测试中有这样一种需求:为了测试更有针对性,需要拿业务数据来测试。所以需要把业务的数据复制一份出来,加载到自己本地的测试库中。

对于小数据量的情况,直接用 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 的文档

重点关注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"
        }
      }
  }
}
Logo

更多推荐