一、迁移前准备(1-2 周):环境与合规前置检查

1.1 环境兼容性检查

1.1.1 MySQL 源端环境要求
检查项 要求标准 操作命令(MySQL 端执行)
版本兼容 MySQL 5.7+/8.0+(推荐 8.0+,兼容性更好) select version();
字符集统一 建议 utf8mb4(避免中文乱码) show variables like 'character_set%';
Binlog 启用(增量迁移) 必须开启(row 格式,保留期≥7 天) show variables like 'log_bin';
权限账号准备 需 SUPER/REPLICATION SLAVE 权限(迁移专用) GRANT ALL PRIVILEGES ON *.* TO 'migrate'@'kingbase_ip' IDENTIFIED BY 'Migrate@123';
1.1.2 KingbaseES 目标端部署
  1. 硬件配置建议(企业级场景):
  • CPU:8 核及以上(推荐 16 核)

  • 内存:32GB 及以上(数据量>100GB 建议 64GB)

  • 存储:SSD 硬盘(读写 IOPS≥10000,容量为源库 1.5 倍以上)

  1. 软件安装步骤(以 KingbaseES V8R6 为例):
# 1. 解压安装包

tar -zxvf KingbaseES_V8R6_Lin64.tar.gz

# 2. 执行图形化安装(或静默安装)

./setup.sh -i console

# 3. 配置环境变量

echo "export PATH=/opt/Kingbase/ES/V8R6/KESRealPro/bin:\\\$PATH" >> /etc/profile

source /etc/profile

# 4. 验证安装成功

ksql -V # 输出版本信息即成功
  1. 预创建加密表空间(提前适配 TDE 加密):
-- 登录KingbaseES(sysdba账号)

ksql -U sysdba -d test -h kingbase_ip -p 54321

-- 创建加密表空间(后续数据迁移至此,默认加密)

CREATE TABLESPACE encrypted_ts      

LOCATION '/data/kingbase/encrypted_ts'

ENCRYPTION USING 'AES-256-CBC'

KEYSTORE 'kms://kms_ip:8443' -- 对接企业KMS服务(无KMS可先用本地密钥)

KEY_ID 'migrate_ts_key';

1.2 合规与安全前置准备

  1. MySQL 权限梳理:导出现有用户权限清单(用于迁移后对比验证)
# 执行MySQL权限导出脚本(生成权限SQL文件)

mysqldump -u root -p --databases mysql --tables user db --where="1=1" > mysql_privileges.sql
  1. 敏感字段识别:梳理需脱敏的字段(如手机号、身份证),形成清单(示例):
表名 敏感字段 脱敏规则
user_info phone 保留前 3 后 4 位
order_data id_card 保留前 6 后 4 位
  1. 应急回退方案
  • 全量备份 MySQL 数据:mysqldump -u root -p --all-databases --single-transaction > mysql_full_backup.sql

  • 记录 MySQL 核心配置(my.cnf):用于迁移失败时快速恢复

二、核心迁移实施(1-3 天):分阶段落地权限与数据

2.1 工具部署:KDTS 迁移工具配置(关键工具)

  1. KDTS 安装(KingbaseES 自带,路径:/opt/Kingbase/ES/V8R6/KDTS):
# 1. 启动KDTS服务

cd /opt/Kingbase/ES/V8R6/KDTS/bin

./kdts_server start

# 2. 访问Web控制台(默认端口8080)

http://kingbase_ip:8080/kdts (账号:admin,密码:Kingbase@123)
  1. 数据源配置(KDTS 控制台操作):
  • 新增 MySQL 源端:填写 IP、端口、迁移账号(migrate/Migrate@123)、数据库名称

  • 新增 KingbaseES 目标端:填写 IP、端口(默认 54321)、sysdba 账号、加密表空间(encrypted_ts)

  • 测试连接:确保两端网络连通(开放 3306/54321/8080 端口)

2.2 权限迁移:自动映射 + 手动优化(零停机)

