- 问题概述
mysql通过chameleon迁移到opengauss3.1时,迁移指令没有报错,但高斯数据库端就是没数据,只有chameleon中间维护的表,最终定位chameleon的日志中如下显示,卡了我两天才解决,应该也有不少人碰到,这里分享出来解决方法。
2023-01-27 14:36:26 MainProcess ERROR: The MySQL configuration does not allow the replica. Exiting now
2023-01-27 14:36:26 MainProcess ERROR: Source settings - log_bin OFF, binlog_format ROW, binlog_row_image FULL, gtid_mode OFF
2023-01-27 14:36:26 MainProcess ERROR: Mandatory settings - log_bin ON, binlog_format ROW, binlog_row_image FULL, gtid_mode ON (only for MySQL 5.6+)
- 环境
操作系统:openEuler20.03LTS
openGauss:3.1.0企业版
mysql:5.7、8.0、mariaDB 均发生问题
chameleon:3.1.1
- 迁移过程
chameleon的gitee项目中有文档说明,不用看那么多,最后的实例汇集了关键步骤,chameleon的官方文档点击查看,但成也萧何败也萧何,文档中有一段开启mysql数据库的复制功能的说明,亲测必须开启,但照着操作,mysql数据库无法启动。
创建用户后,修改MySQL的配置文件,开启MySQL的复制功能。(一般是/etc/my.cnf或者/etc/my.cnf.d/mariadb-server.cnf)
在 [mysqld] 配置块下修改如下配置(若没有[mysqld] 配置块新增即可)
[mysqld]
binlog_format = ROW
log_bin = mysql-bin
server_id = 1
binlog_row_image = FULL
gtid_mode = ON
修改完毕后重启MySQL。
经过排除法操作,发现问题出在gtid_mode = ON的设置上,尝试在mysql控制台设置环境变量,被告知只读变量,通过配置文件又无法启动。
- 解决办法
需要以root身份在mysql服务器端的mysql控制台进行如下操作,其实就是gtid_mode不能直接设置为ON。按下列步骤依次操作即可。
mysql> set global gtid_mode=on;
ERROR 1788 (HY000): The value of @@GLOBAL.GTID_MODE can only be changed one step at a time: OFF <-> OFF_PERMISSIVE <-> ON_PERMISSIVE <-> ON. Also note that this value must be stepped up or down simultaneously on all servers. See the Manual for instructions.
mysql> set global gtid_mode=OFF_PERMISSIVE;
Query OK, 0 rows affected (0.00 sec)
mysql> set global gtid_mode=ON_PERMISSIVE;
Query OK, 0 rows affected (0.02 sec)
mysql> set global gtid_mode=ON; 此处会有提示信息,必须要先设置 enforce_gtid_consistency=on
ERROR 3111 (HY000): SET @@GLOBAL.GTID_MODE = ON is not allowed because ENFORCE_GTID_CONSISTENCY is not ON.
mysql> set global enforce_gtid_consistency=on;
Query OK, 0 rows affected (0.00 sec)
mysql> set global gtid_mode=ON;
Query OK, 0 rows affected (0.01 sec)
操作完成按文档说明重新迁移即可
chameleon create_replica_schema --configdefault
chameleon add_source --config default--source mysql
chameleon init_replica --config default--source mysql
- 部分数据迁移失败处理
自定义函数、属视图、存储过程、最终迁移失败,部分表的数据插入失败,记得查看日志,日志位置在
/home/omm/.pg_chameleon/logs,我日志里的错误就是性别长度造成的。
顺便提一下,配置文件目录不用手动创建,运行chameleon set_configuration_files命令自动生成。
- 兼容性处理
兼容性造成的问题,这个可以做适配但着实麻烦。chameleon的配置文件模板里给了参照。
# 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.
#下面就是示例,将某些数据库的布尔型表示的tinyint转换成布尔型
type_override:
"tinyint(1)":
override_to: boolean
override_tables:
- "*"
# postgres destination connection
pg_conn:
host: "localhost"
port: "5432"
user: "usr_replica"
password: "never_commit_password"
database: "db_replica"
charset: "utf8"
sources:
mysql:
readers: 4
writers: 4
db_conn:
host: "localhost"
port: "3306"
user: "usr_replica"
password: "never_commit_passwords"
charset: 'utf8'
connect_timeout: 10
schema_mappings:
delphis_mediterranea: loxodonta_africana #这个很重要不要搞错了,左边是源,右边是生成的目标
如果解决了你的问题,求打赏~😄