Linux上脚本备份数据库(升级版)

发布于:2024-07-07 ⋅ 阅读:(44) ⋅ 点赞:(0)

直接上代码:

#!/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命令实现自动备份


网站公告

今日签到

点亮在社区的每一天
去签到