博客 / 詳情

返回

技術分享 | MySQL8.0邏輯備份mysqldump全備腳本

本文為墨天輪數據庫管理服務團隊第155期技術分享,內容原創,作者為技術顧問閆建,如需轉載請聯繫小墨(VX:modb666)並註明來源。如需查看更多文章可關注【墨天輪】公眾號。

腳本功能

此腳本是專門用於MySQL8.0全實例備份的mysqldump腳本,它包含了備份數據庫實例的所有對象(數據、結構、存儲過程、函數、事件、觸發器)的完整配置。

腳本內容

腳本名稱命名為 mysql\_full\_backup.sh


### mysql_full_backup.sh腳本內容如下:
#!/bin/bash
# MySQL 8.0 全實例自動備份腳本
# 功能:備份所有數據庫(包含存儲過程、函數、事件、觸發器)
# ====== 配置區 ======
# MySQL 連接配置
MYSQL_USER="root"                    # MySQL 用户名
MYSQL_PASS="your_password"           # MySQL 密碼(建議使用配置文件免密)
MYSQL_HOST="localhost"               # MySQL 主機
MYSQL_PORT="3306"                    # MySQL 端口
# 備份路徑配置
BACKUP_BASE_DIR="/data/mysql_backup"            # 備份根目錄
DATE_STAMP=$(date +"%Y%m%d_%H%M%S")            # 時間戳格式
BACKUP_DIR="${BACKUP_BASE_DIR}/full_${DATE_STAMP}"  # 本次備份目錄
# 備份保留天數(自動清理舊備份)
RETENTION_DAYS=7
# 日誌文件
LOG_FILE="${BACKUP_BASE_DIR}/backup.log"
# ====== 函數定義 ======
# 記錄日誌函數
log_message() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> ${LOG_FILE}
}
# 檢查錯誤函數
check_error() {
    if [ $? -ne 0 ]; then
        log_message "錯誤: $1"
        exit 1
    fi
}
# ====== 主程序開始 ======
log_message "=== MySQL全量備份開始 ==="
# 1. 創建備份目錄
mkdir -p ${BACKUP_DIR}
check_error "創建備份目錄失敗"
# 2. 設置權限(保護備份文件)
chmod 750 ${BACKUP_DIR}
log_message "備份目錄創建成功: ${BACKUP_DIR}"
# 3. 執行全實例備份(關鍵參數説明)
log_message "開始執行mysqldump全實例備份..."
mysqldump --user=${MYSQL_USER} \
          --password=${MYSQL_PASS} \
          --host=${MYSQL_HOST} \
          --port=${MYSQL_PORT} \
          --all-databases \
          --single-transaction \
          --routines \
          --events \
          --triggers \
          --flush-logs \
          --source-data=2 \
          --set-gtid-purged=OFF \
          --default-character-set=utf8mb4 \
          --max-allowed-packet=1G \
          --hex-blob \
          --result-file=${BACKUP_DIR}/mysql_full_backup_${DATE_STAMP}.sql
check_error "mysqldump備份執行失敗"
log_message "MySQL全實例備份完成: ${BACKUP_DIR}/mysql_full_backup_${DATE_STAMP}.sql"
# 4. 備份MySQL配置文件(重要!)
cp /etc/my.cnf ${BACKUP_DIR}/my.cnf_backup_${DATE_STAMP} 2>/dev/null || log_message "警告: 未找到/etc/my.cnf,跳過配置文件備份"
# 5. 壓縮備份文件(節省空間)
log_message "開始壓縮備份文件..."
gzip ${BACKUP_DIR}/mysql_full_backup_${DATE_STAMP}.sql
check_error "備份文件壓縮失敗"
log_message "備份文件壓縮完成: ${BACKUP_DIR}/mysql_full_backup_${DATE_STAMP}.sql.gz"
# 6. 生成MD5校驗文件(驗證備份完整性)
md5sum ${BACKUP_DIR}/mysql_full_backup_${DATE_STAMP}.sql.gz > ${BACKUP_DIR}/backup.md5
log_message "生成MD5校驗文件"
# 7. 清理舊備份(按保留天數設置)
log_message "清理${RETENTION_DAYS}天前的舊備份..."
find ${BACKUP_BASE_DIR} -name "full_*" -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} \; 2>/dev/null
# 8. 輸出備份信息
BACKUP_SIZE=$(du -sh ${BACKUP_DIR} | cut -f1)
log_message "備份完成! 備份大小: ${BACKUP_SIZE}, 備份位置: ${BACKUP_DIR}"
# 9. 驗證備份文件完整性
log_message "驗證備份文件完整性..."
md5sum -c ${BACKUP_DIR}/backup.md5 >> ${LOG_FILE} 2>&1
if [ $? -eq 0 ]; then
    log_message "備份文件完整性驗證通過"
else
    log_message "警告: 備份文件完整性驗證失敗"
fi
log_message "=== MySQL全量備份結束 ==="
echo "備份已完成! 文件位置: ${BACKUP_DIR}/mysql_full_backup_${DATE_STAMP}.sql.gz"
 

 🔧關鍵參數説明

核心備份選項:

1.  --all-databases:備份所有數據庫(含系統庫)
2.  --single-transaction:通過事務確保InnoDB表備份一致性(避免鎖表)
3.  --routines:備份存儲過程和函數
4.  --events:備份事件調度器
5.  --triggers:備份觸發器

高級配置

--source-data=2:在備份中記錄二進制日誌位置(用於主從複製)
--set-gtid-purged=OFF:避免GTID相關衝突
--hex-blob:安全處理BLOB數據類型

使用方法

1. 保存腳本並賦予執行權限

chmod +x mysql_full_backup.sh

2. 配置MySQL免密認證(可選推薦,避免密碼明文)

 在/root/.my.cnf中添加:

[client]
user=root
password=your_password
host=localhost
port=3306

 然後設置權限:chmod 600 /root/.my.cnf

3. 手動執行備份

./mysql_full_backup.sh

4. 配置定時任務(每日凌晨2點執行)

# 編輯crontab:crontab -e 添加如下內容並保存
0 2 * * * /path/to/mysql_full_backup.sh

備份驗證與恢復

驗證備份完整性:

# 檢查備份文件
gunzip -c mysql_full_backup_20251020_143000.sql.gz | head -100
# 驗證MD5校驗和
md5sum -c backup.md5

恢復備份:

# 解壓備份文件
gunzip mysql_full_backup_20251020_143000.sql.gz
# 恢復到MySQL
mysql -u root -p < mysql_full_backup_20251020_143000.sql

總 結

該腳本提供了一個生產環境所需的完整功能,包括錯誤處理、日誌記錄、自動清理和完整性驗證。數據庫運維人員可以根據實際環境調整配置參數,特別是備份路徑和保留天數設置。


墨天輪從樂知樂享的數據庫技術社區蓄勢出發,全面升級,提供多類型數據庫管理服務。墨天輪數據庫管理服務旨在為用户構建信賴可託付的數據庫環境,併為數據庫廠商提供中立的生態支持。
墨天輪數據庫服務官網:https://www.modb.pro/service

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.