数据库主库从库宕机重启后binlog数据同步

由于阿里云经典网络迁移到专用网络,一不小心没有先预备方案调整网段, 导致实例无法以内网IP形式访问数据库,被迫进行数据库停机后网络网段调整,导致宕机了几个小时。。。被客户各种投诉爆了。。

基于这次数据库恢复血泪史, 特整理解决办法, 让日后同学避免再犯。

数据库master库重启后, 确保能正常提供服务。由于生产上BI系统使用的是slave从库做数据查询, 从库的数据库已经落后了master好几天,

查看从库状态:

mysql> show slave status\G;

显示

Slave_IO_Running: No
Slave_SQL_Running: No

说明从库尚未启动数据库同步, 由于几天的binlog的数据量太大, 找binlog开始位置找了好久没找到, 索性先把当前的master数据库导出一份拷贝到从库, 按照导出的时间找binlog位置点。

使用 mysqldump 命令导出整个master 到文件 hairdonkey.sql.2018-07-20

从库先删除后新增

# 删除从库的数据库
drop database hairdonkey;
# 创建新数据库
CREATE DATABASE `hairdonkey` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
# 导入备份的数据
use hairdonkey;
source /data/db_backup/master/hairdonkey.sql.2018-07-20
# 用户授权
grant select, delete, insert, update on hairdonkey.* to onlyreader@'172.%';
flush privileges;

 

从库导入完毕后,开始关键的一步: 找binlog开始同步的位置!

查询binlog位置
(数据库中表数据新增最频繁的表是关键短信发送日志表sms_message_log, 每秒1-2条的频率,故查从库的sms_message_log表的最后一条记录的插入时间!):
1. 导出sms_message_log表:
/data/mysql/bin/mysqldump --socket=/data/mysql/mysql.sock -h172.17.120.167 -uhairdonkey -p123 -B hairdonkey --table sms_message_log --opt --extended-insert=false --single-transaction > sms_message_log.sql;
2.vim 编辑sms_message_log.sql 把 sms_message_log 全部替换为 mid_sms_message_log
把主表的sms_message_log数据导入到从库中的中间表 mid_sms_message_log (替换命令: :%s/sms_message_log/mid_sms_message_log/g )
3. 执行sql : 
source /data/work/sms_message_log.sql
4. 查询mid_sms_message_log比从库多的数据, 并倒叙排列:
select * from hairdonkey.mid_sms_message_log a where not exists(
select 1 from sms_message_log b where a.id = b.id
) order by id desc;
记录max(id) as maxSmsId, min(id) as minSmsId
 
5. 查看短信发送时间字段 send_tm 的最大最小值, 导出这个时间区间的Binlog:
mysqlbinlog -uhairdonkey -p123 -P3306 -h172.17.120.167 --start-datetime="2018-07-21 19:55:40" --stop-datetime="2018-07-21 19:55:59" --read-from-remote-server -vv mysql-bin.000772 >row3.sql
 
6. 编辑模式打开row3.sql, 查找短信记录表minSmsId所在的位置的insert sql对应的endPos 记为 minEndPos,
maxSmsId 所在的位置的insert sql对应的endPos 记为 maxEndPos
导出这两个区间的binlog:
 
mysqlbinlog -uhairdonkey -p123 -P3306 -h172.17.120.167 --start-position="875932395" --stop-position="878561125" --read-from-remote-server -vv mysql-bin.000772 >row2.sql
 
7. 运行row2.sql: source /data/work/row2.sql
8. 比较mid_sms_message_log和从库的sms_message_log表数据,应该是已经数量一致了
9. 设置从库同步位置点(这个点就是maxEndPos):
(1)停止从库同步:stop slave;
(2) 修改master信息:
change master to master_host='172.17.120.167',master_user='hairdonkey',master_password='123',master_log_file='mysql-bin.000772',master_log_pos=875845853;
(3) 启动从库:start slave;
(4) 查看从库状态:show slave status \G;
看到如下两个为Yes, 说明同步成功!
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

 

附加:

mysql主从复制,经常会遇到错误而导致slave端复制中断,这个时候一般就需要人工干预,跳过错误才能继续
跳过错误有两种方式:
1.跳过指定数量的事务:
mysql>slave stop;
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1        #跳过一个事务
mysql>slave start

2.修改mysql的配置文件,通过slave_skip_errors参数来跳所有错误或指定类型的错误
vi /etc/my.cnf
[mysqld]
#slave-skip-errors=1062,1053,1146 #跳过指定error no类型的错误
#slave-skip-errors=all #跳过所有错误
---------------------
作者:seteor
来源:CSDN
原文:https://blog.csdn.net/seteor/article/details/17264633
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/mhl1003/p/9412475.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MySQL的主从同步架构中,主库从库之间的数据同步是单向的,即主库数据同步从库中,而从库数据修改不同步主库中。因此,如果需要将从库中的数据同步主库中,需要通过触发器等手段在从库中的数据发生变化时,同时在主库上执行相应的修改操作,以保证主从数据的一致性。 具体步骤如下: 1. 在从库上创建触发器,监控从库中的数据变化,例如,在从表插入数据时触发一个触发器: ``` CREATE TRIGGER trigger_name AFTER INSERT ON table_name FOR EACH ROW BEGIN -- 触发器操作 INSERT INTO main_table (column1, column2) VALUES (NEW.column1, NEW.column2); END; ``` 其中,trigger_name是触发器的名称,table_name是要监控的表名,AFTER INSERT表示在插入操作完成后触发,FOR EACH ROW表示对每一行数据都触发一次操作。触发器操作中,通过INSERT语句将从表中插入的数据同步到主表中。 2. 在主库上开启binlog,以记录主库上的所有更新操作。 3. 在从库上开启binlog,并配置主库的IP地址和binlog文件名和位置,让从库可以连接到主库并获取binlog文件。 4. 在主库上执行CHANGE MASTER TO语句,将从库设置为主库从库,并启动主从同步。 ``` CHANGE MASTER TO MASTER_HOST='master_host_name', MASTER_USER='replication_user_name', MASTER_PASSWORD='replication_password', MASTER_LOG_FILE='recorded_log_file_name', MASTER_LOG_POS=recorded_log_position; ``` 其中,master_host_name是主库的IP地址,replication_user_name和replication_password是用于主从同步的账号和密码,recorded_log_file_name和recorded_log_position是从库同步的起始位置,需要根据实际情况进行设置。 5. 在主库上,通过配置主从同步,将同步过来的数据修改反向同步从库中,以保证主从数据的一致性。 需要注意的是,触发器可能数据库性能造成一定的影响,因此需要谨慎地设计和使用触发器。同时,也需要注意避免触发器的死循环等问题,保证触发器的正确性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值