14

糟了,生产环境MySQL主从数据库不一致怎么办?!

 3 years ago
source link: http://database.51cto.com/art/202011/632010.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

iQFRziQ.jpg!mobile

作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:https://github.com/sunshinelyz/mykit-delay

问题今天发现Mysql的主从数据库没有同步

先上Master库:

mysql>show processlist; 

查看下进程是否Sleep太多。发现很正常。

show master status; 

也正常。

mysql> show master status; 
+-------------------+----------+--------------+-------------------------------+ 
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB              | 
+-------------------+----------+--------------+-------------------------------+ 
| mysqld-bin.000001 |     3260 |              | mysql,test,information_schema | 
+-------------------+----------+--------------+-------------------------------+ 
1 row in set (0.00 sec) 

再到Slave上查看

mysql> show slave status\G                                                 
  
Slave_IO_Running: Yes 
Slave_SQL_Running: No 

可见是Slave不同步

解决方案

下面介绍两种解决方法

方法一:忽略错误后,继续同步

该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况

解决:

stop slave; 
  
#表示跳过一步错误,后面的数字可变 
set global sql_slave_skip_counter =1; 
start slave; 

之后再用mysql> show slave status\G 查看

mysql> show slave status\G 
Slave_IO_Running: Yes 
Slave_SQL_Running: Yes 

ok,现在主从同步状态正常了。。。

方式二:重新做主从,完全同步

该方法适用于主从库数据相差较大,或者要求数据完全统一的情况

解决步骤如下:

1.先进入主库,进行锁表,防止数据写入

使用命令:

mysql> flush tables with read lock; 

注意:该处是锁定为只读状态,语句不区分大小写

2.进行数据备份

#把数据备份到mysql.bak.sql文件

mysqldump -uroot -p -hlocalhost > mysql.bak.sql 

这里注意一点:数据库备份一定要定期进行,可以用shell脚本或者python脚本,都比较方便,确保数据万无一失。

3.查看master 状态

mysql> show master status; 
+-------------------+----------+--------------+-------------------------------+ 
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB              | 
+-------------------+----------+--------------+-------------------------------+ 
| mysqld-bin.000001 |     3260 |              | mysql,test,information_schema | 
+-------------------+----------+--------------+-------------------------------+ 
1 row in set (0.00 sec) 

4.把mysql备份文件传到从库机器,进行数据恢复

scp mysql.bak.sql [email protected]:/tmp/ 

5.停止从库的状态

mysql> stop slave; 

6.然后到从库执行mysql命令,导入数据备份

mysql> source /tmp/mysql.bak.sql 

7.设置从库同步,注意该处的同步点,就是主库show master status信息里的| File| Position两项

change master to master_host = '192.168.128.100', master_user = 'rsync',  master_port=3306, master_password='', master_log_file =  'mysqld-bin.000001', master_log_pos=3260; 

8.重新开启从同步

mysql> start slave; 

9.查看同步状态

mysql> show slave status\G   
 
Slave_IO_Running: Yes 
Slave_SQL_Running: Yes 

10.回到主库并执行如下命令解除表锁定。

UNLOCK TABLES; 

本文转载自微信公众号「冰河技术」,可以通过以下二维码关注。转载本文请联系冰河技术公众号。

Fvy6zub.jpg!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK