INSIGHT PARA FAZER BACKUP COM O mysqldump
IMHO Fazer backups tornou-se mais uma forma de arte se você souber exatamente como abordá-la
Você tem opções
Opção 1: mysqldump uma instância inteira do mysql
Este é o mais fácil, o acéfalo !!!
mysqldump -h... -u... -p... --hex-blob --routines --triggers --all-databases | gzip > MySQLData.sql.gz
Tudo escrito em um arquivo: estruturas de tabela, índices, gatilhos, procedimentos armazenados, usuários, senhas criptografadas. Outras opções do mysqldump também podem exportar diferentes estilos de comandos INSERT, arquivo de log e coordenadas de posição de logs binários, opções de criação de banco de dados, dados parciais (opção --where) e assim por diante.
Opção 2: mysqldump separa bancos de dados em arquivos de dados separados
Comece criando uma lista de bancos de dados (2 técnicas para fazer isso)
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
A técnica 1 é a maneira mais rápida. A técnica 2 é a mais segura e segura. A técnica 2 é melhor porque, às vezes, os usuários criam pastas para fins gerais em / var / lib / mysql (datadir) que não são relacionados ao banco de dados. O information_schema registraria a pasta como um banco de dados na tabela information_schema.schemata. A técnica 2 ignoraria pastas que não contêm dados mysql.
Depois de compilar a lista de bancos de dados, você pode avançar pela lista e mysqldump, mesmo em paralelo, se assim o desejar.
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
done
wait
Se houver muitos bancos de dados a serem iniciados ao mesmo tempo, despeje-os paralelamente 10 por 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
Opção 3: mysqldump separa tabelas em arquivos de dados separados
Comece criando uma lista de tabelas
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
Em seguida, despeje todas as tabelas em 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
Opção 4: USE SUA IMAGINAÇÃO
Experimente variações das opções acima mencionadas e técnicas para capturas instantâneas limpas
Exemplos
- Ordene a lista de tabelas pelo tamanho de cada tabela, ascendente ou descendente.
- Usando um processo separado, execute "FLUSH TABLES WITH READ LOCK; SELECT SLEEP (86400)" antes de iniciar o mysqldumps. Mate esse processo após a conclusão do mysqldumps. Isso é útil se um banco de dados contiver InnoDB e MyISAM
- Salve o mysqldumps em pastas datadas e gire as pastas de backup antigas.
- Carregue o mysqldumps de instância inteira em servidores independentes.
EMBARGO
Somente a opção 1 traz tudo. A desvantagem é que o mysqldumps criado dessa maneira só pode ser recarregado na mesma versão principal do mysql que o mysqldump foi gerado. Em outras palavras, um mysqldump de um banco de dados MySQL 5.0 não pode ser carregado em 5.1 ou 5.5. O motivo ? O esquema do mysql é totalmente diferente entre os principais lançamentos.
As opções 2 e 3 não incluem salvar nomes de usuário e senhas.
Aqui está a maneira genérica de despejar o SQL Grants para usuários que sejam legíveis e mais portáteis
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
A opção 3 não salva os procedimentos armazenados, portanto, você pode fazer o seguinte
mysqldump -h... -u... -p... --no-data --no-create-info --routines > MySQLStoredProcedures.sql &
Outro ponto que deve ser observado é o InnoDB. Se você possui um buffer pool grande do InnoDB, faz sentido liberá-lo da melhor forma possível antes de executar qualquer backup. Caso contrário, o MySQL gasta o tempo limpando tabelas com as sobras de páginas sujas do buffer pool. Aqui está o que eu sugiro:
Cerca de 1 hora antes de executar o backup, execute este comando SQL
SET GLOBAL innodb_max_dirty_pages_pct = 0;
No MySQL 5.5, o padrão innodb_max_dirty_pages_pct é 75. No MySQL 5.1 e vice-versa, o innodb_max_dirty_pages_pct é 90. Ao definir innodb_max_dirty_pages_pct como 0, isso acelera a liberação de páginas sujas para o disco. Isso impedirá ou pelo menos diminuirá o impacto da limpeza de confirmações bifásicas incompletas dos dados do InnoDB antes de executar qualquer mysqldump em qualquer tabela do InnoDB.
PALAVRA FINAL NO mysqldump
A maioria das pessoas evita o mysqldump em favor de outras ferramentas e essas ferramentas são realmente boas.
Tais ferramentas incluem
- MAATKIT ( scripts de despejo / restauração paralelos , da Percona [obsoleto, mas ótimo])
- XtraBackup (backup de instantâneo TopNotch da Percona)
- CDP R1Soft ( opção do módulo MySQL que tira instantâneos point-in-time)
- MySQL Enterprise Backup (anteriormente InnoDB Hot Backups [comercial])
Se você tem o espírito de um verdadeiro DBA do MySQL, pode abraçar o mysqldump e ter o domínio completo sobre ele que pode ser alcançado. Que todos os seus backups sejam um reflexo de suas habilidades como um DBA do MySQL .