当前位置: 首页 > news >正文

【MySQL】通过shell脚本一键同步MySQL数据库结构和数据到指定库中

通过shell脚本对数据库进行覆盖式备份/迁移,简单方便,适合需要快速同步某个库结构和数据到目标库的场景。

	通过AI调试了好些次得到能用的脚本,本文主要是做一个对该脚本的记录

| 安装依赖


# 安装进度条库
sudo apt install pv

注:如果脚本运行所在环境需要先安装mysql-client(安装mysql时自带),则需要先安装才能使用mysqldump命令

| 数据库全量同步脚本


将配置部分带<>的内容改为实际的数据库配置,内容保存为sync_data.sh,然后chmod +x sync_data.sh给予权限

#!/bin/bash

# MySQL全量同步脚本
# 功能:同步源数据库的结构和数据到目标数据库(覆盖模式)

# 配置源数据库信息
SRC_HOST="<ipaddress>"
SRC_PORT="<port>"     
SRC_USER="<username>"
SRC_PASS="<password>"
SRC_DB="<dbname>"

# 配置目标数据库信息
DST_HOST="<ipaddress>"
DST_PORT="<port>"     
DST_USER="<username>"
DST_PASS="<password>"
DST_DB="<dbname>"

DUMP_FILE="/tmp/mysql_dump.sql"
SUCCESS_FLAG="/tmp/dump_success.flag"


# 清除密码命令行警告的安全封装函数
safe_mysql_cmd() {
    local pass_file=$(mktemp)
    echo "[client]" > $pass_file
    echo "password=$SRC_PASS" >> $pass_file
    chmod 600 $pass_file

    mysqldump --defaults-extra-file=$pass_file \
        -h$SRC_HOST -P$SRC_PORT -u$SRC_USER \
        --ssl=0 \
        --single-transaction \
        --quick \
        --skip-add-locks \
        --no-tablespaces \
        --routines \
        --events \
        --triggers \
        --set-gtid-purged=OFF \
        --databases $SRC_DB 2>/dev/null

    rm -f $pass_file
}

progress_bar() {
    pv -N "$1" -pet -W --rate -i 5
}

# 断点续传逻辑
if [[ -f $DUMP_FILE && -f $SUCCESS_FLAG ]]; then
    echo "检测到已有导出文件,跳过导出直接导入..."
else
    echo "开始全量导出..."
    # 通过临时密码文件执行安全导出
    safe_mysql_cmd | progress_bar "导出进度" > $DUMP_FILE

    if [ ${PIPESTATUS[0]} -eq 0 ]; then
        touch $SUCCESS_FLAG
        echo "导出完成,文件大小: $(du -sh $DUMP_FILE | awk '{print $1}')"
    else
        echo "导出失败,请检查参数!"
        rm -f $DUMP_FILE
        exit 1
    fi
fi

# 数据导入
echo "开始全量导入..."
{
    echo "SET FOREIGN_KEY_CHECKS=0;"
    echo "DROP DATABASE IF EXISTS $DST_DB;"
    echo "CREATE DATABASE $DST_DB;"
    echo "USE $DST_DB;"
    cat $DUMP_FILE
} | progress_bar "导入进度" | mysql -h$DST_HOST -P$DST_PORT -u$DST_USER -p$DST_PASS \
    --ssl=0 \
    --max_allowed_packet=512M \
    --net_buffer_length=16K \
    --compress \
    --show-warnings

if [ $? -eq 0 ]; then
    rm -f $SUCCESS_FLAG $DUMP_FILE
    echo "同步成功!"
else
    echo "导入失败,请检查目标库权限!下次执行将自动续传"
    exit 1
fi

运行./sync_data.sh,等待完成即可。

相关文章:

  • Mysql进阶篇(mysqlcheck - 表维护程序)
  • C# 两种方案实现调用 DeepSeek API
  • C/C++程序的内存是如何开辟的?
  • 如何在 Java 应用中实现数据库的主从复制(读写分离)?请简要描述架构和关键代码实现?
  • hbase合并队列超长问题分析
  • Android原生的HighCPU使用率查杀机制
  • centos7 升级openssl并安装python3
  • 物联网(IoT)如何与人工智能(AI)的结合
  • 【MySQL】基础篇
  • C语言面试题1——1—20
  • 【DeepSeek】deepseek可视化部署
  • 【Python网络爬虫】爬取网站图片实战
  • 黑马Redis详细笔记(实战篇---短信登录)
  • 【05】css 常用背景属性详解
  • Dav_笔记14:优化程序提示 HINTs -3
  • 深入浅出:Python 中的异步编程与协程
  • Mongodb快速上手
  • 复制conda虚拟环境的几种方法
  • electron本地调试时终端输出文字乱码
  • 阿里云轻量服务器docker部署nginx
  • 北京警方:海淀发生小客车刮碰行人事故4人受伤,肇事司机已被查获
  • 《大风杀》导演张琪:为了不算计观众,拍了部不讨好的警匪片
  • 3年多来俄乌要首次直接对话?能谈得拢吗?
  • 袁思达已任中国科学院办公厅主任
  • 以军向也门3个港口的居民发布撤离令
  • 体坛联播|C罗儿子完成国家队首秀,德约结束与穆雷合作