MySQL到openGauss数据迁移实用教程

项目背景

本教程详细介绍如何在有限的硬件资源下,将MySQL数据库平稳迁移到openGauss数据库系统。随着企业数字化转型的深入,越来越多的组织开始关注优越性能数据库的替代和性能优化。openGauss作为新一代企业级开源关系型数据库,凭借其卓越的性能、完善的生态和自主可控的特性,成为MySQL迁移的理想选择。

本教程基于实际的小型服务器环境,通过3种可行的迁移方案,帮助读者在资源有限的条件下完成数据库迁移,同时最大限度发挥openGauss的性能优势。

为什么选择openGauss

1.1 卓越的性能表现

openGauss在性能方面具有显著优势,特别是在高并发场景下:

  • 事务处理速度提升: 相比MySQL,openGauss在OLTP场景下的TPS(每秒事务数)可提升30%-50%,尤其在复杂查询和多表关联操作中表现突出
  • 并发处理能力: 采用无锁化设计和NUMA-Aware技术,在高并发场景下保持线性扩展能力,支持数千并发连接而不明显降低性能
  • 查询优化器: 内置AI查询优化器,能够智能选择最优执行计划,对复杂SQL语句的执行效率比MySQL提升20%-40%
  • 内存管理: 采用内存自适应技术,能够根据工作负载动态调整内存分配,在4GB内存的小型服务器上也能保持稳定高效运行

1.2 企业级功能特性

openGauss提供了众多MySQL企业版才有的功能,而且完全开源免费:

  • 高可用架构: 内置主备复制、级联备份等高可用方案,RPO(恢复点目标)可达0,RTO(恢复时间目标)小于10秒
  • 数据安全: 支持透明数据加密、全密态数据库、细粒度访问控制等安全特性,满足等保2.0和金融行业安全标准
  • SQL兼容性: 高度兼容PostgreSQL和部分MySQL语法,支持B模式(兼容MySQL)、A模式(兼容Oracle),大大降低应用改造成本
  • 在线扩容: 支持在线添加节点和存储扩容,无需停机即可应对业务增长

1.3 自主可控与生态优势

  • 自主: 完全自主研发,拥有完整知识产权,不受国外技术限制,符合国家信创要求
  • 开源生态: 基于木兰宽松许可证,拥有活跃的开源社区,已有数百家企业和数千名开发者参与贡献
  • 工具链完善: 提供数据迁移、监控运维、开发调试等全套工具,降低使用门槛
  • 商业支持: 有华为等多家厂商提供商业版本和技术支持服务,保障企业级应用

1.4 成本优势

  • 零许可费用: 完全开源免费,无需支付高昂的商业数据库许可费
  • 资源利用率高: 优秀的资源管理能力,在同等硬件配置下可支撑更大业务量,降低硬件采购成本
  • 运维成本低: 智能化运维功能减少人工干预,降低运维人力成本

实际环境说明

配置项

说明

MySQL版本

8.0.27

openGauss版本

5.0.0 (推荐使用最新LTS版本)

操作系统

Ubuntu 22.04 LTS (也支持openEuler、CentOS等)

服务器配置

双核CPU、4GB内存

存储空间

100GB总容量,当前可用58GB

注意:由于服务器配置有限,迁移过程需要特别注意内存和存储空间的使用。但openGauss优秀的资源管理能力能够确保在此配置下稳定运行。

迁移前的准备工作

3.1 检查MySQL配置

由于服务器内存有限,建议在迁移前对MySQL进行适当的参数调整:

  • 检查当前数据量,确保有足够的磁盘空间用于导出(建议预留数据量2倍以上的空间)
  • 建议在业务低峰期进行迁移,避免影响正常业务运行
  • 务必备份原有数据,建议同时进行物理备份和逻辑备份以防万一
  • 记录当前数据库的字符集设置(推荐UTF-8),确保迁移后字符集一致
  • 导出数据库表结构,分析是否存在与openGauss不兼容的特性

