mysql rollback.pl_数据的还原操作mixed和row的操作

MySQL备份策略:全备+增量备份主要包括以下几个步骤:

1、开启BINLOG服务

2、使用MYSQLDUMP对数据库进行完全备份

3、使用flush logs指令刷新创建新的2进制日志

4、使用mysqlbinlog logs-bin.[0-9]* |mysql进行增量备份的恢复

一般的,假设我们周日下午3点进行了完全备份并生成备份文件full_backup_20170215.sql,周1周2中午1点进行了两次增量备份,

分别生成增量备份文件mysql-bin.000018,mysql-bin.000019,周3上午10点数据库发生奔溃,需要进行数据恢复,此时正在记录的

2进制日志为mysql-bin.000020,需要恢复其中记录的操作,具体为:

1、恢复全备

2、恢复BINLOG(备份后的BINLOG文件:mysql-bin.000018,mysql-bin.000019,mysql-bin.000020)

##binlog文件可以导成SQL文件或者直接用/usr/local/mysql/bin/mysqlbinlog mysql-bin.000018,mysql-bin.000019,mysql-bin.000020|mysql

这样导入也是可以的,导成SQL文件,不需要加任何参数mysqlbinlog mysql-bin.000020>a20.sql

全备+增量备份

周日全备,周1、2、3是增量,周3删除数据,周4、5、6继续增量,还原周3误删除的数据:

1、还原全备

2、还原增备(1,2,4,5,6)

3、对周3的BINLOG 文件导成SQL文件,找到删除的数据行前加#号,然后在还原周3的增量

全局替换sed -i "s/delete/#delete/g" aa17.sql, 基于binlog_format=mixed

################################################

对于在row模式下,误删除某些数据,要立刻还原的操作

基于row模式的binlog,生成DML(insert/update/delete)的rollback语句

通过mysqlbinlog -v 解析binlog生成可读的sql文件

提取需要处理的有效sql

"### "开头的行.如果输入的start-position位于某个event group中间,则会导致"无法识别event"错误

将INSERT/UPDATE/DELETE 的sql反转,并且1个完整sql只能占1行

INSERT: INSERT INTO => DELETE FROM, SET => WHERE

UPDATE: WHERE => SET, SET => WHERE

DELETE: DELETE FROM => INSERT INTO, WHERE => SET

用列名替换位置@{1,2,3}

通过desc table获得列顺序及对应的列名

特殊列类型value做特别处理

逆序

注意:

表结构与现在的表结构必须相同[谨记]

由于row模式是幂等的,并且恢复是一次性,所以只提取sql,不提取BEGIN/COMMIT

只能对INSERT/UPDATE/DELETE进行处理

代码作者不详,能用就好o(∩_∩)o :

使用过程简单:

1、添加连接数据库的用户名和密码

2、在/usr/bin目录下不要有其他版本的mysqlbinlog文件,和当前版本统一

3、执行脚本 perl binlog_rollback.pl -f "./mysql-bin.000020" -i -o  "/tmp/t.sql" -u "dlan" -p "root123"

4、代码包下载  http://down.51cto.com/data/2287584

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码可以进行一些优化。首先,可以使用列表推导式来简化对need_stash_audits的计算。 ```python need_stash_audits = [audit for audit in self.get_need_rollback_audits()] ``` 接下来,可以使用两个列表推导式来替代for循环和if语句,将需要回滚和需要暂停的审计分别提取出来。 ```python need_rollback_audits = [audit for audit in need_stash_audits if audit.goal.name in ['saving_energy', 'power_limit']] need_suspend_audits = [audit for audit in need_stash_audits if audit not in need_rollback_audits] ``` 然后,可以使用列表推导式和条件表达式来简化循环中的if语句。这样可以减少代码行数并提高可读性。 ```python for audit in need_suspend_audits: LOG.info("Suspend non-dpm audit: %s", audit.uuid) audit.state = objects.audit.State.SUSPENDED if audit.state == objects.audit.State.ONGOING else audit.state audit.save() for audit in need_rollback_audits: LOG.info("Begin to roll back audit: %s", audit.uuid) self.dc_client.rollback_audit(self.context, audit.uuid) self.confirm_audit_rolled_back(audit) ``` 最后,注意到在代码的最后几行中,通过赋值操作更新了`self.running_state`的两个属性。可以将这两个属性的赋值操作放在代码的开头,以便更早地更新状态。 ```python self.running_state.stash_audits = self.stash_audits self.running_state.watcher_disabled_nodes = self.get_watcher_disabled_nodes() LOG.info("Audits have all been updated, disabled nodes by watcher: %s", self.running_state.watcher_disabled_nodes) ``` 通过这些优化,可以使代码更简洁、可读性更高,并且提高执行效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值