浅析mysql主从复制中复制用户的权限管理

    在用复制账号对mysql salve管理过程中,使用哪些权限合适?首先看一下mysql官方提供的权限表:

权限

上下文

CREATE

Create_priv

数据库、表或索引

DROP

Drop_priv

数据库或表

GRANT OPTION

Grant_priv

数据库、表或保存的程序

REFERENCES

References_priv

数据库或表

ALTER

Alter_priv

DELETE

Delete_priv

INDEX

Index_priv

INSERT

Insert_priv

SELECT

Select_priv

UPDATE

Update_priv

CREATE VIEW

Create_view_priv

视图

SHOW VIEW

Show_view_priv

视图

ALTER ROUTINE

Alter_routine_priv

保存的程序

CREATE ROUTINE

Create_routine_priv

保存的程序

EXECUTE

Execute_priv

保存的程序

FILE

File_priv

服务器主机上的文件访问

CREATE TEMPORARY TABLES

Create_tmp_table_priv

服务器管理

LOCK TABLES

Lock_tables_priv

服务器管理

CREATE USER

Create_user_priv

服务器管理

PROCESS

Process_priv

服务器管理

RELOAD

Reload_priv

服务器管理

REPLICATION CLIENT

Repl_client_priv

服务器管理

REPLICATION SLAVE

Repl_slave_priv

服务器管理

SHOW DATABASES

Show_db_priv

服务器管理

SHUTDOWN

Shutdown_priv

服务器管理

SUPER

Super_priv

服务器管理

    怎样找到复制账户的最小权限?

    首先使用root账号登陆,收回复制账号repl_user的所有权限:

mysql> select user();

+----------------+

| user()         |

+----------------+

| root@localhost |

+----------------+

1 row in set (0.00 sec)

mysql> revoke all on *.* from repl_user;

Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

    其次使用repl_user登陆:

mysql> show slave status\G;

ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER,REPLICATION CLIENT privilege(s) for this operation

    错误提示,至少需要SUPER和REPLICATION CLIENT这两个权限之一。

    (1)赋予REPLICATION CLIENT权限给repl_user

mysql> grant REPLICATION CLIENT ON *.* TO repl_user;

Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;

*************************** 1. row ***************************

               Slave_IO_State: Connecting to master

                  Master_Host: 192.168.6.100

                  Master_User: repl_user

                  Master_Port: 3306

                Connect_Retry: 60

                            ......

    show slave status\G;状态查看正常,但是管理slave提示如下:

mysql> stop slave;

ERROR 1045 (28000): Access denied for user ‘repl_user‘@‘%‘ (using password: YES)

    (2)赋予REPLICATION SLAVE权限给repl_user:

mysql> grant REPLICATION SLAVE ON *.* TO repl_user;

Query OK, 0 rows affected (0.00 sec)

mysql> stop slave;

ERROR 1045 (28000): Access denied for user ‘repl_user‘@‘%‘ (using password: YES)

mysql> SELECT Repl_slave_priv,Repl_client_priv,super_priv FROM mysql.USER WHERE USER=‘repl_user‘;

+-----------------+------------------+------------+

| Repl_slave_priv | Repl_client_priv | super_priv |

+-----------------+------------------+------------+

| Y               | Y                | N          |

+-----------------+------------------+------------+

1 row in set (0.00 sec)

    (3)赋予SUPER权限给repl_user:

mysql> grant SUPER ON *.* TO repl_user;

Query OK, 0 rows affected (0.00 sec)

mysql> stop slave;

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> start slave;

Query OK, 0 rows affected, 1 warning (0.00 sec)

    (4)赋予RELOAD权限给repl_user

    在没有RELOAD权限时提示如下错误:

mysql> reset slave;

ERROR 1227 (42000): Access denied; you need (at least one of) the RELOAD privilege(s) for this operation

mysql> grant reload on *.* to repl_user;

Query OK, 0 rows affected (0.00 sec)

mysql> reset slave;

Query OK, 0 rows affected (0.00 sec)

    最后,总结如下:

    REPLICATION CLIENT(客户端)、REPLICATION SLAVE(服务端)、SUPER(管理)和RELOAD四个权限最好在创建用户时就赋予,以免造成不必要的麻烦,当然,要是主主配置,最好给予ALL权限。

    上述只是在工作中的一点思考,希望看到这篇博文的博友给予指正。

    

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。