复制 `mysql` 数据库可以吗?

复制 `mysql` 数据库可以吗?

当我最初设置主到主复制时,我使用了:

binlog-ignore-db=mysql

并一直在手动同步用户帐户和授权。这只是在我正在使用的方法当时。但是有什么理由我不应该删除此行并允许mysql数据库本身也进行复制吗?

如果是这样:在我进行更改之前,除了确保所有授权都相同(或者更好地说,整个 mysql 数据库相同)之外,还有什么我应该仔细检查或注意的吗?

答案1

完全有可能在不知情的情况下授予自己 mysql 权限SQL GRANT 命令

示例:下面是从任何地方使用 SQL GRANT 创建具有完全权限的您自己的用户,名为 superdba,密码为 ClarkKent:

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

以下是不使用 GRANT 命令如何执行此操作:

首先,这是 MySQL 5.1.51 的 mysql.user

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)

只需执行以下 SQL 命令:

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 是合法的 SQL 语句,可以写入二进制日志。您是否希望有人运行此操作并让可见的密码在网络中传播?写入主服务器上的二进制日志?写入从服务器上的中继日志?

有这个指令

binlog-ignore-db=mysql       

防止使用此类 SQL 放弃 mysql 权限。但是,无法通过这种方式停止 GRANT。因此,请确保您按如下方式执行授权:

SET SQL_LOG_BIN=0;
GRANT ...

防止 GRANT 从主服务器传递到从服务器。

答案2

我在复制 mysql 数据库时没有遇到任何问题,但话又说回来,我的基础设施通过防火墙和代理设备提供了额外的安全级别,除了基础设施人员之外的任何人都不可能连接到 MySQL 使用的任何端口。它确实增加了额外的便利性,因为您知道只需授予一次权限并进行复制即可。归根结底,只要您正确设置主机,使其不向除预期之外的任何人(例如您、从属服务器等)公开,就应该没问题。

如果你过于担心中间人拦截,那么你总是可以选择发送通过 SSL 进行复制

相关内容