Devo eseguire il backup e ripristinare il database `mysql`?


15

Nel processo di creazione di una soluzione automatizzata per il backup e il ripristino di un intero server MySQL , mi sono imbattuto nel mysqldatabase che sembra contenere account utente, autorizzazioni, metadati, quel genere di cose. È necessario eseguire il backup di questo database? Il backup e il tentativo di ripristinarlo romperanno le cose?

Ho avuto un sacco di tempo su Google per "mysql backup del database mysql" come puoi immaginare.


3
Per eseguire un ripristino completo, è necessario eseguire il backup di tutto tranne il database "information_schema".
John Gardeniers,

Risposte:


16

Ecco qualcosa di interessante da considerare: il backup del mysqldatabase ti limita notevolmente in quanto puoi ripristinare tale database solo sulla stessa versione di mysql da cui hai eseguito il backup. Ecco perché:

Ecco mysql.user di 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)

Ecco mysql.user di 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)

Ecco mysql.user di 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 si tenta di ripristinare mysql.user su una versione di MySQL per cui non è stato progettato, genererà problemi di autorizzazione casuali. Il modo per eseguire il backup delle autorizzazioni utente mysql in modo indipendente dalla versione è scaricare le concessioni dell'utente in SQL. In questo modo, le concessioni dell'utente sono completamente portatili. Esistono due modi per ottenere questo risultato:

OPZIONE 1: Uso di MAATKIT

mk-show-grants genererà l'SQL necessario indipendentemente dall'istanza mysql a cui ti connetti. (Tieni presente che MAATKIT viene migrato su Percona Toolkit. Questo strumento sarà molto probabilmente chiamato pt-show-grants).

OPZIONE # 2: Script il dumping di SQL GRANTS

Ho scritto la mia emulazione di mk-show-grant. Tralascerà gli utenti anonimi. Sembra così:

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

L'uso di una di queste opzioni creerà un backup più stabile delle sovvenzioni dell'utente.

SU UNA NOTA SEPARATA

Ora se si utilizza questa opzione di output del registro

[mysqld]
log-output=TABLE

il database mysql popolerà il registro lento (se abilitato) come tabella mysql nello schema mysql anziché come file di testo. Pertanto, l'esecuzione di backup fisici includerà tali registri basati su tabella mysql. Credetemi, non vale lo spazio su disco se il registro generale e il registro delle query lente sono abilitati e si accumulano nello schema mysql. Segui le opzioni di dump di MySQL Grants.

AGGIORNAMENTO 2011-09-19 15:54 EDT

Esiste un fattore molto importante nel mantenimento dei backup delle autorizzazioni MySQL tramite SQL Grants:

Ogni utente esce con la propria password in un formato MD5 modificato. Per mysql 4.0 e versioni successive, è una stringa esadecimale di 16 caratteri. Per mysql 4.1+, ha 41 caratteri (un asterisco seguito da una stringa esadecimale di 40 caratteri).

Prima di ripristinare un dump di SQL Grants, controllare il file di dump di SQL Grants per eventuali password esadecimali di 16 caratteri. Se ne vedi anche uno, devi aggiungere quanto segue a /etc/my.cnf (o my.ini per Windows) sul server mysql che ripristinerai su:

[mysqld]
old_password=1

La direttiva old_password consente alle password 16 caratteri e 41 caratteri di coesistere e autenticarsi correttamente nella stessa istanza mysql in esecuzione. Le password create per il futuro avranno 16 caratteri.

Non è necessario il riavvio di MySQL. Esegui questo:

SET GLOBAL old_password = 1;

+1 per una risposta completa.
Mircea Vutcovici,

1
Farò meglio a sillabare la SHOW GRANTSgenerazione di SQL usando QUOTE(), in questo modo:SELECT CONCAT('SHOW GRANTS FOR ',QUOTE(user),'@',QUOTE(host),';') FROM mysql.user WHERE user<>'';
kostix

11

Sì, vuoi sicuramente eseguire il backup del mysqldatabase: è parte integrante del tuo servizio. Sebbene sia possibile ricostruirne il contenuto a partire da altre informazioni, la difficoltà a farlo è proibitiva se si tenta di tornare rapidamente in servizio.


1
+1 Se non si esegue il backup del database mysql, le probabilità di avere un sistema guasto dopo aver effettuato un ripristino sono molto alte. Sono stato lì, fatto quello, ho avuto le cicatrici mentali per dimostrarlo.
John Gardeniers,

6

È possibile ripristinare il database mysql tra le versioni, almeno versioni abbastanza recenti. C'è uno strumento chiamato mysql_upgradeincluso nelle nuove versioni di MySQL che aggiornerà le tabelle di sistema per te.

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


Questo è molto vero Ho visto casi in cui alcuni usano questo e si aggiornano perfettamente. Ho visto altri macellarlo. Dal mio punto di vista come DBA MySQL. Ho perso la fiducia in quel metodo. Poiché la tua risposta riflette una solida fiducia nel suo utilizzo, devi appartenere al primo gruppo. +1 per tale fiducia in mysql_upgrade.
RolandoMySQLDBA,

Quando ho importato la mia 5.6 nella versione 8.0, ha funzionato male il server.
PHPst

5

Finché ripristini una versione mysql simile, puoi ripristinare il database mysql da un backup. In caso di dubbi, basta fare una differenza tra gli schemi del database mysql (quello dal backup e quello dal nuovo server mysql).


+1 per essere stato il primo a menzionare il ripristino di mysql alla stessa versione da cui è stato eseguito il backup.
RolandoMySQLDBA
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.