跳到主要内容

MySQL 到 GaussDB 迁移指南

适用场景:已部署ONES系统,数据库从MySQL迁移到GaussDB的场景。

前置约束

  1. ONES版本号 >= 6.43.7;该客户使用的插件已经完成GaussDB适配。(如果版本过低,则先升级到新版本)
  2. 已部署ONES系统,数据库从MySQL迁移到GaussDB的场景。确保业务停机,避免对 MySQL 写入或更新数据。
  3. 外置 GaussDB, 需客户准备可访问的 GaussDB 实例,确保具备网络连通性,并且延迟低于 10ms
  4. GaussDB 帐号命名约束与建议(修改ONES系统配置时,需要参考此约束)
    由于 GaussDB 的账号名 与 业务使用的 schema 名 不可重名(否则可能引发权限冲突及其他问题),
    建议在创建账号时为账号名添加环境前缀。推荐的帐号命名前缀如下:

    DEV环境(开发): u_dev_
    UAT环境(用户验收): u_uat_
    SIT环境(集成测试): u_sit_
    PROD环境(生产环境): u_prod_
  5. GaussDB 逻辑日志复制槽的命名约束与建议(修改ONES系统配置时,需要参考此约束)
    由于 GaussDB 的逻辑复制槽不允许跨db重名。 因此ONES业务使用的逻辑复制槽的名字必须唯一。
    ONES 通过 gaussdbCdcLogicalSlotName 配置指定 逻辑复制槽的名称, 推荐不同环境的命名如下:

    DEV环境(开发): slot_dev_ones_cdc
    UAT环境(用户验收): slot_uat_ones_cdc
    SIT环境(集成测试): slot_sit_ones_cdc
    PROD环境(生产环境): slot_prod_ones_cdc
  6. GaussDB 密码要求
    GaussDB密码长度必须在 8–32 个字符之间
    至少包含以下字符中的三种: 大写字母、小写字母、数字和特殊字符。
    特殊字符仅支持 ~ ! @ # % ^ * _ - = + ? ,

客户侧的准备工作

  1. 准备好 GaussDB 分布式实例,确保具备网络连通性,并且到ONES服务器的延迟低于 10ms
  2. 创建管理员帐号。(ONES系统cdc组件需要创建、查询、消费 逻辑复制槽,以便保证审计日志、报表、索引功能的正常工作。 而逻辑复制槽的功能需要GaussDB的管理元帐号 )
    CREATE USER onesadmin WITH SYSADMIN password "********";

操作步骤

1. 配置准备

  1. 运行 make init-config 生成最新的 config/ 内容。
  2. 备份旧配置 cp config/config.yaml config/config-mysql.backup.yaml
  3. 编辑配置,加入GaussDB相关的配置项 vi config/private.yaml
# 固定值,无需修改
internalComponentMysqlEnable: false
dbDriver: "gaussdb"
wizEditorUseDB: "gaussdb"
dmCdcDbUser: 'root@mysql01' # 固定值,无需调整
dmCdcDbHost: 'oceanbase-service'
oceanbaseImage: img.ones.pro/library/oceanbase-ce:v4.3.1
gaussdbManualInitDBEnable: false

# 按实际情况进行修改下方配置,注意帐号和密码需要参考本文「前置约束」
gaussdbBaseDB: "ones_uat"
gaussdbHost: "gaussdb.example.com"
gaussdbPort: 8000
gaussdbAdminUser: "onesadmin"
gaussdbAdminPassword: "******"
gaussdbCdcLogicalSlotName: slot_uat_ones_cdc

mysqlUser: u_uat_ones
mysqlPassword: xxxxxxx
mysqlCamundaUser: u_uat_camunda
mysqlCamundaPassword: xxxxxxx
platformMysqlUser: u_uat_platform
platformMysqlPassword: xxxxxxx
platformMysqlPluginUser: u_uat_platform_plugin
platformMysqlPluginPwd: xxxxxxx
pluginBuiltInGvmbef2yMysqlDbUser: u_uat_plugin_built_in_gvmbef2y
pluginBuiltInGvmbef2yMysqlDbPwd: xxxxxxx
wizMysqlUser: u_uat_wizeditor
wizMysqlPassword: xxxxxxx
oauthMysqlUser: u_uat_oauth
oauthMysqlPassword: xxxxxxx
eventsMysqlUser: u_uat_events
eventsMysqlPassword: xxxxxxx
identityMysqlUser: u_uat_identity
identityMysqlPassword: xxxxxxx
mysqlWatchUser: u_uat_oneswatch

# 修改 kafkaCdcConnectorSuffix、kilobSyncSchemaHash、kilobForceSnapshotVersion 的值,跟旧配置值不一样即可
kafkaCdcConnectorSuffix: 3
kilobSyncSchemaHash: 3
kilobForceSnapshotVersion: 3
kilobForceSnapshotAll: true

2. 执行迁移任务

