PERSPECTIVAS PARA HACER COPIAS DE SEGURIDAD CON mysqldump
En mi humilde opinión, hacer copias de seguridad se ha convertido en una forma de arte si sabes cómo abordarlo
Tienes opciones
Opción 1: mysqldump una instancia entera de mysql
¡Esta es la más fácil, la obviedad!
mysqldump -h... -u... -p... --hex-blob --routines --triggers --all-databases | gzip > MySQLData.sql.gz
Todo escrito en un archivo: estructuras de tablas, índices, disparadores, procedimientos almacenados, usuarios, contraseñas cifradas. Otras opciones de mysqldump también pueden exportar diferentes estilos de comandos INSERT, archivo de registro y coordenadas de posición desde registros binarios, opciones de creación de bases de datos, datos parciales (opción --where), etc.
Opción 2: mysqldump bases de datos separadas en archivos de datos separados
Comience creando una lista de bases de datos (2 técnicas para hacer esto)
Técnica 1
mysql -h... -u... -p... -A --skip-column-names -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
Técnica 2
mysql -h... -u... -p... -A --skip-column-names -e"SELECT DISTINCT table_schema FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
La técnica 1 es la forma más rápida. La técnica 2 es la más segura y segura. La técnica 2 es mejor porque, a veces, los usuarios crean carpetas para fines generales en / var / lib / mysql (datadir) que no están relacionadas con la base de datos. Information_schema registraría la carpeta como una base de datos en la tabla information_schema.schemata. La técnica 2 omitiría las carpetas que no contienen datos mysql.
Una vez que compila la lista de bases de datos, puede proceder a recorrer la lista y mysqldump, incluso en paralelo si así lo desea.
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
done
wait
Si hay demasiadas bases de datos para iniciar a la vez, volcado en paralelo 10 a la vez:
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
Opción 3: mysqldump tablas separadas en archivos de datos separados
Comience creando una lista de tablas
mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfTables.txt
Luego volcar todas las tablas en grupos de 10
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DBTB in `cat ListOfTables.txt`
do
DB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $1}'`
TB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $2}'`
mysqldump -h... -u... -p... --hex-blob --triggers ${DB} ${TB} | gzip > ${DB}_${TB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
Opción 4: USE SU IMAGINACIÓN
Pruebe variaciones de las opciones mencionadas más técnicas para obtener instantáneas limpias
Ejemplos
- Ordene la lista de tablas por el tamaño de cada tabla ascendente o descendente.
- Usando un proceso separado, ejecute "ENJUAGAR TABLAS CON BLOQUEO DE LECTURA; SELECCIONE SUEÑO (86400)" antes de iniciar mysqldumps. Mata este proceso después de que mysqldumps estén completos. Esto es útil si una base de datos contiene InnoDB y MyISAM
- Guarde los mysqldumps en carpetas con fecha y gire las carpetas de respaldo antiguas.
- Cargue mysqldumps de instancia completa en servidores independientes.
CONSIDERACIÓN
Solo la Opción 1 trae todo. El inconveniente es que mysqldumps creado de esta manera solo se puede volver a cargar en la misma versión de lanzamiento de mysql que se generó mysqldump. En otras palabras, un mysqldump de una base de datos MySQL 5.0 no se puede cargar en 5.1 o 5.5. La razón ? El esquema mysql es totalmente diferente entre las principales versiones.
Las opciones 2 y 3 no incluyen guardar nombres de usuario y contraseñas.
Aquí está la forma genérica de volcar las concesiones SQL para usuarios que es legible y más portátil
mysql -h... -u... -p... --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -h... -u... -p... --skip-column-names -A | sed 's/$/;/g' > MySQLGrants.sql
La opción 3 no guarda los procedimientos almacenados, por lo que puede hacer lo siguiente
mysqldump -h... -u... -p... --no-data --no-create-info --routines > MySQLStoredProcedures.sql &
Otro punto que debe tenerse en cuenta es sobre InnoDB. Si tiene un gran grupo de búferes InnoDB, tiene sentido limpiarlo lo mejor que pueda antes de realizar cualquier copia de seguridad. De lo contrario, MySQL pasa el tiempo limpiando las tablas con las páginas sucias sobrantes del grupo de búferes. Esto es lo que sugiero:
Aproximadamente 1 hora antes de realizar la copia de seguridad, ejecute este comando SQL
SET GLOBAL innodb_max_dirty_pages_pct = 0;
En MySQL 5.5, innodb_max_dirty_pages_pct predeterminado es 75. En MySQL 5.1 y versiones posteriores, innodb_max_dirty_pages_pct predeterminado es 90. Al establecer innodb_max_dirty_pages_pct en 0, esto acelerará el vaciado de páginas sucias en el disco. Esto evitará o al menos disminuirá el impacto de limpiar cualquier confirmación incompleta de dos fases de los datos de InnoDB antes de realizar cualquier mysqldump en cualquier tabla de InnoDB.
PALABRA FINAL EN mysqldump
La mayoría de las personas se alejan de mysqldump en favor de otras herramientas y esas herramientas son realmente buenas.
Tales herramientas incluyen
- MAATKIT ( scripts de volcado / restauración paralelos , de Percona [obsoleto pero excelente])
- XtraBackup (Copia de seguridad de instantánea de TopNotch de Percona)
- CDP R1Soft ( Opción de módulo MySQL que toma instantáneas de punto en el tiempo)
- MySQL Enterprise Backup (anteriormente InnoDB Hot Backups [comercial])
Si tiene el espíritu de un verdadero DBA MySQL, puede adoptar mysqldump y tener el dominio completo sobre él que se puede lograr. Que todas tus copias de seguridad sean un reflejo de tus habilidades como MySQL DBA .