文章目录
- 前言
- 一、mysqldump
- 二、环境
- 三、使用步骤
- 1.服务器与服务器间直接同步
- 2.导出到sql文件
- 3.sql文件导入
- 总结
- 使用方式 1 服务器间直连方式同步:
- 使用中间SQL 文件方式:
- datax:
前言
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的表名"
]
}
]
}
}
}
]
}
}