Devo fazer backup e restaurar o banco de dados `mysql`?

15

No processo de criação de uma solução automatizada para fazer backup e restaurar um servidor MySQL inteiro , deparei-me com o mysqlbanco de dados que parece conter contas de usuário, permissões, metadados, esse tipo de coisa. É necessário fazer backup desse banco de dados? O backup e a tentativa de restaurá-lo quebrarão as coisas?

Eu já fazia bastante tempo pesquisando no Google o "mysql fazendo backup do banco de dados mysql", como você pode imaginar.

Daniel Beardsley
fonte
3
Para fazer uma restauração completa, você precisa fazer backup de tudo, exceto o banco de dados "information_schema".
John Gardeniers 19/09/11

Respostas:

16

Aqui está algo interessante a considerar: O backup do mysqlbanco de dados o limita bastante, pois você só pode restaurar esse banco de dados na mesma versão do mysql da qual o backup foi executado. Aqui está o porquê:

Aqui está o mysql.user do MySQL 5.0.45

mysql> desc mysql.user;
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Field                 | Type                              | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host                  | char(60)                          | NO   | PRI |         |       |
| User                  | char(16)                          | NO   | PRI |         |       |
| Password              | char(41)                          | NO   |     |         |       |
| Select_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv          | enum('N','Y')                     | NO   |     | N       |       |
| File_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv            | enum('N','Y')                     | NO   |     | N       |       |
| References_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv   | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv      | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type              | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher            | blob                              | NO   |     |         |       |
| x509_issuer           | blob                              | NO   |     |         |       |
| x509_subject          | blob                              | NO   |     |         |       |
| max_questions         | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates           | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections       | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections  | int(11) unsigned                  | NO   |     | 0       |       |
+-----------------------+-----------------------------------+------+-----+---------+-------+
37 rows in set (0.01 sec)

Aqui está o mysql.user do MySQL 5.1.32

mysql> desc mysql.user;
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Field                 | Type                              | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host                  | char(60)                          | NO   | PRI |         |       |
| User                  | char(16)                          | NO   | PRI |         |       |
| Password              | char(41)                          | NO   |     |         |       |
| Select_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv          | enum('N','Y')                     | NO   |     | N       |       |
| File_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv            | enum('N','Y')                     | NO   |     | N       |       |
| References_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv   | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Event_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Trigger_priv          | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type              | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher            | blob                              | NO   |     | NULL    |       |
| x509_issuer           | blob                              | NO   |     | NULL    |       |
| x509_subject          | blob                              | NO   |     | NULL    |       |
| max_questions         | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates           | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections       | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections  | int(11) unsigned                  | NO   |     | 0       |       |
+-----------------------+-----------------------------------+------+-----+---------+-------+
39 rows in set (0.00 sec)

Aqui está o mysql.user do MySQL 5.5.12

mysql> desc mysql.user;
+------------------------+-----------------------------------+------+-----+---------+-------+
| Field                  | Type                              | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host                   | char(60)                          | NO   | PRI |         |       |
| User                   | char(16)                          | NO   | PRI |         |       |
| Password               | char(41)                          | NO   |     |         |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N       |       |
| File_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N       |       |
| References_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher             | blob                              | NO   |     | NULL    |       |
| x509_issuer            | blob                              | NO   |     | NULL    |       |
| x509_subject           | blob                              | NO   |     | NULL    |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0       |       |
| plugin                 | char(64)                          | YES  |     |         |       |
| authentication_string  | text                              | YES  |     | NULL    |       |
+------------------------+-----------------------------------+------+-----+---------+-------+
42 rows in set (0.01 sec)

Se você tentar restaurar o mysql.user para uma versão do MySQL para a qual não foi feito, isso produzirá problemas de permissão aleatórios. A maneira de fazer backup das permissões de usuário do mysql de forma independente da versão é despejar as concessões do usuário no SQL. Dessa forma, as concessões do usuário são completamente portáteis. Existem duas maneiras de conseguir isso:

OPÇÃO # 1: Usando MAATKIT

O mk-show-grant irá gerar o SQL necessário, independentemente da instância do mysql à qual você se conectar. (Lembre-se de que o MAATKIT está sendo migrado para o Percona Toolkit. Essa ferramenta provavelmente será chamada de pt-show-grant).

