CentOS6.8下配置MySQL8.0.12的主从同步详解

版权声明:本文为博主原创文章,欢迎转载并注明出处。 https://blog.csdn.net/wangxiaotongfan/article/details/81870258

最近由于公司需要,自己在本地尝试了一下MySQL最新社区版本的主从同步的搭建配置过程,在搭建的过程中还是遇到了很多的问题,现在记录如下:

一、MYSQL主从配置

1.1 部署环境

     主(master): 192.168.11.179     OS:CentOS 6.8 
     从(slave2): 192.168.11.177     OS:CentOS 6.8
     mysql的版本:社区版8.0.12

1.2 安装mysql

​ 在我之前的博客中已经有了详细的叙述,详见这里

1.3 配置

### 1.3.1 master节点的配置

vim /etc/my.conf
server-id=121 #设置主服务器的ID,可以任意配置但是多个主从之间不能重复
innodb_flush_log_at_trx_commit=2  #
sync_binlog=1  #开启binlog日志同步功能
log-bin=mysql-bin-121 #binlog日志文件名(可以任意命名)
binlog-do-db=xxxx  # 这个表示只同步某个库 (如果没有此项,表示同步所有的库)
# 还有一个参数是指定不同步哪些库,这里不再赘述

   相关配置项还有很多,如果需要,可以参考这里,这里给出了MySQL的配置文件几乎常用的全部配置项以及说明

1.3.2 配置完后,重启主节点数据库

service mysqld restart
如果开启远程可以略过这步
mysql -uroot -p ##登录mysql
mysql>grant replication slave on *.* to 'mark'@'192.168.11.177' identified by '123456'; ##这句话的本意是:授权给从数据库服务器192.168.1.201,用户名mark,密码123456;但是在MySQL8.0的版本中执行不通过,原因是8.0中的创建命令和赋权命令已经完成分开了,现在网上说的所谓的8.0的安装几乎都没有说明这一点,但是我这边尝试的结果就是这种方式是不行的,需要将命令改变如下:
create user '用户名'@'访问主机' identified by '密码'; #创建账户
grant 权限列表 on 数据库 to '用户名'@'访问主机';# (修改权限时在后面加with grant option) 赋予权限:
mysql>show master status ; ##查看主库的状态 file,position这两个值很有用。要放到slave配置中
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000004 |     2029 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

这里要记录下file和position两个属性,因为这两个属性需要在slave中的配置中进行指定;

1.3.3 配置从库服务器

vim /etc/my.cnf
server-id=122
innodb_flush_log_at_trx_commit=2
sync_binlog=1
log-bin=mysql-bin-122

1.3.4 配置完后,重启从节点的mysql

service mysqld restart
mysql -uroot -p
mysql>stop slave;
mysql> change master to master_host='192.168.11.179',master_user='replicator',master_password='123456',master_log_file='master-bin.000004',master_log_pos=2029;
mysql> start slave; #开启从库 (stop slave:关闭从库)
mysql> show slave status \G; #Slave_IO_Running,Slave_SQL_Running 都为Yes的时候表示配置成功

 完成上述配置后,你有可能看到的配置项已经是成功的了,如下所示:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.11.179
                  Master_User: replicator
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000004
          Read_Master_Log_Pos: 2029
               Relay_Log_File: slave2-relay-bin.000002
                Relay_Log_Pos: 2197
        Relay_Master_Log_File: master-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
......

主要观测指标为 Slave_IO_Running和Slave_SQL_Running,如果其都为yes,则证明配置成功;如果顺利的得到如下的结果,那么恭喜你,主从同步的配置基本上就已经完成了,剩下的就是在主节点的MySQL中进行新库、新表的创建以及数据的插入来验证主从同步是否生效了,这个过程比较简单不在赘述。

当然,在配置了主从配置以后,可以将主库的表设置读锁的权限,这个取决于具体业务以及应用场景的具体要求,相关命令如下:

mysql> FLUSH TABLES WITH READ LOCK;

二、配置过程中的相关问题

如果在完成配置后,你发现在slave status中没有相应的输出结果,那么可能要需要读一下这一部分才能更好的解决你遇到的问题:

2.1 问题1 错误码:2061

在相关配置完全按照上面的做了以后,运行查看slave状态的时候,你发现没有两个yes,而是如下的日志:

