Posso copiar um banco de dados MySQL, copiando os arquivos? O que os arquivos contêm exatamente?

13

Estou usando o banco de dados MySQL e uma máquina Ubuntu Linux.

Meu banco de dados chamado db_test, percebo que sob caminho /var/lib/mysql/db_test, existem arquivos sufixo com .frm, .MYD, .MYIcomo segue:

/var/lib/mysql/db_test# ls

cars.frm 
cars.MYD 
cars.MYI

customers.frm
customers.MYD
customers.MYI

departments.frm
departments.MYD
departments.MYI

... 

Parece cada .frm, .MYD, .MYIgrupo arquivos mapeados com uma tabela no banco de dados.

Tenho duas perguntas a seguir:

  1. O que os três arquivos estão fazendo exatamente?

  2. Se eu criar um novo diretório no caminho /var/lib/mysql/digamos db_test_2, e copiar todos os arquivos do db_test_1diretório para db_test_2, ele também criará um novo banco de dados db_test_2com exatamente o mesmo conteúdo (tabelas) que db_test_1o do?

Essa ação de movimentação física dos arquivos do banco de dados cria o mesmo resultado que as seguintes ações da linha de comando:

  1. despejar o banco de dados db_test_1para fora

  2. crie um novo banco de dados db_test_2

  3. despejar o db_test_1banco de dados novamente no novo banco de dados db_test_2?

Nesse caso, parece que os arquivos em movimento são muito mais rápidos do que os usados mysqldumppara copiar bancos de dados (ou importar dados de um banco de dados para outro banco de dados no MySQL). Alguma opinião sobre isso?

Mellon
fonte

Respostas:

5
  1. AFAIR, .frm é um arquivo de descrição (onde a estrutura da tabela de banco de dados é descrita), .MYD é um arquivo com dados, .MYI é um arquivo com índices.

  2. Sim, a cópia será muito mais rápida. Mas há um problema: não é atômico. Sob carga elevada, os arquivos copiados serão inconsistentes e talvez até mesmo corrompidos. Especialmente se você estiver usando um mecanismo mais 'inteligente' como o InnoDB.

Edit: ps Você pode copiar com segurança esses arquivos, mas antes de parar o servidor mysql.

rvs
fonte
4

Você tem uma ferramenta de linha de cmd que faz exatamente isso: mysqlhotcopy

Ele funciona bem com tabelas myisam, mas não com tabelas InnoDb.

Se você configurou seu servidor com lvm e colocou seu / var / lib / mysql em um volume dedicado, aqui é a maneira que eu recomendo fazer backup muito rápido e de maneira não-bloqueadora de todos os seus bancos de dados:

mysql -U root -p
  > flush tables with read lock;

Isso libera todas as suas tabelas para o disco e bloqueia qualquer operação de r / w

  > system "lvcreate -s -L 1G -n lvMysql_snap /dev/vg_myserver/lv_mysql" ;

Precisa ser adaptado à sua configuração, isso cria uma captura instantânea do sistema de arquivos do seu banco de dados. Não demora

  > unlock tables;

Isso é feito, a operação R / W é retomada.

Agora você pode montar / dev / vg_myserver / lvMysql_snap e criar um arquivo tar do seu banco de dados!

Olivier S
fonte
Esta parece ser uma maneira rápida de fazer backup do banco de dados. Mas e quanto a alternar esse instantâneo para que ele se torne meu banco de dados ativo novamente? Essa é a parte que realmente me preocupa. Eu posso mysqldumpmeu db em menos de 2 segundos. Restaurar é a parte mais lenta, levando de 5 a 10 minutos.
Buttle Butkus
nas distros recentes, os snapshots do lvm podem ser revertidos para a origem, mas provavelmente não é o que você deseja para gerenciar backups de bancos de dados.
Olivier S
Em relação mysqlhotcopy: "Esta utilidade é preterido no MySQL 5.6.20 e removido no MySQL 5,7" de: [ dev.mysql.com/doc/refman/5.6/en/mysqlhotcopy.html]
zeusstl
0

Isso funcionará para o MyISAM, mas não para o InnoDB. Consulte /server//a/367321/57569

A partir dessa resposta, sobre o InnoDB:

Se você está pensando apenas em copiar os arquivos .frm e .ibd, está na fila para o mundo das feridas. Copiar o arquivo .frm e .ibd de uma tabela do InnoDB só é bom se você puder garantir que o ID do espaço de tabela do arquivo .ibd corresponda exatamente à entrada do ID do espaço de tabela nos metdados do arquivo ibdata1.

Peter V. Mørch
fonte