全量迁移

功能介绍

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/latest/chameleon/chameleon-1.0.0-py3-none-any.whl,下载完成后,通过Python virtual env环境进行安装。

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

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

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

      说明:

      • 安装过程中,将自动安装该工具依赖的其他库,请确保本机的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下载源码。

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

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

      cd openGauss-tools-chameleon
      python3 setup.py install
      

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

全量迁移

  1. 创建配置文件目录。

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

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

      chameleon set_configuration_files
      

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

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

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

      # global settings
      pid_dir: '~/.pg_chameleon/pid/'
      log_dir: '~/.pg_chameleon/logs/'
      log_dest: file
      log_level: info
      log_days_keep: 10
      rollbar_key: ''
      rollbar_env: ''
      \# type_override allows the user to override the default type conversion
      \# into a different one.
      type_override:
      "tinyint(1)":
      override_to: boolean
      override_tables:
      \- "*"
      \# postgres destination connection
      pg_conn:
      host: "1.1.1.1"
      port: "5432"
      user: "opengauss_test"
      password: "password_123"
      database: "opengauss_database"
      charset: "utf8"
      sources:
      mysql:
      readers: 4
      writers: 4
      db_conn:
      host: "1.1.1.1"
      port: "3306"
      user: "mysql_test"
      password: "password123"
      charset: 'utf8'
      connect_timeout: 10
      schema_mappings:
      mysql_database:sch_mysql_database
      limit_tables:
      skip_tables:
      grant_select_to:
      \- usr_migration
      lock_timeout: "120s"
      my_server_id: 1
      replica_batch_size: 10000
      replay_max_rows: 10000
      batch_retention: '1 day'
      copy_max_memory: "300M"
      copy_mode: 'file'
      out_dir: /tmp
      sleep_loop: 1
      on_error_replay: continue
      on_error_read: continue
      auto_maintenance: "disabled"
      gtid_enable: false
      type: mysql
      keep_existing_schema: No
      migrate_default_value: Yes
      

      以上配置文件中参数的含义是:

      • 迁移数据时,MySQL侧使用的用户名密码分别是 mysql_test 和 password123。MySQL服务器的IP和port分别是1.1.1.1和3306,待迁移的数据库是mysql_database。
      • openGauss侧使用的用户名密码分别是 opengauss_test和 password_123。openGauss服务器的IP和port分别是1.1.1.1和5432,目标数据库是opengauss_database,同时会在opengauss_database下创建sch_mysql_database schema,迁移的表都将位于该schema下。

      需要注意的是,这里使用的用户需要有远程连接MySQL和openGauss的权限,以及对对应数据库的读写权限。同时对于openGauss,运行chameleon所在的机器需要在openGauss的远程访问白名单中。对于MySQL,用户还需要有RELOAD、REPLICATION CLIENT、REPLICATION SLAVE的权限。

  2. 初始化迁移过程。

    chameleon create_replica_schema --config default
    chameleon add_source --config default --source mysql
    

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

  3. 复制基础数据。

    chameleon init_replica --config default --source mysql
    

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

  4. 复制数据库对象。

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

    • 复制视图

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

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

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

      chameleon start_proc_replica --config default --source mysql --debug
      

    可以在对象迁移信息表sch_chameleon.t_replica_object中查看迁移对象的记录。下表展示了t_replica_object表的字段说明。

    表 1 信息表sch_chameleon.t_replica_object字段说明

    字段

    类型

    描述

    i_id_object

    bigint

    id。

    i_id_source

    bigint

    与sch_schema.t_sources的id相对应。

    en_object_type

    枚举类型

    迁移对象所属类型(VIEW/TRIGGER/FUNC/PROC)。

    ts_created

    timestamp with time zone

    迁移时间。

    b_status

    boolean

    迁移状态。true表示迁移成功,false表示迁移失败。

    t_src_object_sql

    text

    原始SQL语句。

    t_dst_object_sql

    text

    翻译后的语句。如果无法翻译或者翻译出现error的情况为空,openGauss不支持的字段被注释。

    说明:

    数据库对象的翻译情况可以通过两种方式查看:

    • 前往openGauss-tools-sql-translator仓库了解数据库对象的翻译情况。
    • 通过chameleon的日志了解数据库对象的翻译情况,chameleon的日志包括翻译过程产生的日志和迁移过程产生的日志。
  5. 结束复制过程及清理资源。

    chameleon stop_replica --config default --source mysql
    chameleon detach_replica --config default --source mysql
    chameleon drop_replica_schema --config default
    

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

卸载chameleon工具

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

示例

迁移自定义函数的示例。

--MySQL侧创建两个自定义函数。
create function mysql_func1(s char(20)) returns char(50) deterministic return concat('mysql_func1, ',s,'!')
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;
--迁移自定义函数。
chameleon start_func_replica --config default --source mysql --debug
--此时MySQL侧的自定义函数已成功被迁移过来了。查询sch_chameleon.t_replica_object表(注意en_object_type的值是为大写)即可获取自定义函数的迁移信息。
select * from sch_chameleon.t_replica_object where en_object_type='FUNC';