全量迁移

功能介绍

chameleon是一个用Python3编写的将MySQL迁移至openGauss的实时复制工具,支持初始全量数据的复制以及后续增量数据的实时在线复制功能。chameleon通过一次初始化配置,使用只读模式,将MySQL的数据全量拉取到openGauss。支持在同一快照下,表间数据并行迁移。

全量迁移支持的功能:支持表及表数据、视图、触发器、自定义函数、存储过程的全量迁移

特性优势

基于sysbench测试模型,在Kunpeng-920 2p服务器上,MySQL数据库10张表单(无主键)表数据量在500万以上时,chameleon使用20并发迁移数据至openGauss,整体全量迁移性能可达300M/S以上。

环境准备

ARM+openEuler 20.03 或 X86+CentOS 5.7

安装chameleon工具

  • whl安装

    1. 下载安装包。安装包下载地址:https://opengauss.obs.cn-south-1.myhuaweicloud.com/3.1.1/chameleon/chameleon-1.0.0-py3-none-any.whl,下载完成后,通过Python virtual env环境进行安装。

    2. 执行如下命令创建Python虚拟环境并激活。

      1. python3 -m venv venv
      2. source venv/bin/activate
    3. 执行如下命令通过pip安装chameleon工具。

      1. pip3 install ./chameleon-1.0.0-py3-none-any.whl

      全量迁移 - 图1 说明:

      • 安装过程中,将自动安装该工具依赖的其他库,请确保本机的pip能正常下载安装相关依赖。相关依赖库及版本要求为:
      • PyMySQL>=0.10.0, <1.0.0
      • argparse>=1.2.1
      • mysql-replication>=0.22
      • py-opengauss>=1.3.1
      • PyYAML>=5.1.2
      • tabulate>=0.8.1
      • daemonize>=2.4.7
      • rollbar>=0.13.17
      • geomet>=0.3.0
      • mysqlclient>=2.1.1
      • mysqlclient的安装需要先使用yum安装mysql-devel,直接使用yum install mysql-devel即可。
  • 源码安装

  1. 执行如下命令通过git下载源码。

    1. ```
    2. git clone git@gitee.com:opengauss/openGauss-tools-chameleon.git
  2. 创建Python虚拟环境并激活。

    1. ```
    2. python3 -m venv venv
    3. source venv/bin/activate
  3. 进入代码的目录,执行python install命令安装。

    1. ```
    2. cd openGauss-tools-chameleon
    3. python3 setup.py install
    1. 安装完成后,不要退出Python虚拟环境,可以开始使用chameleon工具。

全量迁移

  1. 创建配置文件目录。

    1. 进入Python虚拟环境安装好chameleon工具。

    2. 执行如下命令创建chameleon配置文件目录。

      1. chameleon set_configuration_files

      执行该命令后,将在~/.pg_chameleon/configuration目录下创建默认的配置文件模板。

    3. 执行如下命令复制一份默认的配置文件模板保存为default.yml。

      1. cd ~/.pg_chameleon/configuration
      2. cp config-example.yml default.yml
    4. 按照实际情况修改default.yml配置文件作为实际的配置文件。配置文件示例:

      1. # global settings
      2. pid_dir: '~/.pg_chameleon/pid/'
      3. log_dir: '~/.pg_chameleon/logs/'
      4. log_dest: file
      5. log_level: info
      6. log_days_keep: 10
      7. rollbar_key: ''
      8. rollbar_env: ''
      9. # type_override allows the user to override the default type conversion
      10. # into a different one.
      11. type_override:
      12. "tinyint(1)":
      13. override_to: boolean
      14. override_tables:
      15. - "*"
      16. # postgres destination connection
      17. pg_conn:
      18. host: "127.0.0.1"
      19. port: "5432"
      20. user: "opengauss_test"
      21. password: "password123"
      22. database: "opengauss_database"
      23. charset: "utf8"
      24. sources:
      25. mysql:
      26. readers: 4
      27. writers: 4
      28. db_conn:
      29. host: "127.0.0.1"
      30. port: "3306"
      31. user: "mysql_test"
      32. password: "password123"
      33. charset: 'utf8'
      34. connect_timeout: 10
      35. schema_mappings:
      36. mysql_database: sch_mysql_database
      37. limit_tables:
      38. - delphis_mediterranea.foo
      39. skip_tables:
      40. - delphis_mediterranea.bar
      41. grant_select_to:
      42. - usr_readonly
      43. lock_timeout: "120s"
      44. my_server_id: 100
      45. replica_batch_size: 10000
      46. replay_max_rows: 10000
      47. batch_retention: '1 day'
      48. copy_max_memory: "300M"
      49. copy_mode: 'file'
      50. out_dir: /tmp
      51. sleep_loop: 1
      52. on_error_replay: continue
  1. on\_error\_read: continue auto\_maintenance: disabled gtid\_enable: false type: mysql skip\_events: insert: - delphis\_mediterranea.foo # skips inserts on delphis\_mediterranea.foo delete: - delphis\_mediterranea # skips deletes on schema delphis\_mediterranea update: keep\_existing\_schema: No migrate\_default\_value: Yes \`\`\`
  2. ```
  3. 以上配置文件中参数的含义是:
  4. - 迁移数据时,MySQL侧使用的用户名密码分别是 mysql\_test 和 password123。MySQL服务器的IP和port分别是127.0.0.1和3306,待迁移的数据库是mysql\_database。
  5. - openGauss侧使用的用户名密码分别是 opengauss\_test和 password123。openGauss服务器的IP和port分别是127.0.0.1和5432,目标数据库是opengauss\_database,同时会在opengauss\_database下创建sch\_mysql\_database schema,迁移的表都将位于该schema下。
  6. 需要注意的是,这里使用的用户需要有远程连接MySQL和openGauss的权限,以及对对应数据库的读写权限。同时对于openGauss,运行chameleon所在的机器需要在openGauss的远程访问白名单中。对于MySQL,用户还需要有RELOAD、REPLICATION CLIENT、REPLICATION SLAVE的权限。
  7. ```
  1. 初始化迁移过程。

    1. chameleon create_replica_schema --config default
    2. chameleon add_source --config default --source mysql

    此步骤将在openGauss侧创建用于复制过程的辅助schema和表。

  2. 复制基础数据。

    1. chameleon init_replica --config default --source mysql

    此步骤完成后,MySQL当前的全量数据会被复制到openGauss。可以在openGauss侧查看全量数据复制后的情况。

  3. 复制数据库对象。

    chameleon支持将视图、触发器、自定义函数、存储过程从MySQL迁移到openGauss。如果日志不需要输出至控制台,可去掉–debug参数。

    • 复制视图

      1. chameleon start_view_replica --config default --source mysql --debug
    • 复制触发器

      1. chameleon start_trigger_replica --config default --source mysql --debug
    • 复制自定义函数

      1. chameleon start_func_replica --config default --source mysql --debug
    • 复制存储过程

      1. chameleon start_proc_replica --config default --source mysql --debug
  1. 可以在对象迁移信息表sch\_chameleon.t\_replica\_object中查看迁移对象的记录。下表展示了t\_replica\_object表的字段说明。
  2. **表 1** 信息表sch\_chameleon.t\_replica\_object字段说明
  3. <table><thead><tr><th valign="top"><p><a name="p82891142123616"></a><a name="p82891142123616"></a>字段</p></th><th valign="top"><p><a name="p7289194243616"></a><a name="p7289194243616"></a>类型</p></th><th valign="top"><p><a name="p142898422361"></a><a name="p142898422361"></a>描述</p></th></tr></thead><tbody><tr><td headers="mcps1.2.4.1.1 " valign="top"><p><a name="p595755414379"></a><a name="p595755414379"></a>i_id_object</p></td><td headers="mcps1.2.4.1.2 " valign="top"><p><a name="p156702053810"></a><a name="p156702053810"></a>bigint</p></td><td headers="mcps1.2.4.1.3 " valign="top"><p><a name="p182911042153614"></a><a name="p182911042153614"></a>id。</p></td></tr><tr><td headers="mcps1.2.4.1.1 " valign="top"><p><a name="p3958155412373"></a><a name="p3958155412373"></a>i_id_source</p></td><td headers="mcps1.2.4.1.2 " valign="top"><p><a name="p067010063815"></a><a name="p067010063815"></a>bigint</p></td><td headers="mcps1.2.4.1.3 " valign="top"><p><a name="p440151712381"></a><a name="p440151712381"></a>与sch_schema.t_sources的id相对应。</p></td></tr><tr><td headers="mcps1.2.4.1.1 " valign="top"><p><a name="p1995814544375"></a><a name="p1995814544375"></a>en_object_type</p></td><td headers="mcps1.2.4.1.2 " valign="top"><p><a name="p1567130153819"></a><a name="p1567130153819"></a>枚举类型</p></td><td headers="mcps1.2.4.1.3 " valign="top"><p><a name="p57763514389"></a><a name="p57763514389"></a>迁移对象所属类型(VIEW/TRIGGER/FUNC/PROC)。</p></td></tr><tr><td headers="mcps1.2.4.1.1 " valign="top"><p><a name="p139581654173714"></a><a name="p139581654173714"></a>ts_created</p></td><td headers="mcps1.2.4.1.2 " valign="top"><p><a name="p26713018385"></a><a name="p26713018385"></a>timestamp with time zone</p></td><td headers="mcps1.2.4.1.3 " valign="top"><p><a name="p1988915515387"></a><a name="p1988915515387"></a>迁移时间。</p></td></tr><tr><td headers="mcps1.2.4.1.1 " valign="top"><p><a name="p1395935418376"></a><a name="p1395935418376"></a>b_status</p></td><td headers="mcps1.2.4.1.2 " valign="top"><p><a name="p19671150133814"></a><a name="p19671150133814"></a>boolean</p></td><td headers="mcps1.2.4.1.3 " valign="top"><p><a name="p1329474203619"></a><a name="p1329474203619"></a>迁移状态。true表示迁移成功,false表示迁移失败。</p></td></tr><tr><td headers="mcps1.2.4.1.1 " valign="top"><p><a name="p14959145463712"></a><a name="p14959145463712"></a>t_src_object_sql</p></td><td headers="mcps1.2.4.1.2 " valign="top"><p><a name="p13671204382"></a><a name="p13671204382"></a>text</p></td><td headers="mcps1.2.4.1.3 " valign="top"><p><a name="p1564759173911"></a><a name="p1564759173911"></a>原始SQL语句。</p></td></tr><tr><td headers="mcps1.2.4.1.1 " valign="top"><p><a name="p13959185419379"></a><a name="p13959185419379"></a>t_dst_object_sql</p></td><td headers="mcps1.2.4.1.2 " valign="top"><p><a name="p1167112012387"></a><a name="p1167112012387"></a>text</p></td><td headers="mcps1.2.4.1.3 " valign="top"><p><a name="p1178718227399"></a><a name="p1178718227399"></a>翻译后的语句。如果无法翻译或者翻译出现error的情况为空,openGauss不支持的字段被注释。</p><div><a name="note16512411194411"></a><a name="note16512411194411"></a>说明:<div><p><a name="p9512181111441"></a><a name="p9512181111441"></a>数据库对象的翻译情况可以通过两种方式查看:</p><a name="ul86092483443"></a><a name="ul86092483443"></a><ul><li>前往<a href="https://gitee.com/opengauss/openGauss-tools-sql-translator" target="_blank" rel="noopener noreferrer">openGauss-tools-sql-translator</a>仓库了解数据库对象的翻译情况。</li><li>通过chameleon的日志了解数据库对象的翻译情况,chameleon的日志包括翻译过程产生的日志和迁移过程产生的日志。</li></ul></div></div></td></tr></tbody></table>
  1. 结束复制过程及清理资源。

    1. chameleon stop_replica --config default --source mysql
    2. chameleon detach_replica --config default --source mysql
    3. chameleon drop_replica_schema --config default

    外键的创建和验证、重置序列(serial)将在detach_replica阶段进行。

卸载chameleon工具

该工具是Python编写的,只需要删除对应的源码和venv环境即可卸载工具。

示例

迁移自定义函数的示例。

  1. --MySQL侧创建两个自定义函数。
  2. create function mysql_func1(s char(20)) returns char(50) deterministic return concat('mysql_func1, ',s,'!')
  3. create function mysql_func2(x smallint unsigned, y smallint unsigned) returns smallint deterministic BEGIN DECLARE a, b SMALLINT UNSIGNED DEFAULT 10; SET a = x, b = y; RETURN a+b; END;
  4. --迁移自定义函数。
  5. chameleon start_func_replica --config default --source mysql --debug
  6. --此时MySQL侧的自定义函数已成功被迁移过来了。查询sch_chameleon.t_replica_object表(注意en_object_type的值是为大写)即可获取自定义函数的迁移信息。
  7. select * from sch_chameleon.t_replica_object where en_object_type='FUNC';