GNU/Linux >> Tutoriales Linux >  >> Linux

Copia de seguridad incremental de MySQL:copia de seguridad y recuperación en un punto en el tiempo de las bases de datos InnoDB y MyIsam

Hacer copias de seguridad incrementales es un requisito importante para las bases de datos de gran producción. Sin una copia de seguridad incremental segura, no puede decirse a sí mismo que tiene una base de datos de producción confiable. Porque debe tener suficientes datos para recuperar su base de datos en casos de emergencia. Después de algunas búsquedas en Internet, no pude encontrar ninguna herramienta que pueda hacer una copia de seguridad incremental completa para MyISAM e InnodB en un entorno mixto donde las aplicaciones usan ambos motores de base de datos simultáneamente (tal vez no soy un experto en búsquedas en Google e Internet). Así que decidí escribir este, pero para evitar perder el tiempo y beneficiarme de otras soluciones de código abierto, preferí agregar esta característica a -automysqlbackup-script, que es el mejor script para copias de seguridad completas con simplicidad y uso generalizado.

Mecanismo

Usamos la función Post y Pre de automysqlbackup para hacer una copia de seguridad incremental. Antes de iniciar una copia de seguridad completa, mysql-backup-pre ejecuta una consulta para bloquear toda la base de datos durante el proceso de copia de seguridad porque tenemos que congelar el binlog para evitar cualquier cambio mientras se ejecuta la copia de seguridad. Es posible que el nombre y la posición del binlog no cambien durante la copia de seguridad. La posición del registro binario es muy importante en el proceso de copia de seguridad incremental posterior y se utilizará como punto de partida para comenzar la siguiente copia de seguridad incremental. Después de finalizar la copia de seguridad completa, mysql-backup-post elimina el bloqueo de la base de datos.

Consulta de bloqueo:FLUSH TABLAS CON BLOQUEO DE LECTURA; SELECCIONE DORMIR(86400)

Buscar consultas de bloqueo:mysql -u [nombre de usuario] -p [contraseña] -e "mostrar lista de procesos" | grep "SELECCIONAR DORMIR (86400)" | awk '{imprimir $1}'

Requisitos

  • privilegios de root para instalar el paquete y actualizar mysql.conf
  • paquete mysql-community-client
  • instalación automysqlbackup y mysql-incremental

Instalación

Instale el paquete mysql-community-client para su distribución.

Nota:después de la instalación de MySQL debe tener el comando 'mysqlshow'.

Instalar automysqlbackup:

download the package from https://sourceforge.net/projects/automysqlbackup/
tar -xzf [PathYouSavedTarFile] -C /tmp/
cd /tmp/
./install.sh

Durante la instalación de automysqlbackup, se le preguntará sobre la ruta de automysqlbackup.conf y su binario, puede dejar los valores predeterminados sin ningún cambio.

rm /etc/automysqlbackup/myserver.conf

Instale mysql-incremental:descargue el paquete desde https://sourceforge.net/projects/mysqlincrementalbackup/

cd /tmp
wget http://downloads.sourceforge.net/project/mysqlincrementalbackup/mysql-incremental.tar.gz
tar xfz mysql-incremental.tar.gz
cp mysql-incremental /etc/automysqlbackup/
chmod 755 /etc/automysqlbackup/mysql-incremental
cp mysql-backup-post /etc/automysqlbackup/
chmod 755 /etc/automysqlbackup/mysql-backup-post
cp mysql-backup-pre /etc/automysqlbackup/
chmod 755 /etc/automysqlbackup/mysql-backup-pre

Actualice automysqlbackup.conf:

Encuentre los siguientes parámetros, elimine los comentarios y cámbielos:

        CONFIG_mysql_dump_username='Mysql user name. It must has privileges to get Lock'
	CONFIG_mysql_dump_password='Password'
	CONFIG_backup_dir='The backup directory you want to store full and incremental backup'
	CONFIG_db_names=('databaseName1' 'databaseName2' )
	CONFIG_db_month_names=('databaseName1' 'databaseName2' )
	CONFIG_mysql_dump_master_data=2
	CONFIG_prebackup="/etc/automysqlbackup/mysql-backup-pre"
	CONFIG_postbackup="/etc/automysqlbackup/mysql-backup-post"

Actualizar mi.cnf:

Edite el archivo de configuración de MySQL:

nano /etc/mysql/my.cnf

1- Formato BinLog

Debido a alguna limitación en el formato DECLARACIÓN, mi recomendación es configurar el formato basado en ROW. Para obtener más información, consulte la sección 'solución de problemas' en este instructivo. Puede verificar el tipo de formato de registro binario ejecutando "select @@binlog_format;" consulta. Para modificar el formato logbin, debe agregar binlog_format =ROW a mysql.conf o my.cnf.

2- binlog_do_db

Debe especificar las bases de datos que desea que tengan los cambios relacionados en el registro binario. Tenga en cuenta que si no especifica ninguna base de datos, cualquier cambio en cualquier base de datos se registrará en el registro binario. En este caso, si elige el formato DECLARACIÓN, tal vez tenga algunos problemas al restaurar desde copias de seguridad incrementales y archivos binlog. Puede agregar bases de datos a esta opción:

