mysql之——搭建双机热备

说明:

  1. 虚拟机环境为:Centos7 64位,mysql版本为:5.6.44
  2. 俩台主机ip:
    A:192.168.189.135
    B:192.168.189.144
  3. 如需安装mysql可以参考我另一篇文章:https://blog.csdn.net/Cow_cz/article/details/90403412
  4. 本文参考文章:https://www.cnblogs.com/shuidao/p/3551238.html
    建议可以先读一下这篇文章,有关热备的一些理论知识写的很细,运气好点没有踩太多坑的话就可以实现了
    开工!

搭建双机热备

1.创建备份专用用户

在A机器上执行命令,首先连接数据库:

[root@localhost mysql]# pwd
/opt/soft/mysql
[root@localhost mysql]# ./bin/mysql -h192.168.189.135 -uroot -p123123
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 13
Server version: 5.6.44-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

创建用户:

mysql> grant replication slave on *.* to 'backUserA'@'192.168.189.144' identified by 'backup';

说明:
backUserA :为创建的备份用户名称
backup : 为backUserA 的密码
地址为B机器的地址,即设置A上mysql只允许B机器通过新建的备份用户进行登陆
注意: 如果出现执行失败的问题,请看本文末问题总结

2. 开启主服务器的 binarylog

再打开另一个终端连接A机器,进入mysql安装的目录,我这里是/opt/soft/mysql,打开my.cnf文件:

[root@localhost mysql]# ls
bin  COPYING  data  docs  include  lib  man  my.cnf  my.cnf_5_17  my.cnf_bak  mysql-test  README  scripts  share  sql-bench  support-files
[root@localhost mysql]# pwd
/opt/soft/mysql
[root@localhost mysql]# vi my.cnf

