1. 环境准备:搭建迁移基础环境
在开始MySQL到openGauss的迁移之前,我们需要先准备好基础环境。这个过程就像装修房子前要准备好水泥和砖块一样,缺一不可。我遇到过不少因为环境没准备好导致迁移失败的案例,所以这部分特别重要。
首先,我们需要一个合适的操作系统环境。推荐使用openEuler 20.03 LTS版本,这是华为针对openGauss优化过的操作系统。下载地址可以在openEuler官网找到。安装完成后,有几个关键的系统配置需要调整:
# 关闭SELinux sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 设置字符集 echo "export LANG=en_US.UTF-8" >> /etc/profile source /etc/profile这些配置修改后,建议重启服务器确保生效。接下来是安装必要的依赖包:
yum install -y libaio-devel flex bison ncurses-devel glibc-devel patch \ readline-devel libnsl tar vim java sysstat特别要注意的是Java版本,我建议使用OpenJDK 11:
yum remove -y java-1.8* java-1.7* yum install -y java-11-openjdk.x86_64 java-11-openjdk-devel.x86_64资源限制调整也很关键,特别是当数据量较大时:
echo "omm soft nproc 16384" >> /etc/security/limits.conf echo "omm hard nproc 16384" >> /etc/security/limits.conf echo "omm soft nofile 65536" >> /etc/security/limits.conf echo "omm hard nofile 65536" >> /etc/security/limits.conf这些配置将为后续的openGauss安装和DataKit运行提供良好的基础环境。记得每次修改系统配置后都要检查是否生效,我遇到过不少因为配置没生效导致后续步骤失败的案例。
2. openGauss安装与配置
openGauss的安装是整个迁移过程中的核心环节。根据我的经验,很多迁移问题都源于openGauss安装不当。下面我会详细介绍如何正确安装和配置openGauss。
首先下载openGauss安装包,建议使用5.1及以上版本:
wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/5.1.0/x86_openEuler/openGauss-5.1.0-openEuler-64bit-all.tar.gz解压安装包到指定目录:
mkdir -p /opt/software/openGauss tar -zxvf openGauss-5.1.0-openEuler-64bit-all.tar.gz -C /opt/software/openGauss创建专用的数据库用户和组:
groupadd dbgroup useradd -g dbgroup omm echo "omm@123" | passwd --stdin omm执行安装脚本:
cd /opt/software/openGauss/simpleInstall sh install.sh -w omm@123安装完成后,我们需要配置openGauss的远程连接和逻辑复制功能,这对后续的迁移工作至关重要:
# 配置监听地址 gs_guc set -D /opt/software/openGauss/data/single_node -c "listen_addresses = '*'" # 配置逻辑复制 gs_guc set -D /opt/software/openGauss/data/single_node -c "wal_level=logical" # 配置客户端认证 gs_guc set -D /opt/software/openGauss/data/single_node -h "host all all 0.0.0.0/0 sha256"为了让openGauss能够开机自启,我们可以创建一个systemd服务:
cat > /usr/lib/systemd/system/opengauss.service <<EOF [Unit] Description=openGauss After=syslog.target After=network.target [Service] Type=forking User=omm Group=dbgroup Environment=PGDATA=/opt/software/openGauss/data Environment=GAUSSHOME=/opt/software/openGauss ExecStart=/opt/software/openGauss/bin/gs_ctl start -D /opt/software/openGauss/data/single_node ExecReload=/opt/software/openGauss/bin/gs_ctl restart -D /opt/software/openGauss/data/single_node ExecStop=/opt/software/openGauss/bin/gs_ctl stop -D /opt/software/openGauss/data/single_node KillMode=mixed KillSignal=SIGINT TimeoutSec=0 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable opengauss systemctl start opengauss最后,我们需要创建一个专门用于DataKit连接的数据库和用户:
CREATE DATABASE datakit; CREATE USER datakit WITH PASSWORD 'datakit@123'; GRANT ALL PRIVILEGES ON DATABASE datakit TO datakit;3. MySQL环境准备与配置
作为迁移的源端,MySQL的配置同样重要。根据我的经验,很多迁移问题都源于MySQL配置不当,特别是binlog相关配置。
首先安装MySQL 5.7:
wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm rpm -Uvh mysql57-community-release-el7-10.noarch.rpm yum install -y mysql-community-server --nogpgcheck systemctl start mysqld获取初始密码并修改:
temp_pass=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}') mysqladmin -u root -p"$temp_pass" password 'datakit@1234'配置MySQL的关键参数:
cat >> /etc/my.cnf <<EOF server-id = 1 log-bin=mysql-bin binlog_format=ROW binlog_row_image=FULL expire_logs_days=7 gtid_mode=ON enforce_gtid_consistency=ON EOF systemctl restart mysqld创建测试数据库和用户:
CREATE DATABASE world; USE world; CREATE TABLE city ( ID int NOT NULL AUTO_INCREMENT, Name char(35) NOT NULL DEFAULT '', CountryCode char(3) NOT NULL DEFAULT '', District char(20) NOT NULL DEFAULT '', Population int NOT NULL DEFAULT '0', PRIMARY KEY (ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 创建迁移专用用户 CREATE USER 'mig_user'@'%' IDENTIFIED BY 'mig_password'; GRANT ALL PRIVILEGES ON *.* TO 'mig_user'@'%'; FLUSH PRIVILEGES;建议导入一些测试数据,方便后续验证迁移效果。可以使用MySQL自带的world数据库样例:
wget https://downloads.mysql.com/docs/world-db.tar.gz tar -zxvf world-db.tar.gz mysql -uroot -p world < world-db/world.sql4. DataKit安装与配置
DataKit是整个迁移过程的管理平台,它的正确安装和配置直接关系到迁移能否顺利进行。根据我的经验,很多用户在这一步会遇到Java环境或SSL证书的问题。
首先创建DataKit的工作目录:
mkdir -p /opt/datakit/datakit5.1/{logs,config,ssl,files} chown -R ops:ops /opt/datakit下载并解压DataKit安装包:
wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/latest/tools/DataKit-5.1.0.tar.gz tar -zxvf DataKit-5.1.0.tar.gz -C /opt/datakit/datakit5.1配置DataKit的application.yml文件:
system: defaultStoragePath: /opt/datakit/datakit5.1/files whitelist: enabled: false server: port: 9494 ssl: key-store: /opt/datakit/datakit5.1/ssl/keystore.p12 key-store-password: 123456 key-store-type: PKCS12 enabled: true servlet: context-path: / logging: file: path: /opt/datakit/datakit5.1/logs/ spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.opengauss.Driver url: jdbc:opengauss://127.0.0.1:5432/datakit?currentSchema=public&batchMode=off username: datakit password: datakit@123 druid: test-while-idle: true test-on-borrow: true validation-query: "select 1" validation-query-timeout: 10000 connection-error-retry-attempts: 0 break-after-acquire-failure: true max-wait: 6000 keep-alive: true max-active: 30 min-evictable-idle-time-millis: 600000生成SSL证书:
keytool -genkey -noprompt \ -dname "CN=opengauss, OU=opengauss, O=opengauss, L=Beijing, S=Beijing, C=CN" \ -alias opengauss \ -storetype PKCS12 \ -keyalg RSA \ -keysize 2048 \ -keystore /opt/datakit/datakit5.1/ssl/keystore.p12 \ -validity 3650 \ -storepass 123456启动DataKit服务:
cd /opt/datakit/datakit5.1 nohup java -Xms2048m -Xmx4096m -jar openGauss-datakit-5.1.0.jar --spring.profiles.active=temp > logs/datakit.out 2>&1 &DataKit启动后,可以通过https://服务器IP:9494访问管理界面,默认用户名密码是admin/admin123。第一次登录后记得修改密码。
5. 全量迁移实战
全量迁移是将MySQL中的现有数据完整地迁移到openGauss的过程。根据我的经验,这是最耗时的阶段,但也是最关键的阶段。
首先,我们需要在DataKit中添加数据源:
- 登录DataKit管理界面
- 进入"资源中心"->"实例管理"
- 添加MySQL数据源:
- 数据库类型:MySQL
- 连接地址:MySQL服务器IP
- 端口:3306
- 用户名:mig_user
- 密码:mig_password
- 添加openGauss数据源:
- 数据库类型:openGauss
- 连接地址:openGauss服务器IP
- 端口:5432
- 用户名:datakit
- 密码:datakit@123
接下来添加执行服务器:
- 进入"资源中心"->"服务器管理"
- 添加服务器:
- IP地址:DataKit服务器IP
- 用户名:root
- 密码:服务器root密码
- 记住密码:是
创建迁移任务:
- 进入"数据迁移"->"迁移任务中心"
- 点击"创建数据迁移任务"
- 选择源数据库(MySQL)和目标数据库(openGauss)
- 添加子任务,选择要迁移的数据库(如world)
- 迁移过程模式选择"离线模式"
- 分配执行机资源,选择刚才添加的服务器
- 点击"完成"创建任务
启动迁移任务:
- 在迁移任务列表中找到刚创建的任务
- 点击"启动"按钮
- 点击"详情"查看迁移进度
全量迁移过程中,有几个关键点需要注意:
字符集问题:MySQL和openGauss的字符集可能不同,建议在openGauss中创建数据库时指定兼容模式:
CREATE DATABASE world WITH dbcompatibility='B';数据类型映射:有些MySQL数据类型在openGauss中没有直接对应,DataKit会自动处理大部分情况,但可能需要手动调整。
外键约束:全量迁移完成后,外键约束可能需要特殊处理。可以在迁移完成后执行:
chameleon detach_replica --config default --source mysql大表处理:对于大表,可以考虑分批迁移,避免一次性迁移导致内存不足。
迁移完成后,建议进行数据校验:
-- 在openGauss中执行 SELECT count(*) FROM city; SELECT * FROM city LIMIT 10; -- 与MySQL中的结果对比6. 增量迁移与反向迁移
全量迁移完成后,如果需要保持业务连续性,就需要进行增量迁移。这是将全量迁移期间和之后产生的数据变更同步到openGauss的过程。
6.1 增量迁移配置
- 在DataKit中创建一个新的迁移任务
- 选择与全量迁移相同的源和目标数据库
- 迁移过程模式选择"在线模式"
- 启动迁移任务
增量迁移开始后,它会自动捕获MySQL的binlog变化并应用到openGauss。我们可以测试增量迁移的效果:
在MySQL中执行一些数据变更:
USE world; INSERT INTO city(Name, CountryCode, District, Population) VALUES('New City', 'CHN', 'Beijing', 100000); UPDATE city SET Population = Population + 1000 WHERE ID = 1; DELETE FROM city WHERE ID = 2;然后在openGauss中验证这些变更是否同步:
SELECT * FROM city WHERE Name = 'New City'; SELECT * FROM city WHERE ID = 1; SELECT * FROM city WHERE ID = 2;6.2 业务割接
当增量迁移运行一段时间,确认数据同步正常后,可以进行业务割接:
- 停止应用程序向MySQL的写入
- 等待增量迁移追平所有变更
- 修改应用程序连接字符串,指向openGauss
- 重新启动应用程序
6.3 反向迁移配置
业务割接到openGauss后,为了确保数据安全,可以配置反向迁移,将openGauss的变更同步回MySQL:
- 在增量迁移任务详情页面
- 点击"停止增量"按钮
- 点击"启动反向"按钮
- 等待反向迁移启动完成
测试反向迁移:
在openGauss中执行一些变更:
INSERT INTO city(Name, CountryCode, District, Population) VALUES('Reverse City', 'USA', 'Texas', 50000); UPDATE city SET District = 'Shanghai' WHERE Name = 'New City';然后在MySQL中验证这些变更:
SELECT * FROM city WHERE Name = 'Reverse City'; SELECT * FROM city WHERE Name = 'New City';6.4 迁移完成
当确认业务在openGauss上稳定运行后,可以完全停止迁移任务:
- 在反向迁移任务详情页面
- 点击"停止反向"按钮
- 点击"结束任务"按钮
7. 常见问题与解决方案
在实际迁移过程中,可能会遇到各种问题。根据我的经验,以下是几个最常见的问题及其解决方案:
7.1 GTID相关问题
问题现象:增量迁移失败,日志显示GTID相关错误。
解决方案:
-- 在MySQL中执行 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;7.2 字符集问题
问题现象:迁移后数据出现乱码。
解决方案:
- 确保MySQL和openGauss都使用UTF-8编码
- 在openGauss中创建数据库时指定编码:
CREATE DATABASE world WITH ENCODING 'UTF8' dbcompatibility='B';
7.3 性能问题
问题现象:迁移速度慢,特别是大表迁移。
解决方案:
- 调整DataKit的JVM参数:
nohup java -Xms4096m -Xmx8192m -jar openGauss-datakit-5.1.0.jar ... - 在openGauss中临时调整参数:
ALTER SYSTEM SET max_connections = 500; ALTER SYSTEM SET shared_buffers = '4GB';
7.4 外键迁移问题
问题现象:表结构迁移了,但外键没有迁移。
解决方案:
- 对于离线迁移,外键会自动迁移
- 对于在线迁移,需要在停止增量迁移后执行:
chameleon detach_replica --config default --source mysql
7.5 插件安装失败
问题现象:迁移插件安装失败,提示缺少libmysqlclient.so.18。
解决方案:
yum install -y mysql-community-libs-compat ldconfig8. 性能优化建议
迁移完成后,为了获得最佳性能,可以考虑以下优化措施:
8.1 openGauss参数优化
-- 增加工作内存 ALTER SYSTEM SET work_mem = '16MB'; -- 优化并行查询 ALTER SYSTEM SET max_parallel_workers_per_gather = 4; -- 调整维护工作内存 ALTER SYSTEM SET maintenance_work_mem = '1GB';8.2 索引优化
检查MySQL的索引是否都正确迁移,并根据openGauss的特性添加新的索引:
-- 查看表索引 \d 表名 -- 添加新索引 CREATE INDEX idx_city_country ON city(CountryCode);8.3 统计信息更新
ANALYZE VERBOSE city;8.4 查询重写
将MySQL特有的语法重写为openGauss兼容的形式,特别是LIMIT子句和日期函数。
8.5 分区表考虑
对于大表,可以考虑使用openGauss的分区表功能提高查询性能:
CREATE TABLE measurement ( city_id int not null, logdate date not null, peaktemp int, unitsales int ) PARTITION BY RANGE (logdate);9. 迁移后的验证与测试
迁移完成后,必须进行全面的验证,确保数据的完整性和一致性。根据我的经验,以下验证步骤必不可少:
9.1 数据量验证
-- MySQL中执行 SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema = 'world'; -- openGauss中执行 SELECT relname, reltuples FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE nspname = 'public' AND relkind = 'r';9.2 抽样数据验证
随机选择几张表,比较记录内容:
-- MySQL中执行 SELECT * FROM city ORDER BY ID LIMIT 10; -- openGauss中执行 SELECT * FROM city ORDER BY ID LIMIT 10;9.3 约束验证
检查主键、唯一键等约束是否正常:
-- 尝试插入重复主键 INSERT INTO city(ID, Name) VALUES(1, 'Test'); -- 应该报错9.4 应用测试
使用真实应用程序进行测试,验证:
- 查询功能是否正常
- 写入功能是否正常
- 事务处理是否正常
- 性能是否满足要求
9.5 性能对比测试
对关键业务SQL进行执行计划分析:
EXPLAIN ANALYZE SELECT * FROM city WHERE CountryCode = 'CHN';10. 总结与建议
通过DataKit进行MySQL到openGauss的迁移是一个系统性的工程,需要仔细规划和执行。根据我多年的迁移经验,以下几点建议可能对你有所帮助:
- 充分测试:在生产环境迁移前,一定要在测试环境充分验证迁移过程。
- 备份数据:迁移前备份MySQL数据,迁移后备份openGauss数据。
- 选择合适的时间窗口:大型迁移尽量安排在业务低峰期进行。
- 监控资源使用:迁移过程中密切监控CPU、内存、磁盘和网络使用情况。
- 文档记录:详细记录迁移步骤和遇到的问题,为后续维护提供参考。
- 考虑专业支持:对于关键业务系统,考虑寻求原厂或专业服务团队的支持。
迁移完成后,建议运行一段时间反向迁移作为回退方案,等业务完全稳定后再停止。同时,可以利用openGauss的特性如AI4DB、DB4AI等,发掘数据的更大价值。