0%

MySQL误操作后数据恢复(delete)

误删除数据恢复

  • 把binglog解析为文本
    mysqlbinlog --no-defaults --base64-output=decode-rows -v -v ./mysql-bin.001250 > mysql_bin_log.txt

    • 如果确定时间范围,可以使用: mysqlbinlog --no-defaults --database=test_db --start-datetime="2024-09-12 00:00:00" --stop-datetime="2024-09-13 00:00:00" ./mysql-bin.001250 > mysql_bin_log.txt
  • 过滤出 test_db.test_table 的删除内容

    cat mysql_bin_log.txt | sed -n '/### DELETE FROM test_db.test_table/,/COMMIT/p'

    确认好之后,保存到文件中: cat mysql_bin_log.txt | sed -n '/### DELETE FROM test_db.test_table/,/COMMIT/p' >> mysql_delete.txt

  • 把 DELETE 数据转换成 insert into 语句

    1
    2
    3
    4
    5
    6
    cat table_delete.txt \
    | sed -n '/###/p' \
    | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;' \
    | gsed -r 's/(@22.*),/\1;/g' \
    | sed 's/@.*=//g' > recovery.sql

    • 所以最后(4个sed)替换的操作为:
      • 只保留包含 ### 的行
      • 多重操作
        i. 删除每行的前缀注释 ###
        i. 删除 数据列 对应的 mysql注释
        i. 替换 DELETE FROM 为 INSERT INTO
        i. 替换 WHERE 为 SELECT
      • 按正则替换第 22 列(表一共22列)最后的 , 逗号为 ; 分号
      • 删除 数据列 的前缀, 只保留对应的数据
  • 注意:

    • gsed 是由于MAC系统自带的 sed 没有 -r 选项, 所以安装: brew install gnu-sed

    • gsed -r 's/(@17.*),/\1;/g' 中的 @17 其实是 test_table 表的最后一列