Mysql cluster用户权限共享
我们知道,正常情况下每个mysql server的用户权限表在数据库中是采用MYISAM存储引擎保存的,这就意味着在一个mysql节点创建的用户只能访问那一个节点,如果要访问mysql cluster中的其他的sql节点,就需要在其他sql节点都重复的创建,这就使mysql cluster中的权限管理变得非常的痛苦。现在mysql cluster 7.2提供了对分布式mysql数据库用户的支持,实现了在整个mysql cluster中共享用户权限,使我们的权限管理变得简单、高效。
这篇文章,我们来学习下如何通过一些操作来实现mysql cluster权限共享
首先,你需要搭建一套含有多个sql节点的mysql cluster 7.2环境,搭建个过程我这里就不重复了,7.2的搭建和7.1.10以及7.0的搭建过程一样,请参考:
http://blog.chinaunix.net/space.php?uid=20639775&do=blog&id=201960http://blog.chinaunix.net/space.php?uid=20639775&do=blog&id=154598下图是我安装的mysql cluster 7.2环境,下面我们来开始做实验!
在mysql cluster 7.2和以后的版本中,在mysql cluster安装好以后会有一个名字为ndb_dist_priv.sql的sql文件,你可以在share/mysql路径下找到它,但是我的确实在安装目录的share目录下。我们现在说的权限共享就要依靠那个文件来实现了,呵呵,我们的操作步骤如下:
1、将这个文件导入到你的一个mysqld节点中,执行后会自动的创建一些存储过程和函数,
登陆到其中一个sql节点,执行如下命令(注意执行这个文件需要root权限)
mysql -uroot -p
SOURCE /usr/local/mysql/share/ndb_dist_priv.sql;
或者在shell中执行:
mysql -uroot -p < /usr/local/mysql/share/ndb_dist_priv.sql
我执行的时候出现如下报错:
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
解决办法:set GLOBAL log_bin_trust_function_creators=on;
通过如下命令,你可以看到刚才创建的存储过程和函数:
mysql> SELECT ROUTINE_NAME, ROUTINE_SCHEMA, ROUTINE_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME LIKE 'mysql_cluster%' ORDER BY ROUTINE_TYPE;
+---------------------------------------------+----------------+--------------+
| ROUTINE_NAME | ROUTINE_SCHEMA | ROUTINE_TYPE |
+---------------------------------------------+----------------+--------------+
| mysql_cluster_privileges_are_distributed | mysql | FUNCTION |
| mysql_cluster_backup_privileges | mysql | PROCEDURE |
| mysql_cluster_move_grant_tables | mysql | PROCEDURE |
| mysql_cluster_move_privileges | mysql | PROCEDURE |
| mysql_cluster_restore_local_privileges | mysql | PROCEDURE |
| mysql_cluster_restore_privileges | mysql | PROCEDURE |
| mysql_cluster_restore_privileges_from_local | mysql | PROCEDURE |
+---------------------------------------------+----------------+--------------+
2、在mysql终端调用名字为mysql_cluster_move_privileges的存储过程,这个存储过程的功能是备份权限表,然后将表的存储引擎转换为ndbcluster引擎。
mysql> CALL mysql.mysql_cluster_move_privileges();
备注:虽然调用存储过程的时候会自动的备份权限表,但是为了安全起见还是要自己手动备份下权限表,呵呵,可以使用如下语句备份:
shell> mysqldump
options -uroot mysql user db tables_priv columns_priv procs_priv >
backup_file在调用存储过程的时候,因为有的权限表是空的,会出现如下警告
No data -
zero rows fetched, selected, or processed,可以不用理会。
mysql_cluster_move_privileges
存储过程运行完后,你可以使用名字为mysql_cluster_privileges_are_distributed
的存储函数,来确定mysql_cluster_move_privileges
运行是否成功,查看方法为:mysql> SELECT CONCAT( 'Conversion ', IF(mysql_cluster_privileges_are_distributed(), 'succeeded', 'failed'), '.') AS Result;
+-----------------------+
| Result |
+-----------------------+
| Conversion succeeded. |
+-----------------------+
如果返回为Conversion succeeded.则表示运行成功!可以放心的创建测试帐号了。
3、检查调用完表结构是否发生改变,主要是包含这几个设计权限的表:user、db、tables_priv、columns_priv、procs_priv。
mysql> show create table mysql.user;发现这几个表的引擎都变成了ndbcluster,难怪能共享权限,哈哈
4、在其中一个sql节点上建个用户来测试吧,
mysql> grant all on *.* to test@'192.168.3.%' identified by 'test123';
Query OK, 0 rows affected (0.16 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
[root@cluster5 share]# mysql -h192.168.3.225 -utest -ptest123
mysql> quit
[root@cluster5 share]# mysql -h192.168.3.224 -utest -ptest123
mysql>
Ok,测试都没有问题,从此mysql cluster的权限管理变得简单,哈哈!
资料:http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-privilege-distribution.html
阅读(5588) | 评论(0) | 转发(2) |