我们来学mysql -- “数据备份&还原”sh脚本

数据备份&还原

说明

  • 环境准备:来源数据库(服务器A);目标数据库(服务器B)

  • dbInfo.sh脚本记录基本信息

    • 来源库、目标库的ip、port及执行路径

      复制代码
      # MySQL 客户端和 mysqldump 的路径
      MYSQL_CLIENT="/work/oracle/mysql-8.4.4/bin/mysql"
      MYSQL_DUMP="/work/oracle/mysql-8.4.4/bin/mysqldump"
      
      # 源数据库信息
      source_ip="17.2.10.166"
      source_port="3308"
      
      # 目标数据库信息
      target_ip="17.2.10.167"
      target_port="3308"
  • db_backup_cover.sh脚本步骤

    • 登录源库,需要手动输入账户,给出指令是否继续执行
    • 锁定原理库
    • dump导出指定库数据,忽略视图和日志表能
    • 登目标库,需要手动输入账户,给出指令是否继续执行
    • 如果数据量大,执行source会花费些时间

执行

db_backup_cover.sh脚本

复制代码
```
#!/bin/bash

# 备份文件名
current_date=$(date +%F)
system_ip=$(hostname -I | awk '{print $1}')  # 获取系统的主IP地址

# 加载配置文件
if [ -f "dbInfo.sh" ]; then
    source dbInfo.sh
else
    echo "配置文件 config.sh 不存在!"
    exit 1
fi

# 打印配置文件中的变量值
echo "--------------------------------------------------"
echo "配置文件变量:"
echo "MySQL 客户端路径: ${MYSQL_CLIENT}"
echo "mysqldump 路径: ${MYSQL_DUMP}"
echo "源数据库 IP: ${source_ip}"
echo "源数据库端口: ${source_port}"
echo "目标数据库 IP: ${target_ip}"
echo "目标数据库端口: ${target_port}"
echo "--------------------------------------------------"

# 函数:等待用户确认
wait_for_confirmation() {
    read -p "请输入 yes 继续或 no 取消: " confirm
    if [ "$confirm" != "yes" ]; then
        echo "操作已取消。"
        unlock_tables
        exit 1
    fi
}

# 函数:解锁数据库
unlock_tables() {
    echo "正在解锁数据库..."
    ${MYSQL_CLIENT} -h "${source_ip}" -P "${source_port}" -u "${source_user}" -p"${source_password}" -e "UNLOCK TABLES;"
    if [ $? -ne 0 ]; then
        echo "解锁数据库失败!"
    else
        echo "数据库已解锁。"
    fi
}

# 输入源数据库用户名和密码
read -p "请输入源数据库用户名: " source_user
read -s -p "请输入源数据库密码: " source_password
echo

# 1. 锁定数据库
echo "准备执行 FLUSH TABLES WITH READ LOCK 锁定数据库..."
wait_for_confirmation

${MYSQL_CLIENT} -h "${source_ip}" -P "${source_port}" -u "${source_user}" -p"${source_password}" -e "FLUSH TABLES WITH READ LOCK;"
if [ $? -ne 0 ]; then
    echo "锁定数据库失败!"
    exit 1
fi
echo "数据库已成功锁定。"

# 2. 备份Dev数据表及数据
echo "准备开始备份Dev数据..."
wait_for_confirmation

backup_file="/home/sie-srmdb-${source_port}-${system_ip}-${current_date}.sql"

${MYSQL_DUMP} -h "${source_ip}" -P "${source_port}" -u "${source_user}" -p"${source_password}" \
--single-transaction \
--quick \
--add-drop-table \
--set-gtid-purged=OFF \
--compression-algorithms=zlib \
--ignore-table=db-dev.operate_logs \
--ignore-table=db-dev.test_view \
--databases db-dev > "${backup_file}"

# 检查备份是否成功
if [ $? -ne 0 ]; then
    echo "备份Dev数据失败!"
    unlock_tables
    exit 1
fi
echo "备份Dev数据完成,文件已保存到: ${backup_file}"

# 此时不解锁数据库,以便建立复制关系
echo "数据库保持锁定状态,以便建立复制关系。"

# 准备目标数据库信息
echo "备份成功,准备登录目标数据库进行数据覆盖。"
read -p "请输入目标数据库用户名: " target_user
read -s -p "请输入目标数据库密码: " target_password
echo
read -p "执行前请再次确认,输入 yes 继续: " confirm
if [ "$confirm" != "yes" ]; then
    echo "操作已取消。"
    unlock_tables
    exit 1
fi

# 登录目标数据库并切换数据库
echo "准备登录目标数据库并切换数据库..."
wait_for_confirmation

# 登录目标数据库并切换数据库
# 在  << EOF 和 EOF  之间的内容将作为 mysql 客户端的输入,即要执行的 SQL 命令
read -p "请输入要切换的数据库名: " target_db
${MYSQL_CLIENT} -h "$target_ip" -P "$target_port" -u "$target_user" -p"$target_password" << EOF
USE $target_db;
SOURCE $backup_file;
EOF

if [ $? -ne 0 ]; then
    echo "切换数据库或执行 source 命令失败!"
    unlock_tables
    exit 1
fi
echo "数据库切换成功且备份数据已导入到目标数据库。"

echo "操作完成!数据库保持锁定状态,记得在建立好复制关系后手动解锁。"

```
相关推荐
萧曵 丶4 小时前
MySQL 主键不推荐使用 UUID 的深层原因
数据库·mysql·索引
kaico20188 小时前
MySQL的索引
数据库·mysql
资生算法程序员_畅想家_剑魔8 小时前
Mysql常见报错解决分享-01-Invalid escape character in string.
数据库·mysql
霖霖总总9 小时前
[小技巧14]MySQL 8.0 系统变量设置全解析:SET GLOBAL、SET PERSIST 与 SET PERSIST_ONLY 的区别与应用
数据库·mysql
alonewolf_9910 小时前
深入剖析MySQL索引底层:B+树、联合索引与跳跃扫描原理全解
数据库·b树·mysql
oMcLin10 小时前
如何在Debian 11上通过配置MySQL 8.0的分布式架构,提升跨区域数据同步的效率与延迟?
分布式·mysql·debian
计算机学姐10 小时前
基于SpringBoot的校园资源共享系统【个性化推荐算法+数据可视化统计】
java·vue.js·spring boot·后端·mysql·spring·信息可视化
霖霖总总11 小时前
[小技巧23]全面理解 MySQL 的 WAL 机制:原理、影响与可观测性
数据库·mysql
冰暮流星12 小时前
sql语句之select语句的基本使用
数据库·sql·mysql
计算机毕设指导613 小时前
基于微信小程序的钓鱼论坛系统【源码文末联系】
java·spring boot·mysql·微信小程序·小程序·tomcat·maven