赞
踩
直接上代码:
#!/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=10
backup_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 ]; then
echo "ERROR: MySQL is not running! Backup stopped!"
exit 1
else
echo $welcome_msg
fi
# 备份函数
backup_database() {
local db_name=$1
local backup_dir=$2
mkdir -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.gz
if [ $? -eq 0 ]; then
echo "Database backup success. Backup saved to $backup_dir/$db_name-$backup_time.sql.gz"
else
echo "Database backup failed for $db_name!"
exit 1
fi
}
# 删除过期备份函数
delete_expired_backups() {
local backup_dir=$1
local db_name=$2
if [ "$expire_backup_delete" == "ON" ] && [ -n "$backup_dir" ]; then
expired_file_prefix="$db_name-$(date -d "-$expire_days days" +%Y%m%d)"
find $backup_dir/ -type f -name "$expired_file_prefix*.sql.gz" -delete
echo "Expired backup data deleted in $backup_dir for $db_name!"
fi
}
# 备份视图创建语句函数
backup_views() {
local db_name=$1
local backup_dir=$2
mkdir -p $backup_dir
local 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_file
if [ $? -eq 0 ]; then
echo "View export successful. File saved to $view_backup_file"
else
echo "View export failed for $db_name!"
exit 1
fi
gzip -c $view_backup_file > $compressed_view_backup_file
if [ $? -eq 0 ]; then
echo "Backup file compressed. Compressed file saved to $compressed_view_backup_file"
else
echo "Compression failed for $view_backup_file!"
exit 1
fi
rm -f $view_backup_file
}
# 循环备份所有数据库
for i in "${!databases[@]}"; do
backup_database "${databases[i]}" "$backup_base_dir/${backup_dirs[i]}"
#backup_views "${databases[i]}" "$backup_base_dir/${backup_dirs[i]}"
if [ "${databases[i]}" == "dflow_jnzn" ]; then
backup_views "${databases[i]}" "$backup_base_dir/${backup_dirs[i]}"
fi
done
# 删除过期备份
for i in "${!databases[@]}"; do
delete_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命令实现自动备份
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。