首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 從全量備份中恢復指定庫表的實戰技巧

     編輯:MySQL 資料庫相關知識

場景背景

生產環境定期執行全量備份 (mysqldump -A),但災難恢復時往往只需恢復某個庫或某張表。全量導入耗時極長,需掌握精準恢復技巧。

一、恢復指定數據庫 (--one-database)


# 全量備份
mysqldump -uroot -p --single-transaction -A --master-data=2 > full_backup.sql

# 僅恢復 erp 數據庫
mysql -uroot -p -D erp --one-database < full_backup.sql

原理:--one-database (簡寫 -o) 只執行目標庫的 SQL,跳過其他庫的語句。前提:備份文件包含 USE `db_name`; 切庫語句 (默認包含)。

二、從全量備份提取單表結構與數據

2.1 提取表結構 (sed 正則)


# 提取表 t 的 CREATE TABLE 語句
sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `t`/!d;q' full_backup.sql

# 輸出示例
DROP TABLE IF EXISTS `t`;
CREATE TABLE `t` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `age` tinyint(4) NOT NULL DEFAULT '0',
  `name` varchar(30) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.2 提取表數據 (grep)


# 提取表 t 的 INSERT 語句
grep 'INSERT INTO `t`' full_backup.sql

# 輸出示例
INSERT INTO `t` VALUES (0,0,''),(1,0,'aa'),(2,0,'bbb'),(3,25,'helei');

三、組合恢復流程


# 1. 創建目標庫 (如不存在)
mysql -uroot -p -e "CREATE DATABASE IF NOT EXISTS target_db;"

# 2. 提取表結構並導入
sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `t`/!d;q' full_backup.sql | mysql -uroot -p target_db

# 3. 提取表數據並導入
grep 'INSERT INTO `t`' full_backup.sql | mysql -uroot -p target_db

四、進階:恢復到不同時點 (二進制日志)


# 1. 全量備份恢復到備份時間點
mysql -uroot -p < full_backup.sql

# 2. 應用增量 binlog (需開啟 log-bin)
mysqlbinlog mysql-bin.000003 | mysql -uroot -p

# 3. 指定時間點恢復
mysqlbinlog --stop-datetime="2023-10-01 10:00:00" mysql-bin.000003 | mysql -uroot -p

# 4. 指定位置恢復 (跳過故障 SQL)
mysqlbinlog --start-position=368315 mysql-bin.000003 | mysql -uroot -p

五、工具推薦:mysqlbinlog 精準恢復參數

參數用途
--start-datetime / --stop-datetime按時間範圍過濾
--start-position / --stop-position按位置偏移量過濾 (更精準)
--database只處理指定庫
--verbose輸出可讀 SQL (重定向到文件審查)

總結

掌握 --one-database 恢復指定庫、sed/grep 提取單表、mysqlbinlog 時間/位置點恢復 三大技巧,可將恢復時間從小時級壓縮到分鐘級。建議平時演練,備份文件定期驗證可用性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved