最近由于公司需要,自己在本地尝试了一下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时,还是遇到了很多的问题,这个总结也是想总结一下这个解决问题的过程,首先定位问题,找到问题是最为重要的,当然定位的最快的就是看日志了,这个过程是非常重要的(不要一上来就去百度,这个过程很盲目);其次,在百度后发现没有什么可用的资料后,一定要去官网的论坛或者是问题列表中去查找一下,一般遇到的问题在这个里边都会有,可以节省很多的时间。