全量迁移
功能介绍
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虚拟环境并激活。
python3 -m venv venv
source venv/bin/activate
执行如下命令通过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即可。
源码安装
执行如下命令通过git下载源码。
```
git clone git@gitee.com:opengauss/openGauss-tools-chameleon.git
创建Python虚拟环境并激活。
```
python3 -m venv venv
source venv/bin/activate
进入代码的目录,执行python install命令安装。
```
cd openGauss-tools-chameleon
python3 setup.py install
安装完成后,不要退出Python虚拟环境,可以开始使用chameleon工具。
全量迁移
创建配置文件目录。
进入Python虚拟环境安装好chameleon工具。
执行如下命令创建chameleon配置文件目录。
chameleon set_configuration_files
执行该命令后,将在~/.pg_chameleon/configuration目录下创建默认的配置文件模板。
执行如下命令复制一份默认的配置文件模板保存为default.yml。
cd ~/.pg_chameleon/configuration
cp config-example.yml default.yml
按照实际情况修改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: "127.0.0.1"
port: "5432"
user: "opengauss_test"
password: "password123"
database: "opengauss_database"
charset: "utf8"
sources:
mysql:
readers: 4
writers: 4
db_conn:
host: "127.0.0.1"
port: "3306"
user: "mysql_test"
password: "password123"
charset: 'utf8'
connect_timeout: 10
schema_mappings:
mysql_database: sch_mysql_database
limit_tables:
- delphis_mediterranea.foo
skip_tables:
- delphis_mediterranea.bar
grant_select_to:
- usr_readonly
lock_timeout: "120s"
my_server_id: 100
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 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 \`\`\`
```
以上配置文件中参数的含义是:
- 迁移数据时,MySQL侧使用的用户名密码分别是 mysql\_test 和 password123。MySQL服务器的IP和port分别是127.0.0.1和3306,待迁移的数据库是mysql\_database。
- openGauss侧使用的用户名密码分别是 opengauss\_test和 password123。openGauss服务器的IP和port分别是127.0.0.1和5432,目标数据库是opengauss\_database,同时会在opengauss\_database下创建sch\_mysql\_database schema,迁移的表都将位于该schema下。
需要注意的是,这里使用的用户需要有远程连接MySQL和openGauss的权限,以及对对应数据库的读写权限。同时对于openGauss,运行chameleon所在的机器需要在openGauss的远程访问白名单中。对于MySQL,用户还需要有RELOAD、REPLICATION CLIENT、REPLICATION SLAVE的权限。
```
初始化迁移过程。
chameleon create_replica_schema --config default
chameleon add_source --config default --source mysql
此步骤将在openGauss侧创建用于复制过程的辅助schema和表。
复制基础数据。
chameleon init_replica --config default --source mysql
此步骤完成后,MySQL当前的全量数据会被复制到openGauss。可以在openGauss侧查看全量数据复制后的情况。
复制数据库对象。
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字段说明
<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>
结束复制过程及清理资源。
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';