【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备份数据库,含忽略数据表 的相关文章

  • 维护/更新mysql中的记录顺序

    我在 mySql 中有一个记录表 我需要按照用户指定的方式维护它们的订单 所以我添加了一个 位置 列 当我移动特定记录时更新所有记录的 SQL 语句是什么 我有类似的东西 UPDATE items SET position 2 WHERE
  • 外键和索引

    我有 2 张桌子 products and 类别 每个类别有很多产品 一个产品可以属于多个类别 products product id int primary auto increment name unique etc 类别 catego
  • SQL UPDATE 语句根据另一个现有行更新列

    基本上我有一个与下表具有相似格式的表格 我想做的是根据这个逻辑更新 Col4 如果 Col2 为空 则用 Col3 更新 Col4 如果 Col2 不为 null 则在 Col1 中查找与 Col2 中的值匹配的值 使用 col3 中的相应
  • 删除表的重复项

    In my activity logs 它包含列 material name user id mod result 这标志着测试是否通过 失败 cert links 不知何故 用户生成了两倍的条目material name与cert lin
  • 自动删除主键序列中的间隙

    我正在创建一个网页 该网页根据用户操作将数据存储到 MySQL 数据库中 数据库有很多行 行的主键是列 rowID 它只是按顺序对行进行编号 例如 1 2 3 4 用户可以选择删除行 问题是当用户删除最后一行以外的行时 rowID 中有一个
  • 为什么我在 MySQL 中设置更大的 INT 数据类型长度时没有收到错误消息?

    我对 MySql 中的数据类型长度有点困惑 我阅读了参考手册http dev mysql com doc refman 5 0 en data types html http dev mysql com doc refman 5 0 en
  • 何时在 mysql 中使用 Union [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 对于 Union 您会在什么现实情况下使用它 因为对我来说 对具有不同列用途 含义的两个表中的两个选择查询使用联合是没有意义的 例如
  • 如何使用wireshark清晰捕获mysql查询sql

    因为我们使用远程开发Mysql服务器 所以不能轻易检查查询sql 如果使用本地服务器可以tail f general log file查看调用某个http接口时执行了哪些sql 所以我安装了一个wireshark捕获这些从本地发送的查询sq
  • 在一个后台为MYSQL的网站上集成搜索

    我有一个位置搜索website http www jammulinks com对于一个城市 我们首先收集该城市所有可能类别的数据 如学校 学院 百货商店等 并将其信息存储在单独的表中 因为每个条目除了名称 地址和电话号码外都有不同的详细信息
  • oursql 中的参数化查询

    如果有人能告诉我是否可以使用命名占位符进行参数化查询 我将不胜感激oursql 一个用于与 MySQL 数据库交互的 python 模块 例如 我尝试了一种可以与 sqlite3 一起使用的查询 c execute select from
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • 在MySQL中生成随机字符串

    我正在尝试使用函数在 phpmyadmin 中获取随机字符串 我有以下代码 CREATE FUNCTION randomPassword RETURNS varchar 128 BEGIN SET chars ABCDEFGHIJKLMNO
  • mysql表中的数据非常大。即使 select 语句也需要很多时间

    我正在开发一个数据库 它是一个相当大的数据库 有 13 亿行和大约 35 列 这是我检查表状态后得到的结果 Name Table Name Engine InnoDB Version 10 Row format Compact Rows 1
  • 如何为我的整个 Node.js 应用程序使用相同的 MySQL 连接?

    我有一个app js 我从那里运行我的整个应用程序 在 app js 内部 我require许多文件中都有代码 对于每个文件 我都这样做 var mysql require mysql var mclient mysql createCon
  • PDO语法错误

    我在一个项目中使用 PDO 但提交时出现语法错误 这是我的代码
  • WHERE NOT EXIST 附近的语法错误

    我在堆栈中搜索 但没有一个达到最终答案 我的查询是这样的 INSERT INTO user username frequence autoSend VALUES feri2 3 1 WHERE NOT EXISTS SELECT FROM
  • NHibernate - 无法执行查询 - 输入字符串的格式不正确

    我已经为此摸不着头脑有一段时间了 我不知道出了什么问题 概述 我的 MySQL 数据库中有两个表 两者都正确映射到数据库 我可以加载数据 并且我能够查询一个表 但不能查询另一个表 我研究过的解决方案 表和 C 代码之间的类型转换问题 映射问
  • MVCC 如何与 MySql 中的 Lock 配合使用?

    我知道Mysql中使用锁或者MVCC可以实现并发控制 比如可重复读 但我不知道MVCC如何避免幻读 在其他地方了解到一般是通过MVCC和Gap Lock来实现的 但是目前我理解的是MVCC不需要锁 即更新和删除都是使用undo log来实现
  • JDBC 错误:在结果集开始之前[重复]

    这个问题在这里已经有答案了 我在 Java Eclipse 中收到错误消息 我在 MySql 中有一个数据库 它有列 String user name int id time int id desk int user password 我想
  • Mysql带限制的删除语句

    我试图从表中删除行 但出现错误 DELETE FROM chat messages ORDER BY timestamp DESC LIMIT 20 50 我在 50 时收到此错误 您的 SQL 语法有错误 检查与您的 MySQL 服务器版

随机推荐