介绍
较之前的版本,将合并的导入导出拆分为3个场景,并重复的导出动作进行了文档归档能力。以下将重新阐述能力
一、核心功能模块
1. 多线程数据库迁移
- 支持并行处理多个数据库(xargs -P实现并发)
- 可配置线程数(THREADS参数控制并发度)
- 导出/导入操作独立线程池管理
2. 双模式运行机制
| 模式 | 功能描述 | 关键特性 |
| both | 同时执行导出+导入 | 全自动流水线操作,迁移ID自动生成 |
| export | 仅导出数据到本地文件 | 自动创建时间戳目录 |
| import | 从指定目录导入数据 | 严格校验迁移ID一致性 |
3. 迁移安全控制
- 迁移ID机制:
- 导出模式:生成8位SHA1随机ID(date +%s%N | sha1sum | head -c 8)
- 导入模式:从文件提取ID并验证一致性
- 事务保障:
- 导出:–single-transaction确保一致性快照
- 导入:SET foreign_key_checks=0禁用约束检查
⚙️ 二、关键技术实现
- 性能优化设计
- 压缩加速:使用pigz并行压缩(-9最高压缩比)替代gzip
- MySQL参数优化:
--max-allowed-packet=1G
--net-buffer-length=16384
--skip-lock-tables
- 健壮性保障
- 错误隔离:
- 每个数据库独立错误日志(${db}_${MIGRATION_ID}.export.err)
- 失败任务记录到failed_imports.txt/failed_exports.txt
- 预检查机制:
- 命令依赖检查(mysql/mysqldump/pigz)
- 双端数据库连接测试
- 迁移文件存在性验证
- 日志系统
- 分级日志(info/warning/error)
- 双输出:控制台关键信息+文件全量记录
- 结构化日志格式:
[2023-11-04 15:30:22] [INFO] 开始导出: orders (ID:8a3d7f2b)
📂 三、配置与扩展能力
- 灵活输入支持
- 数据库来源:命令行直接指定(-d ‘db1,db2’)或文件读取(-f dblist.txt)
- 连接参数覆盖:支持运行时动态设置源/目标数据库凭证
- 目录管理策略
| 变量 | 功能说明 | 默认行为 |
| EXPORT_DIR | 导出存储路径 | 按时间自动生成目录 |
| IMPORT_DIR | 导入数据源路径 | 必须显式指定 |
| MAIN_DIR | 运行时主目录 | 模式自适应(export=导出目录) |
- 清理机制
- both模式自动清理中间压缩文件(保留日志)
- 独立保留失败任务记录便于重试
📊 四、典型应用场景
- 跨环境迁移
./migrate.sh -d 'orders,users' --src-host prod-db --dest-host test-db
- 灾难恢复
./migrate.sh -m import -i /backups/20231104 -d critical_db
- 数据归档
./migrate.sh -m export -d archive_2015..2020 -e /mnt/backups
⚠️ 五、局限性及注意事项
- 安全性限制
- 密码明文传递(需配合Vault等密钥管理工具)
- 无SSL连接支持(需手动添加–ssl-mode参数)
- 超大库处理
- 单库>1TB时需调整–max_allowed_packet
- 无分片导出能力(需拆分子库处理)
- 版本依赖
- 必需组件:MySQL 5.7+, pigz, GNU xargs
- 不兼容BSD/macOS原生工具链
六、脚本内容如下:
#!/bin/bash
export THREADS=4
export MODE="both"
export SRC_HOST="source-db.example.com"
export SRC_PORT=3306
export SRC_USER="admin"
export SRC_PASS="secure_password"
export DEST_HOST="target-db.example.com"
export DEST_PORT=3306
export DEST_USER="admin"
export DEST_PASS="secure_password"
export EXPORT_DIR="migration_data_$(date +%Y%m%d-%H%M%S)"
export IMPORT_DIR=""
usage() {echo "用法: $0 -d 'db1,db2,...' [选项]"echo "选项:"echo " -d, --databases 要迁移的数据库列表(逗号分隔)"echo " -f, --dbfile 包含数据库列表的文件(每行一个)"echo " -t, --threads 并发线程数(默认: $THREADS)"echo " -m, --mode 运行模式: both/import/export (默认: $MODE)"echo " -e, --export-dir 导出文件夹路径(默认: 自动创建)"echo " -i, --import-dir 导入文件夹路径(必须包含导出文件)"echo " --src-host 源数据库主机"echo " --src-port 源数据库端口"echo " --src-user 源数据库用户"echo " --src-pass 源数据库密码"echo " --dest-host 目标数据库主机"echo " --dest-port 目标数据库端口"echo " --dest-user 目标数据库用户"echo " --dest-pass 目标数据库密码"exit 1
}
DATABASES=""
DBFILE=""
while [[ $# -gt 0 ]]; docase "$1" in-d|--databases)DATABASES="$2"shift 2;;-f|--dbfile)DBFILE="$2"shift 2;;-t|--threads)THREADS="$2"shift 2;;-m|--mode)MODE="$2"shift 2;;-e|--export-dir)EXPORT_DIR="$2"shift 2;;-i|--import-dir)IMPORT_DIR="$2"shift 2;;--src-host)