温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Mysql中怎么实现延时复制

发布时间:2021-08-06 14:18:50 来源:亿速云 阅读:112 作者:Leah 栏目:MySQL数据库

今天就跟大家聊聊有关Mysql中怎么实现延时复制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

首先研究下mysql的复制结构,4.0以上开始,复制分为2个进程,io进程和sql进程。其中io进程连接到master读取binlog,写入relaylog,而sql进程读取relaylog后apply到slave上。

binlog和relaylog格式dump出来是这样的:

#090108 20:24:17 server id 1 log_pos 9466422 Query thread_id=34456 exec_time=0 error_code=0
SET TIMESTAMP=1231417457;
insert into xxxx (UDusedo,UDdirect,UDuserid,UDusername,UDgetuserid,UDgetusername,UDcoins,UDtype,UDzone1,UDtargetvalue,UDdate,UD
ip,UDstatus) values ('33','n','7495715','LWGZOY','7495715','LWGZOY','1000','prop','3','56009376',now(),'116.53.1.144','00');

log中有SET TIMESTAMP=1231417457是为了防止slave和master之间时间不同造成某些时间字段值不一致的情况。其实也等同于这句sql在master上运行的时间,那么我们只要获取到它再和当前slave上的时间比较,如果少于我们需要的延时就让复制停下,这不就实现了延时复制么.

在mysql中可以通过函数UNIX_TIMESTAMP获取到和上面的TIMESTAMP同样的结果。

mysql> select unix_timestamp();
+------------------+
| unix_timestamp() |
+------------------+
| 1231750815 |
+------------------+
1 row in set (0.00 sec)

如何挖relaylog的尾部是个问题,因为日志可能很大,所以我们要借助下面的命令:

[root@HB-150-189 data]# mysql -e "show slave statusG"
*************************** 1. row ***************************
Master_Host: 192.168.1.104
Master_User: rep
Master_Port: 3306
Connect_retry: 60
Master_Log_File: HBDB104-bin.104
Read_Master_Log_Pos: 534427423
Relay_Log_File: HB-150-189-relay-bin.070
Relay_Log_Pos: 20200284
Relay_Master_Log_File: HBDB104-bin.104
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_do_db: aushop,auhj
Replicate_ignore_db:
Last_errno: 0
Last_error:
Skip_counter: 0
Exec_master_log_pos: 534427423
Relay_log_space: 20200284

其中得到Relay_Log_File的名字,Relay_Log_Pos: 20200284,通过这个可以得到一个offset,以此来挖掘relaylog来获取到最近的TIMESTAMP,然后使用:

mysqlbinlog -j 20200284./HB-150-189-relay-bin.070|grep "SET TIMESTAMP"|sed -n '1p'

在加上shell的处理就可以轻松获取最近的TIMESTAMP了

再看下show slave status的输出,版本为4.0.26:

mysql> show slave statusG
*************************** 1. row ***************************
Master_Host: 192.168.1.184
Master_User: rep
Master_Port: 3306
Connect_retry: 60
Master_Log_File: HBDB184-bin.072
Read_Master_Log_Pos: 358310392
Relay_Log_File: HB150-130-relay-bin.076
Relay_Log_Pos: 348847513
Relay_Master_Log_File: HBDB184-bin.072
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_do_db: money
Replicate_ignore_db:
Last_errno: 0
Last_error:
Skip_counter: 0
Exec_master_log_pos: 358310392
Relay_log_space: 348847513
1 row in set (0.00 sec)

输出信息包括了Slave_IO_Running, Slave_SQL_Running的状态。

mysql 4以后,可以通过STOP SLAVE IO_THREAD来停止io进程的活动,STOP SLAVE SQL_THREAD来停止sql进程的活动,大家只要使用shell结合crontab和nohup,加上对

[root@HB-150-189 data]# mysqladmin extended-status|grep Slave_running

看完上述内容,你们对Mysql中怎么实现延时复制有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI