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

今天写了一个快速搭建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 因为刚写好,所以很多注释,细节还没有改进,稍后继续补充吧。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2017-09-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何在Ubuntu 16.04上安装和使用PostgreSQL

关系数据库管理系统是许多网站和应用程序的关键组件。它们提供了一种存储,组织和访问信息的结构化方法。

6021
来自专栏北京马哥教育

SQLite这么娇小可爱,不多了解点都不行啊

简介 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。它的设计目标是嵌入式的,目前Android和iOS的设备内置的都是SQLite数...

3638
来自专栏小特工作室

Navi.Soft31.代码生成器(含下载地址)

1系统简介 1.1功能简述 在Net软件开发过程中,大部分时间都是在编写代码,并且都是重复和冗杂的代码.比如:要实现在数据库中10个表的增删改查功能,大部分代码...

2018
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(61)-如何使用框架来开发

前言 这篇文本讲述了这个框架的使用方式,及一些疑问的答疑,更加精准的使用这个框架来建立功能 经过几个版本的迭代,系统使用更加方便,代码更加简洁也更加的智能,...

2956
来自专栏PHP在线

SQL语句执行过程详解

一条sql,plsql的执行到底是怎样执行的呢? 一、SQL语句执行原理: 第一步:客户端把语句发给服务器端执行 当我们在客户端执行 select 语句时,客户...

5486
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(999)-如何使用这个系统来开发?

前言 这篇文本讲述了这个框架的使用方式,及一些疑问的答疑,更加精准的使用这个框架来建立功能 经过几个版本的迭代,系统使用更加方便,代码更加简洁也更加的智能,...

3086
来自专栏云计算教程系列

如何使用Ubuntu 16.04上的osquery监视系统安全性

osquery是一个安全开源工具,它采用操作系统并将其转换为一个巨大的数据库,使用可以使用类似SQL的语句进行查询的表。通过这些查询,您可以监控文件完整性,检查...

6530
来自专栏云计算教程系列

最全的CentOS MariaDB入门教程

MariaDB是流行的跨平台MySQL数据库管理系统的分支,被认为是MySQL 的完全替代品。MariaDB是由Sun在Sun Microsystems合并期间...

2275
来自专栏架构技术

Solr7使用Oracle数据源导入+中文分词

安装目录假设为#solr_home,本文的#solr_home为apps/svr/solr

992
来自专栏一枝花算不算浪漫

Redis的介绍及使用实例.

3729

扫码关注云+社区

领取腾讯云代金券