事件背景
线上的数据由于开发错误的 update 语句导致数据出现问题,需要将某张指定的表回滚到某个状态,但是查看了凌晨的备份,该数据文件有 20G 左右,不好恢复操作,于是想直接从 SQL 文件中抽离出该表。这里对网上的方法做个记录并测试有效。
方法如下:
1. 导出表结构:
sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `表名`/!d;q' 备份的SQL文件 > table.sql
例如从 backup.sql 的备份文件中导出 hello 表:
sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `hello`/!d;q' backup.sql > table.sql
2. 导出该表数据:
grep 'INSERT INTO `表名`' 备份的SQL文件 > data.sql
这样就能拿到数据了,当然如果想要最新的,可以结合 binlog 使用。