Soll ich die mysql-Datenbank sichern und wiederherstellen?

15

Bei der Erstellung einer automatisierten Lösung zum Sichern und Wiederherstellen eines gesamten MySQL-Servers bin ich auf die mysqlDatenbank gestoßen, die anscheinend Benutzerkonten, Berechtigungen, Metadaten usw. enthält. Soll diese Datenbank gesichert werden? Bricht die Sicherung und der Versuch, sie wiederherzustellen, die Dinge?

Ich hatte eine verdammte Zeit damit, nach "mysql backuping mysql database" zu suchen, wie Sie sich vorstellen können.

Daniel Beardsley
quelle
3
Um eine vollständige Wiederherstellung durchzuführen, müssen Sie alles außer der Datenbank "information_schema" sichern.
John Gardeniers

Antworten:

16

Hier ist etwas Interessantes zu beachten: Durch mysqldas Sichern der Datenbank sind Sie stark eingeschränkt, da Sie eine solche Datenbank nur auf der gleichen Version von mysql wiederherstellen können, von der Sie die Sicherung ausgeführt haben. Hier ist warum:

Hier ist mysql.user von 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)

Hier ist mysql.user aus 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)

Hier ist mysql.user von 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)

Wenn Sie versuchen, mysql.user auf eine MySQL-Version zurückzusetzen, für die es nicht gedacht war, treten zufällige Berechtigungsprobleme auf. Die Möglichkeit, die mysql-Benutzerberechtigungen versionsunabhängig zu sichern, besteht darin, die Benutzerberechtigungen in SQL zu sichern. Auf diese Weise sind die Benutzerstipendien vollständig portierbar. Es gibt zwei Möglichkeiten, dies zu erreichen:

OPTION 1: Verwenden von MAATKIT

mk-show-grants generiert die SQL, die für jede MySQL-Instanz benötigt wird, zu der Sie eine Verbindung herstellen. (Beachten Sie, dass MAATKIT auf das Percona Toolkit migriert wird. Dieses Tool wird höchstwahrscheinlich als pt-show-grants bezeichnet.)

OPTION 2: Schreiben Sie das Dumping der SQL-GRANTS

Ich habe meine eigene Emulation von mk-show-grants geschrieben. Es werden anonyme Benutzer ausgelassen. Es sieht aus wie das:

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

Wenn Sie eine dieser Optionen verwenden, wird eine stabilere Sicherung der Benutzerbewilligungen erstellt.

AUF EINEM SEPARATEN HINWEIS

Nun , wenn Sie diese verwenden log-Ausgabe - Option

[mysqld]
log-output=TABLE

Die MySQL-Datenbank füllt das langsame Protokoll (falls aktiviert) als MySQL-Tabelle im MySQL-Schema und nicht als Textdatei. Wenn Sie also physische Sicherungen durchführen, werden solche MySQL-Tabellen-basierten Protokolle eingeschlossen. Glauben Sie mir, es ist den Speicherplatz nicht wert, wenn das allgemeine Protokoll und das langsame Abfrageprotokoll aktiviert sind und sich im mysql-Schema häufen. Halten Sie sich einfach an die MySQL Grants Dump-Optionen.

UPDATE 19.09.2011 15:54 EDT

Es gibt einen sehr wichtigen Faktor bei der Sicherung von MySQL-Berechtigungen über SQL Grants:

Jeder Benutzer gibt sein Kennwort in einem geänderten MD5-Format heraus. Bei MySQL 4.0 und früheren Versionen handelt es sich um eine hexadezimale Zeichenfolge mit 16 Zeichen. Ab MySQL 4.1 sind es 41 Zeichen (ein Sternchen, gefolgt von einer 40-stelligen hexadezimalen Zeichenfolge).

Überprüfen Sie vor dem Wiederherstellen eines SQL Grants-Dumps die SQL Grants-Dump-Datei auf hexadezimale Kennwörter mit 16 Zeichen. Wenn Sie auch nur eines sehen, müssen Sie Folgendes zu /etc/my.cnf (oder my.ini für Windows) auf dem MySQL-Server hinzufügen, auf dem Sie wiederherstellen möchten:

[mysqld]
old_password=1

Mit der old_password- Direktive können 16- Zeichen- und 41- Zeichen -Kennwörter in derselben laufenden mysql-Instanz koexistieren und korrekt authentifiziert werden. Alle künftig erstellten Passwörter bestehen aus 16 Zeichen.

Ein Neustart von MySQL ist nicht erforderlich. Führen Sie einfach Folgendes aus:

SET GLOBAL old_password = 1;
RolandoMySQLDBA
quelle
+1 für eine vollständige Antwort.
Mircea Vutcovici
1
Ich würde die SHOW GRANTSSQL-Generierung besser folgendermaßen buchstabieren QUOTE():SELECT CONCAT('SHOW GRANTS FOR ',QUOTE(user),'@',QUOTE(host),';') FROM mysql.user WHERE user<>'';
kostix
11

Ja, Sie möchten die mysqlDatenbank auf jeden Fall sichern - sie ist ein wesentlicher Bestandteil Ihres Service. Während Sie den Inhalt anhand anderer Informationen rekonstruieren können, ist die Schwierigkeit, dies zu tun, unerschwinglich, wenn Sie versuchen, den Service schnell wieder aufzunehmen.

womble
quelle
1
+1 Wenn Sie die MySQL-Datenbank nicht sichern, ist die Wahrscheinlichkeit eines Systembruchs nach einer Wiederherstellung sehr hoch. Dort gewesen, das getan, hatte die mentalen Narben, um es zu beweisen.
John Gardeniers
6

Sie können die MySQL-Datenbank zwischen den Versionen wiederherstellen, zumindest in relativ neuen Versionen. mysql_upgradeIn neuen Versionen von MySQL ist ein Tool namens enthalten, das die Systemtabellen für Sie aktualisiert.

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

HampusLi
quelle
Das ist sehr wahr. Ich habe Fälle gesehen, in denen einige dies nutzen und einfach perfekt upgraden. Ich habe gesehen, wie andere es schlachteten. Aus meiner Sicht als MySQL DBA. Ich habe das Vertrauen in diese Methode verloren. Da Ihre Antwort ein solides Vertrauen in ihre Verwendung widerspiegelt, müssen Sie zur ersten Gruppe gehören. +1 für ein solches Vertrauen in mysql_upgrade.
RolandoMySQLDBA
Als ich mein 5.6 in 8.0 importierte, war der Server kaputt.
PHPst
5

Solange Sie eine ähnliche MySQL-Version wiederherstellen, können Sie die MySQL-Datenbank aus einer Sicherung wiederherstellen. Wenn Sie sich nicht sicher sind, unterscheiden Sie einfach die MySQL-Datenbankschemata (das aus der Sicherung und das aus dem neuen MySQL-Server).

Mircea Vutcovici
quelle
+1 für die erste Erwähnung der Wiederherstellung von MySQL auf dieselbe Version, von der Sie eine Sicherungskopie erstellt haben.
RolandoMySQLDBA