今天写了一个快速搭建MySQL主从环境的脚本,思路和前几天发布的MGR快速搭建的有一点像,但是最根本的差别就是这个脚本支持5.6,5.7版本。其实sandbox本身也能够做这些事情,自己写这个只是想把这个过程自己记录下来,明白可能在哪些地方有一些注意的细节。
本来以为写起来会很容易,结果在最后调试的时候发现MySQL 5.7版本没问题了,MySQL 5.6版本碰到了问题。提示的信息显示从库连接主库抓取binlog的时候连接有问题,换句话说,就是数据库连接失败,导致从库无法应用binlog.
这就奇怪了,MySQL 5.7可以,到了MySQL 5.6怎么就不行了呢?
我看了下,涉及到复制用户的语句就两行:
CREATE USER rpl_usersss@'%';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'rpl_pass';
仔细看也没什么特别之处啊。
难道是其他的地方的配置有问题?我们简单来对比一下。
MySQL 5.7中,使用如下的方式连接是没有问题的
# /usr/local/mysql_5.7/bin/mysql -urpl_user -prpl_pass -h 127.0.0.1 -P33081 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 5.7.19-log MySQL Community Server (GPL) 。。。 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL 5.6中,用户名密码不变的情况下,为什么使用127.0.0.1就不行了呢。
# /usr/local/mysql_5.6/bin/mysql -urpl_user -prpl_pass -h 127.0.0.1 -P33091 Warning: Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'rpl_user'@'localhost' (using password: YES)
我前前后后花了不少的时间去对比,发现始终是提示用户名密码错误,但是我确认用户名密码是相同的。 带着疑问我查看了mysql.user表,看看里面的一些基本信息。 mysql> select user,host from mysql.user; +----------+------------------+ | user | host | +----------+------------------+ | rpl_user | % | | root | 127.0.0.1 | | root | ::1 | | | localhost | | root | localhost | | | oel64.oracle.com | | root | oel64.oracle.com | +----------+------------------+ 7 rows in set (0.00 sec) 这样一个配置,用户rpl_user是使用域名解析的方式,%的范围很广,所以倒不存在特殊的映射关系。 带着疑问,从安全的角度来看,MySQL 5.6中有一些匿名用户,还有默认的test库,这些是应该改进的。 而确实在MySQL 5.7中已经做了相应的修复,或者说是改进吧。 5.7 默认就删除了匿名用户,mysql.user默认的情况如下。 mysql> select user,host from mysql.user; +---------------+-----------+ | user | host | +---------------+-----------+ | rpl_user | % | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +---------------+-----------+ 4 rows in set (0.04 sec) 所以我在MySQL 5.6中删除了匿名用户。 mysql> delete from mysql.user where user=''; Query OK, 2 rows affected (0.03 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) 没想到这个操作完成后,原本提示密码错误的连接问题就引刃而解了。 我修改了脚本,反反复复模拟了多次,能够复现这类问题,也就暂时宣告了这个问题的一个基本解决。 如果回过头来看这个问题,可能会有更多的收获,比如从安全性方面的这些考虑,可能有些问题暂时不会 成为问题,但是会是潜在问题,有些问题虽然暂时不会有明显的影响,但是在一些特定的场景下, 可能表现形式会更加复杂,而解法其实就很简单了。 新写的脚本放在了github上,地址是: https://github.com/jeanron100/mysql_slaves 因为刚写好,所以很多注释,细节还没有改进,稍后继续补充吧。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23718752/viewspace-2144422/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23718752/viewspace-2144422/