在進行任何恢復操作前,務必停止MySQL服務,防止數據被進一步覆蓋或修改:
sudo systemctl stop mysql
同時,備份當前數據庫文件(默認路徑為/var/lib/mysql
),避免恢復過程中出現意外:
sudo cp -R /var/lib/mysql /var/lib/mysql_backup
這一步是后續恢復的基礎,能有效降低二次數據丟失的風險。
若之前通過mysqldump
創建了SQL備份(如full_backup.sql
),可通過以下命令恢復:
mysql -u root -p < /path/to/full_backup.sql
注意:恢復前需確保目標數據庫已存在(可通過CREATE DATABASE 數據庫名;
創建)。
若備份的是/var/lib/mysql
目錄(包含所有數據庫文件),可直接覆蓋當前目錄:
sudo cp -R /var/lib/mysql_backup/* /var/lib/mysql/
覆蓋后重啟MySQL服務即可:
sudo systemctl start mysql
此方法適用于MyISAM等存儲引擎,恢復速度快,但需確保備份文件與當前MySQL版本兼容。
若啟用了Binlog(默認開啟,可通過SHOW VARIABLES LIKE 'log_bin';
確認),可通過日志恢復指定時間點或位置的數據:
# 查看當前使用的Binlog文件
SHOW MASTER STATUS;
# 查看Binlog開啟狀態(應為ON)
SHOW VARIABLES LIKE 'log_bin';
Binlog文件通常位于/var/log/mysql/
目錄,命名格式為mysql-bin.000001
。
使用mysqlbinlog
工具解析Binlog,提取誤操作前的數據:
# 按時間范圍解析(如恢復2025-10-10 10:00至12:00的操作)
mysqlbinlog --start-datetime="2025-10-10 10:00:00" --stop-datetime="2025-10-10 12:00:00" /var/log/mysql/mysql-bin.000001 > recovery.sql
# 或按位置解析(如從位置1234到5678)
mysqlbinlog --start-position=1234 --stop-position=5678 /var/log/mysql/mysql-bin.000001 > recovery.sql
解析后,編輯recovery.sql
文件,刪除誤刪除語句(如DELETE
),保留INSERT
語句,再導入數據庫:
mysql -u root -p 數據庫名 < recovery.sql
此方法能精確恢復到某一時間點,適合誤刪單條或多條數據的場景。
Percona XtraBackup是開源熱備份工具,支持InnoDB和XtraDB存儲引擎,無需停止MySQL服務即可備份:
# 安裝工具
sudo apt-get install percona-xtrabackup-24
# 準備備份(目標目錄需提前創建)
sudo xtrabackup --backup --target-dir=/path/to/backup
# 準備恢復(應用日志)
sudo xtrabackup --prepare --target-dir=/path/to/backup
# 恢復數據(復制到MySQL數據目錄)
sudo xtrabackup --copy-back --target-dir=/path/to/backup --datadir=/var/lib/mysql
# 重啟MySQL服務
sudo systemctl restart mysql
此工具適合大規模數據庫恢復,支持增量備份,恢復效率高。
若數據丟失涉及InnoDB表,可通過以下步驟恢復:
# 解壓備份文件(若已壓縮)
innobackupex --decompress /path/to/backup/full
# 應用日志(確保數據一致性)
innobackupex --apply-log /path/to/backup/full
# 復制備份到MySQL數據目錄
innobackupex --datadir=/var/lib/mysql --copy-back /path/to/backup/full
# 重啟MySQL服務
sudo systemctl restart mysql
此方法能恢復InnoDB表的最新數據,適合InnoDB引擎的數據庫。
若表因崩潰或誤操作損壞,可通過mysqlcheck
工具修復:
# 修復所有數據庫的表
sudo mysqlcheck --all-databases --auto-repair -u root -p
# 修復指定數據庫的表
sudo mysqlcheck --repair --databases 數據庫名 -u root -p
修復后,可通過CHECK TABLE 表名;
命令驗證表完整性。
若沒有任何備份,可嘗試使用第三方數據恢復工具,如:
cron
任務結合mysqldump
或xtrabackup
;log_bin=ON
,這是精確恢復的關鍵;