備註:
MySQL 5.7.31
一.問題描述
之前幫朋友搭建的MySQL數據庫,說是有個表的數據被誤刪除了,現在需要進行恢復。
二. 解決方案
還好我之前給他安裝MySQL數據庫的時候,特意做了備份,每天凌晨都會把整庫進行備份。
2.1 從整庫備份中找到單表的備份文件
2.1.1 直接通過sed命令處理
在網上找到了這個命令,用起來還不錯:
sed -n -e '/CREATE TABLE.*`my_table`/,/CREATE TABLE/p' mydump.sql >/tmp/my_table.sql
不過有點慢,9GB左右文件 5分鐘左右,結果文件500M左右
速度有點慢:
2.1.2 切分後通過grep來查找
下次嘗試把大文件切分一下
按1000行一個文件進行切分,最好在後臺運行
split -l 1000 mydump.sql &
切分後的文件如下:
[root@not1 tmp]# ls
xaa xab xac xad xae xaf xag xah xai xaj xak xal xam xan xao xap xaq xar xas xat xau xav xaw xax xay xaz xba xbb
寫個shell腳本遍歷:
#!/bin/bash
dir=/data/tmp
date
for file in $dir/*; do
cat $file | grep --ignore-case 'insert into `my_table`' >>/tmp/20211126.log
done
date
echo "================="
date
cat /data/dump.sql | grep --ignore-case 'insert into `my_table`' >>/tmp/20211126_2.log
date
~
數據量不大,只有2G,12s優化到了8s,效果還算過得去
[root@node1 data]# sh 1.sh
Fri Nov 26 17:40:38 CST 2021
Fri Nov 26 17:40:50 CST 2021
=================
Fri Nov 26 17:40:50 CST 2021
Fri Nov 26 17:41:02 CST 202
2.2 恢復到一個新表
做恢復的時候,最好是恢復到一個新庫下的新表,確認數據無誤後再寫回原表
mysql -uroot -p -hmy_host
create database db_backup;
use db_backup;
source /tmp/my_table.sql
追日誌,確保無問題。
2.3 還原到源環境
因爲備份表和目前系統的表 表結構不一致,所以處理起來會麻煩一些
目前系統的表比源表多一個col1字段。
-- 備份新表
create table my_new_table_bak like my_new_table;
-- 將新表多的字段給刪除
alter table my_new_table drop column col1;
-- 從備份表同步數據
insert into my_new_table select * from db_backup.my_backup_table;
-- 將刪除的列再添加回來
alter table my_new_table add column col1 varchar(255);
-- 清理備份表
drop table db_backup.my_backup_table;