MySQL自動備份與覆蓋恢復(fù)實戰(zhàn)指南
一、此前每日備份的腳本
#!/bin/bash
# === 配置部分 ===
BACKUP_BASE_DIR="/data/backup_mysql"
DATE=$(date +%F)
LOG_FILE="${BACKUP_BASE_DIR}/logs/backup-${DATE}.log"
LOCK_FILE="/tmp/mysql_backup.lock"
# 備份選項(1=啟用,0=禁用)
ENABLE_FULL_BACKUP=1
ENABLE_PER_DB_BACKUP=1
# === 日志重定向 ===
mkdir -p "${BACKUP_BASE_DIR}/logs"
exec >> "$LOG_FILE" 2>&1
echo "===== MySQL Backup Started: $(date) ====="
# === 加鎖,避免重復(fù)執(zhí)行 ===
exec 9>"$LOCK_FILE"
if ! flock -n 9; then
echo "?? 另一個備份任務(wù)正在運(yùn)行,退出..."
exit 1
fi
# === 全量備份 ===
if [ "$ENABLE_FULL_BACKUP" -eq 1 ]; then
echo "?? 開始全庫備份..."
FULL_BACKUP_FILE="${BACKUP_BASE_DIR}/all/all-databases-${DATE}.sql"
FULL_GZ_FILE="${FULL_BACKUP_FILE}.gz"
mkdir -p "${BACKUP_BASE_DIR}/all"
mysqldump --all-databases --single-transaction --quick --lock-tables=false > "$FULL_BACKUP_FILE"
if [ $? -eq 0 ]; then
echo "? 全庫備份成功: $FULL_BACKUP_FILE"
gzip "$FULL_BACKUP_FILE"
if [ $? -eq 0 ]; then
echo "? 全庫壓縮成功: $FULL_GZ_FILE"
else
echo "? 全庫壓縮失敗: $FULL_BACKUP_FILE" >&2
fi
else
echo "? 全庫備份失敗" >&2
rm -f "$FULL_BACKUP_FILE"
fi
fi
# === 每庫備份 ===
if [ "$ENABLE_PER_DB_BACKUP" -eq 1 ]; then
echo "?? 開始庫級別備份..."
databases=$(mysql -e "SHOW DATABASES;" | grep -Ev "^(Database|information_schema|performance_schema|mysql|sys)$")
for db in $databases; do
echo "?? 正在備份: $db"
DB_BACKUP_DIR="${BACKUP_BASE_DIR}/${db}"
mkdir -p "$DB_BACKUP_DIR"
DB_BACKUP_FILE="${DB_BACKUP_DIR}/${db}-${DATE}.sql"
DB_GZ_FILE="${DB_BACKUP_FILE}.gz"
mysqldump --single-transaction --quick --lock-tables=false "$db" > "$DB_BACKUP_FILE"
if [ $? -eq 0 ]; then
echo "? 備份成功: $DB_BACKUP_FILE"
gzip "$DB_BACKUP_FILE"
if [ $? -eq 0 ]; then
echo "? 壓縮成功: $DB_GZ_FILE"
else
echo "? 壓縮失敗: $DB_BACKUP_FILE" >&2
fi
else
echo "? 備份失敗: $db" >&2
rm -f "$DB_BACKUP_FILE"
fi
done
fi
# === 清理過期文件(.sql / .sql.gz) ===
echo "?? 清理 7 天前的備份文件..."
find "$BACKUP_BASE_DIR" -type f \( -name "*.sql" -o -name "*.sql.gz" \) -mtime +7 -exec rm -f {} \;
echo "===== MySQL Backup Completed: $(date) ====="二、環(huán)境信息
- 服務(wù)器主機(jī)名:
- 服務(wù)器 IP:
- 數(shù)據(jù)庫類型:MySQL
- MySQL 版本:
8.0.42 Community Server - 目標(biāo)數(shù)據(jù)庫:
imip_ecb - 數(shù)據(jù)庫字符集:
utf8mb4 - 排序規(guī)則:
utf8mb4_general_ci - 備份文件路徑(恢復(fù)來源):
/data/backup_mysql/imip_ecb/imip_ecb-2025-12-11.sql.gz- 恢復(fù)前保護(hù)性備份路徑:
/data/backup_mysql/manual_before_restore/imip_ecb-before-restore-2025-12-11.sql - 恢復(fù)類型:覆蓋源庫恢復(fù)(在同一實例上,用備份覆蓋原有 imip_ecb 庫)
三、實際恢復(fù)操作步驟
1. 查詢imip_ecb數(shù)據(jù)庫字符集與排序規(guī)則
mysql -u root -p -e " SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='imip_ecb'; "
查詢結(jié)果:
SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME ----------- | -------------------------- | ------------------------ imip_ecb | utf8mb4 | utf8mb4_general_ci
目的:記錄當(dāng)前庫的字符集/排序規(guī)則,確保重建數(shù)據(jù)庫時保持一致。
2. 創(chuàng)建“恢復(fù)前快照”備份目錄
mkdir -p /data/backup_mysql/manual_before_restore
目的:單獨(dú)存放本次覆蓋前的手工備份,便于必要時回滾。
3. 對覆蓋前的imip_ecb做一次完整邏輯備份
mysqldump --single-transaction --quick --lock-tables=false \ imip_ecb > /data/backup_mysql/manual_before_restore/imip_ecb-before-restore-`date +%F`.sql
確認(rèn)備份文件存在:
cd /data/backup_mysql/manual_before_restore ll # imip_ecb-before-restore-2025-12-11.sql
目的:為本次覆蓋恢復(fù)保留一份“恢復(fù)前狀態(tài)”的 SQL 備份。
4. 刪除原有imip_ecb數(shù)據(jù)庫(為覆蓋恢復(fù)做準(zhǔn)備)
mysql -u root -p -e "DROP DATABASE IF EXISTS imip_ecb;"
目的:清理舊庫,避免恢復(fù)過程中與原有對象沖突,確保是“重建 + 導(dǎo)入”的干凈覆蓋。
5. 按原字符集/排序規(guī)則重建imip_ecb數(shù)據(jù)庫
mysql -u root -p -e " CREATE DATABASE imip_ecb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; "
目的:與恢復(fù)前字符集/排序規(guī)則保持一致,避免編碼相關(guān)問題。
6. 使用 2025-12-11 備份文件對imip_ecb進(jìn)行覆蓋恢復(fù)
zcat /data/backup_mysql/imip_ecb/imip_ecb-2025-12-11.sql.gz \ | mysql -u root -p imip_ecb
目的:通過 zcat 解壓 .sql.gz,并通過管道將邏輯備份數(shù)據(jù)導(dǎo)入到新建的 imip_ecb 庫,實現(xiàn)在源實例上的覆蓋恢復(fù)。
7. 恢復(fù)后檢查:確認(rèn)數(shù)據(jù)庫存在
mysql -u root -p -e "SHOW DATABASES LIKE 'imip_ecb';"
8. 恢復(fù)后檢查:確認(rèn)業(yè)務(wù)表已成功恢復(fù)
mysql -u root -p -D imip_ecb -e "SHOW TABLES;"
輸出包含業(yè)務(wù)表,例如:
EMS_EQUIPMENT_INFO EMS_INSPECT_TASK EMS_MAINTENANCE_WORK_ORDER ERP_STOCK ERP_STOCK_IN ERP_STOCK_OUT ERP_SUPPLIER ERP_WAREHOUSE infra_task_attachment ...
目的:確認(rèn) EMS/ERP 相關(guān)業(yè)務(wù)表均已從備份中成功恢復(fù),庫結(jié)構(gòu)完整。
以上就是MySQL自動備份與覆蓋恢復(fù)實戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于MySQL自動備份與覆蓋恢復(fù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mysql優(yōu)化調(diào)優(yōu)中兩個重要參數(shù)table_cache和key_buffer
這篇文章主要介紹了Mysql優(yōu)化調(diào)優(yōu)中兩個重要參數(shù)table_cache和key_buffer,需要的朋友可以參考下2014-12-12
MySQL自動填充create_time和update_time的兩種方式
當(dāng)我們創(chuàng)建業(yè)務(wù)表的時候 通常都需要設(shè)置create_time 和 update_time,下面這篇文章主要給大家介紹了關(guān)于MySQL自動填充createTime和updateTime的兩種方式,需要的朋友可以參考下2022-05-05
MySQL 導(dǎo)出一條數(shù)據(jù)的插入語句(示例詳解)
在MySQL中,如果我們想要導(dǎo)出一條數(shù)據(jù)的插入語句,我們可以使用SELECT ... INTO OUTFILE語句,這篇文章主要介紹了MySQL 導(dǎo)出一條數(shù)據(jù)的插入語句,需要的朋友可以參考下2024-06-06
Win10系統(tǒng)下MySQL8.0.16 壓縮版下載與安裝教程圖解
這篇文章主要介紹了Win10系統(tǒng)下MySQL8.0.16 壓縮版下載與安裝教程圖解,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考解決價值,需要的朋友可以參考下2019-06-06

