生產環境定期執行全量備份 (mysqldump -A),但災難恢復時往往只需恢復某個庫或某張表。全量導入耗時極長,需掌握精準恢復技巧。
# 全量備份
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`; 切庫語句 (默認包含)。
# 提取表 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;
# 提取表 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
| 參數 | 用途 |
|---|---|
| --start-datetime / --stop-datetime | 按時間範圍過濾 |
| --start-position / --stop-position | 按位置偏移量過濾 (更精準) |
| --database | 只處理指定庫 |
| --verbose | 輸出可讀 SQL (重定向到文件審查) |
掌握 --one-database 恢復指定庫、sed/grep 提取單表、mysqlbinlog 時間/位置點恢復 三大技巧,可將恢復時間從小時級壓縮到分鐘級。建議平時演練,備份文件定期驗證可用性。