MySQL自動(dòng)備份與覆蓋恢復(fù)實(shí)戰(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"
# 備份選項(xiàng)(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 "?? 另一個(gè)備份任務(wù)正在運(yùn)行,退出..."
exit 1
fi
# === 全量備份 ===
if [ "$ENABLE_FULL_BACKUP" -eq 1 ]; then
echo "?? 開始全庫(kù)備份..."
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 "? 全庫(kù)備份成功: $FULL_BACKUP_FILE"
gzip "$FULL_BACKUP_FILE"
if [ $? -eq 0 ]; then
echo "? 全庫(kù)壓縮成功: $FULL_GZ_FILE"
else
echo "? 全庫(kù)壓縮失敗: $FULL_BACKUP_FILE" >&2
fi
else
echo "? 全庫(kù)備份失敗" >&2
rm -f "$FULL_BACKUP_FILE"
fi
fi
# === 每庫(kù)備份 ===
if [ "$ENABLE_PER_DB_BACKUP" -eq 1 ]; then
echo "?? 開始庫(kù)級(jí)別備份..."
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
# === 清理過(guò)期文件(.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ù)庫(kù)類型:MySQL
- MySQL 版本:
8.0.42 Community Server - 目標(biāo)數(shù)據(jù)庫(kù):
imip_ecb - 數(shù)據(jù)庫(kù)字符集:
utf8mb4 - 排序規(guī)則:
utf8mb4_general_ci - 備份文件路徑(恢復(fù)來(lái)源):
/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ù)類型:覆蓋源庫(kù)恢復(fù)(在同一實(shí)例上,用備份覆蓋原有 imip_ecb 庫(kù))
三、實(shí)際恢復(fù)操作步驟
1. 查詢imip_ecb數(shù)據(jù)庫(kù)字符集與排序規(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)前庫(kù)的字符集/排序規(guī)則,確保重建數(shù)據(jù)庫(kù)時(shí)保持一致。
2. 創(chuàng)建“恢復(fù)前快照”備份目錄
mkdir -p /data/backup_mysql/manual_before_restore
目的:?jiǎn)为?dú)存放本次覆蓋前的手工備份,便于必要時(shí)回滾。
3. 對(duì)覆蓋前的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ù)庫(kù)(為覆蓋恢復(fù)做準(zhǔn)備)
mysql -u root -p -e "DROP DATABASE IF EXISTS imip_ecb;"
目的:清理舊庫(kù),避免恢復(fù)過(guò)程中與原有對(duì)象沖突,確保是“重建 + 導(dǎo)入”的干凈覆蓋。
5. 按原字符集/排序規(guī)則重建imip_ecb數(shù)據(jù)庫(kù)
mysql -u root -p -e " CREATE DATABASE imip_ecb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; "
目的:與恢復(fù)前字符集/排序規(guī)則保持一致,避免編碼相關(guān)問(wèn)題。
6. 使用 2025-12-11 備份文件對(duì)imip_ecb進(jìn)行覆蓋恢復(fù)
zcat /data/backup_mysql/imip_ecb/imip_ecb-2025-12-11.sql.gz \ | mysql -u root -p imip_ecb
目的:通過(guò) zcat 解壓 .sql.gz,并通過(guò)管道將邏輯備份數(shù)據(jù)導(dǎo)入到新建的 imip_ecb 庫(kù),實(shí)現(xiàn)在源實(shí)例上的覆蓋恢復(fù)。
7. 恢復(fù)后檢查:確認(rèn)數(shù)據(jù)庫(kù)存在
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ù),庫(kù)結(jié)構(gòu)完整。
以上就是MySQL自動(dòng)備份與覆蓋恢復(fù)實(shí)戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于MySQL自動(dòng)備份與覆蓋恢復(fù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mysql優(yōu)化調(diào)優(yōu)中兩個(gè)重要參數(shù)table_cache和key_buffer
這篇文章主要介紹了Mysql優(yōu)化調(diào)優(yōu)中兩個(gè)重要參數(shù)table_cache和key_buffer,需要的朋友可以參考下2014-12-12
MySQL自動(dòng)填充create_time和update_time的兩種方式
當(dāng)我們創(chuàng)建業(yè)務(wù)表的時(shí)候 通常都需要設(shè)置create_time 和 update_time,下面這篇文章主要給大家介紹了關(guān)于MySQL自動(dòng)填充createTime和updateTime的兩種方式,需要的朋友可以參考下2022-05-05
MySQL 導(dǎo)出一條數(shù)據(jù)的插入語(yǔ)句(示例詳解)
在MySQL中,如果我們想要導(dǎo)出一條數(shù)據(jù)的插入語(yǔ)句,我們可以使用SELECT ... INTO OUTFILE語(yǔ)句,這篇文章主要介紹了MySQL 導(dǎo)出一條數(shù)據(jù)的插入語(yǔ)句,需要的朋友可以參考下2024-06-06
Mysql存儲(chǔ)json格式的實(shí)現(xiàn)
本文主要介紹了Mysql存儲(chǔ)json格式的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
MySQL自動(dòng)停機(jī)的問(wèn)題處理實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了關(guān)于MySQL自動(dòng)停機(jī)的問(wèn)題處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
MySQL 服務(wù)和數(shù)據(jù)庫(kù)管理
今天MySQL總結(jié)一些方法和一些基礎(chǔ)的內(nèi)容,下面文章將圍繞MySQL 服務(wù)與數(shù)據(jù)庫(kù)管理得相關(guān)資料展開內(nèi)容,需要的朋友可以參考一下,希望對(duì)你有所幫助2021-11-11
Win10系統(tǒng)下MySQL8.0.16 壓縮版下載與安裝教程圖解
這篇文章主要介紹了Win10系統(tǒng)下MySQL8.0.16 壓縮版下載與安裝教程圖解,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考解決價(jià)值,需要的朋友可以參考下2019-06-06

