添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

MySQL【Delete误操作】使用binlog快速回滚(无须python脚本)

根据误操作时间定位binlog位置

在具体的使用场景中,binlog可能存了几十万甚至更多条数据,数据量达到上G的大小,因此确定binlog的位置需要根据误操作时间来进行筛选,因此最好能记住误操作的时间,否则查找定位binlog是一件费时费力的事。使用mysqlbinlog命令,通过–start-datetime及–stop-datetime来筛选在此时间区间内的所有操作及操作对应binlog的position。
日志文件所在路径不同版本mysql可能不同,本人使用mysql8,binlog文件在/var/lib/mysql下。
进入文件所在目录下,执行如以下命令即可查询得到相关数据操作。

mysqlbinlog --no-defaults --database=xxx -vv binlog.000007 --start-datetime="2022-02-19 8:06:34" --stop-datetime="2022-02-19 8:06:35"  | more

但如果在此过程中日志较多,通过上述命令确定position是很困难的,可以结合 “| head -1000” 以及 “| tail -1000” 进行过滤,只看binlog输出的前N行或后N行,来找到起始和终止位置,这样可以大大节省时间。若关于误操作的时间等信息实在无记忆,定位误操作的过程可以使用多种方式来进行筛选过滤,如在命令中添加sed命令来选择指定日志打印出来, “| sed -n ‘/### DELETE FROM `test`.`tet3`/,/COMMIT/p’”,打印从“### DELETE FROM `test`.`tet3`”开始到“COMMIT”结束的内容,类似方法可自行查找进行尝试。

mysqlbinlog --no-defaults --database=xxx -vv binlog.000007 --start-datetime="2022-02-19 8:06:34" --stop-datetime="2022-02-19 8:06:35" |tail -300   | more

提取误操作日志

通过查询binlog里形如 “at 123” 的日志即可确认position,确认删除操作的BEGIN及COMMIT的position即可知道整个删除操作的起始和结束position,根据两个位置点提取其中的DELETE操作日志,格式如下所示:

### DELETE FROM `test`.`me_info`
### WHERE
###   @1=2165974 /* INT meta=0 nullable=0 is_null=0 */
###   @2='1984:03:17' /* DATE meta=0 nullable=1 is_null=0 */
###   @3=NULL /* DATE meta=765 nullable=1 is_null=1 */
###   @4=2012-10-25 00:00:00 /* DATETIME meta=0 nullable=0 is_null=0 */
###   @5='' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */
###   @6=0 /* TINYINT meta=0 nullable=1 is_null=0 */
###   @7='' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */
###   @8=-1 (4294967295) /* INT meta=0 nullable=1 is_null=0 */
###   @9=0 /* MEDIUMINT meta=0 nullable=1 is_null=0 */

提取所有delete操作的日志输出到文件:

mysqlbinlog --no-defaults -vv binlog.000007 --start-position=10147088 --stop-position=109132975 | grep ^"###" >data_reload

将binlog里的delete语句转化为insert语句

delete语句为delete from `dbname`.`tablename` where @1=xxxx,@1之类表明第1个字段。
insert语句为insert into `dbname`.`tablename` values(value1, value2, ……)。
将delete语句转换为insert语句:

cat data_reload | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/VALUES(/g;' |sed -r 's/(@9.*),/\1);/g' | sed 's/@[1-9]=//g' >data_reload.sql

命令参数说明:

  • sed -n ‘/###/p’:打印’###'开头的行。
  • sed ‘s/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/VALUES(/g;’:
    s/### //g;s/\/\*.*/,/g; 把’### ’ 和/*…*/去掉; s/DELETE FROM/INSERT INTO/g; 把delete from换成insert into; s/WHERE/VALUES(/g; 把where换成values(。
  • sed -r ‘s/(@9.*),/\1);/g’:-r是正则表达式,在@9开头的一行末尾添加一个 ); ,(此处为最后一个字段后),即补全了 values(v1, ……, v9);
  • sed ‘s/@[1-9]=//g’:将@1-@9去除。

