Mysql數據倉庫備份腳本
#!/bin/bash# MySQL數據庫完整備份腳本
# 功能: 查詢所有數據庫 -> 分別導出 -> 壓縮打包# ==================== 配置區域 ====================
# MySQL連接信息
MYSQL_USER="root"
MYSQL_PASSWORD="root"
MYSQL_HOST="localhost"
MYSQL_PORT="3306"# 備份配置
BACKUP_BASE_DIR="/home/db"
BACKUP_FOLDER="mysql_backup_$(date +%Y%m%d_%H%M%S)"
BACKUP_DIR="$BACKUP_BASE_DIR/$BACKUP_FOLDER"
ARCHIVE_FILE="$BACKUP_BASE_DIR/${BACKUP_FOLDER}.tar.gz"
LOG_FILE="/home/db/mysql_full_backup.log"# ==================== 函數定義 ====================
# 日志記錄函數
log_message() {echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}# 檢查和創建備份目錄
check_backup_dir() {log_message "檢查和創建備份目錄..."# 創建基礎備份目錄if [ ! -d "$BACKUP_BASE_DIR" ]; thenlog_message "創建基礎備份目錄: $BACKUP_BASE_DIR"mkdir -p "$BACKUP_BASE_DIR"if [ $? -ne 0 ]; thenlog_message "錯誤: 無法創建基礎備份目錄 $BACKUP_BASE_DIR"exit 1fifi# 創建本次備份目錄if [ ! -d "$BACKUP_DIR" ]; thenlog_message "創建本次備份目錄: $BACKUP_DIR"mkdir -p "$BACKUP_DIR"if [ $? -ne 0 ]; thenlog_message "錯誤: 無法創建備份目錄 $BACKUP_DIR"exit 1fifi
}# 檢查MySQL連接
check_mysql_connection() {log_message "正在檢查MySQL連接..."mysql -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "SELECT 1;" >/dev/null 2>&1if [ $? -ne 0 ]; thenlog_message "錯誤: 無法連接到MySQL數據庫"exit 1filog_message "MySQL連接正常"
}# 查詢所有數據庫
get_all_databases() {log_message "查詢所有數據庫..."DATABASES=($(mysql -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "SHOW DATABASES;" 2>>"$LOG_FILE" | grep -v Database))log_message "發現 ${#DATABASES[@]} 個數據庫: ${DATABASES[*]}"
}# 導出單個數據庫
export_database() {local db_name=$1local output_file="$BACKUP_DIR/${db_name}.sql"local temp_file="${output_file}.tmp"log_message "導出數據庫: $db_name"mysqldump \-h"$MYSQL_HOST" \-P"$MYSQL_PORT" \-u"$MYSQL_USER" \-p"$MYSQL_PASSWORD" \--single-transaction \--routines \--triggers \--events \--set-gtid-purged=OFF \--opt \--hex-blob \"$db_name" > "$temp_file" 2>>"$LOG_FILE"if [ $? -eq 0 ] && [ -s "$temp_file" ]; thenmv "$temp_file" "$output_file"local file_size=$(du -h "$output_file" | cut -f1)log_message "數據庫 $db_name 導出成功 (大小: $file_size)"return 0elselog_message "錯誤: 數據庫 $db_name 導出失敗"rm -f "$temp_file" 2>/dev/nullreturn 1fi
}# 導出所有數據庫
export_all_databases() {log_message "開始導出所有數據庫..."local success_count=0local failed_count=0for db in "${DATABASES[@]}"; doif export_database "$db"; thensuccess_count=$((success_count + 1))elsefailed_count=$((failed_count + 1))fidonelog_message "數據庫導出完成: 成功 $success_count 個, 失敗 $failed_count 個"return $failed_count
}# 壓縮備份文件夾
compress_backup_folder() {log_message "開始壓縮備份文件夾: $BACKUP_DIR"# 檢查備份目錄是否存在且不為空if [ ! -d "$BACKUP_DIR" ] || [ -z "$(ls -A "$BACKUP_DIR")" ]; thenlog_message "錯誤: 備份目錄不存在或為空"return 1fi# 進入基礎目錄并壓縮cd "$BACKUP_BASE_DIR" || return 1tar -czf "$ARCHIVE_FILE" "$BACKUP_FOLDER" 2>>"$LOG_FILE"if [ $? -eq 0 ] && [ -f "$ARCHIVE_FILE" ]; thenlocal archive_size=$(du -h "$ARCHIVE_FILE" | cut -f1)log_message "備份文件夾壓縮完成: $ARCHIVE_FILE (大小: $archive_size)"return 0elselog_message "錯誤: 備份文件夾壓縮失敗"return 1fi
}# 驗證壓縮文件
verify_compressed_file() {if [ ! -f "$ARCHIVE_FILE" ]; thenlog_message "警告: 壓縮文件不存在: $ARCHIVE_FILE"return 1fi# 檢查文件大小local file_size=$(du -h "$ARCHIVE_FILE" | cut -f1)if [ "$file_size" = "0" ]; thenlog_message "警告: 壓縮文件為空: $ARCHIVE_FILE"return 1filog_message "壓縮文件驗證通過: $ARCHIVE_FILE (大小: $file_size)"return 0
}# 清理原始備份目錄(壓縮成功后)
cleanup_backup_directory() {log_message "清理原始備份目錄..."if [ -d "$BACKUP_DIR" ]; thenrm -rf "$BACKUP_DIR"if [ $? -eq 0 ]; thenlog_message "原始備份目錄清理完成"elselog_message "警告: 原始備份目錄清理失敗"fifi
}# 生成備份摘要
generate_backup_summary() {local failed_count=$1local summary_file="$BACKUP_BASE_DIR/backup_summary_$(date +%Y%m%d_%H%M%S).txt"{echo "MySQL數據庫備份摘要"echo "========================"echo "備份時間: $(date)"echo "備份目錄: $BACKUP_DIR"echo "壓縮文件: $ARCHIVE_FILE"echo "數據庫總數: ${#DATABASES[@]}"echo "備份成功: $(( ${#DATABASES[@]} - failed_count )) 個"echo "備份失敗: $failed_count 個"echo ""echo "數據庫列表:"for db in "${DATABASES[@]}"; doecho " - $db"doneecho ""if [ -f "$ARCHIVE_FILE" ]; thenecho "壓縮文件信息:"echo " 文件路徑: $ARCHIVE_FILE"echo " 文件大小: $(du -h "$ARCHIVE_FILE" | cut -f1)"echo " 修改時間: $(stat -c %y "$ARCHIVE_FILE")"fi} > "$summary_file"log_message "備份摘要已生成: $summary_file"
}# ==================== 主程序 ====================
main() {log_message "========== MySQL數據庫完整備份開始 =========="# 1. 檢查環境和創建目錄check_backup_dir# 2. 檢查MySQL連接check_mysql_connection# 3. 查詢所有數據庫get_all_databases# 4. 導出所有數據庫local failed_count=0if ! export_all_databases; thenfailed_count=$?fi# 5. 壓縮備份文件夾local compress_success=0if compress_backup_folder; thencompress_success=1# 驗證壓縮文件verify_compressed_file# 清理原始目錄cleanup_backup_directoryfi# 6. 生成備份摘要generate_backup_summary $failed_countlog_message "========== MySQL數據庫完整備份結束 =========="# 輸出最終結果echo ""echo "備份完成:"echo " 備份目錄: $BACKUP_DIR"echo " 壓縮文件: $ARCHIVE_FILE"echo " 數據庫總數: ${#DATABASES[@]}"echo " 失敗數量: $failed_count"if [ $failed_count -gt 0 ]; thenlog_message "警告: 存在備份失敗的數據庫"exit 1fiif [ $compress_success -eq 0 ]; thenlog_message "警告: 壓縮備份文件夾失敗"exit 1filog_message "所有操作成功完成"
}# ==================== 腳本執行 ====================
# 捕獲中斷信號
trap 'log_message "備份被用戶中斷"; rm -rf "$BACKUP_DIR" 2>/dev/null; exit 130' INT TERM# 執行主程序
main "$@"exit 0