3.2 安装openGauss

在Ubuntu 22.04上安装openGauss,建议使用最小化安装以节省资源。openGauss的安装过程简单快捷:,会自动优化内存参数以适应当前硬件环境,无需手动调整即可获得良好性能。这里我们昨天已经安装好了。

迁移方法选择

根据实际环境和数据特点,我们提供三种经过验证的迁移方法。每种方法都针对openGauss的特性进行了优化,能够充分发挥其性能优势,其中重点讲述一下gsql和gs_chacemeleon的实际体验。

方法一:使用mysqldump + gsql (推荐用于小数据量)

适用场景:

  • 数据量在1GB以下
  • 可以接受短暂的业务停机
  • 不需要实时同步
  • 首次尝试数据库迁移,希望使用简单方法

优点:

  • 操作简单,无需安装额外工具
  • 对服务器性能要求低,4GB内存即可顺利完成
  • 适合小型数据库快速迁移
  • 迁移过程可控,便于出现问题时回滚

操作步骤:

  1. 导出MySQL数据

mysqldump -u root -p --databases rnd \

  --single-transaction \

  --no-create-db \

  --skip-triggers \

  > D:\rnd_dump.sql

然后导出之后,将文件上传到服务器,这里就不阐述如何将文件放到服务器了,有很多方法。

放到服务器上,再复制进docker容器内

sudo docker cp /tmp/rnd_dump.sql opengauss:/tmp

  1. 转换SQL语法(利用openGauss的兼容性特性)

接下来我们进入到容器内:

sudo docker exec -it opengauss bash

由于openGauss提供了B模式(MySQL兼容模式),大部分MySQL语法可以直接使用。但仍需处理少量差异:

sed -i 's/ENGINE=InnoDB//g' /tmp/rnd_dump.sql

sed -i 's/AUTO_INCREMENT/SERIAL/g' /tmp/rnd_dump.sql

  1. 在openGauss中创建数据库(使用B兼容模式)

gsql -d postgres -p 5432

CREATE DATABASE rnd WITH DBCOMPATIBILITY='B';

注: DBCOMPATIBILITY='B'表示使用MySQL兼容模式,这是openGauss的一大特色功能。

  1. 导入数据到openGauss

gsql -d rnd -p 5432 -f mysql_dump.sql

这里大约1.1G的sql实际只使用了42秒,这速度相当快了。

这里我们使用navicat对比一下:

这里将近五百万行数据,使用navicat直接传输使用了20多分钟,可见gsql命令的高效性

方法二:使用CSV文件中转 (推荐用于中等数据量)

适用场景:

  • 数据量在1GB-10GB之间
  • 需要更快的迁移速度
  • 表结构相对简单
  • 需要分批次迁移不同的表

优点:

  • 速度比mysqldump快2-3倍,openGauss的COPY命令经过高度优化
  • 可以分表处理,便于大数据量的分批迁移和管理
  • 对内存要求较低,即使在4GB内存环境下也能流畅运行
  • CSV格式通用性强,可作为数据备份保存

操作步骤:

  1. 从MySQL导出CSV文件

SELECT * FROM table_name INTO OUTFILE '/tmp/table_name.csv'

FIELDS TERMINATED BY ','

ENCLOSED BY '"'

LINES TERMINATED BY '\n';

  1. 在openGauss中创建表结构

mysqldump -u root -p --no-data rnd > schema.sql

然后手动在openGauss中创建表结构,或使用转换后的schema.sql

  1. 使用COPY命令导入CSV(充分利用openGauss的批量导入优化)

gsql -d rnd -p 5432

\COPY table_name FROM '/tmp/table_name.csv' WITH (FORMAT csv, HEADER true, DELIMITER ',');

预计时间:对于1GB数据,导出约3-5分钟,导入约4-7分钟。openGauss的并行COPY功能可以进一步提升导入速度。

但是这种对于多表的迁移就显得很冗余,重复性很强,建议这种方法比较适用于单表迁移。

