Linux / mysql: é seguro copiar arquivos mysql db com o comando cp de um banco de dados para outro?

7

A maioria dos guias recomenda mysqldump e SQL simples para copiar uma tabela para o db anoter. Como sobre linux shell cp? Posso simplesmente fazer

cp /db1/mytable.frm /db2/mytable.frm

    
por giorgio79 07.03.2012 / 16:26

4 respostas

18

Copiar é muito simples para o MyISAM e completamente 100% arriscado (quase suicida) com o InnoDB.

Da sua pergunta, você mencionou

cp /db1/mytable.frm /db2/mytable.frm

MyISAM

Não há problema em fazer isso. No entanto, você não pode simplesmente mover o .frm. Você deve mover todos os componentes. De sua pergunta, vamos pegar uma tabela chamada db1.mytable. Em uma instalação normal, a tabela está localizada em / var / lib / mysql / db1. Haveria três arquivos compondo a tabela.

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.MYD (banco de dados de tabelas)
  • /var/lib/mysql/db1/mytable.MYI (índices da tabela)

Você deve mover todos os três arquivos para mover a única tabela. Se todas as suas tabelas usam o mecanismo de armazenamento MyISAM, você pode desligar o mysql e copiar. Se você está simplesmente fazendo uma cópia da tabela e colocando-a em outro banco de dados, você deve fazer isso usando SQL.

Por exemplo, se você deseja copiar db1.mytable para o banco de dados db2, faça o seguinte:

CREATE TABLE db2.mytable LIKE db1.mytable;
ALTER TABLE db2.mytable DISABLE KEYS;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;
ALTER TABLE db2.mytable ENABLE KEYS;

Agora, se você acabou de mover a tabela do db1 para o db2, você pode fazer isso:

ALTER TABLE db1.mytable RENAME db2.mytable;

InnoDB

Copiar é muito perigoso por causa da infraestrutura em que o InnoDB trabalha. Existem duas infraestruturas básicas: 1) innodb_file_per_table disabled e 2) innodb_file_per_table enabled

O calcanhar de Aquiles do InnoDB é o arquivo de espaço de tabela do sistema conhecido como ibdata1 (normalmente localizado em / var / lib / mysql). O que está contido nesse arquivo ?

  • Páginas de dados de tabela
  • Índice de páginas de tabela
  • MetaData de tabela (lista de gerenciamento de ID de espaço de tabela)
  • Dados MVCC (para suportar o isolamento de transações e ACID Compliance )

InnoDB (innodb_file_per_table disabled)

Com o innodb_file_per_table desativado, todos esses tipos de informações do InnoDB vivem dentro do ibdata1. A única manifestação de qualquer tabela InnoDB fora de ibdata1 é o arquivo .frm da tabela InnoDB. Copiar todos os dados do InnoDB de uma só vez exige copiar todo o / var / lib / mysql.

Copiar uma tabela InnoDB individual é totalmente impossível. Você deve mysqldump para extrair um dump da tabela como uma representação lógica dos dados e suas definições de índice correspondentes. Você então carregaria esse despejo em outro banco de dados no mesmo servidor ou em outro servidor.

InnoDB (innodb_file_per_table enabled)

Com innodb_file_per_table ativado, os dados da tabela e seus índices residem na pasta do banco de dados ao lado do arquivo .frm. Por exemplo, para a tabela db1.mytable, a manifestação dessa tabela InnoDB fora de ibdata1 seria:

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.ibd

Todos os metadados para db1.mytable ainda residem em ibdata1 e não há absolutamente nenhuma maneira de contornar isso . Redo logs e dados MVCC também ainda vivem com ibdata1.

AVISO (ou PERIGO como o robô diria em Perdido no Espaço )

Se você está pensando apenas em copiar o arquivo .frm e .ibd, você está na fila para o mundo da dor. Copiar o arquivo .frm e .ibd de uma tabela InnoDB só será bom se você puder garantir que o ID do espaço de tabela do arquivo .ibd corresponda exatamente à entrada id do espaço de tabela no metadado do arquivo ibdata1.

Eu escrevi dois posts no DBA StackExchange sobre esse conceito de ID de espaço de tabela

Aqui está um excelente link sobre como reconectar e arquivo. ibd para ibdata1 no caso de ids de espaço para tabelas incompatíveis: link . Depois de ler isto, você deve ser capaz de ver porque eu disse quase suicida.

Para o InnoDB você só precisa disto

CREATE TABLE db2.mytable LIKE db1.mytable;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;

para fazer uma cópia de uma tabela InnoDB. Se você está migrando para outro servidor de banco de dados, use mysqldump.

    
por 07.03.2012 / 18:45
6

Copiar o datadir inteiro do MySQL é uma técnica prática, presumindo que o serviço MySQL está parado e você deseja que o servidor de banco de dados inteiro seja copiado.

Essa é uma técnica útil para transferir bancos de dados com índices grandes, e um mysql dump não incluirá os índices, que precisarão ser regenerados no momento da importação. Eu achei essa técnica útil ao configurar escravos do MySQL.

Copiar um arquivo individual depende do esquema da tabela em uso, mas na maioria das situações não é uma solução adequada.

    
por 07.03.2012 / 16:36
2

Use o xtrabackup sem o invólucro innobackupex e você ficará bem tanto no myisam quanto no innodb bases de dados. Observe que restaurar bancos de dados innodb não apenas copia os arquivos, mesmo que você use o xtrabackup. Diga se você precisa de mais informações

    
por 08.03.2012 / 00:35
1

Não, você deve fazer backup com mysqdump e restaurar com o utilitário mysql cli, copiando o arquivo frm que você está copiando apenas a estrutura da tabela e não os dados dentro, e se você estiver no innodb copie o arquivo diretamente não é possível.

A melhor maneira é descarregar e restaurar a tabela.

    
por 07.03.2012 / 16:35