Tôi có nên sao lưu và khôi phục cơ sở dữ liệu `mysql` không?


15

Trong quá trình tạo ra một giải pháp tự động để sao lưu và khôi phục toàn bộ máy chủ MySQL , tôi đã đi qua mysqlcơ sở dữ liệu dường như chứa tài khoản người dùng, quyền, siêu dữ liệu, loại đó. Cơ sở dữ liệu này có nên được sao lưu? Sẽ sao lưu và cố gắng khôi phục nó phá vỡ mọi thứ?

Tôi đã có một thời gian googling cho "mysql sao lưu cơ sở dữ liệu mysql" như bạn có thể tưởng tượng.


3
Để khôi phục hoàn toàn, bạn cần sao lưu mọi thứ trừ cơ sở dữ liệu "information_schema".
John Gardeniers

Câu trả lời:


16

Đây là một điều thú vị để xem xét: Sao lưu mysqlcơ sở dữ liệu giới hạn bạn rất nhiều ở chỗ bạn chỉ có thể khôi phục cơ sở dữ liệu đó vào cùng một phiên bản mysql mà bạn đã chạy bản sao lưu từ đó. Đây là lý do tại sao:

Đây là mysql.user từ 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)

Đây là mysql.user từ 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)

Đây là mysql.user từ 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)

Nếu bạn cố gắng khôi phục mysql.user thành phiên bản MySQL, điều đó không có nghĩa, nó sẽ tạo ra các vấn đề về quyền ngẫu nhiên. Cách để sao lưu các quyền của người dùng mysql theo cách không biết phiên bản là kết xuất các khoản trợ cấp của người dùng trong SQL. Bằng cách đó, các khoản tài trợ của người dùng là hoàn toàn di động. Có hai cách để thực hiện điều này:

TÙY CHỌN # 1: Sử dụng MAATKIT

mk-show-Grants sẽ tạo ra SQL cần thiết cho bất kỳ trường hợp mysql nào bạn kết nối. (Hãy nhớ rằng MAATKIT đang được di chuyển sang Bộ công cụ Percona. Công cụ này rất có thể sẽ được gọi là pt-show-Grants).

TÙY CHỌN # 2: Kịch bản bán phá giá SQL GRANTS

Tôi đã viết mô phỏng của riêng tôi về mk-show-Grants. Nó sẽ loại bỏ người dùng ẩn danh. Nó trông như thế này:

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

Sử dụng một trong hai tùy chọn này sẽ tạo ra một bản sao lưu tài trợ người dùng ổn định hơn.

TRÊN MỘT LƯU Ý RIÊNG

Bây giờ nếu bạn đang sử dụng tùy chọn log-output này

[mysqld]
log-output=TABLE

cơ sở dữ liệu mysql sẽ điền vào nhật ký chậm (nếu được bật) dưới dạng bảng mysql trong lược đồ mysql chứ không phải là tệp văn bản. Vì vậy, thực hiện sao lưu vật lý sẽ bao gồm các bản ghi dựa trên bảng mysql như vậy. Tin tôi đi, nó không có giá trị cho không gian đĩa nếu nhật ký chung và nhật ký truy vấn chậm được kích hoạt và chồng chất trong lược đồ mysql. Chỉ cần gắn bó với các tùy chọn kết xuất tài trợ của MySQL.

CẬP NHẬT 2011-09-19 15:54 EDT

Có một yếu tố rất quan trọng trong việc duy trì sao lưu quyền của MySQL thông qua SQL Grants:

Mỗi người dùng đi ra với mật khẩu của họ ở một số định dạng MD5 được sửa đổi. Đối với mysql 4.0 trở lại, nó là một chuỗi thập lục phân 16 ký tự. Đối với mysql 4.1+, nó là 41 ký tự (Dấu hoa thị theo sau là chuỗi thập lục phân 40 ký tự).

Trước khi bạn khôi phục kết xuất SQL Grants, hãy kiểm tra tệp kết xuất SQL Grants để biết mật khẩu thập lục phân 16 ký tự. Nếu bạn nhìn thấy ngay cả một, bạn phải thêm đoạn sau vào /etc/my.cnf (hoặc my.ini cho Windows) trên máy chủ mysql mà bạn sẽ khôi phục lại:

[mysqld]
old_password=1

Lệnh old_password cho phép mật khẩu 16 char và 41 char cùng tồn tại và xác thực chính xác trong cùng một ví dụ mysql đang chạy. Bất kỳ mật khẩu nào được tạo trong tương lai sẽ có 16 ký tự.

Khởi động lại MySQL là không cần thiết. Chỉ cần chạy này:

SET GLOBAL old_password = 1;

+1 cho câu trả lời hoàn chỉnh.
Mircea Vutcovici

1
Tôi nên đánh vần SHOW GRANTSSQL thế hệ bằng cách sử dụng QUOTE(), như thế này:SELECT CONCAT('SHOW GRANTS FOR ',QUOTE(user),'@',QUOTE(host),';') FROM mysql.user WHERE user<>'';
kostix

11

Có, bạn chắc chắn muốn sao lưu mysqlcơ sở dữ liệu - đó là một phần không thể thiếu trong dịch vụ của bạn. Mặc dù bạn có thể xây dựng lại nội dung của nó từ các thông tin khác, nhưng khó khăn trong việc này là nghiêm cấm nếu bạn đang cố gắng nhanh chóng quay lại dịch vụ.


1
+1 Nếu bạn không sao lưu cơ sở dữ liệu mysql, tỷ lệ có hệ thống bị hỏng sau khi thực hiện khôi phục là rất cao. Ở đó, làm điều đó, có những vết sẹo tinh thần để chứng minh điều đó.
John Gardeniers

6

Bạn có thể khôi phục cơ sở dữ liệu mysql giữa các phiên bản, ít nhất là các phiên bản gần đây. Có một công cụ được gọi là mysql_upgradebao gồm trong các phiên bản mới của MySQL sẽ nâng cấp các bảng hệ thống cho bạn.

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


Thật là quá đúng. Tôi đã thấy trường hợp một số sử dụng này và nâng cấp hoàn hảo. Tôi đã thấy người khác bán thịt nó. Từ quan điểm của tôi là một DBA MySQL. Tôi đã mất niềm tin vào phương pháp đó. Vì câu trả lời của bạn phản ánh niềm tin âm thanh trong việc sử dụng nó, bạn phải thuộc nhóm đầu tiên. +1 cho sự tự tin như vậy trong mysql_upTHER.
RolandoMySQLDBA

Khi tôi nhập phiên bản 5.6 của mình vào phiên bản 8.0, nó đã làm hỏng máy chủ.
PHP

5

Miễn là bạn khôi phục lại phiên bản mysql tương tự, bạn có thể khôi phục cơ sở dữ liệu mysql từ bản sao lưu. Nếu bạn nghi ngờ, chỉ cần tạo một sự khác biệt giữa các lược đồ cơ sở dữ liệu mysql (một từ bản sao lưu và một từ máy chủ mysql mới).


+1 vì là người đầu tiên đề cập đến việc khôi phục mysql cho cùng phiên bản mà bạn đã sao lưu.
RolandoMySQLDBA
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.