binlog_do_db = DATABASENAME1
binlog_do_db = DATABASENAME2

3- expire_logs_days

Para tener archivos de registro binarios durante más tiempo, puede aumentar este parámetro a un valor más alto. Mi recomendación es de 60 días. Por lo tanto, debe agregarlo o cambiarlo a "expire_logs_days =60".

4- bin de registro

El directorio donde se almacenarán los registros binarios. En versiones anteriores de MySQL, es posible que mysql-incremenetal no pueda encontrar la ruta correcta. Entonces, si obtiene un error al respecto después de ejecutar mysql-incremental, debe actualizar el script mysql-incremental y establecer la ruta de registro binario.

5-log_slave_updates

Si está configurando una copia de seguridad incremental de mysql en un servidor esclavo, debe habilitar esta opción. Normalmente, un esclavo no registra actualizaciones en su propio registro binario, ya que se recibieron de un servidor maestro. Esta opción le dice al esclavo que registre las actualizaciones realizadas por sus subprocesos SQL en su propio registro binario. http://dev.mysql.com/doc/refman/5.1/en/replication-options-slave.html#option_mysqld_log-slave-updates

Ejecutar automysqlbackup

Ejecute automysqlbackup manualmente para tener al menos una copia de seguridad completa de las bases de datos especificadas.

automysqlbackup

Después de ejecutar el comando con éxito, verifique el archivo /[BackupDirInAutomysqlbackup]/status/backup_info para ver la información recién agregada sobre la copia de seguridad diaria. Para obtener detalles del error, consulte /var/log/Backup_Post_Pre_log . El archivo de copia de seguridad se almacenará en el directorio /[BackupDirInAutomysqlbackup]/daily/[DatabaseName]/ .

Ejecutar mysql-incremental

Ejecute mysql-incremental manualmente ahora para tener al menos una copia de seguridad cada hora.

mysql-incremental

En caso de error, los detalles se registran en el archivo "/var/log/Backup_Incremental_Log" . Los archivos de copia de seguridad incremental se almacenarán en el directorio /[BackupDirInAutomysqlbackup]/IncrementalBackup/ .

Editar el crontab raíz

Puede programar mysql-incremental durante más de una hora. Puede encontrar el tiempo total de la copia de seguridad completa de backup_status y luego, en función de ese valor, establecer un horario de programación preciso. Por supuesto, la copia de seguridad incremental de mysql tiene un mecanismo para encontrar cualquier copia de seguridad completa en ejecución antes de comenzar, por lo que no hay preocupación por el conflicto entre la copia de seguridad incremental y la completa.

crontab -e
5 00 * * * root /usr/local/bin/automysqlbackup
25 *  * * * root  /etc/automysqlbackup/mysql-incremental

Restaurar base de datos

Para restaurar hasta un momento específico (recuperación de un punto en el tiempo), primero debe restaurar una copia de seguridad diaria completa y luego restaurar los archivos de copia de seguridad incrementales relacionados secuencialmente. Para aclarar más, aquí están los pasos para recuperar la base de datos testDB. En el escenario de muestra, tenemos la intención de recuperar nuestros datos hasta el 2015-5-01 a las 2 a.m. hemos configurado /backup como nuestro directorio de respaldo principal y testDB como nuestra base de datos de destino:

1- mysql -u root -p DatabaseName < /backup/daily/testDB/daily_DatabaseName_2015-05-16_00h05m_Saturday.sql.gz
2- mysql -u root -p DatabaseNAme < /backup/IncrementalBackup/2015-5-01_Incremental/testDB/testDB_IncrementalBackup_2015-5-01_00h25m.1
3- mysql -u root -p DatabaseNAme < /backup/IncrementalBackup/2015-5-01_Incremental/testDB/testDB_IncrementalBackup_2015-5-01_01h25m.2
4- mysql -u root -p DatabaseNAme < /backup/IncrementalBackup/2015-5-01_Incremental/testDB/testDB_IncrementalBackup_2015-5-01_02h25m.3

Notas importantes y solución de problemas

MySQL admite diferentes formatos para el registro binario. Algunas versiones de Mysql usan 'basado en sentencias' como formato de registro binario que este tipo de registro binario tiene algunas limitaciones a las que debemos prestar mucha atención cuando intentamos usarlo en el procedimiento de copia de seguridad incremental. Cuando mysql está configurado en formato de base de declaración, no puede filtrar correctamente en función de las bases de datos. Si configura 'USE o \u' para cambiar la base de datos y luego actualiza otra base de datos que no está incluida en binlog-do-db, la declaración se registrará en el archivo binlog de que no es un estado deseable. y expondrá algunos problemas al restaurar en función de una base de datos específica y también si cambia a otra base de datos que no está incluida en binlog-do-db y actualiza una base de datos que está incluida en binlog-do-db, la declaración no se registrará en archivo binlog. nuestro propósito al agregar bases de datos a binlog-do-db es filtrar según la base de datos, pero no funciona como se esperaba. Si no se ejecuta USE o \u antes de ejecutar consultas, mysqlbinlog no puede extraer 'consultas de actualización' relacionadas con una base de datos. Explicaremos más este problema con los siguientes escenarios:

