测试中有这样一种需求:为了测试更有针对性,需要拿业务数据来测试。所以需要把业务的数据复制一份出来,加载到自己本地的测试库中。
对于小数据量的情况,直接用 mysqldump 把数据表全部转换成 SQL 语句,然后导入到新库即可。
对于大数据量的情况, mysqldump 搞不定(?仅直观感觉,数据膨胀太大了,文件会超级大,导出过程中任何异常都可能导致导出中断),需要用新工具,例如阿里巴巴的 DataX
DataX 的使用非常简单,基本按照教程操作即可:
安装
tar zxvf datax.tar.gz
chmod -R 755 datax
运行
cd datax/bin
python datax.py ../job/job.json
其中,job.json是自带的一个例子配置文件,没什么具体用途。如果希望将一个库的数据复制到另外一个库,可以用下面的配置文件 db2db.json
运行方法不变
python datax.py ../job/db2db.json
db2db.json 只是一个例子,更多详细的配置参见 DataX 的文档
- https://github.com/alibaba/DataX/blob/master/mysqlreader/doc/mysqlreader.md
- https://github.com/alibaba/DataX/blob/master/mysqlwriter/doc/mysqlwriter.md
重点关注channel, splitPk,column 这几个参数。
注意
需要注意的是,并发复制模式下,DataX 并不保证源和目的数据的严格一致。
针对多线程的一致性快照需求,在技术上目前无法实现,只能从工程角度解决,工程化的方式存在取舍,我们提供几个解决思路给用户,用户可以自行选择:
使用单线程同步,即不再进行数据切片。缺点是速度比较慢,但是能够很好保证一致性。
关闭其他数据写入方,保证当前数据为静态数据,例如,锁表、关闭备库同步等等。缺点是可能影响在线业务。
附:db2db.json
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"column": ['*'],
"connection": [ { "jdbcUrl": ["jdbc:mysql://127.0.0.1:20833/blue?user=test1&password=test1"], "table": ['t6'] } ],
"username": "test1",
"password": "test1",
"where": "" }
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert",
"username": "test1",
"password": "test1",
"column": ['*'],
"splitPk": "c2",
"session": [ ],
"preSql": [ "delete from t6" ],
"connection": [ { "jdbcUrl": "jdbc:mysql://127.0.0.1:20833/test?user=test1&password=test1", "table": ['t6'] } ] }
}
}
],
"setting": {
"speed": {
"channel": "1"
}
}
}
}