2.2.1 自动迁移 MySQL 权限(KDTS 操作)
  1. 进入 KDTS 控制台 → 「权限迁移」→ 「新建任务」

  2. 选择「MySQL → KingbaseES」,勾选「用户迁移」「权限迁移」「角色迁移」

  3. 配置映射规则(默认自动映射,可自定义):

  • MySQL 数据库权限 → KingbaseES 数据库 + Schema 权限

  • MySQL 主机限制(@‘ip’)→ KingbaseES IP 限制(OPTIONS ip_restrict)

  1. 执行迁移:点击「开始迁移」,查看迁移报告(重点关注失败用户 / 权限)
2.2.2 手动优化权限(KingbaseES 端执行)
  1. 重构角色体系(基于最小权限原则):
-- 1. 创建基础角色(延续之前文档示例)

CREATE ROLE base_role WITH LOGIN PASSWORD 'Base@123';

GRANT CONNECT ON DATABASE test TO base_role;

-- 2. 迁移MySQL开发用户并绑定角色

CREATE USER 'dev_user'@'%' WITH PASSWORD 'Dev@123' INHERIT base_role;

GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO dev_user;

REVOKE DELETE ON ALL TABLES IN SCHEMA public FROM dev_user; -- 回收高危权限

-- 3. 迁移审计用户并绑定审计角色

CREATE USER 'audit_user'@'%' WITH PASSWORD 'Audit@123';

GRANT auditadmin TO audit_user; -- 绑定内置审计管理员角色
  1. 权限验证
-- 查看用户权限

\du dev_user;

-- 测试权限有效性(切换dev_user登录)

ksql -U dev_user -d test -h kingbase_ip -p 54321

DELETE FROM user_info; -- 应提示权限不足(验证回收效果)

2.3 数据迁移:全量 + 增量同步(业务零停机)

2.3.1 全量数据迁移(KDTS 操作)
  1. 新建「数据迁移任务」→ 选择源库 / 目标库 → 勾选需迁移的表

  2. 配置迁移选项:

  • 字符集映射:utf8mb4 → utf8mb4

  • 数据类型适配:MySQL INT → KingbaseES INT,MySQL DATETIME → TIMESTAMP

  • 目标表空间:指定 encrypted_ts(默认加密存储)

  1. 执行全量迁移:点击「开始」,监控迁移进度(大表建议分片迁移)
2.3.2 增量数据同步(KFS 工具,保证数据一致性)
  1. KFS 配置(KingbaseES 数据同步工具):
# 1. 进入KFS目录

cd /opt/Kingbase/ES/V8R6/KFS/bin

# 2. 编辑配置文件(kfs.conf)

vi kfs.conf

# 核心配置:

[source]

type=mysql

ip=mysql_ip

port=3306

user=migrate

password=Migrate@123

db=test

[target]

type=kingbase

ip=kingbase_ip

port=54321

user=sysdba

password=Kingbase@123

db=test

tablespace=encrypted_ts

[sync]

type=incremental # 增量同步

binlog_file=mysql_bin.000123 # MySQL当前binlog文件(show master status获取)

binlog_pos=12345 # binlog位置
  1. 启动增量同步
./kfs_start.sh # 后台运行,日志输出到 kfs.log
  1. 数据一致性校验(KFS 内置功能):
# 执行存量数据校验(不停机)

./kfs_check.sh -type full -table all

# 执行增量数据校验

./kfs_check.sh -type inc -table all
  • 校验结果:输出「一致」则通过;若「不一致」,执行 ./``kfs_repair.sh 自动修复

2.4 安全配置迁移:兼容 + 增强并行

2.4.1 传输加密复用(MySQL TLS 证书直接迁移)
  1. 复制 MySQL TLS 证书到 KingbaseES 服务器:
scp mysql_server.crt mysql_client.key root@kingbase_ip:/opt/Kingbase/ES/V8R6/data/
  1. 配置 KingbaseES 传输加密(kingbase.conf):
ALTER SYSTEM SET ssl = on;

ALTER SYSTEM SET ssl_cert_file = '/opt/Kingbase/ES/V8R6/data/mysql_server.crt';

