Como posso mover tabelas MySQL de um servidor físico para outro?
Como este cenário exato: Eu tenho um servidor MySQL que usa a tabela innodb e tem tamanho de aproximadamente 20 GB.
Quero movê-lo para um novo servidor, qual é a maneira mais eficiente de fazer isso?
Respostas:
Minha maneira favorita é canalizar um comando sqldump para um comando sql. Você pode fazer todos os bancos de dados ou um específico. Então, por exemplo,
Você pode fazer todos os bancos de dados com
O único problema é quando o banco de dados é muito grande e o tubo entra em colapso. Nesse caso, você pode fazer tabela por tabela ou qualquer um dos outros métodos mencionados abaixo.
fonte
netcat
.Recentemente, mudei um banco de dados de 30 GB com a seguinte estratégia:
Servidor antigo
~/mysqldata/*
)tar -czvf mysqldata.tar.gz ~/mysqldata
)Novo servidor
tar -xzvf mysqldata.tar.gz
)fonte
De acordo com o Guia de Estudo de Certificação do MySQL 5.0 , Capítulo 32, Seção 32.3.4, Páginas 456.457, descreve as Condições de Portabilidade Binária que trazem o seguinte:
Existem duas maneiras principais, com base no mecanismo de armazenamento, de mover tabelas individuais.
Para o exemplo dado, vamos supor o seguinte:
Tabelas MyISAM
Se mydb.mytable usar o mecanismo de armazenamento MyISAM, a tabela será manifestada fisicamente como três arquivos separados
O .frm contém a estrutura da tabela.
O .MYD contém os dados da tabela.
O .MYI contém a página de índice da tabela
Esses arquivos são usados interdependentemente para representar a tabela do ponto de vista lógico no mysql. Como esses arquivos não têm mais associação lógica anexada, migrando uma tabela de um servidor de banco de dados para outro. Você pode até fazer isso de um servidor Windows para um servidor Linux ou um MacOS. Obviamente, você pode desligar o mysql e copiar os 3 arquivos de tabela. Você pode executar o seguinte:
em uma sessão ssh para manter a tabela como somente leitura e manter a trava por 24 horas. Um segundo depois, execute a cópia em outra sessão ssh. Então mate a sessão do mysql com o bloqueio de 24 horas. Você não precisa esperar 24 horas.
Tabelas InnoDB
Com base na citação acima mencionada no livro Certificação, existem muitos fatores que determinam como fazer backup de uma tabela específica do InnoDB. Por uma questão de simplicidade, clareza e concisão, basta executar um mysqldump da tabela desejada usando os parâmetros --single-transaction para obter um despejo perfeito da tabela em um determinado momento. Não há necessidade de se preocupar com a semântica do InnoDB se você quiser apenas uma tabela. Você pode recarregar esse arquivo de despejo em qualquer servidor MySQL de sua escolha.
Como duas perguntas foram mescladas aqui (jcolebrand): EDIT
Se você estiver disposto a viver com um desempenho lento do banco de dados, poderá executar uma série de rsyncs do servidor antigo (ServerA) para o novo servidor (ServerB), mesmo enquanto o mysql ainda estiver em execução no ServerA.
Etapa 01) instale a mesma versão do mysql no ServerB que o ServerA possui
Etapa 02) No ServerA, execute o
SET GLOBAL innodb_max_dirty_pages_pct = 0;
mysql e aproximadamente 10 minutos (Isso remove páginas sujas do InnoDB Buffer Pool. Também ajuda a executar um desligamento do mysql mais rapidamente) Se o seu banco de dados for todo MyISAM, você pode pular esta etapa.Etapa 03)
rsync --archive --verbose --stats --partial --progress --human-readable ServerA:/var/lib/mysql ServerB:/var/lib/mysql
Etapa 04) Repita a Etapa 03 até que um rsync leve menos de 1 minuto
Etapa 05)
service mysql stop
no ServerAEtapa 06) Execute mais um rsync
Etapa 07)
scp ServerA:/etc/my.cnf ServerB:/etc/
Etapa 08)
service mysql start
no ServerBEtapa 08)
service mysql start
no ServerA (opcional)De uma chance !!!
EMBARGO
Você pode criar um escravo de replicação como este. Lembre-se de definir o ID do servidor explicitamente no master /etc/my.cnf e um número diferente para o id do servidor no slave /etc/my.cnf
fonte
Você nem precisa do mysqldump se estiver movendo um esquema de banco de dados inteiro e estiver disposto a interromper o primeiro banco de dados (para que seja consistente ao ser transferido)
Não me lembro se o mysqldump lida com usuários e permissões, ou apenas com os dados ... mas mesmo se o fizer, isso é muito mais rápido do que fazer um despejo e executá-lo. Eu usaria isso apenas se precisasse despejar um banco de dados mysql para reinserir em outro RDBMS, se precisasse alterar as opções de armazenamento (innodb vs. myisam) ou talvez se estivesse alterando as principais versões do mysql (mas Eu acho que fiz isso entre 4 e 5, no entanto)
fonte
--all-databases
despeja o esquema mysql. Iniciar o mysql na próxima máquina traz as permissões, desde que você transfira a pasta de dados para a outra máquina com a mesma versão principal do MySQL. (MySQL 5.5.x para MySQL 5.5.x, MySQL 5.1.x para MySQL 5.1.x, MySQL 5.0.x para MySQL 5.0.x)mysqldump
lida com usuários e permissões, pois elas são armazenadas nomysql
esquema.Se você deseja apenas mover uma tabela específica, tente:
mysqldump -u username -ppassword databasename tablename > databasename.tablename.sql
Você pode especificar mais nomes de tabela acima, no mesmo comando. Depois que o comando for concluído, mova o arquivo databasename.tablename.sql para o outro servidor e restaure usando:
Observe que o arquivo .sql de volta é criado usando o programa mysqldump , e a restauração é feita diretamente no mysql .
fonte
Pode haver essa possibilidade em que você move os arquivos de banco de dados reais (para a minha instalação, eles estão localizados em / var / lib / mysql), mas não tenho muita certeza de como isso vai funcionar / funcionar.
fonte
Você precisará de um tempo de inatividade. Vai demorar um pouco, dependendo da velocidade da sua rede. Eu vou assumir que você está executando o MySQL no Linux / Unix. Aqui está o processo que eu uso:
Em seguida, proceda como de costume, configurando o MySQL local.
* Nota: você também pode usar o parâmetro -c com rsync para adicionar uma soma de verificação à transferência; no entanto, isso será lento dependendo da velocidade da CPU.
fonte
Posso confirmar que o método do DTest também funciona para copiar entre o ubuntu e o osx.
Para copiar todos os bancos de dados sem precisar fazer dumping ou similar:
Verifique se você possui um mysql limpo do mysql (instalou o dmg baixado do mysql http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.63-osx10.6-x86_64.dmg ), que (VERY IMPORTANTE) nunca foi executado.
Copie o conteúdo da pasta / var / lib / mysql / da máquina ubuntu em cima de / usr / local / mysql / data / contents no mac. Para ter acesso à pasta get na máquina ubuntu, tive que usar o sudo, ou seja:
Copiei a pasta usando scp.
Antes de começar, faça uma cópia da pasta mysql no mac para garantir que você não estrague nada.
Após copiar a pasta, faça o seguinte na máquina mac:
Inicie o servidor mysql pela primeira vez (no painel de preferências, em Preferências do Sistema-> mysql). Todos os usuários e bancos de dados agora devem estar configurados corretamente.
Isso funcionou com o mysql 5.1.61 no ubuntu 64 bit 11.10 e o mysql 5.1.63 no osx lion (macbook pro).
fonte
Acho que todas as respostas anteriores provavelmente funcionam bem, mas realmente não tratam da questão de definir um nome de banco de dados durante a transferência.
Foi assim que fiz com o bash:
Você pode ser melhor fora de usar
rsync
do quescp
, e não comprimir o arquivo se você estiver fazendo isso muitas vezes.No meu servidor de origem:
No meu servidor de destino:
Em qualquer máquina, para ver o progresso:
Isso tudo pressupõe que você tenha o arquivo de configuração do MySQL em seu diretório pessoal nas duas máquinas e defina as permissões:
fonte
você está movendo para outro servidor mysql db? se for o caso, faça uma exportação para ele
fonte
Método linux genérico:
edite o datadir (e o soquete) do mysqld e mysqld_safe (se aplicável) para apontar para o novo local e, em seguida,
Publiquei isso porque ninguém parecia simplesmente listar a menor quantidade de etapas para fazer isso e acho que é a maneira mais simples pessoalmente.
fonte
Talvez esta seja a melhor maneira de fazê-lo:
Versão 1 : cópia de arquivos de dados (apenas MYISAM)
Versão 2 : mysqldump
Versão 3 : master / slave + mysqldump / file-copy
roteiro:
PS:
Para copiar pequenas tabelas, use:
fonte
Eu sugeriria as duas etapas simples para transferir todo o banco de dados de um servidor para outro.
Passo 1 : Faça um backup completo dos bancos de dados no servidor de origem usando o mysqldump .
Etapa 2 : você pode usar o comando rsync para transferir todos os bancos de dados para o servidor de destino.
fonte