复制mysql数据库是否可以?


15

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

binlog-ignore-db=mysql

并且一直在手动同步用户帐户和授权。这就是我当时使用的方法中所做的简单操作。但是,有什么原因为什么我不应该删除此行并允许mysql数据库本身也进行复制?

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


在过去的4.5年中,即使在进行较小的升级时,我也一直在升级mysql时遇到复制问题。原因是apt-get upgrade(实际上是mysql-server .deb postinst脚本)执行ALTER TABLE user了无法复制的语句。我在serverfault.com/questions/686025/…上
dlo 2015年

Answers:


12

完全可以在不知道SQL GRANT命令的情况下给自己mysql权限。

示例:这里是使用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从主机传播到从机。


哦,等等...我很困惑:无论binlog-ignore-db conf怎么说,您是说GRANT语句都在复制吗?我知道如果我在一台服务器上创建一个新用户,那么该用户不会出现在另一台服务器上。那么,也许您的意思是GRANT被传输并存储了,但根本没有应用于从站?
dlo 2011年

可以不受任何限制地申请授予。这就是为什么必须运行SET SQL_LOG_BIN = 0的原因。在mysql会话中,以防止任何GRANT命令输入二进制日志。
RolandoMySQLDBA 2011年

可以在主站和从站上不受任何障碍地应用格兰特。这就是为什么必须运行SET SQL_LOG_BIN = 0的原因。在mysql会话中,以防止任何GRANT命令输入二进制日志并遍历到从站的中继日志。
RolandoMySQLDBA 2011年

1
好。只是为了让其他人知道,我相信您是在警告我,GRANTS会在传输过程中暴露密码(可以通过Scott的SSL建议来解决)并将明文存储在binlog中。您建议如果这些对我来说很重要,那么我应该同时使用binlog-ignore-db = mysql SET SQL_LOG_BIN = 0;。但是,如果我对这些条件满意,那么通过删除binlog-ignore-db行来复制GRANT并没有特别的问题。如果这是不正确的摘要,请纠正我。
dlo 2011年

@dlo-肯定!
RolandoMySQLDBA 2011年

4

复制mysql数据库没有问题,但是我的基础架构又提供了防火墙和代理设备的更高级别的安全性,除了基础架构人员之外,其他任何人都无法连接MySQL使用的任何端口。知道您只需要授予一次权限并进行复制,就可以为您带来额外的便利。当问题归结为它时,只要您已正确设置主机,以使其不暴露给预期以外的任何其他人(例如,您,从属设备等),就可以了。

如果您在中间拦截中过分关心人,则始终可以选择通过SSL发送复制

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.