ALTER SYSTEM SET ssl_key_file = '/opt/Kingbase/ES/V8R6/data/mysql_client.key';

ALTER SYSTEM SET ssl_ciphers = 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256';

SELECT sys_reload_conf(); -- 重载配置(无需重启数据库)
2.4.2 敏感数据脱敏配置(迁移后立即生效)
-- 1. 为迁移后的表添加脱敏规则(以user_info表为例)

ALTER TABLE user_info

ALTER COLUMN phone SET MASKED WITH (FUNCTION = 'partial(0,"****",4)'),

ALTER COLUMN id_card SET MASKED WITH (FUNCTION = 'partial(6,"********",4)');

-- 2. 授予普通用户脱敏权限

GRANT SELECT ON user_info TO 'dev_user'@'%' WITH MASKED;

-- 3. 验证脱敏效果(dev_user登录查询)

SELECT phone, id_card FROM user_info; -- 输出:138****1234、110101********1234
2.4.3 审计策略启用(满足等保 2.0)
-- 1. 启用审计模块

ALTER SYSTEM SET audit_enabled = on;

ALTER SYSTEM SET audit_log_dest = 'file:/data/kingbase/audit_log'; -- 审计日志存储路径

SELECT sys_reload_conf();

-- 2. 创建审计策略(覆盖权限变更、敏感操作)

CREATE AUDIT POLICY mysql_migrate_audit

PRIVILEGES = (CREATE, DROP, ALTER, GRANT, REVOKE)

OBJECTS = (ALL TABLES IN SCHEMA public)

USERS = (ALL)

EVENTS = (LOGIN, LOGOUT, INSERT, UPDATE, DELETE, EXECUTE)

RETENTION = 365;

-- 3. 绑定审计策略到所有用户

ALTER AUDIT POLICY mysql_migrate_audit APPLY TO ALL;

三、迁移验证(1 天):权限 + 数据 + 安全三重校验

3.1 权限有效性验证

验证项 操作步骤 预期结果
列级权限 ksql -U dev_user -d test -c "SELECT id, phone FROM user_info;" 仅能查询 id、phone 列(其他列提示无权限)
权限即时回收 REVOKE SELECT ON user_info FROM dev_user; 后,现有连接查询 立即提示权限不足(无需断开连接)
角色继承 CREATE USER 'new_dev'@'%' INHERIT dev_role; 后查询 自动拥有 dev_role 的所有权限

3.2 数据一致性验证

  1. 工具校验
# 使用KDTS数据校验功能(控制台→数据校验→新建任务)

# 或执行SQL对比

-- MySQL端:SELECT COUNT(*) FROM user_info;

-- KingbaseES端:SELECT COUNT(*) FROM user_info;

-- 结果需完全一致
  1. 抽样数据校验
-- 对比前100条数据的MD5值(确保数据无篡改)

-- MySQL端:

SELECT MD5(CONCAT(id, phone, id_card)) FROM user_info LIMIT 100;

-- KingbaseES端:

SELECT MD5(CONCAT(id, phone, id_card)) FROM user_info LIMIT 100;

3.3 安全特性验证

安全特性 验证步骤 预期结果
TDE 加密 查看数据文件:hexdump -C /data/kingbase/encrypted_ts/user_info 数据为加密乱码(非明文)
审计日志 查看审计文件:cat /data/kingbase/audit_log/audit_2025xxxx.log 记录登录、查询、权限变更等操作
IP 访问限制 用非授权 IP 登录:ksql -U dev_user -d test -h unauthorized_ip 提示「IP 访问被拒绝」

3.4 合规检查(KSEC 工具)

-- 执行合规扫描(覆盖等保2.0核心要求)

SELECT * FROM sys_security_check(

       'policy' = 'mysql_migrate_security',

       'check_items' = ('privilege_isolation', 'encryption', 'audit', 'masking', 'access_control')

);
  • 输出结果中「合规状态」需全部为「通过」;若有「未通过」,按工具提示修复(如启用 MFA、配置审计日志异地存储)

四、业务切换(窗口时间:建议凌晨 2-4 点):平滑割接

