資料庫備份是 DBA 的生命線。本文針對 Linux 環境 MySQL,提供冷備份、熱備份、還原、定時排程完整操作流程,並含真實故障修復案例(phpBB 論壇 MyISAM 表損壞)。
/var/lib/mysql# 1. 停止服務(避免寫入衝突)
systemctl stop mysqld
# 或:mysqladmin -u root -p shutdown
# 2. 修復損壞表(以 phpbb2_users 為例)
cd /var/lib/mysql/phpbb2
myisamchk -r phpbb2_users.MYI # 普通修復
# 若失敗,強制修復
myisamchk -o phpbb2_users.MYI
# 3. 重複執行直到無錯誤輸出
# 4. 重啟服務驗證
systemctl start mysqld
mysql -u root -p -e "CHECK TABLE phpbb2_users"
建議: 定期排程 mysqlcheck -A -r 全庫檢查修復,避免積累損壞。
# 1. 停止 MySQL
systemctl stop mysqld
# 2. 打包數據目錄(以 phpbb2 庫為例)
tar czvf /backup/phpbb2_db_$(date +%F).tgz /var/lib/mysql/phpbb2
# 3. 打包程式碼(如有變更)
tar czvf /backup/phpbb2_code_$(date +%F).tgz /var/www/html/phpbb2
# 4. 重啟 MySQL
systemctl start mysqld
優點:文件級一致性 100%,無鎖無阻塞。缺點:需停機(秒級~分級)。
# 單庫備份(含結構+數據)
mysqldump -u root -p --single-transaction --routines --triggers --events phpbb2 > /backup/phpbb2_$(date +%F).sql
# 全庫備份
mysqldump -u root -p --all-databases --single-transaction > /backup/full_$(date +%F).sql
# 壓縮存儲
mysqldump ... | gzip > /backup/db_$(date +%F).sql.gz
關鍵參數:--single-transaction(InnoDB 一致性視圖)、--master-data=2(記錄 Binlog 位置便於 PITR)。
# 安裝
yum install percona-xtrabackup-80
# 全備
xtrabackup --backup --target-dir=/backup/full_$(date +%F) --user=root --password=xxx
# 增備
xtrabackup --backup --target-dir=/backup/inc_$(date +%F) --incremental-basedir=/backup/full_2024-01-01 --user=root --password=xxx
# 還原準備
xtrabackup --prepare --target-dir=/backup/full_2024-01-01
# 停止 MySQL、清空 datadir、複製回、修正權限、啟動
# 建庫
mysql -u root -p -e "CREATE DATABASE phpbb2 CHARACTER SET utf8mb4;"
# 導入
mysql -u root -p phpbb2 < /backup/phpbb2_2024-01-01.sql
# 或壓縮文件
zcat /backup/phpbb2_2024-01-01.sql.gz | mysql -u root -p phpbb2
systemctl stop mysqld
rm -rf /var/lib/mysql/* # 清空或備份舊目錄
tar xzvf /backup/phpbb2_db_2024-01-01.tgz -C /var/lib/mysql/
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld
# 編輯 crontab
crontab -e
# 每天凌晨 2:30 全庫邏輯備份
30 2 * * * /usr/bin/mysqldump -u root -p'pass' --all-databases --single-transaction | gzip > /backup/full_$(date +\%F).sql.gz
# 每小時增量物理備份(需配合 xtrabackup 腳本)
0 * * * * /scripts/xtrabackup_inc.sh
SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER, RELOAD, REPLICATION CLIENT。MySQL 備份無銀彈,需根據業務 RPO/RTO 選型:小庫/可停機 → 冷備份;大庫/7×24 → xtrabackup 物理熱備 + Binlog PITR。無論何種方案,「備份未驗證等於無備份」是鐵律。