方法三:使用gs_chameleon工具 (推荐用于大数据量)

官方解释: 基于 sysbench 测试模型,在 Kunpeng-920 2p 服务器上,MySQL 数据库 10 张表单表数据量在 300 万以上时,chameleon 使用 10 并发迁移数据至 openGauss,整体全量迁移性能可达 300M/S 以上。

我的理解是当迁移速度很慢,且表数据量很大的时候,该工具就很适合处理这种情景。也就是说,又快又适用于大数据量的库。

适用场景:

  • 数据量超过10GB
  • 需要增量同步功能,确保数据实时性
  • 要求最小化业务停机时间
  • 需要自动化迁移流程

优点:

  • 支持全量和增量同步,保证数据一致性
  • 自动处理数据类型转换,减少人工干预
  • 适合大规模数据迁移和生产环境
  • 与openGauss深度集成,充分发挥数据库性能

安装方法1:

首先我们需要安装这个工具,先去官网下载whl文件

https://opengauss.org/zh/tools/

这里我的openGauss是5.0.0版本,就下载chameleon5.0.0版本的whl:

再将下载的文件上传至服务器,再复制到容器内:

sudo docker cp /tmp/chameleon-5.0.0-py3-none-any.whl opengauss:/tmp

安装方法2:

源码安装:通过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-master

python3 setup.py install

安装完成后,不要退出python虚拟环境,可以开始使用chameleon工具。

注意chameleon需要在非root用户下使用

chameleon set_configuration_files

touch config-example.yml

cp config-example.yml default.yml

根据实际情况修改 default.yml 文件中的内容。重点修改 pg_conn 和 mysql 中的连接配置信息,用户信息,数据库信息,schema 映射关系。下面给出一份配置文件示例供参考。

# 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: ''

dump_json: No

# type_override allows the user to override the default type conversion

# into a different one.

type_override:

  "tinyint(1)":

    override_to: boolean

    override_tables:

      - "*"

# specify the compress properties when creating tables

compress_properties:

  compresstype: 0

  compress_level: 0

  compress_chunk_size: 4096

  compress_prealloc_chunks: 0

  compress_byte_convert: false

  compress_diff_convert: false

# postgres destination connection

pg_conn:

  host: "xxx.xxx.xx.xx"

  port: "xx"

  user: "xx"

  password: "xxx"

  database: "xxx"

  charset: "utf8"

  params:

#    maintenance_work_mem: "1G"

#    param1: value1

#    param2: value2

sources:

  mysql:

    readers: 4

    writers: 4

    retry: 3

    db_conn:

      host: "xxx.xxx.xxx.xxx"

      port: "xx"

      user: "xxx"

      password: "xxx"

      charset: 'utf8'

      connect_timeout: 10

    schema_mappings:

      "mysql_databases": "openGauss_databases"

    limit_tables:

      - delphis_mediterranea.foo

    skip_tables:

      - delphis_mediterranea.bar

    enable_compress: No

    compress_tables:

      - delphis_mediterranea.foo

    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

    csv_dir: /tmp

    contain_columns: No

    column_split: ','

    sleep_loop: 1

    on_error_replay: continue

    on_error_read: continue

    auto_maintenance: "disabled"

    index_parallel_workers: 2

    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_restart_config: No

    is_create_index: Yes

    index_dir: '~/.pg_chameleon/index/'

    is_skip_completed_tables: No

    with_datacheck: No

    slice_size: 100000

    csv_files_threshold:

    csv_dir_space_threshold:

初始化复制流:

chameleon create_replica_schema --config default

chameleon add_source --config default --source mysql

此步骤将在 openGauss 侧创建用于复制过程的辅助 schema 和表。

复制基础数据:

chameleon init_replica --config default --source mysql

做完此步骤后,将把 MySQL 当前的全量数据复制到 openGauss。

注意看下面的状态,创建流对象的时候不会插入源数据,当add-source是enm_status是ready的,然后init_replica初始化数据流是,状态再次发生改变成initialised,表明已初始化成功

