在進行數據恢復前,務必優先停止MySQL服務,防止新的寫入操作覆蓋原有數據(尤其是InnoDB引擎的表,數據可能仍在內存或redo log中)。執行以下命令停止服務:
sudo systemctl stop mysqld
同時,備份當前數據目錄(默認路徑為/var/lib/mysql
),避免恢復過程中出現意外:
sudo cp -R /var/lib/mysql /var/lib/mysql_backup
若你定期使用mysqldump
工具創建了邏輯備份(.sql
文件),這是最可靠的恢復方式。
mysql -u 用戶名 -p 數據庫名 < 備份文件.sql
例如,恢復mydatabase
數據庫:
mysql -u root -p mydatabase < /path/to/mydatabase_backup.sql
輸入密碼后,備份中的表結構和數據將導入到指定數據庫。
若只需恢復單個表,可將備份文件中的對應表結構及數據導入:
mysql -u root -p 數據庫名 < /path/to/backup_file.sql
或直接指定表名(需備份文件包含該表數據):
mysql -u root -p 數據庫名 表名 < /path/to/table_backup.sql
若啟用了二進制日志(log_bin=ON
),可通過binlog記錄的SQL操作,精準恢復誤刪或誤修改的數據。
SHOW VARIABLES LIKE 'log_bin';
若返回ON
,則表示已開啟。
SHOW BINARY LOGS;
記錄下包含誤操作時間點的binlog文件名(如mysql-bin.000002
)。
使用mysqlbinlog
工具解析binlog,提取誤操作前后的SQL語句:
mysqlbinlog --no-defaults --start-datetime="2025-08-18 00:00:00" --stop-datetime="2025-08-18 23:59:59" /var/lib/mysql/mysql-bin.000002 > binlog.sql
參數說明:
--start-datetime
/--stop-datetime
:指定時間范圍,縮小恢復范圍;/var/lib/mysql/mysql-bin.000002
:binlog文件路徑;> binlog.sql
:將解析結果輸出到binlog.sql
文件。打開binlog.sql
,找到誤刪操作的逆操作(如DELETE
對應INSERT
),執行即可。例如:
INSERT INTO users (id, name, age) VALUES (2, 'Bob', 25);
若需恢復到誤操作前的狀態,可直接回放binlog到誤操作前的時間點:
mysqlbinlog --stop-datetime="2025-08-18 15:30:00" /var/lib/mysql/mysql-bin.000002 | mysql -u root -p
這會將binlog中截至15:30:00
的所有操作重新執行,覆蓋誤刪后的數據。
若數據丟失是由于表損壞(而非誤刪),可使用MySQL自帶的工具修復:
sudo myisamchk -r /var/lib/mysql/數據庫名/表名.MYI
-r
參數表示修復表,若修復失敗,可嘗試-o
(更徹底的修復)。
sudo mysqlcheck -u root -p --all-databases --auto-repair
或針對特定數據庫/表:
sudo mysqlcheck -u root -p 數據庫名 表名 --auto-repair
--auto-repair
參數會自動修復損壞的表。
若你有完整的物理備份(如整個/var/lib/mysql
目錄的快照或磁盤分區備份),可通過以下步驟恢復:
sudo rsync -avz /path/to/physical_backup/mysql/ /var/lib/mysql/
sudo chown -R mysql:mysql /var/lib/mysql
sudo systemctl start mysqld
mysqldump
或mydumper
工具定期創建邏輯備份,或配置物理備份(如rsync
+cron
);my.cnf
中設置log_bin=ON
,保留足夠的binlog文件(通過expire_logs_days
參數設置過期時間);DELETE
、DROP
等高危操作權限。以上方法覆蓋了Linux環境下MySQL數據恢復的常見場景,可根據實際情況選擇合適的方式。若數據極其重要且無法自行恢復,建議聯系專業數據恢復服務商。