databases: 
 - binlog
     - person (table) 
  - binlog2
     - person (table)

 binlog-do-db=binlog2 (it is supposed only change of this database are logged to binlog file)
--------Scenario 1---------
\u binlog2
insert into person (data) values ('17') ---> loged in binlog  *desired state*
insert into binlog.person (data) values ('25'); ---> logged in binlog (target database is 'binlog' ) *undesired state*
--------Scenario 2---------
\u binlog
insert into person (data) values ('17') ---> is not logged in binlog  *desired state*
insert into binlog2.person (data) values ('25'); ---> is not logged in binlog (target database is 'binlog2' ) *undesired state* because the binlog2 database
is begin changed, so we want to have this change,but it will not logged in logbin file
--------Scenario 3---------
if you just connect to database without any USE or \u statement, all of updates on any databases will be logged, but mysqlbinlog can not able to filter
based on specific database, so that is not desirable state for our purpose in incremental backup. Using USE or \u before executing update queries, is very
important. Because mysqlbinlog finds update queries based on USE statement in binlog file.

Solucionar el problema mencionado

1) Al definir usuarios en las bases de datos de manera que cada usuario solo tenga acceso a una base de datos para actualizar (usuario de la aplicación) y cuando se conecte a la base de datos, se debe especificar el nombre de la base de datos. Por supuesto, la mayoría de las aplicaciones tienen un archivo de configuración en el que se establecen las credenciales y el nombre de la base de datos, por lo que en ese caso no tendrá un acceso cruzado a las bases de datos y no habrá preocupaciones sobre el uso de "\USE o \u ".

2) Si usa el formato binlog basado en filas, todos los problemas mencionados desaparecerán. en otras palabras, el formato basado en filas es un método mucho más adecuado para binlog. https://dev.mysql.com/doc/refman/5.1/en/replication-options-binary-log.html

Archivos de registro

Intenté registrar todo en un archivo de registro para que pueda encontrar suficiente información en los registros:

/var/log/Backup_Post_Pre_log
/var/log/Backup_Incremental_Log
/[SpecifiedBackupDirInAutomysqlbackup.conf]/status/backup_info

El archivo "backup_info" contiene información detallada sobre la copia de seguridad y cuándo finalizó la copia de seguridad (los tiempos están en formato Unix Time). Contiene el nombre del binlog y la posición del momento en que se inició la copia de seguridad, el tipo de copia de seguridad, la cantidad de copias de seguridad desde la última copia de seguridad completa y la duración de la copia de seguridad.

Ejemplo de copia de seguridad_info:

1431043501,mysql-bin.000026,120,Daily,2015-05-08,0,24
1431044701,mysql-bin.000026,120,Hourly,2015-05-08,1,1

Aquí hay una descripción de los diferentes valores:

 1th) 1431043501 : indicates the time when the backup has been finished. You can run date --date @1431043501 command on the server the backup has been done to view it in human readable format.
 2th) Mysql-bin.000026 : indicates the binary log name that backup up to this file has been done.
 3th) 120 : indicates the position of binlog  that backup up to this position in binary log has been done.
 4th) Daily/Hourly: indicates type of backup. Daily does mean the full backup by automysqlbackup script and Hourly is done by mysql-incremental script.
 5th) 2015-05-08: The date that backup has been done. This date will be used in creating directory for incremental backup and also as a base for restore hourly backups. In restoring procedure, first a full backup is restored and then sequentially other incremental backup are restored.
 6th) 0 : indicates number of backups from previous full backup. 0 does mean the backup is full and others mean hourly. This number is very important in restoring procedure.
 7th) 24: The backup duration in second.

Informe de error

Puede informar errores o dar sus sugerencias y revisiones en https://sourceforge.net/projects/mysqlincrementalbackup .


Linux
  1. Cómo administrar bases de datos MySQL y usuarios en cPanel

  2. Cómo optimizar y reparar bases de datos MySQL usando phpMyAdmin

  3. MySQL:cómo hacer una copia de seguridad (volcar) y restaurar una base de datos usando mysqldump

  4. Reparación de bases de datos MySQL InnoDB

  5. Cómo hacer una copia de seguridad y restaurar la base de datos MySQL usando la línea de comandos

Cómo importar y exportar bases de datos MySQL en Linux

13 consejos para ajustar y optimizar las bases de datos Mysql y Mariadb

Cómo hacer una copia de seguridad de todas las bases de datos MySQL desde la línea de comandos

Cómo crear una copia de seguridad de bases de datos MySQL usando mysqldump en Ubuntu 20.04

Cree y administre bases de datos MySQL con el asistente de MySQL

Cómo crear y modificar bases de datos MySQL en cPanel