4.1 切换前准备

  1. 停止 MySQL 写入业务(通知应用暂停新增 / 修改操作)

  2. 执行最后一次增量同步校验:./``kfs_check.sh`` -type inc -table all(确保无增量数据差异)

  3. 备份 KingbaseES 数据:sys_dump -U sysdba -d test -F c -f kingbase_full_backup.dmp

4.2 应用切换

  1. 修改应用配置文件(替换数据库连接信息):
# 原MySQL配置

spring.datasource.url=jdbc:mysql://mysql_ip:3306/test?useSSL=true

spring.datasource.username=app_user

spring.datasource.password=App@123

# 新KingbaseES配置(兼容MySQL协议,应用无需改代码)

spring.datasource.url=jdbc:kingbase8://kingbase_ip:54321/test?useSSL=true\&compatibleMode=mysql

spring.datasource.username=app_user

spring.datasource.password=App@123
  1. 重启应用,验证业务功能:
  • 核心流程测试(查询、新增、修改操作)

  • 敏感操作测试(如删表需审批:执行 DROP TABLE 测试,需审计管理员审批后生效)

4.3 应急回退(若切换失败)

  1. 停止 KingbaseES 增量同步:./``kfs_stop.sh

  2. 恢复应用连接到 MySQL:还原应用配置文件并重启

  3. 同步 KingbaseES 增量数据到 MySQL(若有写入):./``kfs_sync_back.sh

五、迁移后优化(1-2 周):权限精细化 + 安全增强

5.1 权限优化

  1. 清理冗余权限:REVOKE ALL PRIVILEGES ON *.* FROM 'migrate'@'kingbase_ip';(删除迁移账号)

  2. 配置动态权限:为运维人员设置临时权限窗口

-- 创建维护窗口角色(仅允许22:00-24:00有修改权限)

CREATE ROLE maintain_role INHERIT base_role;

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO maintain_role;

-- 绑定时间限制

ALTER USER 'ops_user'@'%' SET ROLE maintain_role      

OPTIONS (time_restrict '22:00-24:00');

5.2 安全增强

  1. 启用 MFA 双因素认证(管理员账号强制启用):
ALTER USER 'sysdba'@'%' ENABLE MFA;

-- 绑定动态令牌(通过KingbaseES管理控制台配置)
  1. 对接 LDAP 统一身份认证:
-- 配置LDAP服务器(延续之前文档示例)

CREATE SERVER ldap_server TYPE 'LDAP' FOREIGN DATA WRAPPER ldap_fdw OPTIONS (

       host 'ldap://ldap_ip:389',

       port '389',

       base_dn 'dc=company,dc=com'

);

-- 映射LDAP用户到KingbaseES角色

CREATE USER MAPPING FOR ldap_user SERVER ldap_server OPTIONS (

       ldap_user 'cn=ldap_user,ou=users,dc=company,dc=com',

       ldap_password 'Ldap@123'

);
  1. 定期安全审计:每周执行合规检查
SELECT * FROM sys_security_check(

       'policy' = 'mysql_migrate_security',

       'check_items' = ('all')

) INTO OUTFILE '/data/kingbase/security_report/weekly_report.csv';

六、常见问题避坑指南

问题场景 原因分析 解决方案
迁移后中文乱码 字符集不兼容(MySQL 为 utf8,KingbaseES 为 gbk) 重新迁移,指定字符集:ALTER DATABASE test SET CHARACTER SET utf8mb4;
存储过程执行失败 MySQL 函数语法不兼容(如 DECODE→CASE WHEN) 参考「翻译字典」修改:DECODE(a,b,c,d)CASE WHEN a=b THEN c ELSE d END
增量同步延迟高 MySQL Binlog 日志量过大 清理历史 Binlog,调整 KFS 同步线程数:./kfs_config.sh -threads 8
审计日志写入缓慢 审计日志存储在机械硬盘 迁移审计日志到 SSD 硬盘,修改配置:ALTER SYSTEM SET audit_log_dest = 'file:/ssd/audit_log';

更多推荐