mysql 函数延时_实现Mysql延时复制

Oracle可以通过设置归档的delay来设置DataGuard的Apply延时,达到某些人为错误发生后的容灾。Mysql一直没有这个功能,目前已知的大概也只有http://code.google.com/p/maatkit/上的mk-slave-delay,不过通过一些办法可以山寨延时复制,研究这个功能也是没办法,最近老有手下做错事情,老是用mysqlbinlog挖的累了- -,而某些业务数据库是mysql 4.02的,没有触发器可以保护表。[@more@]

首先研究下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延时复制的功能,达到防止人为错误的作用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值