MySQL從整庫備份中恢復單表 一.問題描述 二. 解決方案 參考:

備註:
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;

參考:

  1. https://cloud.tencent.com/developer/ask/28565
  2. https://www.cnblogs.com/mysql-dba/p/4958612.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章