Có thể sao chép cơ sở dữ liệu `mysql` không?


15

Khi tôi thiết lập bản sao chính chủ của mình, tôi đã sử dụng:

binlog-ignore-db=mysql

và đã được đồng bộ hóa các tài khoản người dùng và cấp bằng tay. Đây chỉ đơn giản là cách nó được thực hiện theo cách tôi đang sử dụng vào thời điểm đó. Nhưng có lý do nào khiến tôi không nên xóa dòng này và cho phép mysqlcơ sở dữ liệu tự sao chép không?

Nếu vậy: Trước khi tôi thực hiện thay đổi, ngoài việc đảm bảo rằng tất cả các khoản tài trợ đều giống nhau trên cả hai (hoặc nói rõ hơn, toàn bộ cơ sở dữ liệu mysql là giống hệt nhau), có điều gì khác tôi nên kiểm tra lại hoặc nhận biết không?


Trong 4,5 năm qua, tôi đã liên tục phải vật lộn với các vấn đề sao chép khi nâng cấp mysql, ngay cả trên các nâng cấp nhỏ. Lý do là apt-get upgrade(trên thực tế, tập lệnh postinst mysql-server .deb) thực thi các ALTER TABLE usercâu lệnh không thể sao chép. Tôi đã đăng một giải pháp làm việc tại serverfault.com/questions/686025/ từ
dlo

Câu trả lời:


12

Hoàn toàn có thể cung cấp cho mình quyền mysql mà không cần biết các lệnh SQL GRANT .

Ví dụ: Đây là để tạo người dùng của riêng bạn với đầy đủ các đặc quyền sử dụng SQL GRANT từ bất kỳ nơi nào được gọi là superdba với mật khẩu của ClarkKent:

GRANT ALL PRIVILEGES ON *.* TO superdba@'%' IDENTIFIED BY 'ClarkKent' WITH GRANT OPTION; 

Đây là cách bạn có thể làm điều này mà không cần lệnh GRANT:

Trước hết, đây là mysql.user cho MySQL 5.1.51

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)

Chỉ cần thực thi các lệnh SQL này:

INSERT INTO mysql.user SET
Host='%',User='superdba',Password=PASSWORD('ClarkKent'),
Select_priv='Y',Insert_priv='Y',Update_priv='Y',Delete_priv='Y',
Create_priv='Y',Drop_priv='Y',Reload_priv='Y',Shutdown_priv='Y',
Process_priv='Y',File_priv='Y',Grant_priv='Y',References_priv='Y',
Index_priv='Y',Alter_priv='Y',Show_db_priv='Y',Super_priv='Y',
Create_tmp_table_priv='Y',Lock_tables_priv='Y',Execute_priv='Y',
Repl_slave_priv='Y',Repl_client_priv='Y',Create_view_priv='Y',
Show_view_priv='Y',Create_routine_priv='Y',Alter_routine_priv='Y',
Create_user_priv='Y',Event_priv='Y',Trigger_priv='Y';
FLUSH PRIVILEGES;

INSERT đó là một câu lệnh SQL hợp pháp có thể nằm trong nhật ký nhị phân. Bạn có muốn ai đó chạy cái này và có mật khẩu hiển thị trên mạng không? để ngồi trong một bản ghi nhị phân trên bản gốc? để ngồi trong một bản ghi tiếp sức trên nô lệ?

Có chỉ thị này

binlog-ignore-db=mysql       

ngăn chặn việc cho phép mysql sử dụng SQL như vậy. Tuy nhiên, GRANT không thể dừng theo cách này. Do đó, hãy đảm bảo bạn thực hiện các khoản tài trợ như thế này:

SET SQL_LOG_BIN=0;
GRANT ...

để ngăn chặn các GRANT đi qua từ chủ đến nô lệ.


Ôi, chờ đã ... Tôi bối rối: Bạn đang nói rằng các câu lệnh GRANT sao chép bất kể câu lệnh binlog-ign-db nói gì? Tôi biết nếu tôi tạo một người dùng mới trên một máy chủ, thì người dùng đó sẽ không xuất hiện trên máy chủ kia. Vì vậy, có lẽ bạn có nghĩa là GRANT được truyền và lưu trữ nhưng đơn giản là không được áp dụng trên nô lệ?
dlo

GRANTS được áp dụng mà không có bất kỳ khối đường. Đó là lý do tại sao bạn phải chạy SET SQL_LOG_BIN = 0; trong phiên mysql để ngăn chặn bất kỳ lệnh GRANT nào vào nhật ký nhị phân.
RolandoMySQLDBA

GRANTS được áp dụng mà không có bất kỳ khối đường trên chủ và nô lệ. Đó là lý do tại sao bạn phải chạy SET SQL_LOG_BIN = 0; trong phiên mysql để ngăn chặn bất kỳ lệnh GRANT nào nhập vào nhật ký nhị phân và duyệt qua các bản ghi chuyển tiếp của nô lệ.
RolandoMySQLDBA

1
Đồng ý. Để rõ ràng cho những người khác, tôi tin rằng bạn đang cảnh báo tôi về GRANTS lộ mật khẩu trong quá trình (có thể được giải quyết với đề xuất SSL của Scott) và được lưu trữ văn bản rõ ràng trong binlog. Bạn đang đề xuất rằng nếu đó là những mối quan tâm đối với tôi, thì tôi nên sử dụng cả binlog- ign -db = mysql SET SQL_LOG_BIN = 0;. Nhưng nếu tôi ổn với những điều kiện đó, sẽ không có vấn đề gì với việc sao chép GRANT bằng cách xóa dòng binlog-ign-db. Chính xác cho tôi nếu đây là một bản tóm tắt không chính xác.
dlo

@dlo - Khẳng định !!!
RolandoMySQLDBA

4

Tôi không gặp vấn đề gì với việc sao chép cơ sở dữ liệu mysql, nhưng một lần nữa, cơ sở hạ tầng của tôi cho vay một mức độ bảo mật bổ sung với tường lửa và thiết bị proxy mà không ai khác ngoài cơ sở hạ tầng có thể kết nối trên bất kỳ cổng nào mà MySQL sử dụng . Nó có thêm một mức độ tiện lợi khi biết rằng bạn chỉ phải cấp quyền một lần và được nhân rộng. Khi nó sôi sùng sục, miễn là bạn đã đặt máy chủ đúng cách để không phơi bày nó cho bất kỳ ai khác ngoài dự định (ví dụ: bạn, nô lệ, v.v ...), bạn sẽ ổn thôi.

Nếu bạn quá quan tâm đến con người trong các can thiệp ở giữa, luôn có tùy chọn gửi sao chép qua SSL .

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.