*************************** 1. row ***************************
               Slave_IO_State: Connecting to master
                  Master_Host: 192.168.11.179
                  Master_User: cheng
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000003
          Read_Master_Log_Pos: 155
               Relay_Log_File: slave2-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: master-bin.000003
             Slave_IO_Running: Connecting
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 155
              Relay_Log_Space: 155
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 2061
                Last_IO_Error: error connecting to master '[email protected]:3306' - retry-time: 60  retries: 1
               Last_SQL_Errno: 0

查看日志:

2018-08-20T02:52:18.470614Z 14 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'wang@master:3306' - retry-time: 60  retries: 1, Error_code: MY-002061
2018-08-20T02:53:22.979467Z 16 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'wang@master:3306' - retry-time: 60  retries: 1, Error_code: MY-002061
2018-08-20T02:54:22.987281Z 16 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'wang@master:3306' - retry-time: 60  retries: 2, Error_code: MY-002061
2018-08-20T02:55:22.990201Z 16 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'wang@master:3306' - retry-time: 60  retries: 3, Error_code: MY-002061
2018-08-20T02:56:22.992723Z 16 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'wang@master:3306' - retry-time: 60  retries: 4, Error_code: MY-002061
2018-08-20T02:57:22.995668Z 16 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'wang@master:3306' - retry-time: 60  retries: 5, Error_code: MY-002061
2018-08-20T02:58:23.002184Z 16 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'wang@master:3306' - retry-time: 60  retries: 6, Error_code: MY-002061
2018-08-20T02:59:23.006673Z 16 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'wang@master:3306' - retry-time: 60  retries: 7, Error_code: MY-002061

其错误码为:Error_code: MY-002061,这个为问题也是困扰我时间最长的问题,百度了一圈没有相应的错误代码(这里真不是黑百度),尝试步骤一重新设置了五六次还是不行,最后google,得到了最后的解决方案。

这个问题在MySQL forums中已经进行了解决,将其解决方法贴一下,其地址在这里

I should have digged more into the “error 2061”. Error 2061 says “you are using a auth plugin which requires SSL”. I did not setup the recovery channel to use SSL (which is possible).

To reduce complexity for now, I am not using SSL, so you are required to set the auth plugin when creating the replication user, because from the MySQL 8.0.4 release notes:

https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-4.html>

“Incompatible Change: The caching_sha2_password and sha256_password authentication plugins provide more secure password encryption than the mysql_native_password plugin, and caching_sha2_password provides better performance than sha256_password. Due to these superior security and performance characteristics of caching_sha2_password, it is now the preferred authentication plugin, and is also the default authentication plugin rather than mysql_native_password. …”

Quick fix: CREATE USER replicator@’%’ IDENTIFIED WITH ‘mysql_native_password’ BY ‘secret’;

其大致意思是因为你在MySQL的搭建过程中指定并运行了SSL的验证授权算法,那么创建的备份用户也必须要设置这个验证,如果读过我mysql8.0搭建这个文章的一定知道,在启动运行后,我有运行了一下SSL的验证;这问题正式由于这个引起的,如果不指定这个SSL的机制,可能不会出现这个问题,这也只是我的猜测,我没有进行验证,有时间的朋友可以验证一下这个,分享一下验证的结果。

知道这个原因,重新创建用户,就可以解决这个问题。

2.2 问题2 错误码:2003

首先表明,这个问题我没有遇到,但是在解决上一个问题的时候,发现在大家比较多遇到的是这个问题,那也在这里进行一下remark。

刚配置的MySQL主从,在从机上看到

mysql> SHOW slave STATUS \G 

********* 1. row ********* 
               Slave_IO_State: Connecting to master 
                  Master_Host: 172.17.210.199 
                  Master_User: my 
                  Master_Port: 3306 
                Connect_Retry: 60 
              Master_Log_File: masters-bin.000003 
          Read_Master_Log_Pos: 1224 
               Relay_Log_File: testmysql-relay-bin.000001 
                Relay_Log_Pos: 4 
        Relay_Master_Log_File: masters-bin.000003 
             Slave_IO_Running: Connecting 
            Slave_SQL_Running: Yes 
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 

看日志有很多:

141010 0:03:48 [ERROR] Slave I/O: error connecting to master \'[email protected]:3306\' - retry-time: 60 retries: 2, Error_code: 2003 
141010 0:04:48 [ERROR] Slave I/O: error connecting to master \'[email protected]:3306\' - retry-time: 60 retries: 3, Error_code: 2003 

解决方法: 导致lave_IO_Running 为connecting 的原因主要有以下 3 个方面:

