linux启动项目报连不上mysql_mysql主从数据库启动报错?别慌!

e18eb6064785dea75b64a0b24aa192c4.png

前阵子撸项目时用到了主从数据库的配置,配置同测试主从一路通畅无主!手游5杀的快感你能体会吗?我兴奋得直接把启动文件给关了,嗯,这项技术貌似问题不大。但事实再次证明我还是太嫩了,当我重新开启主从数据库执行同步时,报错还是来了!

我的妈呀,这是啥?上网百度了一番,不知道为啥百度上的答案总是千篇一律的统一,弄了我半天,结果还是解决不了,算了还是自己看着日志找问题吧~~

88490e469810fa34c6b51bdf08cf460a.png

首先从原理入手:

  • master上开启**bin-log日志**功能,记录更新、插入、删除的语句。
  • 必须开启三个线程,分别是两个io线程和一个sql线程。
  • 从数据库io线程去连接master,master通过io线程检查有slave过来的请求,请求日志、postsion位置。master将这些相应的日志返回给slave,slave自己去下载到本地的realy_log里面,写入一个master-info日志记录同步的点。
  • slave的sql线程检查到realy-log日志有更新,然后在本地去exec执行。

8fa7117022a4d31ee06dba99d1423e1e.png

经过查看日志可知道是主从日志上存在有不同步的点所造成的,即我原有数据库已存有表数据。


好,下面开始秀操作了:

a21cda16a0ddf31161a98659afa34f99.png

(1)mysql8.0新增用户及密码加密规则修改

修改的方法有两种,一种是升级客户端驱动,一种是把mysql用户登录密码加密规则还原成mysql_native_password。这里我选择了后者!

-- 建立后台执行备份的账号

(2)解决Slave_IO_Running,Slave_SQL_Running问题

它俩是mysql replication 中slave机器(从数据库)上的两个关键的进程,死一个都不行!不信的话你可以试试,多试错印象也会深刻一点~~

  • 如果是slave_io_running 报错为no了,那么就我个人看有三种情况,一个是网络有问题,连接不上,像有一次我用虚拟机搭建replication,使用了nat的网络结构,就是死都连不上,第二个是有可能my.cnf有问题,配置文件怎么写就不说了,网上太多了,最后一个是授权的问题,replication slave和file权限是必须的。一旦io为no了先看err日志,看看报什么错,很可能是网络,也有可能是包太大收不了,这个时候主备上改max_allowed_packet这个参数。
  • 如果是slave_sql_running报错为no了,那么也有两种可能,一种是slave机器上这个表中出现了其他的写操作,就是程序写了,这个是会有问题的,今天我想重现,但是有时候会有问题,有时候就没有问题,现在还不是太明了,后面再更新,还有一种占绝大多数可能的是slave进程重启,事务回滚造成的,这也是mysql的一种自我保护的措施,像关键时候只读一样。

这个时候想恢复的话,只要停掉slave,set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;再开一下slave就可以了,这个全局变量赋值为N的意思是:

This statement skips the next N events from the master. This is useful for recovering from replication stops caused by a statement. 
This statement is valid only when the slave thread is not running. Otherwise, it produces an error.

好,咱们先执行show slave statusG命令测试一波

mysql>show slave statusG 
mysql>Slave_IO_Running: Yes 
mysql>Slave_SQL_Running: No 

有问题了,Slave_SQL_Running应该是Yes才对。

再往下看,有错误的提示:

Last_Errno: 1062
Last_Error: Error 'Duplicate entry 'b847a74ad1e35badd71d0171bd703360' for key 'PRIMARY'' on query. Default database: 'fangh6fu'. Query: 'INSERT INTO `fangh6fu`.`ecs_sessions` (sesskey, expiry, ip, data) VALUES ('b847a74ad1e35badd71d0171bd703360', '1447919111', '192.168.1.214', 'a:0:{}')'

先stop slave,然后执行了一下提示的语句,就是把重复的主键记录删除,

再SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;

mysql>stop slave;
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql>START SLAVE;

mysql>show slave statusG 
mysql>Slave_IO_Running: Yes 
mysql>Slave_SQL_Running: Yes 

OK了,从服务器也在几分钟内把堆积的log处理完了,此时再主数据库中建表,可发现主从数据库两边又同步了!!!

今天分享到这,喜欢的可以扣一波关注,后期有时间会分享项目和实战代码!

a61771dc06ab689934f07733b5b72bd3.png

关注公众号了解更多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值