进行编辑,在文件最后新增:(因为我是新搭建的数据库只有基础的几个数据库,这里测试使用test数据库,如果你本身有其他数据库,或者有多个数据库需要进行热备,则需要把俩台机器的对应数据库进行同步,参见我推荐的文章,我这里不再细说

#主从热备新加
log_bin = mysql-bin
binlog_format = mixed
server_id = 1
read-only = 0
binlog-do-db=test
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
auto-increment-increment=2
auto-increment-offset=1

配置说明:
》log_bin 是生成binarylog的前缀
》server_id 要设置为唯一,即节点的唯一id,彼此节点是不同的
》binlog-do-db 用来表示,只把哪些数据库的改动记录到binary日志中。 可以写上关注hello数据库。 但是我把它注释掉了。 只是展示一下。 可以写多行,表示关注多个数据库。
》binlog-ignore-db 表示,需要忽略哪些数据库。我这里忽略了其他的4个数据库。
》后面两个用于在 双主(多主循环)互相备份。 因为每台数据库服务器都可能在同一个表中插入数据,如果表有一个自动增长的主键,那么就会在多服务器上出现主键冲突。 解决这个问题的办法就是让每个数据库的自增主键不连续。 上图说是, 我假设需要将来可能需要2台服务器做备份, 所以auto-increment-increment 设为2. 而 auto-increment-offset=1 表示这台服务器的序号。 从1开始, 不超过auto-increment-increment。
这样做之后, 我在这台服务器上插入的第一个id就是 1, 第二行的id就是 3了, 而不是2.
(同理,在第二台服务器上插入的第一个id就是2, 第二行就是4, 总之就是避免自增主键冲突) 这样就不会出现主键冲突了

3. 重启主服务器mysql服务

执行命令:(因为我这里已经把mysql加入到service服务中了,如果执行有问题参考我开始说明里的文件进行设置)

[root@localhost mysql]# service mysqld restart
Shutting down MySQL.... SUCCESS! 
Starting MySQL. SUCCESS!
4. 获取主服务器状态

登陆mysql执行命令:

mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000009
         Position: 1517
     Binlog_Do_DB: test
 Binlog_Ignore_DB: mysql,information_schema,performance_schema
Executed_Gtid_Set: 
1 row in set (0.00 sec)

重点记录下:
File: mysql-bin.000009
Position: 1517
后续用的着
注意: 如果这里执行查看主机状态时候返回为空,即:
在这里插入图片描述
解决方法看my.cnf文件是否修改有误,没有开启 binarylog文件,即看下是否包含了我上面配置的全部内容,或者再看下是否修改了配置但是没有重启mysql服务。

因为我这里数据库是刚搭建的,无需进行数据同步

5. 修改从服务器配置文件

打开从服务器 B 的 /etc/my.cnf 文件:

[root@localhost mysql]# ls
bin  COPYING  data  docs  include  lib  man  my.cnf  my.cnf_5_17  my.cnf_bak  mysql-test  README  scripts  share  sql-bench  support-files
[root@localhost mysql]# pwd
/opt/soft/mysql
[root@localhost mysql]# vi my.cnf

在文件最后新增:

#主从热备新加
log_bin = mysql-bin
binlog_format = mixed
server_id = 2
#read-only = 0
replicate-do-db=test
replicate-ignore-db=mysql
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
#auto-increment-increment=2
#auto-increment-offset=1
relay_log=mysql-relay-log
log-slave-updates=ON

配置说明:
》replicate-do-db 可以指定需要复制的数据库, 我这里注掉了。 演示一下。
》replicate-ignore-db 复制时需要排除的数据库, 我使用了,这个。 除开系统的几个数据库之外,所有的数据库都复制。
》relay_log 中继日志的名字。 前面说到了, 复制线程需要先把远程的变化拷贝到这个中继日志中, 在执行。
》log-slave-updates 意思是,中继日志执行之后,这些变化是否需要计入自己的binarylog。 当你的B服务器需要作为另外一个服务器的主服务器的时候需要打开。 就是双主互相备份,或者多主循环备份。 我们这里需要, 所以打开。

然后重启从服务器mysql

6. 开启从服务器的同步

登陆从服务器mysql,执行开启命令:

CHANGE MASTER TO 
       MASTER_HOST='192.168.189.135', 
       MASTER_USER='backUserA', 
       MASTER_PASSWORD='backup', 
       MASTER_LOG_FILE='mysql-bin.000009', 
       MASTER_LOG_POS=1517;

注意MASTER_LOG_FILE和MASTER_LOG_POS分别为第四步中查出的主服务器状态

7.重启主从服务器

在A和B机器上都执行重启命令:service mysqld restart

8.查看从服务器salve线程

再次登陆从服务器执行命令:

mysql> show slave status\G

重点看如图俩个信息:
mysql之——搭建双机热备_第1张图片
如果如图,俩个都为YES则说明开启成功,如果其中一个是No, 那就说明不成功。需要查看mysql的错误日志,我也遇到了这个问题,在最后问题总结中进行细说。

9.验证主到从的同步

使用远程登陆工具navicat,登陆俩个服务器,并在主mysql的test数据库下创建表adult,如图:
mysql之——搭建双机热备_第2张图片
然后查看从服务器test数据库,也对应创建了adult表:
mysql之——搭建双机热备_第3张图片

接下来进行数据同步的验证,在A机器上新增一条数据:
mysql之——搭建双机热备_第4张图片
然后查看B服务器数据,也同样产生了新增的数据:
mysql之——搭建双机热备_第5张图片
验证通过

10.配置B到A的同步

配置从服务器到主服务器的同步,只需要将上述的配置步骤重新再反过来执行一下。这里不再进行展示,可以参考文章开头推荐博文里的描述

11.问题总结

【问题一】创建备份用户失败
描述: 创建备份用户时,执行授权sql报错如下:

mysql> grant replication slave on *.* to 'backUserA'@'192.168.189.144' identified by '123123';
ERROR 1045 (28000): Access denied for user 'root'@'%' (using password: YES)
mysql>

分析: 查阅资料这个报错大多数都是在执行登陆命令时候遇到,是root密码不正确导致的,但是我这里使用root登陆是可以的,同时在Navicat上登陆也是没有问题的,因此root密码是正确的,但是为什么执行这个sql还是会报错呢?
尝试: 有人建议可以把sql中*.*改为指定数据库,即这样执行:

mysql> grant replication slave on test.* to 'backUserA'@'192.168.189.144' identified by '123123';
ERROR 1044 (42000): Access denied for user 'root'@'%' to database 'test'

总之我这里还是不行
解决方法: 最终自己猜想是否是因为权限问题,于是用Navicat连接A机器的数据库,打开mysql数据库,再打开user表,查看各条数据的差异,直到发现主机:%用户:root的数据中,Grant_priv对应的值为N,如下图:
mysql之——搭建双机热备_第6张图片
把该值改为Y然后重启mysql服务,然后再次执行sql,成功!
mysql之——搭建双机热备_第7张图片
【问题二】 查看slave进程,发现并未全部开启
描述: 在全部修改结束后,执行show slave status\G命令时,发现Slave_IO_Running和Slave_SQL_Running并不是全部都为YES,如图:
mysql之——搭建双机热备_第8张图片
分析: 这里就需要去查看错误日志,进入安装mysql的目录,在进入data目录,我这里是:、opt/soft/mysql/data,然后查看对应的错误日志,.err结尾的文件,如图:
mysql之——搭建双机热备_第9张图片
打开错误日志文件,排查日志最低几行带有error的日志:
mysql之——搭建双机热备_第10张图片
日志已经说的很明白了,我这里是因为我的俩台虚拟机是进行克隆而来,所以俩台机器的server_uuid是一样的,才导致这个报错。
相关补充知识:
》mysql 5.6的复制引入了uuid的概念,各个复制结构中的server_uuid得保证不一样,但是查看到直接copy data文件夹后server_uuid是相同的,show variables like ‘%server_uuid%’;
修改uuid方法:
找到data文件夹下的auto.cnf文件,修改里面的uuid值,保证各个db的uuid不一样,重启db即可
》另外一种可能性,创建主从关系时copy了同样的my.cnf文件,报错:

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids;

原因分析:
和server_uuid类似,servier_id也得保证不一样
修改方法:
找到my.cnf配置文件中的server_id,修改从库的server_id保证和复制结构中的其他db不一样,重启db即可

最后解决方法: 按照上述方法找到data文件夹下的auto.cnf文件,修改里面的uuid值,保证各个db的uuid不一样,然后重启msyql服务,问题解决:
mysql之——搭建双机热备_第11张图片
我这里是这样解决的,但是针对不同情况错误日志里报错可能不一样,有用户名错误,密码错误等等,针对性去修改即可。
重点记录下这俩个问题,欢迎留言沟通!

你可能感兴趣的:(数据库)