【SHELL脚本】MYSQLDUMP备份数据库,含忽略数据表

2023-11-17

背景介绍:项目的数据库十分重要,必须保证数据不能丢失。项目组的数据库为mysql5.7.12,采用备份工具mysqldump

开发需求:

  1. 备份指定多个数据库

  2. 部分数据库的部分数据表需要指定忽略

  3. 打包上传到go-FastDFS文件管理器

下面为脚本代码:

#!/bin/bash

# 数据库连接配置
mysql_host="10.6.111.10"
mysql_user="root"
mysql_password="xxxxx"
# 需要备份的数据库。不同数据库以空格分隔,同一数据库中需要忽略备份的多个表以.号连接。如:数据库名1.数据表名1.数据表名2 数据库名2.数据表名1.数据表名2
backup_databases="demo nacos xxl_job_xujunwei.xxl_job_log.xxl_job_user"

# 当前日期
curr_date=$(date +%Y%m%d)
backup_dir="${curr_date}"

# 上传文件服务器配置
upload_host="10.10.110.10"
upload_port="8080"
upload_scene="mysql"
upload_group="group1/upload"


# 生成命令以忽略部分表的备份,如--ignore-table=xxl_job_xujunwei.xxl_job_user
function build_ignore_table_name(){
    database_table=$@
    arr=($(echo $database_table | tr "." "\n"))
    database=${arr[0]}
    ignore_key="--ignore-table="
    ignore_table=""
    # 遍历拼接--ignore-table字段
    for((i=1; i<${#arr[@]};i++))
    do
        str="$ignore_key$database.${arr[$i]}"
        ignore_table="$str $ignore_table"
    done
}


echo "* 备份数据库信息,并上传到文件服务器。*" >> backup.log

# 判断文件夹是否存在,不存在则创建
mkdir -p ${backup_dir}



echo -e "\n当前日期${curr_date},开始备份数据库:" >> backup.log

# 遍历备份数据库
for database_table in ${backup_databases}
do
    # 获取数据库名称    
    str_arr=($(echo $database_table | tr "." "\n"))
    database=${str_arr[0]}

    # 查看是否包含“.”符号
    contain_str=$(echo $database_table | grep "\.")

    # 若没有包含“.”符号,则完整备份该数据库;否则包含“.”符号,则忽略部分数据表的备份
    if [ -z "$contain_str" ]; then
        # echo "等于空,说明不包含. 应执行完整备份" --set-gtid-purged=OFF会记录binlog日志,以便恢复主库时,主从同步
        mysqldump -h ${mysql_host} -p${mysql_password} -u${mysql_user}  --databases ${database} --ssl-mode=disabled --single-transaction --column-statistics=0 --set-gtid-purged=OFF >./${backup_dir}/${database}_${curr_date}.sql
    else
        # echo "不等于空,则执行忽略表的备份"
        # 调用函数,生成忽略表的命令
        build_ignore_table_name ${database_table}
        mysqldump -h ${mysql_host} -p${mysql_password} -u${mysql_user}  --databases ${database} $ignore_table --ssl-mode=disabled --single-transaction --column-statistics=0 --set-gtid-purged=OFF >./${backup_dir}/${database}_${curr_date}.sql
    fi
done


# 打包压缩以便备份
tar -jcf ${curr_date}.tar ./${backup_dir}/*.sql
echo -e "\n${curr_date}.tar 打包压缩完成" >> backup.log


# 上传压缩的备份文件到go-fastDFS
curl -F scene=${upload_scene} -F file=@./${curr_date}.tar http://${upload_host}:${upload_port}/${upload_group}

# 判断返回状状态,是否上传成功
if [  $? -eq 0 ]; then
    echo -e "\n${curr_date}.tar上传完成。" >> backup.log
else
    echo -e "\n${curr_date}.tar上传失败,请校验" >> backup.log
fi

注:本脚本主要放容器中运行,可在容器中配置参数和定时执行时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【SHELL脚本】MYSQLDUMP备份数据库,含忽略数据表 的相关文章

  • 通过货币换算获取每种产品类型的最低价格

    我想选择每种产品类型中最便宜的 包括运费 价格转换为当地货币 最便宜 产品 价格 产品 运费 seller to aud 我的数据库有如下表 PRODUCTS SELLERS id type id seller id price shipp
  • 无法使用 Django 应用程序从容器连接到 MySQL docker 容器

    当我尝试从运行 Django 应用程序的 docker 容器连接到运行 MySQL 的容器时 出现以下错误 django db utils OperationalError 2003 Can t connect to MySQL serve
  • 通过连接从两个表中删除?

    我有两个表如下 tbl1 tbl2 id article id title image whole news tags author older datetime 其中 tbl1 id gt tbl2 article id 如何从两个表中删
  • mySQL MATCH 跨多个表

    我有一组 4 个表 我想对其进行搜索 每个都有全文索引 查询可以使用每个索引吗 CREATE TABLE categories id int 5 unsigned NOT NULL auto increment display order
  • PHP 选择后立即删除

    我有一个 PHP 服务器脚本 它从 MySQL 数据库中选择一些数据 一旦我将 mysql query 和 mysql fetch assoc 的结果存储在我自己的局部变量中 我就想删除我刚刚选择的行 这种方法的问题在于 PHP 似乎对我的
  • MySQL 存储过程将值分配给 select 语句中的多个变量

    这是我的存储过程 我在为声明的变量赋值时遇到问题 当我执行它时 插入和更新命令工作正常 但声明变量的值保持为 0 但我在数据库中有一些价值 我怎样才能正确地做到这一点 BEGIN DECLARE PaidFee INT DEFAULT 0
  • 将记录分成两列

    我的数据库中有一个 学生 表 其中包含大约 5 000 条记录 我想将这些记录显示在two分区 如何在不执行查询两次的情况下做到这一点 仅使用单个查询 显示示例http www freeimagehosting net uploads f1
  • 社交应用程序的数据库设计和优化注意事项

    通常的情况 我有一个简单的应用程序 允许人们上传照片并关注其他人 因此 每个用户都会有类似 墙 或 活动源 的东西 他或她可以在其中看到他 她的朋友 他或她关注的人 上传的最新照片 大多数功能都很容易实现 然而 当涉及到这个历史活动源时 由
  • ActiveRecord3死锁重试

    Rails 3 或 ActiveRecord 3 是否有任何插件可以复制旧版本死锁重试 http agilewebdevelopment com plugins deadlock retry插入 或者 该插件仍然适用于 Rails 3 吗
  • Mysql innoDB 不断崩溃[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的数据库 mysql 服务器不断崩溃 重新启动 我不知道该怎么办 我不断在 dbname org err 文件中收到以下内容 13120
  • MYSQL - 查找最近的前一天

    我可以以某种方式 不使用 PHP 找到一周中最近的前一天日期吗 Like 最近的上一个星期二的日期是哪一天 CURDATE INTERVAL WEEKDAY CURDATE wday IF WEEKDAY CURDATE gt wday 0
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • 当sql连接中存在两个同名列时,如何从一个表列中获取值

    当我连接两个具有相同名称列的表时 我目前面临着尝试获取值的问题 例如 table1 date和table2 date 每个表中的日期不同 我将如何获取 日期 本例中的表1 我目前正在跑步 while row mysqliquery gt f
  • 阻止注销页面后的后退按钮

    我有 php 注销页面 当用户单击注销链接时 请参阅此页面并重定向到索引页面 但是当单击后退按钮时 我会看到带有用户数据的上一页 当然 当我刷新页面时 我看不到以前的页面和数据 我在单击注销并单击后退按钮后检查了其他代码 drupal 但我
  • MySQL 使用 ALTER IGNORE TABLE 出现重复错误

    我的 MySQL 中有一个有重复项的表 我尝试删除重复项并保留一项 我没有主键 我可以通过以下方式找到重复项 select user id server id count as NumDuplicates from user server
  • MySQL MIN/MAX 所有行

    我有桌子Races与行ID Name and TotalCP 我选择分钟 TotalCP FROM Races 但是我想选择具有最小值的整行 我如何在单个查询中做到这一点 从聚合值获取整行的一般形式是 SELECT FROM Races W
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • 在 PHP 字符串中格式化 MySQL 代码

    是否有任何程序 IDE 可以在 PHP 字符串中格式化 MySQL 代码 例如 我使用 PHPStorm IDE 但它无法做到这一点 它对 PHP 和 MYSQL 执行此操作 但不适用于 php 字符串内的 MYSQL 我已准备好使用新的
  • 同一配置文件上的两个不同提供程序

    我在用着实体框架 6 1 0 I have 2 家提供者 MysqlClient 和 SQLServerCE 我需要创建2个不同的DBContext 这迫使我创造2个配置类因为mysql有一些不同的东西 但是当我初始化应用程序时 Datab
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希

随机推荐