ฉันควรสำรองและกู้คืนฐานข้อมูล `mysql 'หรือไม่


15

ในกระบวนการสร้างโซลูชันอัตโนมัติสำหรับการสำรองและกู้คืนเซิร์ฟเวอร์ MySQL ทั้งหมดฉันเจอmysqlฐานข้อมูลที่ดูเหมือนว่ามีบัญชีผู้ใช้สิทธิ์ metadata สิ่งนั้น ควรสำรองฐานข้อมูลนี้หรือไม่ การสำรองและพยายามกู้คืนมันจะทำลายทุกสิ่งหรือไม่

ฉันมีเวลาที่ Googling สำหรับ "mysql สำรองฐานข้อมูล mysql" ที่คุณสามารถจินตนาการ


3
ในการทำการกู้คืนแบบเต็มคุณจำเป็นต้องสำรองข้อมูลทุกอย่างยกเว้นฐานข้อมูล "information_schema"
John Gardeniers

คำตอบ:


16

นี่คือสิ่งที่น่าสนใจที่ต้องพิจารณา: การสำรองmysqlฐานข้อมูลจะ จำกัด คุณอย่างมากในการที่คุณสามารถกู้คืนฐานข้อมูลดังกล่าวเป็น mysql รุ่นเดียวกันที่คุณใช้ในการสำรองข้อมูล นี่คือเหตุผล:

นี่คือ mysql.user จาก 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)

นี่คือ mysql.user จาก 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)

นี่คือ mysql.user จาก 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)

หากคุณพยายามคืนค่า mysql.user ให้เป็นเวอร์ชันของ MySQL ที่ไม่ได้มีไว้ใช้ก็จะสร้างปัญหาการอนุญาตแบบสุ่ม วิธีการสำรองข้อมูลสิทธิ์ผู้ใช้ mysql ในแบบที่ไม่เชื่อเรื่องพระเจ้าคือการถ่ายโอนข้อมูลผู้ใช้ที่ให้สิทธิ์ใน SQL ด้วยวิธีนี้ผู้ใช้ถือเป็นพกพาอย่างสมบูรณ์ มีสองวิธีในการทำสิ่งนี้:

OPTION # 1: การใช้ MAATKIT

mk-show-grantsจะสร้าง SQL ที่ต้องการอินสแตนซ์ mysql ที่คุณเชื่อมต่อ (โปรดทราบว่า MAATKIT จะถูกย้ายไปยัง Percona Toolkit เครื่องมือนี้มักจะถูกเรียกว่า pt-show-grants)

OPTION # 2: สคริปต์การทิ้งของ SQL GRANTS

ฉันเขียนการจำลอง mk-show-grants ของฉันเอง มันจะออกจากผู้ใช้ที่ไม่ระบุชื่อ ดูเหมือนว่านี้:

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

การใช้ตัวเลือกใดตัวเลือกหนึ่งเหล่านี้จะสร้างการสำรองข้อมูลของผู้ใช้ที่มีเสถียรภาพ

บนหมายเหตุแยก

ตอนนี้ถ้าคุณใช้ตัวเลือกบันทึกเอาท์พุท

[mysqld]
log-output=TABLE

ฐานข้อมูล mysql จะเติมข้อมูลบันทึกช้า (ถ้าเปิดใช้งาน) เป็นตาราง mysql ใน schema mysql มากกว่าไฟล์ข้อความ ดังนั้นการสำรองข้อมูลจริงจะรวมถึงไฟล์บันทึกแบบตาราง mysql เชื่อฉันจะไม่คุ้มค่าพื้นที่ใช้งานหากบันทึกทั่วไปและบันทึกแบบสอบถามช้าเปิดใช้งานและซ้อนขึ้นใน schema mysql เพียงติดกับ MySQL Grants Dump Options

อัพเดท 2011-09-25 15:54 EDT

มีปัจจัยสำคัญอย่างหนึ่งในการบำรุงรักษาการสำรองข้อมูลสิทธิ์ MySQL ผ่าน SQL Grants:

ผู้ใช้แต่ละคนออกมาพร้อมรหัสผ่านในรูปแบบ MD5 ที่แก้ไขบางส่วน สำหรับ mysql 4.0 และย้อนกลับเป็นสตริงเลขฐานสิบหก 16 ตัว สำหรับ mysql 4.1+ จะเป็นอักขระ 41 ตัว (เครื่องหมายดอกจันตามด้วยสตริงเลขฐานสิบหก 40 อักขระ)

ก่อนที่คุณจะกู้คืนดัมพ์ของ SQL Grants ให้ตรวจสอบไฟล์ดัมพ์ของ SQL Grants สำหรับรหัสผ่านเลขฐานสิบหก 16 อักขระใด ๆ หากคุณเห็นแม้แต่รายการเดียวคุณต้องเพิ่มสิ่งต่อไปนี้ใน /etc/my.cnf (หรือ my.ini สำหรับ Windows) บนเซิร์ฟเวอร์ mysql ที่คุณจะกู้คืนไปที่:

[mysqld]
old_password=1

old_passwordสั่งอนุญาตให้ 16 ถ่านและถ่าน 41 รหัสผ่านที่จะอยู่ร่วมกันได้อย่างถูกต้องและรับรองความถูกต้องในกรณีที่ทำงาน MySQL เดียวกัน รหัสผ่านที่สร้างขึ้นไปข้างหน้าจะมีความยาว 16 ตัวอักษร

ไม่จำเป็นต้องทำการรีสตาร์ท MySQL เรียกใช้สิ่งนี้:

SET GLOBAL old_password = 1;

+1 สำหรับคำตอบที่สมบูรณ์
Mircea Vutcovici

1
ฉันดีกว่าจะสะกดSHOW GRANTSSQL รุ่นที่ใช้QUOTE()เช่นนี้SELECT CONCAT('SHOW GRANTS FOR ',QUOTE(user),'@',QUOTE(host),';') FROM mysql.user WHERE user<>'';
kostix

11

ใช่คุณต้องการสำรองmysqlฐานข้อมูลอย่างแน่นอน- เป็นส่วนสำคัญของบริการของคุณ แม้ว่าคุณจะสามารถสร้างเนื้อหาจากข้อมูลอื่นได้ แต่ความยากลำบากในการทำเช่นนั้นเป็นสิ่งต้องห้ามหากคุณพยายามที่จะกลับไปใช้บริการได้อย่างรวดเร็ว


1
+1 หากคุณไม่ทำการสำรองฐานข้อมูล mysql โอกาสที่จะมีระบบเสียหลังจากทำการกู้คืนนั้นสูงมาก เคยไปที่นั่นทำแล้วมีแผลเป็นจิตเพื่อพิสูจน์มัน
John Gardeniers

6

คุณสามารถคืนค่าฐานข้อมูล mysql ระหว่างรุ่นอย่างน้อยที่สุดก็ค่อนข้างล่าสุด มีเครื่องมือที่เรียกว่าmysql_upgradeรวมอยู่ใน MySQL เวอร์ชันใหม่ที่จะอัพเกรดตารางระบบสำหรับคุณ

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


นี่เป็นเรื่องจริง ฉันเคยเห็นกรณีที่บางคนใช้สิ่งนี้และอัปเกรดได้อย่างสมบูรณ์แบบ ฉันเคยเห็นคนอื่นเขียงมัน จากมุมมองของฉันเป็น MySQL DBA ฉันสูญเสียศรัทธาในวิธีการนั้น เนื่องจากคำตอบของคุณสะท้อนถึงความเชื่อมั่นในการใช้งานคุณต้องมาจากกลุ่มแรก +1 เพื่อความมั่นใจใน mysql_upgrade
RolandoMySQLDBA

เมื่อฉันนำเข้า 5.6 ของฉันไปเป็นเวอร์ชั่น 8.0 มันก็บอร์กเซิร์ฟเวอร์
PHPst

5

ตราบใดที่คุณคืนค่าเป็นเวอร์ชัน mysql ที่คล้ายกันคุณสามารถกู้คืนฐานข้อมูล mysql จากข้อมูลสำรองได้ หากคุณมีข้อสงสัยให้สร้างความแตกต่างระหว่างสกีมาฐานข้อมูล mysql (หนึ่งจากการสำรองข้อมูลและจากเซิร์ฟเวอร์ mysql ใหม่)


+1 ที่กล่าวถึงการเรียกคืน mysql เป็นเวอร์ชันเดียวกันกับที่คุณสำรองไว้
RolandoMySQLDBA
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.