OPÇÃO # 2: Script do dumping dos SQL GRANTS

Eu escrevi minha própria emulação de mk-show-grant. Isso deixará de fora usuários anônimos. Se parece com isso:

mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql

O uso de uma dessas opções criará um backup mais estável das concessões do usuário.

EM NOTA NOTA

Agora, se você estiver usando esta opção de saída de log

[mysqld]
log-output=TABLE

o banco de dados mysql preencherá o log lento (se ativado) como uma tabela mysql no esquema mysql em vez de um arquivo de texto. Portanto, fazer backups físicos incluirá esses logs baseados em tabela do mysql. Acredite, não vale a pena o espaço em disco se o log geral e o log de consultas lentas estiverem ativados e se acumulando no esquema mysql. Basta seguir as opções de despejo do MySQL Grants.

UPDATE 2011-09-19 15:54 EDT

Há um fator muito importante na manutenção de backups de permissões do MySQL via SQL Grants:

Cada usuário sai com sua senha em algum formato MD5 modificado. Para o mysql 4.0 e anteriores, é uma cadeia hexadecimal de 16 caracteres. Para o mysql 4.1+, são 41 caracteres (um asterisco seguido por uma cadeia hexadecimal de 40 caracteres).

Antes de restaurar um despejo do SQL Grants, verifique o arquivo de despejo do SQL Grants em busca de senhas hexadecimais de 16 caracteres. Se você vir um, você deve adicionar o seguinte ao /etc/my.cnf (ou my.ini para Windows) no servidor mysql para o qual você restaurará:

[mysqld]
old_password=1

A diretiva old_password permite que senhas de 16 caracteres e 41 caracteres coexistam e se autentiquem corretamente na mesma instância do mysql em execução. Todas as senhas criadas daqui para frente terão 16 caracteres.

Não é necessário reiniciar o MySQL. Basta executar o seguinte:

SET GLOBAL old_password = 1;
RolandoMySQLDBA
fonte
+1 para uma resposta completa.
Mircea Vutcovici 19/09/11
1
Gostaria de melhor significar o SHOW GRANTSSQL geração usando QUOTE(), como este:SELECT CONCAT('SHOW GRANTS FOR ',QUOTE(user),'@',QUOTE(host),';') FROM mysql.user WHERE user<>'';
kostix
11

Sim, você definitivamente deseja fazer backup do mysqlbanco de dados - é parte integrante do seu serviço. Embora você possa reconstruir o conteúdo de outras informações, a dificuldade de fazê-lo é proibitiva se você estiver tentando voltar ao serviço rapidamente.

mulher
fonte
1
+1 Se você não fizer backup do banco de dados mysql, as chances de ter um sistema danificado após a restauração são muito altas. Estive lá, fiz isso, consegui as cicatrizes mentais para provar isso.
John Gardeniers 19/09/11
6

Você pode restaurar o banco de dados mysql entre versões, pelo menos versões bastante recentes. Existe uma ferramenta chamada mysql_upgradeincluída em novas versões do MySQL que atualizará as tabelas do sistema para você.

http://dev.mysql.com/doc/refman/5.0/en/mysql-upgrade.html

HampusLi
fonte
Isso é verdade. Eu já vi casos em que alguns usam isso e atualizam perfeitamente. Eu já vi outros massacrá-lo. Do meu ponto de vista como um DBA MySQL. Eu perdi a fé nesse método. Como sua resposta reflete uma sólida fé em seu uso, você deve pertencer ao primeiro grupo. +1 por essa confiança no mysql_upgrade.
RolandoMySQLDBA 19/09/11
Quando importei o meu 5.6 para a versão 8.0, ele funcionou no servidor.
PHPst 3/08/19
5

Enquanto você restaurar para uma versão semelhante do mysql, poderá restaurar o banco de dados mysql a partir de um backup. Se você estiver em dúvida, faça uma diferença entre os esquemas do banco de dados mysql (o do backup e o do novo servidor mysql).

Mircea Vutcovici
fonte
+1 por ser o primeiro a mencionar a restauração do mysql para a mesma versão da qual você fez backup.
RolandoMySQLDBA 19/09/11