【MySQL 利器之 mysqldump】

文章介绍了在大规模数据迁移场景下,使用mysqldump和DataX进行数据库同步的体验。作者发现mysqldump在稳定性方面优于DataX,尤其是在处理大量数据时,DataX速度变慢并出现错误。文章提供了mysqldump的使用步骤和命令行参数详解,以及两种同步策略:直接服务器间同步和通过SQL文件。同时,文章也包含了DataX的配置示例。
摘要由CSDN通过智能技术生成


前言

1.随着服务器环境改造,新旧数据库环境更换,需要迁移数据。
2.以前数据表结构设计不合理,索引建立不完善,需重新构建表结构。
3.数据量很大,某个表一天增加1千万条数据。
4.总数据空间占用 10T 左右。


一、mysqldump

没错,我是用 mysqldump。
可能你觉得 mysql 自带的东西,比不上其它第三方工具比如(datax)。事实在此过程我也用 datax,最后实践出真理,mysqldump 比 datax 好用多了。
为啥说 datax 不好用,是因为我用它同步一个任务,那个任务估计在1千5百万条左右,开始的时候估计在 1.6M/s, 但是跑着跑着就会越来越慢, 到了 1千2百万左右就出现很多次 0M/s。还不止这样,最后直接就报错终止了,报了一个 write time out 的信息。这可是大忌呀, 你跑慢点我就忍了,但是你突然就终止了,这次等了几个小时的时间就白费了呀,后面还得从零开始导。(也许是我用不惯)

二、环境

Mysql 数据库服务 A (需导出的数据库) 端口 3306
Mysql 数据库服务 B (需导入的数据库)端口 3308

三、使用步骤

核心参数解释:

nohup : 使用后台方式执行
-h : 指定host 地址
-P : (大写)指定端口, 
-u : 指定账号,紧挨着账号名中间没有空格
-p : (小写)指定密码, 紧挨着密码名中间没有空格
--databases : 指定数据库名称
--tables : 指定表名称, 多个表名称用空格分隔
--where : 指定条件
--no-create-info : 不导出建表语句
--compact : 简洁导出,忽略开头、末尾的非必要信息
--complete-insert : 使用完整的一条 insert 语句,减少多次insert
--add-drop-table : 在建表语句前添加删除表语句
--no-tablespaces : 不导出表空间
--skip-lock-tables : 不锁表
--set-gtid-purged=OFF : 这个不是跟清楚,只是不加这个会报 gtid 的错误
--skip-triggers : 不导出触发器
--skip-triggers : 不导出事件
| : 管道符号,左边输出作为右边参数

1.服务器与服务器间直接同步

nohup sh -c "/pddyjc/mysql/bin/mysqldump -h A的IP -P 3306 -uA的账号 -pA的密码 \
--databases A的数据库名 --tables A的表名1 A的表名2 ... \
--where=\"sjsjday between '2022-01-00' and '2022-01-32'\" \
--add-drop-table \
--no-tablespaces --skip-lock-tables \
--set-gtid-purged=OFF --skip-triggers --skip-events|mysql -h B的IP -P 3308 \
-uB的账号 -pB的密码 B的数据库名" > 日志.out &

2.导出到sql文件

nohup sh -c "/pddyjc/mysql/bin/mysqldump -h A的IP -P 3306 -uA的账号 -pA的密码 \
--databases A的数据库名 --tables A的表名 --no-create-info \
--no-tablespaces --compact --skip-lock-tables --complete-insert --set-gtid-purged=OFF \
--skip-triggers --skip-events > SQL文件.sql " > 日志.log &

3.sql文件导入

nohup sh -c "mysql -h B的IP -P 3308 -uB的账号 -pB的密码 B的数据库名 < SQL文件.sql " > 日志.out &

总结

使用方式 1 服务器间直连方式同步:

优点: 不用中间存贮,适合空间紧缺环境,
缺点: 偶尔还是会报错,估计是我的网络不稳定。

使用中间SQL 文件方式:

优点: 导出的时候很快,文件保留,以后可以慢慢导入。不容易出现网络问题错误。
缺点: 需要中间存储资源。

以下是用 SQL文件方式导入导出的情况:
73G 的文件, 1亿多的记录。
导入没有报错
看不到结束时间,我就晚上挂着,第二早上过来看结果。
重点是不报错,时间可以慢慢导入。
在这里插入图片描述
在这里插入图片描述

datax:

官网: https://github.com/alibaba/DataX
提到了 datax , 我把配置也发出来。

{
    "job": {
        "setting": {
            "speed": {
                 "channel":1
            }
        },
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "username": "A的账号",
                        "password": "A的密码",
                        "column": [
                            "*"
                        ],

                        "connection": [
                            {
                                "table": [
                                    "A的表名"
                                ],
                                "jdbcUrl": [
                                    "jdbc:mysql://A的IP/A的库名"
                                ]
                            }
                        ],
                        "where": " sjsj_year_month = 202305 "
                    }
                },
                "writer": {
                    "name": "mysqlwriter",
                    "parameter": {
                        "writeMode": "insert",
                        "batchSize": 16384,
                        "username": "B的账号",
                        "password": "B的密码",
                        "column": [
                            "*"
                        ],
                        "session": [

                        ],
                        "preSql": [
                            " set global foreign_key_checks = 0 ",
                            " set global unique_checks = 0 " 
                        ],
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:mysql://B的IP:3308/B的库名?useUnicode=true&characterEncoding=utf-8",
                                "table": [
                                    "B的表名"
                                ]
                            }
                        ]
                    }
                }
            }
        ]
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值