Chinaunix首页 | 论坛 | 博客
  • 博客访问: 454976
  • 博文数量: 481
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 1040
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-06 14:09
文章分类

全部博文(481)

文章存档

2013年(483)

我的朋友

分类: Mysql/postgreSQL

2013-04-17 16:04:47

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=201960
http://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
     

阅读(316) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~