1、网络不通
2、密码不对
3、pos不对 (除了这三个原因,还有可能是问题一种的原因)
解决步骤:
1、对于第一个问题,一般情况下都是可以排除的,也是最容易排除的。
2、在主库上修改用来复制的用户的密码。
3、 在做chang to 的时候注意log_pos 是否跟此时主机的一样。

2.3 问题3 错误总结

错误一

ERROR] Slave I/O: error connecting to master 'replication@VMS00782:3306' - retry-time: 60  retries: 2, Error_code: 1045

错误原因:从库用来连接主库的用户权限或者密码不对

解决方法:首先在主库上检查用来主从复制的用户权限,如果没有问题在检查从库使用的密码是否正确。

错误二

140331 10:08:18 [ERROR] Error reading master configuration
140331 10:08:18 [ERROR] Failed to initialize the master info structure
140331 10:08:18 [Note] Event Scheduler: Loaded 0 events

错误原因:这个可能是从库的master.info文件有损坏。

解决方法:reset slave

错误三

Error 'Duplicate entry '1' for key 1' on query. Default database: 'movivi1'. Query: 'INSERT INTO `v1vid0_user_samename` VALUES(null,1,'123','11','4545','123')'

错误原因:可能是从库的约束比主库更多写造成的。

解决方法:

Mysql > stop slave;
Mysql > set global sql_slave_skip_counter =1 ;
Mysql > start slave;

错误四

Slave SQL: Error 'Table 'xxxx' doesn't exist' on query. Default database: 't591'. Query: 'INSERT INTO `xxxx`(type,post_id,browsenum) SELECT type,post_id,browsenum FROM xxxx WHERE hitdate='20090209'', Error_code: 1146

错误原因:slave上缺少错误中的表。

解决方法:在slave上添加上对应的表,然后start slave。

错误五

Error 'Unknown column 'qdir' in 'field list'' on query. Default database: 'club'. Query: 'insert into club.question_del (id, pid, ques_name, givepoint, title, subject, subject_pid, createtime, approve, did, status, intime, order_d, endtime,banzhu_uid,banzhu_uname,del_cause,qdir) select id, pid, ques_name, givepoint, title, subject, subject_pid, createtime, approve, did, status, intime, order_d, endtime,'1521859','admin0523','无意义回复',qdir from club.question where id=7330212'

1 row in set (0.00 sec)

错误原因:从库上对应的表上缺少字段。

解决方法:根据主库上表结构,在从库对应表上添加缺少的字段,然后start slave。

错误六

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
               Master_Host: 192.168.60.159
                  Master_User: backup
                  Master_Port: 3311
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000012
          Read_Master_Log_Pos: 274863854
               Relay_Log_File: mysql-relay-bin.000007
                Relay_Log_Pos: 2160037
        Relay_Master_Log_File: mysql-bin.000012
             Slave_IO_Running: Yes
            Slave_SQL_Running: No

错误原因:主库删除的表在从库中不存在,导致从库在遇到删除不存在表的错误时无法继续同步。

解决方法:利用slave-skip-errors参数,跳过对于的1146错误(这个参数是一个只读的,需要在配置文件中修改,并重启从库)

1、在my.cnf的[mysqld]下面添加slave_skip_errors=1146

2、重启从库 service mysql restart

3、在从库上启动同步

mysql> start slave ;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.60.159
                  Master_User: backup
                  Master_Port: 3311
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000012
          Read_Master_Log_Pos: 274863854
               Relay_Log_File: mysql-relay-bin.000007
                Relay_Log_Pos: 137439021
        Relay_Master_Log_File: mysql-bin.000012
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 137438808
              Relay_Log_Space: 274867275
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 88484
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 159
                  Master_UUID: ded30ff9-62b2-11e6-b0d0-f80f41fa11bf
             Master_Info_File: /usr/local/mysql-5.7.14-linux-glibc2.5-x86_64/data/master.info

问题三中的错误列表中参考:here

三、 总结

这次搭建本来以为是一次比较简单的搭建过程,按照网上的教程应该很快,但是发现在搭建新版本的mysql时,还是遇到了很多的问题,这个总结也是想总结一下这个解决问题的过程,首先定位问题,找到问题是最为重要的,当然定位的最快的就是看日志了,这个过程是非常重要的(不要一上来就去百度,这个过程很盲目);其次,在百度后发现没有什么可用的资料后,一定要去官网的论坛或者是问题列表中去查找一下,一般遇到的问题在这个里边都会有,可以节省很多的时间。

猜你喜欢

转载自blog.csdn.net/wangxiaotongfan/article/details/81870258