前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >快速搭建主从的脚本和问题排查

快速搭建主从的脚本和问题排查

作者头像
jeanron100
发布2018-03-21 17:29:33
8440
发布2018-03-21 17:29:33
举报

今天写了一个快速搭建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中,使用如下的方式连接是没有问题的

代码语言:javascript
复制
# /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就不行了呢。

代码语言:javascript
复制
# /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表,看看里面的一些基本信息。

代码语言:javascript
复制

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默认的情况如下。

代码语言:javascript
复制
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中删除了匿名用户。

代码语言:javascript
复制
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 因为刚写好,所以很多注释,细节还没有改进,稍后继续补充吧。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档