注:具体情况具体分析,根据不同数据库表结构来执行本条命令。

执行insert语句脚本将数据导入数据库

mysql -uroot -p < data_reload.sql
                    MySQL【Delete误操作】快速回滚(无须python脚本)根据误操作时间定位binlog位置在具体的使用场景中,binlog可能存了几十万甚至更多条数据,数据量达到上G的大小,因此确定binlog的位置需要根据误操作时间来进行筛选,因此最好能记住误操作的时间,否则查找定位binlog是一件费时费力的事。使用mysqlbinlog命令,通过–start-datetime及–stop-datetime来筛选在此时间区间内的所有操作及操作对应binlog的position。日志文件所在路径不同版本my
				
主要介绍了SQL删除语句DROP、TRUNCATE、 DELETE 的区别,帮助大家更好的理解和学习sql语句,感兴趣的朋友可以了解下 DROP: DROP TABLE test; 删除表test,并释放空间,将test删除的一干二净。 TRUNCATE: TRUNCATE test; 删除表test里的内容,并释放空间,但不删除表的定义,表的结构还在。 DELETE: 1、删除指定数据 删除表test中年龄等于30的且国家为US的数据 DELETE FROM test WHERE age=30 AND country=’US’; 2、删除整个表 仅删除表test内的所有内容,保留表的定
上一篇文章我讲解了delete操作回滚日志建立的方法,基于上一篇文章的基础,经过修改和增加,实现update操作回滚日志的建立。首先要注意的是:这里的update并不只是表的update操作,它包含delete和insert操作,完全涵盖上一篇文章的内容。那上一篇文章岂不就多此一举,废话一堆啦?NO~NO~NO~前一篇文章是个启发,简单易懂。行了,废话就讲到这里了! 下面直接上代码(copy
我们一般都认为TRUNCATE是一种不可回滚操作,它会删除表中的所有数据以及重置Identity列。 如果你在事务中进行TRUNCATE操作,就能回滚。反之,它就不会从日志文件文件恢复数据。它不会在日志文件中记录删除的那些数据,它只在日志中记录数据页的单元分配。 下面的例子就能解释上面的所说的.         代码如下:USE temp_test_database –创建一个临时表 CREATE TABLE TruncateTabel(ID INT) INSERT INTO TruncateTabel(ID) SELECT 1 UNION ALL SELECT 2 UNION AL
基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL操作后如何快速回滚?比如,delete一张表,忘加限制条件,整张表没了。假如这还是线上环境核心业务数据,那这事闹大了。误操作后,能快速回滚数据是非常重要的。   用全量备份重搭实例,再利用增量binlog备份,恢复到误操作之前的状态。然后跳过误操作SQL,再继续应用binlog。此法费时费力,不值得再推荐。   利用binlog2sql快速闪回   首先,确认你的MySQL server开启了binlog,设置了以下参数:   [mysqld]   server-id = 1
基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL操作后如何快速回滚?比如,delete一张表,忘加限制条件,整张表没了。假如这还是线上环境核心业务数据,那这事就闹大了。误操作后,能快速回滚数据是非常重要的。 binlog2sql快速回滚 首先,确认你的MySQL server开启了binlog,设置了以下参数: [mysqld] server-id = 1 log_bin = /var/log/mysql/mysql-bin.log max_binlog_size = 1000M binlog-format = row 如果没有开启binlog,也没有预先生
public class Main { public static String encoding = "GBK"; public static void readTxtFile(String filePath) { try { File file = new File(filePath); if (file.isFile() && file.exists()) {
一:根据时间来恢复: 1、查询数据库当前时间(目的是为了检查数据库时间是否与你电脑时间相近,避免时间不同而将数据恢复到错误时间点) select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss’) from dual; 2、查询删除数据时间点之前的数据 select * from 表名 as of timestamp to_timestamp(‘2016-08-11 16:12:11’,‘yyyy-mm-dd hh24:mi:ss’); (若没有数据 ,将时间继续提前)