Criando um * Consistent * * Online * MySQL Backup com tabelas InnoDB e MyISAM

6

Eu passei horas construindo um novo servidor de banco de dados para substituir dois servidores com falha de um arquivo mysqldump criado há um mês e, em seguida, usei bin-logs do meu servidor para atualizar o mysqldump . Agora que tenho esse novo servidor de banco de dados on-line e o executei por alguns dias, preciso concluir a configuração do servidor e reimplementar uma estratégia de backup.

Eu preciso trazer (pelo menos) um MySQL Replication Slave online para o novo servidor, bem como começar a criar backups utilizáveis para quando as coisas falharem novamente.

Antes de prosseguir:

  • Esqueci (eep) para ativar o bin-log no novo servidor MySQL antes de importar o backup lógico antigo e executar os logs bin velhos (acho que estou acordado por 24 horas nesse ponto, eu acho).

  • Meus dados consistem em vários bancos de dados, todos com uma combinação de tabelas MyISAM e tabelas InnoDB.

  • Além disso, seguindo as mesmas linhas de ativação dos registros bin no novo servidor, esqueci de ativar a opção innodb-file-per-table no my.cnf antes de importar todos os dados. O log binário agora está habilitado no novo servidor MySQL, mas a opção inno por tabela é praticamente uma correção, até que eu possa importar outro backup lógico (provavelmente acabarei trazendo um segundo escravo e promovendo o primeiro escravo). para dominar e abandonar o mestre atual - como a configuração não é apenas onde eu preciso que seja).

Então, o problema:
Eu preciso fazer um backup do servidor MySQL, mas não consigo colocar o novo servidor MySQL offline. Preciso continuar fazendo gravações e servindo leituras com pouco ou nenhum tempo de inatividade. Esse requisito de "pouco ou nenhum tempo de inatividade" é definido como menos de 10 minutos. Meus dados atualmente usam cerca de 100 GB de espaço no servidor (arquivos de dados mysql), e os backups lógicos são de cerca de 50 GB (isso é um monte de índices ... haha). Eu não me importo com este backup é lógico, ou uma cópia dos arquivos de dados do diretório de dados do MySQL. Eu posso criar um backup lógico do escravo depois que eu o colocar on-line.

E a pergunta:
Como você criaria esse backup necessário? Eu sei que não é fácil, muitas pessoas dirão que não é possível. Mas eu me recuso a acreditar que não é possível, tem que haver uma maneira de fazê-lo.

Uma nota sobre o servidor: Ele está rodando o Ubuntu 10.04, o MySQL 5.1.41, e o sistema de arquivos no qual os dados estão armazenados é o ext3. O servidor está rodando no Rackspace Cloud, então o sistema de arquivos praticamente "é o que é" a menos que eu possa reparticionar o dispositivo raiz e reparticioná-lo com outro FS (talvez o XFS?) Para fazer um snapshot.

Eu li sobre Ferramenta Perconas XtraBackup mas ele só funciona para tabelas InnoDB. Eles têm uma ferramenta MyISAM, mas eu realmente não entendo como isso poderia funcionar (ou mesmo se isso acontecer) em conjunto com o XtraBackup para criar um backup completamente consistente.

Eu li sobre mysqlhotcopy mas ele só funciona com tabelas MyISAM .

Obviamente eu sei sobre mysqldump , mas (também, obviamente) o problema aqui é criar um backup consistente sem bloquear todo o servidor de banco de dados pelo número de horas que serão necessárias para produzir todo o arquivo de backup sql.

    
por Jim Rubenstein 01.06.2011 / 17:47

3 respostas

4

Com relação ao XtraBackup, ou mais especificamente ao innobackupex, confira esta explicação

Trecho:

The innobackupex program adds more convenience and functionality by also permitting you to back up MyISAM tables and .frm files. It starts xtrabackup, waits until it finishes copying files, and then issues FLUSH TABLES WITH READ LOCK to prevent further changes to MySQL's data and flush all MyISAM tables to disk. It holds this lock, copies the MyISAM files, and then releases the lock.

The backed-up MyISAM and InnoDB tables will eventually be consistent with each other, because after the prepare (recovery) process, InnoDB's data is rolled forward to the point at which the backup completed, not rolled back to the point at which it started. This point in time matches where the FLUSH TABLES WITH READ LOCK was taken, so the MyISAM data and the prepared InnoDB data are in sync.

Espero que isso ajude.

Felicidades

    
por 01.06.2011 / 18:33
1

This "little-to-no downtime" requirement is defined as less than 10 minutes

OK 2 soluções óbvias:

1) configure um sistema de arquivos espelhado para armazenar as tabelas de dados do mysql. Quando você quiser fazer um backup, desligue o mysqld, remova um dos espelhos do conjunto, então inicie o mysqld novamente, então remonte a unidade que você acabou de tirar do espelho em algum outro lugar e copie os arquivos raw ou inicie uma segunda instância do mysld (porta diferente, caminho diferente para os arquivos) e execute o mysqldump lá. Quando terminar, desligue a segunda instância do mysqld e coloque a unidade de volta no conjunto de espelhos (o sistema RAID deve manipular a atualização da unidade antes de sua leitura como um prt do espelho, portanto não há necessidade de encerrar a primeira instância neste ponto). / p>

2) Similar a 1, mas implementar o espelhamento no nível do aplicativo - configure sua instância atual do mysqld como um mestre, configure uma segunda instância como escravo. Quando você quiser criar um backup, pare a replicação no escravo, faça o backup e, em seguida, inicie a replicação novamente (0 tempo de inatividade).

    
por 01.06.2011 / 18:11
0

Como é uma infraestrutura de nuvem e você não pode fazer muitas coisas no servidor dedicado (como reparticionar / alterar sistemas de arquivos / usando lvm), procure por uma solução de snapshot / backup do seu provedor de serviços de nuvem.

O Quick googling me indicou isso: link

Verifique isso, pode ser a melhor solução para o seu problema.

    
por 01.06.2011 / 19:23