pg_chameleon介绍
pg_chameleon是一个用Python3编写的实时复制工具,经过内部适配,目前支持MySQL迁移到openGauss。工具使用mysql-replication库从MySQL中提取rowimages,这些rowimages将以jsonb格式被存储到openGauss中。在openGauss中会执行一个pl/pgsql函数,解码jsonb并将更改重演到openGauss。同时,工具通过一次初始化配置,使用只读模式,将MySQL的全量数据拉取到openGauss,使得该工具提供了初始全量数据的复制以及后续增量数据的实时在线复制功能。pg_chameleon的特色包括:通过读取MySQL的binlog,提供实时在线复制的功能。
支持从多个MySQLschema读取数据,并将其恢复到目标openGauss数据库中。源schema和目标schema可以使用不同的名称。
通过守护进程实现实时复制,包含两个子进程,一个负责读取MySQL侧的日志,一个负责在openGauss侧重演变更。
使用pg_chameleon将MySQL数据库迁移至openGauss,通过pg_chameleon的实时复制能力,可以大大降低系统切换数据库时的停服时间。pg_chameleon在openGauss上的使用注意事项
pg_chameleon依赖psycopg2,psycopg2内部通过pg_config检查PostgreSQL版本号,限制低版本PostgreSQL使用该驱动。而openGauss的pg_config返回的是openGauss的版本号(当前是openGauss2.0.0),会导致该驱动报版本错误,“PsycopgrequiresPostgreSQLclientlibrary(libpq)=9.1”。解决方案为通过源码编译使用psycopg2,并去掉源码头文件psycopg/psycopg.h中的相关限制。
pg_chameleon通过设置LOCK_TIMEOUTGUC参数限制在PostgreSQL中的等锁的超时时间。openGauss不支持该参数(openGauss支持类似的GUC参数lockwait_timeout,但是需要管理员权限设置)。需要将pg_chameleon源码中的相关设置去掉。
pg_chameleon用到了upsert语法,用来指定发生违反约束时的替换动作。openGauss支持的upsert功能语法与PostgreSQL的语法不同。openGauss的语法是ONDUPLICATEKEYUPDATE{column_name={expression
DEFAULT}}[,...]。PostgreSQL的语法是ONCONFLICT[conflict_target]DOUPDATESET{column_name={expression
DEFAULT}}。两者在功能和语法上略有差异。需要修改pg_chameleon源码中相关的upsert语句。
pg_chameleon用到了CREATESCHEMAIFNOTEXISTS、CREATEINDEXIFNOTEXISTS语法。openGauss不支持SCHEMA和INDEX的IFNOTEXISTS选项。需要修改成先判断SCHEMA和INDEX是否存在,然后再创建的逻辑。
openGauss对于数组的范围选择,使用的是column_name[start,end]的方式。而PostgreSQL使用的是column_name[start:end]的方式。需要修改pg_chameleon源码中关于数组的范围选择方式。
pg_chameleon使用了继承表(INHERITS)功能,而当前openGauss不支持继承表。需要改写使用到继承表的SQL语句和表。
接下来我们将演示如何使用pg_chameleon迁移MySQL数据库至openGauss。
配置pg_chameleon
pg_chameleon通过~/.pg_chameleon/configuration下的配置文件config-example.yaml定义迁移过程中的各项配置。整个配置文件大约分成四个部分,分别是全局设置、类型重载、目标数据库连接设置、源数据库设置。全局设置主要定义log文件路径、log等级等。类型重载让用户可以自定义类型转换规则,允许用户覆盖已有的默认转换规则。目标数据库连接设置用于配置连接至openGauss的连接参数。源数据库设置定义连接至MySQL的连接参数以及其他复制过程中的可配置项目。
详细的配置项解读,可查看