直接上代碼:
#!/bin/bash# 配置部分
mysql_user="root"
mysql_host="localhost"
mysql_port="3306"
mysql_charset="utf8mb4"
mysql_defaults_file="/home/mysql/mysql_back/.my.cnf"backup_base_dir="/mnt/sdd/home/mysqlbak"
backup_dirs=("dflowsql" "dflow_clientsql" "dflow_hcwysql" "dflow_jnznsql")
databases=("dflow" "dflow_client" "dflow_hcwy" "dflow_jnzn")expire_backup_delete="ON"
expire_days=10backup_time=$(date +%Y%m%d%H%M)welcome_msg="Welcome to use MySQL backup tools!"# 檢查MySQL實例是否正常運行
mysql_ps=$(pgrep -f mysql | wc -l)
mysql_listen=$(netstat -an | grep LISTEN | grep ":$mysql_port" | wc -l)if [ $mysql_ps -eq 0 ] || [ $mysql_listen -eq 0 ]; thenecho "ERROR: MySQL is not running! Backup stopped!"exit 1
elseecho $welcome_msg
fi# 備份函數
backup_database() {local db_name=$1local backup_dir=$2mkdir -p $backup_dir/usr/local/mysql/bin/mysqldump --defaults-extra-file=$mysql_defaults_file \--add-drop-table -h $mysql_host -P $mysql_port \--default-character-set=$mysql_charset --hex-blob $db_name \--single-transaction --routines --events | gzip > $backup_dir/$db_name-$backup_time.sql.gzif [ $? -eq 0 ]; thenecho "Database backup success. Backup saved to $backup_dir/$db_name-$backup_time.sql.gz"elseecho "Database backup failed for $db_name!"exit 1fi
}# 刪除過期備份函數
delete_expired_backups() {local backup_dir=$1local db_name=$2if [ "$expire_backup_delete" == "ON" ] && [ -n "$backup_dir" ]; thenexpired_file_prefix="$db_name-$(date -d "-$expire_days days" +%Y%m%d)"find $backup_dir/ -type f -name "$expired_file_prefix*.sql.gz" -deleteecho "Expired backup data deleted in $backup_dir for $db_name!"fi
}# 備份視圖創建語句函數
backup_views() {local db_name=$1local backup_dir=$2mkdir -p $backup_dirlocal view_backup_file="$backup_dir/${db_name}_views-$backup_time.sql"local compressed_view_backup_file="$view_backup_file.gz"mysql --defaults-extra-file=$mysql_defaults_file -h $mysql_host -P $mysql_port -D $db_name -B -N -e "SELECT CONCAT('CREATE OR REPLACE VIEW \`', '$db_name', '\`.\`', TABLE_NAME, '\` AS ', VIEW_DEFINITION, ';') FROM information_schema.VIEWS WHERE TABLE_SCHEMA = '$db_name' ORDER BY TABLE_NAME;" > $view_backup_fileif [ $? -eq 0 ]; thenecho "View export successful. File saved to $view_backup_file"elseecho "View export failed for $db_name!"exit 1figzip -c $view_backup_file > $compressed_view_backup_fileif [ $? -eq 0 ]; thenecho "Backup file compressed. Compressed file saved to $compressed_view_backup_file"elseecho "Compression failed for $view_backup_file!"exit 1firm -f $view_backup_file
}# 循環備份所有數據庫
for i in "${!databases[@]}"; dobackup_database "${databases[i]}" "$backup_base_dir/${backup_dirs[i]}"#backup_views "${databases[i]}" "$backup_base_dir/${backup_dirs[i]}"if [ "${databases[i]}" == "dflow_jnzn" ]; thenbackup_views "${databases[i]}" "$backup_base_dir/${backup_dirs[i]}"fi
done# 刪除過期備份
for i in "${!databases[@]}"; dodelete_expired_backups "$backup_base_dir/${backup_dirs[i]}" "${databases[i]}"
done
- MySQL 配置:定義了數據庫連接所需的參數,包括用戶、主機、端口、字符集和數據庫名稱。
- 備份路徑:定義了備份文件的保存位置和文件名,使用當前日期時間作為文件名的一部分,以確保文件名唯一。
- 歡迎信息:輸出一條開始備份的提示信息。
- 創建備份目錄:使用 mkdir -p 創建備份目錄(如果不存在)。
- 導出視圖創建語句:使用 MySQL 命令從information_schema.VIEWS 表中提取視圖創建語句,并保存到文件中。
- 檢查導出是否成功:通過檢查上一個命令的退出狀態碼來判斷導出是否成功。
- 壓縮備份文件:使用 gzip 壓縮生成的 SQL 文件。
- 檢查壓縮是否成功:通過檢查上一個命令的退出狀態碼來判斷壓縮是否成功。
- 清理未壓縮的備份文件:刪除未壓縮的原始文件,只保留壓縮后的文件。
- 完成提示:輸出備份完成的提示信息。
升級比較(增加視圖語句的備份)
新增函數 backup_views:
作用:導出視圖創建語句,并將其保存為一個SQL文件,然后壓縮該文件。
步驟: 連接到數據庫,提取視圖創建語句并保存到文件中。
檢查導出是否成功,并輸出相應的信息。 將導出的SQL文件壓縮。 檢查壓縮是否成功,并輸出相應的信息。 刪除未壓縮的原始文件。在循環中調用 backup_views:
條件:當數據庫名為 dflow_jnzn 時,調用 backup_views 函數來備份視圖創建語句。結構調整:
確保所有數據庫的備份和視圖備份在循環中進行,并且保持腳本的邏輯清晰。
自動備份具體看我上一篇文章Linux上通過mysqldump命令實現自動備份