全量迁移

功能介绍

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安装

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

  • 执行如下命令创建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即可。
    • 源码安装
  • 执行如下命令通过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 ```

2. 安装完成后,不要退出Python虚拟环境,可以开始使用chameleon工具。

全量迁移

  1. 创建配置文件目录。

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

  3. 执行如下命令创建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: ''

    1. type_override allows the user to override the default type conversion

    2. into a different one.

    3. type_override:

    4. "tinyint(1)":
    5. override_to: boolean
    6. override_tables:
      • "*"
    7. postgres destination connection

    8. pg_conn:
    9. host: "127.0.0.1"
    10. port: "5432"
    11. user: "opengauss_test"
    12. password: "password123"
    13. database: "opengauss_database"
    14. charset: "utf8"

    15. sources:

    16. mysql:
    17. readers: 4
    18. writers: 4
    19. db_conn:
    20. host: "127.0.0.1"
    21. port: "3306"
    22. user: "mysql_test"
    23. password: "password123"
    24. charset: 'utf8'
    25. connect_timeout: 10
    26. schema_mappings:
    27. mysql_database: sch_mysql_database
    28. limit_tables:
      • delphis_mediterranea.foo
    29. skip_tables:
      • delphis_mediterranea.bar
    30. grant_select_to:
      • usr_readonly
    31. lock_timeout: "120s"
    32. my_server_id: 100
    33. replica_batch_size: 10000
    34. replay_max_rows: 10000
    35. batch_retention: '1 day'
    36. copy_max_memory: "300M"
    37. copy_mode: 'file'
    38. out_dir: /tmp
    39. sleep_loop: 1
    40. 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 \`\`\`

3. ```
4. 以上配置文件中参数的含义是:

6. -   迁移数据时,MySQL侧使用的用户名密码分别是 mysql\_test 和 password123。MySQL服务器的IP和port分别是127.0.0.1和3306,待迁移的数据库是mysql\_database。
7. -   openGauss侧使用的用户名密码分别是 opengauss\_test和 password123。openGauss服务器的IP和port分别是127.0.0.1和5432,目标数据库是opengauss\_database,同时会在opengauss\_database下创建sch\_mysql\_database schema,迁移的表都将位于该schema下。

9. 需要注意的是,这里使用的用户需要有远程连接MySQL和openGauss的权限,以及对对应数据库的读写权限。同时对于openGauss,运行chameleon所在的机器需要在openGauss的远程访问白名单中。对于MySQL,用户还需要有RELOAD、REPLICATION CLIENT、REPLICATION SLAVE的权限。
10. ```
  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表的字段说明。

3. **表 1** 信息表sch\_chameleon.t\_replica\_object字段说明

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