From 84d1ca7465d78482245fc79abdd7545d61e862a7 Mon Sep 17 00:00:00 2001 From: duanguoqiang4 Date: Fri, 26 Apr 2024 17:01:45 +0800 Subject: [PATCH] =?UTF-8?q?DataKit=E6=95=B0=E6=8D=AE=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E6=95=99=E7=A8=8B=E7=B3=BB=E5=88=97=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\347\224\250\350\257\264\346\230\216.md" | 377 +++++++++++++++++ ...55\345\273\272\346\255\245\351\252\244.md" | 387 ++++++++++++++++++ ...45\347\232\204\345\244\204\347\220\206.md" | 323 +++++++++++++++ 3 files changed, 1087 insertions(+) create mode 100644 "app/zh/blogs/duanguoqiang/DataKit\346\225\260\346\215\256\350\277\201\347\247\273-1\344\275\277\347\224\250\350\257\264\346\230\216.md" create mode 100644 "app/zh/blogs/duanguoqiang/DataKit\346\225\260\346\215\256\350\277\201\347\247\273-2\345\256\236\344\276\213\346\220\255\345\273\272\346\255\245\351\252\244.md" create mode 100644 "app/zh/blogs/duanguoqiang/DataKit\346\225\260\346\215\256\350\277\201\347\247\273-3\345\211\215\347\275\256\346\240\241\351\252\214\345\244\261\350\264\245\347\232\204\345\244\204\347\220\206.md" diff --git "a/app/zh/blogs/duanguoqiang/DataKit\346\225\260\346\215\256\350\277\201\347\247\273-1\344\275\277\347\224\250\350\257\264\346\230\216.md" "b/app/zh/blogs/duanguoqiang/DataKit\346\225\260\346\215\256\350\277\201\347\247\273-1\344\275\277\347\224\250\350\257\264\346\230\216.md" new file mode 100644 index 00000000..69619be5 --- /dev/null +++ "b/app/zh/blogs/duanguoqiang/DataKit\346\225\260\346\215\256\350\277\201\347\247\273-1\344\275\277\347\224\250\350\257\264\346\230\216.md" @@ -0,0 +1,377 @@ +--- +title: 'DataKit数据迁移-1使用说明' +date: '2024-04-26' +category: 'blog' +tags: ['openGauss技术文章征集','openGauss','DataKit','数据迁移'] +archives: '2024-04' +author: 'duanguoqiang' +summary: '使用DataKit进行MySQL到openGauss数据迁移教程-1' +img: '' +times: '16:40' +--- + +## 1 环境准备 + +- DataKit服务 + + 要求:成功加载data-migration插件 + + DataKit安装教程,请参考码云仓库(`https://gitee.com/opengauss/openGauss-workbench `) + +- openGauss企业版服务 + + 要求:可以被DataKit服务所在服务器访问 + + openGauss企业版安装请参考官方社区(`https://opengauss.org/zh/ `)教程,也可使用DataKit base-ops插件的“集群安装-安装部署”功能进行安装。 + +- MySQL服务 + + 要求:可以被DataKit服务所在服务器访问 + +- CentOS或openEuler系统服务器 + + 要求:可以被DataKit服务所在服务器访问;JDK 11+环境 + + 用途:用于安装迁移插件(portal) + +## 2 迁移前配置 + +### 2.1 openGauss配置 + +#### 2.1.1 参数配置 + +修改配置文件`pg_hba.conf`和`postgresql.conf`相关参数,以支持迁移过程。 + +配置白名单,以支持通过openGauss用户进行远程连接,配置命令如下: + +```sh +-- 修改pg_hba.conf文件 +gs_guc set -D -h "host all all 0.0.0.0/0 sha256" +-- 修改postgresql.conf文件 +gs_guc set -D -c "listen_addresses = '*'" +-- 其中,“”为数据库节点路径,请替换为实际值,如“/opt/huawei/install/data/dn”,此文档中后续此参数含义不变。 +``` + +配置日志参数及复制权限,以支持反向迁移,配置命令如下: + +```sh +-- 修改pg_hba.conf文件 +gs_guc set -D -h "host replication all 0.0.0.0/0 sha256" +-- 修改postgresql.conf文件 +gs_guc set -D -c "wal_level = logical" +``` + +配置完成后,重启数据库,重启命令如下: + +```sh +gs_ctl restart -D +``` + +#### 2.1.2 创建管理员用户 + +连接数据库 + +```sh +gsql -d postgres -p -r +-- 其中,“”请替换为实际端口,如“5432”,此文档中后续此参数含义不变。 +``` + +创建用户并赋予管理员权限 + +```sql +create user opengauss_test with password 'Sample@123'; +grant all privileges to opengauss_test; +-- 其中,“opengauss_test”为用户名,可自定义,后续此文档中涉及到连接openGauss的用户,便使用此用户。 +-- “Sample@123”为用户密码,可自定义。 +``` + +## 3 执行迁移任务 + +请参考文档:"DataKit数据迁移-2实例搭建步骤" + +## 4 DataKit安装Portal教程 + +### 4.1 DataKit安装Portal注意事项 + +- root用户下安装依赖 + + ```sh + yum install mysql-devel mysql5-devel mariadb-devel python3-devel python-devel + ``` + + 注:如果mysql5-devel与mariadb-devel冲突,保留一个即可。其他包如果未找到,则可忽略。 + +- 请确保安装用户的~/.bashrc已经配置java环境变量,并且版本满足11+。 + +- 安装6.0.0-RC1的portal包,并确认在线安装的安装包是否匹配对应主机架构。 + + 可能存在DataKit未成功获取目标执行机系统及机构信息的情况,导致在线安装给出的包是默认的centos-x86的安装包。遇到此情况,请自行前往portal仓库,下载匹配目标执行机系统及架构的安装包,然后使用datakit的portal离线安装,上传下载的安装包进行安装。 + + ```sh + # portal码云仓库地址 + https://gitee.com/opengauss/openGauss-migration-portal + ``` + +- 安装目录尽量不要再用户的home目录下,即~目录下,并确保安装用户对安装目录有操作权限。因此建议使用安装用户创建目录,供安装portal使用。 + +- 请确保第三方工具的三个端口未被占用,如果默认端口已被占用,支持自定义端口。 + +### 4.2 DataKit安装Portal步骤 + + +1. 访问Datakit服务,点击进入“数据迁移->迁移任务中心”目录下 +2. 点击“创建数据迁移任务”按钮 +3. 开始“选择迁移源库和目的库”步骤,分别选择源端数据库(database),选择目的端数据库(database),并点击“添加子任务”按钮。如果无数据源,点击“新增数据源”,输入所需参数进行新增。\ + 添加子任务成功后,在页面下方选择对应子任务的“迁移过程模式”,支持在线模式和离线模式。离线模式:自动执行全量迁移,完成后自动结束,释放资源。 在线模式:自动执行全量迁移+增量迁移,用户手动启动反向迁移,需要用户操作结束迁移,释放资源。 \ + “选择迁移源库和目的库”配置成功,点击下一步。 +4. 进入“配置迁移过程参数”步骤,可直接使用默认参数,直接点击“下一步”。 +5. 进入“分配执行机资源”步骤,页面会展示所有的执行机列表信息,选择对应执行机点击“开始安装”,进入“迁移套件安装”步骤。\ + 此处如果无执行机信息显示,请前往“资源中心->服务器管理”添加服务器资源,注意添加服务器时需要勾选“记住密码”,添加服务器成功后,页面会显示添加成功的服务器记录。\ + 点击所需服务器记录右侧的“用户管理”,添加普通用户。至此,此服务器可作为安装portal的执行机。 +6. 进行portal安装,\ + “安装用户”选择上述添加的服务器的普通用户。“安装目录”选择使用“安装用户”创建的已有目录,不建议使用默认的“安装用户”的home目录。“第三方工具配置方式”选择“本机新安装”,选择后会出现“zookeeper 端口”,“kafka 端口”,“schema_registry 端口”三条配置项,请确保配置的三个端口未被占用,如默认端口被占用,支持自定义端口。“第三方工具安装目录”使用默认的即可,支持自定义,但同样请配置到使用“安装用户”创建的目录下。\ + 选择安装方式,“在线安装”是在线下载安装包,完成安装,需要确保对应的服务器网络正常。“离线安装”支持手动上传portal安装包进行安装,注意自行下载时请下载匹配对应服务器系统及架构的安装包。“导入安装”支持导入对应服务器上已安装的portal,但要求已安装的portal成功安装了所有的mysql迁移插件,否则导入安装无法成功。 +7. “安装包名称”建议选用最新版本的安装包。至此“迁移套件安装”步骤配置成功,点击“确认”按钮,开始portal安装。 +8. 进行portal安装时,“分配执行机资源”页面的对应执行机的“是否安装迁移套件”字段会显示为“安装中”,安装成功则显示为“已安装”。如果安装失败,可下载“安装日志”,排除故障后,点击“清理环境”,然后再次安装即可。 + +### 4.3 DataKit安装Portal可能出现的问题 + +无论遇到任何问题,请先按照“DataKit安装Portal注意事项”进行排查后,再次尝试安装。 + +#### 4.3.1 kafka启动失败的问题 + +**问题描述:** + +安装portal,所有迁移工具安装成功,但是启动kafka失败,报错类似如下: + +```tex +Socket server failed to bind to 10.126.28.177:9089: Cannot assign requested address +``` + +**问题原因:** + +网络问题,使用外网ip连接服务器时,本机无法感知,导致kafka无法成功启动,修改ip为本机ip,如192.168.0.123后,停止残留的zookeeper kafka等进程,重新启动kafka,启动kafka成功。 + +**解决方式:** + +修改了配置文件的listeners属性中的ip地址为本机ip地址,配置文件位置:`/portalpath/portal/tools/debezium/confluent-5.5.1/etc/kafka/server.properties`。修改成功后,执行如下命令重启kafka: + +```sh +-- 可以先执行停止kafka的命令,确保Kafka进程已停止,避免启动时出错,停止kafka的命令如下 +java -Dpath=/data/dgq/portal/portal/ -Dorder=stop_kafka -Dskip=true -jar /data/dgq/portal/portal/portalControl-6.0.0rc1-exec.jar +-- 启动kafka进程的命令 +java -Dpath=/data/dgq/portal/portal/ -Dorder=start_kafka -Dskip=true -jar /data/dgq/portal/portal/portalControl-6.0.0rc1-exec.jar +``` + +## 5 DataKit数据迁移常见问题 + +### 5.1 在线模式,任务长时间卡顿在全量迁移过程中的问题 + +**问题描述:** + +成功创建在线迁移任务后,点击启动,无前置校验失败,任务状态长时间卡顿在全量迁移进行中,页面无报错,后台full_migration.log无报错。 + +查看portal中对应任务workspace.id的log日志,可以看到报错类似如下: + +```tex +16:56:15,851 ERROR (ThreadExceptionHandler:uncaughtException) - thread main occur excetion: +java.lang.reflect.InvocationTargetException + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:566) + at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) + at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) + at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) + at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88) +Caused by: java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 0 + at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3319) + at java.base/java.lang.String.substring(String.java:1874) + at org.opengauss.portalcontroller.tools.mysql.IncrementalMigrationTool.changeGtidSet(IncrementalMigrationTool.java:165) + at org.opengauss.portalcontroller.tools.mysql.IncrementalMigrationTool.findOffset(IncrementalMigrationTool.java:139) + at org.opengauss.portalcontroller.tools.mysql.IncrementalMigrationTool.init(IncrementalMigrationTool.java:302) + at org.opengauss.portalcontroller.task.Plan.execPlan(Plan.java:448) + at org.opengauss.portalcontroller.PortalControl.startPlan(PortalControl.java:384) + at org.opengauss.portalcontroller.command.mysql.StartCommandReceiver.action(StartCommandReceiver.java:41) + at org.opengauss.portalcontroller.command.ConcreteCommand.execute(ConcreteCommand.java:24) + at org.opengauss.portalcontroller.PortalControl.main(PortalControl.java:181) + ... 8 more +16:56:16,599 INFO (ChangeStatusTools:reduceDiskSpace) - isReduced:false,Plan.stopPlan:false,PortalControl.status:2 +16:56:18,654 INFO (ChangeStatusTools:reduceDiskSpace) - isReduced:false,Plan.stopPlan:false,PortalControl.status:2 +``` + +**问题原因:** + +直接原因:查询openGauss的t_gtid_set为空所致 + +```sql +-- 查询openGauss的t_gtid_set的sql +select t_binlog_name,i_binlog_position,t_gtid_set from sch_chameleon.t_replica_batch; +``` + +根本原因:查询MySQL的Executed_Gtid_Set为空所致 + +```sql +-- 查询MySQL的Executed_Gtid_Set的sql,其中字段Executed_Gtid_Set对应的值就是Executed_Gtid_Set +SHOW MASTER STATUS; +``` + +**问题解决:** + +设置gtid_mode=on,设置的sql如下: + +```sql +-- 逐行执行如下sql语句,完成设置 +SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON; +SET GLOBAL gtid_mode=OFF; +SET GLOBAL gtid_mode=OFF_PERMISSIVE; +SET GLOBAL gtid_mode=ON_PERMISSIVE; +SET GLOBAL gtid_mode=ON; +``` + +设置完成后,通过如下sql查询是否设置成功: + +```sql +-- 查询gitid_mode状态的sql语句 +SHOW GLOBAL VARIABLES LIKE 'gtid_mode'; +``` + +设置成功后,执行一条sql语句后,再次查询Executed_Gtid_Set,发现不再为空。问题解决。 + +### 5.2 全量校验失败的问题 + +**问题描述:** + +成功创建迁移任务,并成功执行全量迁移,迁移校验失败,报错提示类似如下: + +```tex +failed (insert=0 update=6 delete=0)If you want to repair data.please read the following files:/data/dgq/portal/portal/workspace/25/check_result/result/repair_source_db_table1_0_0.txt +``` + +`repair_source_db_table1_0_0.txt`中内容如下: + +```sql +update `source_db`.`table1` set name='data' , col='data1' where id=1 ; +update `source_db`.`table1` set name='data' , col='data2' where id=2 ; +update `source_db`.`table1` set name='data' , col='data3' where id=3 ; +update `source_db`.`table1` set name='data' , col='data4' where id=4 ; +update `source_db`.`table1` set name='data' , col='data5' where id=5 ; +update `source_db`.`table1` set name='data' , col='data6' where id=6 ; +``` + +然而手动校验迁移后table1表中的数据,数据正确。 + +**问题原因:** + +MySQL创建表table1时,字段`NAME`的字段名使用的是大写,建表语句如下: + +```sql +CREATE TABLE table1 ( + id INT, + NAME VARCHAR(10), + col VARCHAR(20), + PRIMARY KEY(id) +); +``` + +由于,迁移到openGauss端后,迁移过程创建的table1表格的建表语句如下: + +```sql +CREATE TABLE table1 ( + id integer NOT NULL, + "NAME" character varying(10), + col character varying(20) +) +WITH (orientation=row, compression=no); +ALTER TABLE table1 ADD CONSTRAINT pk_table1_1712058063_0 PRIMARY KEY USING btree (id); +``` + +可见大写的`NAME`被双引号括起来,因此导致全量校验的时候,由于双引号的问题,导致检验时无法匹配两边的`name`字段名,导致校验无法通过。 + +**问题解决:** + +MySQL端创建表格时,字段名使用小写,问题解决。 + +### 5.3 全量检验未校验,便进行下一步骤增量迁移的问题 + +**问题原因:** 内存不够 + +**问题解决:** 释放服务器内存后,再次尝试 + +### 5.4 增量迁移删除拥有主键的表失败的问题 + +**问题原因:** + +对于drop table操作,当表含有关联对象是,例如视图,MySQL端可以用drop table只删除表而保留视图,openGauss端用drop table仅删除表会失败,此问题属于内核兼容性问题。因此对于MySQL端的drop table语句,openGauss端将采用drop table cascade一并删除表及其关联的对象。 + +因此增量迁移源端删除有关联对象的表,目标端无法删除,导致此问题的出现。 + +**问题解决:** + +删除表格关联对象后,再删除此表。 + +### 5.5 增量迁移创建view失败的问题 + +**问题原因:** + +由于增量迁移解析出的创建view的语句语法类似如下: + +```sql +CREATE ALGORITHM=UNDEFINED DEFINER=`test`@`%` SQL SECURITY DEFINER VIEW `view1` AS SELECT * FROM table1; +``` + +由于语句中包含`@`符号,而openGauss端执行此创建view的语句,会在`@`符号处报出语法错误。因此导致失败。 + +**问题解决:** + +通过如下命令设置openGauss的`b_compatibility_user_host_auth`参数值为`on`使其支持此语法,问题便得到解决。 + +```sql +set b_compatibility_user_host_auth to on; +``` + +**b_compatibility_user_host_auth参数说明:** + +**参数说明**:控制是否允许创建`'user'@'host'`之类的用户并兼容mysql的user@host认证鉴权,对兼容mysql的user@host进行认证时,需要在配置文件postgresql.conf中设为on。 + +**取值范围**:布尔型 + +**默认值**:off + +**示例**: + +```sql +openGauss=# show b_compatibility_user_host_auth; + b_compatibility_user_host_auth +-------------------------------- + off +(1 row) +``` + +### 5.7 反向迁移成功启动,数据反向迁移未成功的问题 + +**问题描述:** + +创建迁移任务,无前置校验问题,成功进行全量迁移,增量迁移,数据同步后,停止增量迁移,反向迁移成功启动,在openGauss端添加数据记录,反向迁移条数仍为0,且MySQL端未成功同步数据。 + +**问题原因:** + +openGuass数据库未开启用户复制权限的支持,即使用户的权限管理中具有复制的权限,但是数据库也需要通过修改配置文件pg_hba.conf,在文件末尾配置`host replication {用户名} 0.0.0.0/0 sha256`,如此用户才能进行复制相关操作。其中,用户名也可以换成all,以支持所有用户的复制权限。 + +**个人理解:**用户虽然具有复制权限,但是数据库服务不支持用户使用复制权限进行复制相关操作,因此需要开启数据库对复制权限的管理。 + +就比如我有从仓库拿东西的权限,所以我可以往外拿东西,但是后来仓库管理员说所有东西都不可以往外拿东西,那么即使我有往外拿东西的权限,他也不让我往外拿东西。配置的目的便是,领导告诉仓库管理员,现在可以让我往外拿东西,那么我再往外拿东西的时候,便能拿出来了。相当于用户有用户的权限管理,然后仓库管理员有仓库管理员的权限管理,两层权限都有,我才能往外拿东西。 + +**问题解决:** + +修改配置文件pg_hba.conf,在文件末尾配置`host replication {用户名} 0.0.0.0/0 sha256`。或通过如下命令配置,命令如下: + +```shell +gs_guc set -D /opt/datakit/opengauss/datanode/dn1 -h "host replication {用户名} 0.0.0.0/0 sha256" +``` + +配置完成后重启数据库,使配置生效,重启数据库的命令如下: + +```shell +gs_ctl restart -D /opt/datakit/opengauss/datanode/dn1 +``` diff --git "a/app/zh/blogs/duanguoqiang/DataKit\346\225\260\346\215\256\350\277\201\347\247\273-2\345\256\236\344\276\213\346\220\255\345\273\272\346\255\245\351\252\244.md" "b/app/zh/blogs/duanguoqiang/DataKit\346\225\260\346\215\256\350\277\201\347\247\273-2\345\256\236\344\276\213\346\220\255\345\273\272\346\255\245\351\252\244.md" new file mode 100644 index 00000000..c11a22f6 --- /dev/null +++ "b/app/zh/blogs/duanguoqiang/DataKit\346\225\260\346\215\256\350\277\201\347\247\273-2\345\256\236\344\276\213\346\220\255\345\273\272\346\255\245\351\252\244.md" @@ -0,0 +1,387 @@ +--- +title: 'DataKit数据迁移-2实例搭建步骤' +date: '2024-04-26' +category: 'blog' +tags: ['openGauss技术文章征集','openGauss','DataKit','数据迁移'] +archives: '2024-04' +author: 'duanguoqiang' +summary: '使用DataKit进行MySQL到openGauss数据迁移教程-2' +img: '' +times: '16:40' +--- + + +说明:此文档仅包含使用DataKit进行数据迁移时,搭建迁移任务相关教程,不包含一些必须的前置配置步骤,和环境要求等,请优先学习“**DataKit数据迁移-1使用说明**”文档。 + +# 数据迁移实例搭建步骤 + +## 1 离线模式迁移步骤 + +- 创建源端数据库用例,并初始化数据 + + 详细说明,参考“迁移各步骤详细说明”目录下:“1 创建源端数据库用例,并初始化数据”,下同。 + +- 创建目标端数据库B库 + + 详细说明:“2 创建目标端数据库B库” + +- 使用B库连接openGauss数据库,并在目标端创建与mysql对象definer同名的用户,并赋权 + + 详细说明:“3 在目标端创建与MySQL对象definer同名的用户,并赋权” + +- DataKit新增目标端和源端数据源 + + 详细说明:“4 DataKit新增目标端和源端数据源” + +- 创建迁移任务 + + 详细说明:“5 创建迁移任务步骤” + +- 启动迁移任务,查看任务详情 + + 详细说明:“6 启动迁移任务,查看任务详情” + +- 解决前置校验失败 + + 详细说明:“7 解决前置校验失败” + +- 重置迁移任务, 查看任务详情 + + 详细说明:“8 重置迁移任务, 查看任务详情” + +- 等待迁移任务完成,手动校验迁移结果 + + 详细说明:“9 校验全量迁移结果” + +## 2 在线模式迁移步骤 + +- 创建源端数据库用例,并初始化数据 + + 同离线模式步骤 + +- 创建目标端数据库B库 + + 同离线模式步骤 + +- 使用B库连接openGauss数据库,并在目标端创建与mysql对象definer同名的用户,并赋权 + + 同离线模式步骤 + +- DataKit新增目标端和源端数据源 + + 同离线模式步骤 + +- 创建迁移任务 + + 同离线模式步骤 + +- 启动迁移任务,查看任务详情 + + 同离线模式步骤 + +- 解决前置校验失败 + + 同离线模式步骤 + +- 重置迁移任务, 查看任务详情 + + 同离线模式步骤 + +- 校验全量迁移结果 + + 同离线模式“校验迁移结果”步骤 + +- 修改源端数据库数据,校验增量迁移结果 + + 详细说明:“10 修改源端数据库数据,校验增量迁移结果” + +- 结束增量迁移,启动反向迁移 + + 详细说明:“11 结束增量迁移,启动反向迁移” + +- 修改目标端数据库数据,检验反向迁移结果 + + 详细说明:“12 修改目标端数据库数据,检验反向迁移结果” + +- 结束迁移任务 + +- 详细说明:“13 结束在线模式迁移任务” + +# 迁移各步骤详细说明 + +## 1 创建源端数据库用例,并初始化数据 + +连接MySQL数据库,并执行如下sql语句,在源端创建source_db数据库,作为迁移的源端数据库用例。 + +```sql +DROP DATABASE IF EXISTS source_db; + +CREATE DATABASE source_db; +USE source_db; + +CREATE TABLE table1(id INT, name VARCHAR(10), col VARCHAR(20), PRIMARY KEY(id)); +INSERT INTO table1 VALUES(1,'data', 'data1'); +INSERT INTO table1 VALUES(2,'data', 'data2'); +INSERT INTO table1 VALUES(3,'data', 'data3'); +INSERT INTO table1 VALUES(4,'data', 'data4'); +INSERT INTO table1 VALUES(5,'data', 'data5'); +INSERT INTO table1 VALUES(6,'data', 'data6'); + +CREATE VIEW view1 AS SELECT * FROM table1; + +CREATE FUNCTION mysql_func1(s CHAR(20)) RETURNS CHAR(50) DETERMINISTIC RETURN CONCAT('mysql_func1, ',s,'!'); + +CREATE TRIGGER trigger1 BEFORE INSERT ON table1 FOR EACH ROW SET new.col = CONCAT(new.name, new.id); + +CREATE PROCEDURE procedure1() SELECT * FROM table1; +``` + +## 2 创建目标端数据库B库 + +连接openGauss数据库,并执行如下sql语句,创建B库。 + +```sql +create database target_db with dbcompatibility = 'b'; +``` + +## 3 在目标端创建与MySQL对象definer同名的用户,并赋权 + +当源端数据库中有视图(view),触发器(trigger)或存储过程(procedure)的对象时,需要在目标端创建与其对象definer同名的用户。 + +**查询MySQL端对象definer** + +```sql +-- 查询MySQL对象definer的sql语句 +show create view view1; +``` + +查询结果类似如下: + +```tex +View Create View character_set_client collation_connection +view1 CREATE ALGORITHM=UNDEFINED DEFINER=`test`@`%` SQL SECURITY DEFINER VIEW `view1` AS select `table1`.`id` AS `id`,`table1`.`name` AS `name`,`table1`.`col` AS `col` from `table1` utf8mb3 utf8mb3_general_ci +``` + +其中:“`'test'@'%'`”即为MySQL对象definer + +**使用B库连接openGauss数据库** + +```shell +-- 通过gsql连接B库 +gsql -d target_db -p 5680 -r +-- 或,在gsql已连接情况下切换至B库 +\c target_db +``` + +**在目标端创建与mysql对象definer同名的用户,并赋权** + +```sql +-- 创建与mysql对象definer同名的用户,并赋权的sql语句 +-- 设置b_compatibility_user_host_auth参数值为on +set b_compatibility_user_host_auth to on; +-- 创建同名用户 +create user 'username'@'%' with password 'Sample@123'; +-- 给新增用户赋权 +grant all privileges to 'username'@'%'; +``` + +## 4 DataKit新增目标端和源端数据源 + +请按照如下步骤,分别添加源端MySQL数据源和目标端openGauss数据源。 + +1. 访问DataKit服务,点击进入“资源中心->实例管理”目录下 +2. 点击“创建”按钮,弹出“新增数据源”窗口 +3. 进行新增数据源配置 + - 集群名称可忽略,也可自定义 + - 数据库类型选择“MYSQL”或“OPENGAUSS” + - 准确配置数据库服务的ip地址,端口,用户名,密码信息 + - 连接拓展属性,及使用jdbc连接数据库服务时,做的一些时区,字符集限制等,可忽略 + - 连接地址,即通过上述配置的连接信息拼出的jdbc连接数据库的url +4. 配置完成后,点击“测试连通性” + - “待检测”显示为“可用”,说明可以成功建立连接 + - “待检测”显示为“不可用”,说明存在网络问题,或配置信息有误,请校验后重试。 +5. “测试连通性”可用后,点击“确认”按钮,成功添加数据库实例 + +## 5 创建迁移任务步骤 + +1. Datakit成功加载data-migration插件 + +2. 点击进入DataKit服务“数据迁移 -> 迁移任务中心”目录下 + +3. 点击“创建数据迁移任务”按钮 + +4. 开始“选择迁移源库和目的库”步骤 + + - 选择源端数据库(MySQL端),选择目的端数据库(openGauss端),并点击“添加子任务”按钮,支持添加多条子任务。 + - 成功添加子任务后,在页面下方选择对应子任务的“迁移过程模式”,支持选择“在线模式”和“离线模式”。 + - “选择迁移源库和目的库”配置成功,点击下一步。 + + **注:** + + - 如果无数据源,点击“新增数据源”,输入所需参数进行新增,或参考目录“4 DataKit新增目标端和源端数据源”。 + + - 目的端选择目录“2 创建目标端数据库B库”已创建好的B库。 + + - 迁移过程模式,支持在线模式和离线模式。 + + 离线模式:自动执行全量迁移 + 全量校验,完成后自动结束。 + + 在线模式:可执行全量迁移 + 全量校验 + 增量迁移 + 增量校验 + 反向迁移。其中portal自动执行全量迁移 + 全量校验 + 增量迁移 + 增量校验,然后一直处于增量迁移状态(此时增量迁移和增量校验同时运行)。用户需要手动停止增量迁移,然后手动启动反向迁移,此后一直处于反向迁移状态。如果需要结束任务,需要用户手动结束迁移。 + +5. 开始“配置迁移过程参数”步骤 + + 直接使用默认参数即可,点击“下一步”。 + +6. 开始“分配执行机资源”步骤 + + 页面会展示所有的执行机列表信息,页面左侧复选框,勾选一台已安装迁移套件(portal)的执行机,点击完成,创建迁移任务成功。 + + **注:** + + - 执行机,是指安装有portal(portal时具体执行迁移任务的插件)的服务器。即,迁移任务实际上是在安装portal的服务器上,使用portal插件执行的,DataKit这里只是作为一个集中管理迁移任务的客户端。 + - 如果没有已安装迁移套件的执行机,详细见文档“**DataKit数据迁移-1使用说明**”中,目录:“DataKit安装Portal教程”。 + +7. 查看迁移任务 + + 点击进入目录“数据迁移 -> 迁移任务中心”下,可以看到已创建成功的迁移任务列表信息。 + +8. 修改迁移任务配置 + + 迁移任务列表中,字段“执行状态”为未启动的任务,点击对应数据行右侧“详请”,可以看到上述“创建迁移任务步骤”的过程配置信息,并支持修改配置。 + +## 6 启动迁移任务,查看任务详情 + +1. 点击进入DataKit服务“数据迁移 -> 迁移任务中心”目录下 +2. 找到上述创建的迁移任务记录,点击记录右侧的“启动”,迁移任务启动成功 +3. 点击记录右侧的“详情”,进入迁移任务详情页 +4. 点击对应子任务右侧的“详情”,可查看子任务迁移的详细过程数据 +5. “在线/离线迁移过程记录”中,会展示详细的迁移情况 +6. 其中全量迁移会展示表,视图,函数,触发器和存储过程的迁移情况,迁移状态为绿色“√”图标时,说明迁移成功,为橙色“×”图标时,说明迁移失败。 +7. 全量校验则只校验拥有主键的表,同样校验状态为绿色“√”图标时,说明迁移成功,为橙色“×”图标时,说明校验失败。 +8. 当存在失败的情况时,点击对应子任务右侧的“日志”,可以选择下载所需日志,查看日志中的报错信息并解决。 + +## 7 解决前置校验失败 + +如果未出现“前置校验失败”的状态,则不需要解决,跳过此步骤即可。 + +当出现前置校验失败时,鼠标悬浮于对应子任务“前置校验失败”提示的右侧橙色“×”图标上,即可查看校验失败的详细信息,根据详细信息中提示的校验失败项,参考文档“**DataKit数据迁移-3前置校验失败的处理**”,对失败项进行解决。 + +## 8 重置迁移任务, 查看任务详情 + +如果未出现“前置校验失败”的状态,则不需要此操作,跳过此步骤即可。 + +当解决完成“前置校验失败”的项目后,在页面的标签页栏中关闭此任务的“任务详情”页面,点击回到“迁移任务中心”页面,找到对应迁移任务记录,点击对应页面右侧的“结束迁移”,然后点击“重置”,再点击“启动”,重新启动此迁移任务,再次点击“详情”,即可查看迁移任务详细的过程信息。 + +## 9 校验全量迁移结果 + +当离线模式迁移任务完成,或在线模式全量校验完成后,可以手动连接到迁移的目标端数据库,通过如下sql语句,手动查看并校验库中数据是否于源端数据库中数据相同。 + +```sh +-- 使用B库连接openGauss数据库 +gsql -d target_db -p 5680 -r +``` + +```sql +-- 或在已连接的情况下,切换到目标端B库 +\c target_db + +-- 设置默认的schema +SET CURRENT_SCHEMA TO source_db; + +-- 查看表格和视图 +SHOW TABLES; + +-- 查询触发器 +SHOW TRIGGERS; + +-- 查看函数 +SHOW FUNCTION STATUS WHERE Db = 'source_db'; + +-- 查看存储过程 +SHOW PROCEDURE STATUS WHERE Db = 'source_db'; + +-- 查询表中数据 +SELECT * FROM table1; +``` + +**注:**此处设置默认的schema,是由于数据迁移会默认在目标端数据库中创建与源端数据库同名的的schema,并将源端数据库中的数据迁移到此schema中。 + +## 10 修改源端数据库数据,校验增量迁移结果 + +在源端依次执行增删改和创建表格等操作,可以查看对应迁移任务详情中,“累计增量迁移对象数”会随着操作逐次增加,当“剩余待写入数据”条数为0时,说明所有数据库操作均已增量迁移成功。 + +也可以每次源端做出操作后,在目标端手动校验数据是否同步,以验证增量迁移情况。 + +**修改源端数据库数据** + +```sql +-- 增删改操作 +-- 插入数据 +INSERT INTO table1 VALUES(7, 'data', 'data7'); +-- 修改数据 +UPDATE table1 SET NAME = 'new_data' WHERE id = 7; +-- 删除数据 +DELETE FROM table1 WHERE id = 7; + +-- DDL操作 +-- 创建表 +CREATE TABLE table2 ( + id INT, + NAME VARCHAR(10) +); +-- 删除表 +DROP TABLE table2; +``` + +**手动校验增量迁移结果** + +```sql +-- 增删改操作校验 +-- 查询表中修改的数据是否同步 +select * from table1; + +-- DDL操作校验 +-- 查询目标端表格的增删情况 +SHOW TABLES; + +-- 查询目标端表结构,与新增表结构是否一致 +SHOW CREATE TABLE table2; +``` + +## 11 结束增量迁移,启动反向迁移 + +点击对应子任务右侧的“停止增量”,点击“确认”按钮,等待增量迁移停止。 + +增量迁移成功停止后,对应子任务右侧的“启动反向”,点击查看详情,可以查看反向迁移详细过程。 + +## 12 修改目标端数据库数据,检验反向迁移结果 + +在目标端依次执行增删改操作,可以查看对应迁移任务详情中,“累计反向迁移对象数”会随着操作逐次增加,当“剩余待写入数据”条数为0时,说明所有数据库操作均已反向迁移成功。 + +也可以每次目标端做出操作后,在源端手动校验数据是否同步,以验证反向迁移情况。 + +**修改目标端数据库数据** + +```sql +-- 增删改操作 +-- 插入数据 +INSERT INTO table1 VALUES(7, 'data', 'data7'); +-- 修改数据 +UPDATE table1 SET NAME = 'new_data' WHERE id = 7; +-- 删除数据 +DELETE FROM table1 WHERE id = 7; +``` + +**手动校验反向迁移结果** + +```sql +-- 增删改操作校验 +-- 依次查询修改是否同步 +select * from table1; +``` + +## 13 结束在线模式迁移任务 + +在线模式迁移任务不同与离线模式,当不手动进行停止操作时,会始终处于反向迁移状态下。 + +点击对应子任务右侧“结束迁移”,等待迁移任务停止,则此在线模式迁移任务完成。 \ No newline at end of file diff --git "a/app/zh/blogs/duanguoqiang/DataKit\346\225\260\346\215\256\350\277\201\347\247\273-3\345\211\215\347\275\256\346\240\241\351\252\214\345\244\261\350\264\245\347\232\204\345\244\204\347\220\206.md" "b/app/zh/blogs/duanguoqiang/DataKit\346\225\260\346\215\256\350\277\201\347\247\273-3\345\211\215\347\275\256\346\240\241\351\252\214\345\244\261\350\264\245\347\232\204\345\244\204\347\220\206.md" new file mode 100644 index 00000000..bd620ed8 --- /dev/null +++ "b/app/zh/blogs/duanguoqiang/DataKit\346\225\260\346\215\256\350\277\201\347\247\273-3\345\211\215\347\275\256\346\240\241\351\252\214\345\244\261\350\264\245\347\232\204\345\244\204\347\220\206.md" @@ -0,0 +1,323 @@ +--- +title: 'DataKit数据迁移-3前置校验失败的处理' +date: '2024-04-26' +category: 'blog' +tags: ['openGauss技术文章征集','openGauss','DataKit','数据迁移'] +archives: '2024-04' +author: 'duanguoqiang' +summary: '使用DataKit进行MySQL到openGauss数据迁移教程-3' +img: '' +times: '16:40' +--- + +## 前置校验项目及不通过的处理 + +### 1、Kafka服务可用性检查: + +>使用jps在portal执行机上执行查看,保证以下三个服务进程存在 +> +>```sh +>[test@dev-openeuler-arm ~]$ jps +>3757401 SchemaRegistryMain +>3757072 SupportedKafka +>3756341 QuorumPeerMain +>``` +> +>如果在portal以正常安装的情况下,三个服务进程异常终止,可使用如下命令启动三个服务进程。 +> +>```shell +>-- 可以先执行停止kafka的命令,确保Kafka进程已停止,避免启动时出错,停止kafka的命令如下 +>java -Dpath=/{portal_path}/portal/ -Dorder=stop_kafka -Dskip=true -jar /{portal_path}/portal/portalControl-*-exec.jar +> +>-- 启动kafka进程的命令 +>java -Dpath=/{portal_path}/portal/ -Dorder=start_kafka -Dskip=true -jar /{portal_path}/portal/portalControl-*-exec.jar +> +>-- 出现类似如下日志信息,表示启动kafka成功 +>``` +> +>```tex +>log4j: reset attribute= "false". +>log4j: Threshold ="null". +>log4j: Level value for root is [debug]. +>log4j: root level set to DEBUG +>log4j: Class name: [org.apache.log4j.ConsoleAppender] +>log4j: Parsing layout of class: "org.apache.log4j.PatternLayout" +>log4j: Setting property [conversionPattern] to [%d{HH:mm:ss,SS} %-5p (%C{1}:%M) - %m%n]. +>log4j: Setting property [levelMin] to [INFO]. +>log4j: Setting property [levelMax] to [ERROR]. +>log4j: Setting property [acceptOnMatch] to [true]. +>log4j: Adding filter of type [class org.apache.log4j.varia.LevelRangeFilter] to appender named [log.console]. +>log4j: Adding appender named [log.console] to category [root]. +>log4j: Class name: [org.apache.log4j.DailyRollingFileAppender] +>log4j: Setting property [file] to [/data/test/portal/portal//logs/portal_.log]. +>log4j: Setting property [append] to [true]. +>log4j: Setting property [datePattern] to [yyyy-MM-dd]. +>log4j: Parsing layout of class: "org.apache.log4j.PatternLayout" +>log4j: Setting property [conversionPattern] to [%d{HH:mm:ss,SS} %-5p (%C{1}:%M) - %m%n]. +>log4j: Setting property [levelMin] to [INFO]. +>log4j: Setting property [levelMax] to [ERROR]. +>log4j: Setting property [acceptOnMatch] to [true]. +>log4j: Adding filter of type [class org.apache.log4j.varia.LevelRangeFilter] to appender named [log.file]. +>log4j: setFile called: /data/test/portal/portal//logs/portal_.log, true +>log4j: setFile ended +>log4j: Appender [log.file] to be rolled at midnight. +>log4j: Adding appender named [log.file] to category [root]. +>19:35:00,492 INFO (ParamsUtils:initMigrationParamsFromProps) - properties = {awt.toolkit=sun.awt.X11.XToolkit, java.specification.version=11, sun.cpu.isalist=, sun.jnu.encoding=UTF-8, java.class.path=/data/test/portal/portal/portalControl-6.0.0rc1-exec.jar, java.vm.vendor=BiSheng, sun.arch.data.model=64, path=/data/test/portal/portal/, java.vendor.url=https://gitee.com/openeuler/bishengjdk-11/, user.timezone=Asia/Shanghai, os.name=Linux, java.vm.specification.version=11, sun.java.launcher=SUN_STANDARD, user.country=US, order=start_kafka, sun.boot.library.path=/data/test/env/java/bisheng-jdk-11.0.20/lib, sun.java.command=/data/test/portal/portal/portalControl-6.0.0rc1-exec.jar, jdk.debug=release, sun.cpu.endian=little, user.home=/home/test, user.language=en, java.specification.vendor=Oracle Corporation, java.version.date=2023-07-18, java.home=/data/test/env/java/bisheng-jdk-11.0.20, file.separator=/, java.vm.compressedOopsMode=Zero based, line.separator= +>, java.specification.name=Java Platform API Specification, java.vm.specification.vendor=Oracle Corporation, java.awt.graphicsenv=sun.awt.X11GraphicsEnvironment, java.protocol.handler.pkgs=org.springframework.boot.loader, sun.management.compiler=HotSpot 64-Bit Tiered Compilers, java.runtime.version=11.0.20+11, user.name=test, skip=true, path.separator=:, os.version=4.19.90-2110.8.0.0119.oe1.aarch64, java.runtime.name=OpenJDK Runtime Environment, file.encoding=UTF-8, java.vm.name=OpenJDK 64-Bit Server VM, java.vendor.version=BiSheng, java.vendor.url.bug=https://gitee.com/openeuler/bishengjdk-11/issues/, java.io.tmpdir=/tmp, java.version=11.0.20, user.dir=/data/test/portal, os.arch=aarch64, java.vm.specification.name=Java Virtual Machine Specification, java.awt.printerjob=sun.print.PSPrinterJob, sun.os.patch.level=unknown, java.library.path=/data/test/portal/portal/tools/chameleon/chameleon-6.0.0rc1:/data/test/portal/portal/tools/chameleon/chameleon-5.1.1:/data/test/portal/portal/tools/chameleon/chameleon-6.0.0rc1:/data/test/portal/portal/tools/chameleon/chameleon-6.0.0rc1:/data/test/portal/portal/tools/chameleon/chameleon-6.0.0rc1:/data/test/portal/portal/tools/chameleon/chameleon-6.0.0:/data/xz_u2/base/opt/huawei/install/om/lib:/data/xz_u2/base/opt/huawei/install/om/script/gspylib/clib::/usr/java/packages/lib:/lib:/usr/lib:/usr/lib64:/lib64, java.vm.info=mixed mode, java.vendor=BiSheng, java.vm.version=11.0.20+11, java.specification.maintenance.version=2, sun.io.unicode.encoding=UnicodeLittle, java.class.version=55.0} +>19:35:00,567 INFO (MigrationConfluentInstanceConfig:getSystemParamAndParseEntity) - get MigrationConfluentInstanceConfig from system param = MigrationConfluentInstanceConfig(id=null, zookeeperPort=null, kafkaPort=null, zkIp=null, kafkaIp=null, installDir=null, bindPortalId=null, zkIpPort=null, kafkaIpPort=null, schemaRegistryIpPort=null, schemaRegistryIp=null, schemaRegistryPort=null, bindPortalHost=null, thirdPartySoftwareConfigType=null) +>19:35:00,569 INFO (KafkaUtils:changeConfluentDirFromSysParam) - no need change param +>19:35:00,576 INFO (FileUtils:createFile) - File /data/test/portal/portal/portal.portId.lock already exists. +>19:35:00,587 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1 already exists. +>19:35:00,587 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/tmp/ already exists. +>19:35:00,592 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/logs already exists. +>19:35:00,631 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/status/ already exists. +>19:35:00,632 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/status/incremental/ already exists. +>19:35:00,632 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/status/portal.txt already exists. +>19:35:00,632 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/status/full_migration.txt already exists. +>19:35:00,632 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/status/incremental_migration.txt already exists. +>19:35:00,632 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/status/reverse_migration.txt already exists. +>19:35:00,632 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/logs/debezium/ already exists. +>19:35:00,633 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/logs/datacheck/ already exists. +>19:35:00,650 INFO (ParamsUtils:changeDatacheckLogLevel) - global log level param is empty +>19:35:00,796 INFO (MigrationConfluentInstanceConfig:getSystemParamAndParseEntity) - get MigrationConfluentInstanceConfig from system param = MigrationConfluentInstanceConfig(id=null, zookeeperPort=null, kafkaPort=null, zkIp=null, kafkaIp=null, installDir=null, bindPortalId=null, zkIpPort=null, kafkaIpPort=null, schemaRegistryIpPort=null, schemaRegistryIp=null, schemaRegistryPort=null, bindPortalHost=null, thirdPartySoftwareConfigType=null) +>19:35:00,851 INFO (RuntimeExecUtils:executeStartOrder) - start command = /data/test/portal//portal/tools/debezium/confluent-5.5.1/bin/zookeeper-server-start -daemon /data/test/portal//portal/tools/debezium/confluent-5.5.1/etc/kafka/zookeeper.properties +>19:35:00,938 INFO (RuntimeExecUtils:executeStartOrder) - Start zookeeper. +>19:35:02,964 INFO (MqTool:start) - kafkaOrder====/data/test/portal//portal/tools/debezium/confluent-5.5.1/bin/kafka-topics --list --bootstrap-server 192.168.0.118:9092 +>19:35:03,07 INFO (RuntimeExecUtils:executeStartOrder) - start command = /data/test/portal//portal/tools/debezium/confluent-5.5.1/bin/kafka-server-start -daemon /data/test/portal//portal/tools/debezium/confluent-5.5.1/etc/kafka/server.properties +>19:35:03,93 INFO (RuntimeExecUtils:executeStartOrder) - Start kafka. +>19:35:05,102 INFO (RuntimeExecUtils:removeFile) - Remove file /data/test/portal/portal/tmp/test_.txt finished. +>19:35:07,108 INFO (RuntimeExecUtils:removeFile) - Remove file /data/test/portal/portal/tmp/test_.txt finished. +>19:35:07,174 INFO (RuntimeExecUtils:executeStartOrder) - start command = /data/test/portal//portal/tools/debezium/confluent-5.5.1/bin/schema-registry-start -daemon /data/test/portal//portal/tools/debezium/confluent-5.5.1/etc/schema-registry/schema-registry.properties +>19:35:07,181 INFO (RuntimeExecUtils:executeStartOrder) - Start kafka schema registry. +>19:35:10,281 INFO (MqTool:start) - Start kafka success. +>``` + +### 2、检查源端和目标端数据库是否可连接 + +>MySQL: mysql -h ip -P port -u user -ppassword -S /~/mysql.sock\ +>OpenGauss: gsql -r -d database -p port -U user -W password + +### 3、权限检查 + +**Mysql连接用户权限要求**如下: + +为确认数据的顺利迁移,源端数据库(Mysql)的数据源添加时,请按照迁移需要添加所需权限,也可以直接给all权限; + +1)全量迁移: select 、reload、 lock tables 、replication client + +2)增量迁移: select 、replication client 、replication slave + +3)反向迁移: select 、update 、insert 、delete + +查询和修改用户权限的命令如下,如果连接用户权限不满足,请修改对应权限值。 + +```sql +-- 查询用户权限的命令 +SELECT * FROM mysql.user WHERE USER = '{用户名}'; +-- 修改用户权限的命令语法格式如下,其中privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL;databasename:数据库名;tablename:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用*表示,如*.*。 +GRANT privileges ON databasename.tablename TO '{用户名}'; +-- 赋予用户全量迁移权限的命令 +GRANT SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO '{用户名}'; +-- 赋予用户增量迁移权限的命令 +GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO '{用户名}'; +-- 赋予用户反向迁移权限的命令 +GRANT SELECT, UPDATE, INSERT, DELETE ON *.* TO '{用户名}'; +-- 赋予所有权限的命令 +GRANT ALL ON *.* TO '{用户名}'; +-- 在赋权后,确保刷新权限以使更改生效 +FLUSH PRIVILEGES; +``` + +**openGauss连接用户权限要求**如下: + +通过Datakit平台安装的目标端数据库(openGauss)可以直接迁移,导入的数据库以及在创建任务时添加的自定义openGauss数据源,需要提前将用户权限改为SYSADMIN角色; + + +>反向迁移需要将rolreplication设置为true +> +>```sql +>-- 首先使用连接用户连接openGauss +>-- 查询rolreplication权限的命令 +>select rolreplication from pg_roles; +>-- 修改权限的命令 +>alter role '{用户名}' replication; +>``` + +修改openGauss用户权限的方式如下: + +*方式一:(推荐,符合最小权限)* + +```shell +#给要迁移的目标库target_source赋all权限给迁移用户openGauss_test +grant all on database target_source to openGauss_test; +``` + +*方式二:(不推荐)* + +```shell +#修改用户角色为SYSADMIN +alter user {用户名} SYSADMIN; +#查询用户角色,字段值为t时说明具有sysadmin角色,f时则没有 +select rolsystemadmin from PG_ROLES where rolname='{用户名}'; +``` + +> 有sysadmin角色权限:查询结果为t; + +> 无sysadmin角色权限:查询结果为f; + +### 4、日志参数检查 + +*增量迁移时,源数据库Mysql需要开启复制功能,在配置中增加以下配置参数,并重启* + +> log_bin=ON +> +> binlog_format= ROW +> +> binlog_row_image=FULL + +查询参数值是否设置成功的命令如下: + +```sql +SHOW VARIABLES LIKE 'log_bin'; +SHOW VARIABLES LIKE 'binlog_format'; +SHOW VARIABLES LIKE 'binlog_row_image'; +``` + +*反向迁移时,需要在openGauss数据库增加如下配置,并重启* + +> 调整pg_hba.conf以允许复制 +> +> ```sql +> -- 根据连接用户和实际网络配置命令 +> gs_guc set -D /opt/datakit/opengauss/datanode/dn1 -h "host replication {connected username} {ip/port} sha256" +> -- 直接允许所有用户和网络配置命令 +> gs_guc set -D /opt/datakit/opengauss/datanode/dn1 -h "host replication all 0.0.0.0/0 sha256" +> ``` +> +> 调整日志参数wal_level的命令: +> +> ```sql +> -- 修改参数的sql语句 +> alter system set wal_level to logical; +> -- 或直接修改配置文件中的参数,其中“/opt/datakit/opengauss/datanode/dn1”为实际数据库节点目录 +> gs_guc set -D /opt/datakit/opengauss/datanode/dn1 -c "wal_level = logical" +> ``` + +查询日志参数wal_level是否设置成功的命令如下: + +```sql +-- 查询是否允许复制的参数,为1表示设置成功 +select rolreplication from pg_roles where rolname='{用户名}' +-- 查询wal_level参数 +show variables like 'wal_level'; +``` + +### 5、大小写参数检查 + +需确保Mysql和OpenGauss的大小写参数一致,查询大小写参数的命令如下: + +```sql +-- 查询Mysql的大小写参数 +show variables like 'lower_case_table_names'; +-- 查询openGauss的大小写参数 +show dolphin.lower_case_table_names; +``` + +修改大小写参数,使两者保持一致,修改方式如下: + +修改Mysql的大小写参数 + +```tex +更改数据库参数文件my.cnf +在mysqld下添加或修改 lower_case_table_names = 1 之后重启数据库 +``` + +修改openGauss的大小写参数 + +```sql +alter user {用户名} set dolphin.lower_case_table_names to 0; +``` + +### 6、磁盘空间校验 + +迁移过程中会产生一些临时文件,需要占用一定的磁盘空间,要求磁盘满足---源端单表的最大数据量。 + +### 7、B库校验 + +迁移的目标数据库要求是B库,查询是否为B库的命令如下: + +```sql +show sql_compatibility; +``` + +创建B库的命令 + +```sql +create database {dbname} with dbcompatibility = 'b'; +``` + +### 8、Mysql加密方式校验 + +查询系统默认加密方式的命令 + +```sql +select @@default_authentication_plugin; +``` + +修改系统默认加密方式 + +```tex +更改数据库参数文件my.cnf +在mysqld下添加或修改 default-authentication-plugin=mysql_native_password 之后重启数据库 +``` + +同时修改连接用户的加密方式为mysql_native_password,修改的sql语句如下: + +```sql +ALTER USER '用户名'@'%' IDENTIFIED WITH mysql_native_password BY '新密码'; +``` + +### 9、复制参数校验 + +启动反向迁移会占用逻辑复制槽位,需要确保openGauss有可使用的槽位。 + +```sql +-- 查询当前使用的槽位 +select count(*) from pg_get_replication_slots(); +-- 查询系统最大槽位 +show max_replication_slots; +``` + +槽位很少出现被占满的情况,如若被占满,通过如下操作删除无用槽位。 + +```sql +-- 获取当前复制槽列表 +select * from pg_get_replication_slots(); +-- 删除流复制槽,其中slot_name为流复制槽名称 +select pg_drop_replication_slot('slot_name'); +``` + +获取复制槽列表的示例如下: + +```sql +openGauss=# select * from pg_get_replication_slots(); + slot_name | plugin | slot_type | datoid | active | xmin | catalog_xmin | restart_lsn | dummy_standby | confirmed_flush +-----------+----------------+-----------+--------+--------+------+--------------+-------------+---------------+----------------- + dn_s1 | | physical | 0 | t | | | 0/23DB14E0 | f | + slot1 | mppdb_decoding | logical | 16304 | f | | 60966 | 0/1AFA1BB0 | f | 0/23DA5700 +(2 rows) +``` + +**注:** + +逻辑复制槽的占用会在增量迁移停止后创建,如果此时结束迁移任务,就会有槽位占用的残留。而如果正常进行反向迁移,然后停止迁移任务,则会自动删除占用的槽位。 + +可以将portal的`migrationConfig.properties`配置文件中的`drop.logical.slot.on.stop`参数设置为`true`,以保证迁移任务结束时,自动删除占用的槽位。 + +进一步学习,请参考openGauss社区,社区地址:https://opengauss.org/zh/。 + +10、迁移过程中,请勿关闭源数据库或目标数据库; + +11、执行迁移任务的服务器应具备一定的性能和配置,以保证迁移过程的顺利执行; + +12、迁移任务是在非root用户下执行,任务的执行机器来源于平台资源中心的设备管理,因此需要在设备管理的用户管理中添加非root用户。 \ No newline at end of file -- Gitee