# 初始化 GaussDB
make init-gaussdb-db
# 开始迁移任务
make config-ones
kubectl -n ones apply -f tmp/ones/v1/init-gaussdb-db/mysql-to-gaussdb.yaml
# 查看迁移 mysql-to-gaussdb pod 的日志
kubectl -n ones logs -f -l app=mysql-to-gaussdb

3. 验证迁移结果

查看 mysql-to-gaussdb pod 的日志如果看到了包含 Migration complete 的内容且 failure: 0 则说明迁移完成。如果 failure 不为 0 联系相关同事作进一步处理。

迁移完成后可以执行以下命令

# 删除迁移任务
kubectl -n ones delete -f tmp/ones/v1/init-gaussdb-db/mysql-to-gaussdb.yaml

4. 切换到GaussDB数据库

  1. 执行 make setup-ones ,使ONES系统配置指向GaussDB并生效
  2. 重建cdc make rebuild-cdc
  3. 关闭内置 MySQL make setup-ones-built-in-mysql(外置MySQL时,这一步可忽略)

回退到 MySQL

如果切换到GaussDB数据库后发现问题,可以回退到 MySQL 数据库。

  1. 备份GaussDB配置 cp config/config.yaml config-gaussdb.backup.yaml
  2. 回退到MySQL配置 cp config/config-mysql.backup.yaml config/config.yaml
  3. 执行 make setup-ones-built-in-mysql 启用内置 MySQL(外置MySQL时,这一步可忽略);
  4. 执行 make setup-ones 重新部署 ONES。
  5. 重建cdc make rebuild-cdc

重置数据库

如果要清除 GaussDB 数据库中的 ONES 数据,使用 GaussDB 控制台或 gsql 工具,登录 GaussDB 数据库执行以下 SQL

(以UAT环境为例,根据实际情况,请调整下方的帐号名称和复制槽名称 )

-- 清理帐号
DROP USER IF EXISTS u_uat_ones CASCADE;
DROP USER IF EXISTS u_uat_camunda CASCADE;
DROP USER IF EXISTS u_uat_platform CASCADE;
DROP USER IF EXISTS u_uat_platform_plugin CASCADE;
DROP USER IF EXISTS u_uat_plugin_built_in_gvmbef2y CASCADE;
DROP USER IF EXISTS u_uat_wizeditor CASCADE;
DROP USER IF EXISTS u_uat_oauth CASCADE;
DROP USER IF EXISTS u_uat_events CASCADE;
DROP USER IF EXISTS u_uat_identity CASCADE;
DROP USER IF EXISTS u_uat_oneswatch CASCADE;
-- 由于GaussDB会在DB下创建跟帐号同名的schema,因此也需要清理DB下的同名schema
DROP SCHEMA IF EXISTS u_uat_ones CASCADE;
DROP SCHEMA IF EXISTS u_uat_camunda CASCADE;
DROP SCHEMA IF EXISTS u_uat_platform CASCADE;
DROP SCHEMA IF EXISTS u_uat_platform_plugin CASCADE;
DROP SCHEMA IF EXISTS u_uat_plugin_built_in_gvmbef2y CASCADE;
DROP SCHEMA IF EXISTS u_uat_wizeditor CASCADE;
DROP SCHEMA IF EXISTS u_uat_oauth CASCADE;
DROP SCHEMA IF EXISTS u_uat_events CASCADE;
DROP SCHEMA IF EXISTS u_uat_identity CASCADE;
DROP SCHEMA IF EXISTS u_uat_oneswatch CASCADE;
-- 清理业务数据库
DROP SCHEMA IF EXISTS project CASCADE;
DROP SCHEMA IF EXISTS wiki CASCADE;
DROP SCHEMA IF EXISTS camunda CASCADE;
DROP SCHEMA IF EXISTS plugin_platform CASCADE;
DROP SCHEMA IF EXISTS open_platform_plugin CASCADE;
DROP SCHEMA IF EXISTS plugin_built_in_gvmbef2y CASCADE;
DROP SCHEMA IF EXISTS wizeditor CASCADE;
DROP SCHEMA IF EXISTS oauth CASCADE;
DROP SCHEMA IF EXISTS events CASCADE;
DROP SCHEMA IF EXISTS identity CASCADE;
-- 清理逻辑复制槽
SELECT pg_drop_replication_slot('slot_uat_ones_cdc');

常见问题

  • 迁移出错:联系相关ONES技术支持进一步处理
  • 搜索功能异常: 联系相关ONES技术支持进一步处理(排查方向:1.检查oceanbase、kafka-cdc、 kilob 组件是否正常工作)
  • 报表功能异常: 联系相关ONES技术支持进一步处理(排查方向:1.检查oceanbase、kafka-cdc、 ones-bi-sync-etl 组件是否正常工作)
  • 审计日志功能异常: 联系相关ONES技术支持进一步处理(排查方向:1.检查oceanbase、kafka-cdc、 binlog-event-sync 组件是否正常工作)