接下来就可以执行迁移数据:

状态就变成running表示正在迁移数据。

针对小型服务器的配置优化:

虽然chameleon功能强大,但在资源受限的环境下需要适当调整参数:

readers: 2  # 默认是4,降低到2以节省内存

writers: 2  # 默认是4,降低到2

replica_batch_size: 5000  # 默认10000,降低批次大小

copy_max_memory: 100M  # 默认300M,降低内存使用

预计时间:对于1GB数据,在当前配置下全量迁移约需30秒,增量同步预计延迟通常在1-5分钟。

针对小型服务器的优化建议

5.1 内存管理

  • 在4GB内存环境下,openGauss会自动分配1.5-2GB shared_buffers,无需手动调整
  • 迁移时关闭不必要的服务以释放内存,如Web服务器、监控服务等
  • 如果出现内存不足,openGauss的内存管理器会自动进行垃圾回收,也可以考虑分批迁移
  • 利用openGauss的内存池技术,可以有效减少内存碎片

5.2 存储空间管理

  • 定期清理临时文件和日志,openGauss提供自动日志清理功能
  • 导出的SQL或CSV文件使用后及时删除
  • 使用df -h命令监控磁盘使用情况,建议保留至少20GB空闲空间
  • openGauss支持表空间管理,可以灵活分配存储资源

5.3 性能调优技巧

  • 在业务低峰期进行迁移,减少对系统的压力
  • 迁移完成后,使用openGauss的ANALYZE命令收集统计信息,优化查询计划
  • 创建必要的索引,openGauss支持B-tree、Hash、GiST等多种索引类型
  • 对大表可以考虑使用分区表功能,提升查询和维护效率
  • 启用openGauss的查询缓存功能,提升重复查询的响应速度

数据验证

迁移完成后,必须进行严格的数据验证以确保数据完整性和一致性。openGauss提供了丰富的验证工具:

6.1 基础验证

-- 比对表数量

SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='rnd';

-- 比对记录数

这里我随机抽取了两个表去查询记录数都是一样的

SELECT COUNT(*) FROM finance_wages_record;

SELECT COUNT(*) FROM project_staff_checkin_detail;

6.2 深度校验

  • 数据抽样检查: 随机抽取部分数据,对比MySQL和openGauss中的数据是否完全一致
  • 业务逻辑验证: 运行关键业务查询,确保结果正确
  • 性能基准测试: 使用相同的查询测试两个数据库的性能,通常openGauss会有20%-50%的性能提升
  • 字符集验证: 检查中文等特殊字符是否正常显示
  • 约束检查: 验证主键、外键、唯一约束等是否正确迁移

总结与建议

根据在双核4G内存服务器上的实际测试,我们得出以下最佳实践建议:

  1. 小数据量(1GB以下): 使用mysqldump方法,简单直接,2-3分钟即可完成
  2. 中等数据量(1-10GB): 使用CSV中转方法,速度快且可靠,通常1-2小时完成
  3. 大数据量(10GB以上): 使用chameleon工具,虽然配置稍复杂,但支持增量同步,适合生产环境,且速度极快,只是少许配置较为繁琐。

openGauss的迁移优势总结

  • 性能卓越: 迁移后性能通常提升30%-50%,查询响应更快
  • 兼容性好: B模式高度兼容MySQL,应用改造工作量小
  • 资源高效: 即使在4GB内存的小型服务器上也能稳定运行
  • 功能丰富: 提供高可用、安全加密、在线扩容等企业级特性
  • 成本低廉: 开源免费,无许可费用,降低总体拥有成本
  • 自主可控: 完全,符合信创要求,保障数据安全

重要提醒:由于服务器配置有限,强烈建议在迁移前先在测试环境中进行完整测试,熟悉迁移流程并验证应用兼容性。确保迁移方案可行后再在生产环境执行。数据备份是必不可少的安全措施。

参考文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会洗碗的CV工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值