mysql数据库迁移瀚高

现有系统是mysql版本,需要改成瀚高数据库。
使用瀚高迁移工具,将mysql的表和数据迁移到瀚高数据库中。
在这里插入图片描述
在这里插入图片描述
处理mysql表中自动递增id
查询mysql中的自增id

SELECT
  t.TABLE_NAME AS 表名,
  c.COLUMN_NAME AS 自增列名,
	CONCAT('\'',t.TABLE_NAME, ':' ,c.COLUMN_NAME,'\','),
  c.DATA_TYPE AS 数据类型,
  t.AUTO_INCREMENT AS 当前自增起始值,
  c.COLUMN_COMMENT AS 列注释
FROM
  INFORMATION_SCHEMA.TABLES t
JOIN
  INFORMATION_SCHEMA.COLUMNS c
ON
  t.TABLE_SCHEMA = c.TABLE_SCHEMA
  AND t.TABLE_NAME = c.TABLE_NAME
WHERE
  t.TABLE_SCHEMA = DATABASE() -- 自动适配当前数据库
  AND t.AUTO_INCREMENT IS NOT NULL
  AND c.EXTRA LIKE '%auto_increment%';

在瀚高中添加存储过程seq_update,将mysql中的自增id全部列出来。

CREATE OR REPLACE PROCEDURE gcp_flow_yhd.seq_update()
 LANGUAGE plpgsql
AS $procedure$
DECLARE
    -- 定义需要处理的表和对应的主键字段名
    -- 格式: 表名:主键字段名
    tables_with_pk TEXT[] := ARRAY[
       'ACT_EVT_LOG:LOG_NR_',
	'ACT_HI_TSK_LOG:ID_',
	'gen_table:table_id',
	'gen_table_column:column_id',
	'leave_application:id',
	'study_queue:id',
	'study_queue_patient:id',
	...
	'wx_project_standard:id'
    ];
    
    tbl_info TEXT;
    tbl_name TEXT;
    pk_field TEXT;
    seq_name TEXT;
    start_id BIGINT;
    sequence_exists BOOLEAN;
    current_max_id BIGINT;
    has_default BOOLEAN;
    error_msg TEXT;
BEGIN 
    -- 记录开始时间
    RAISE NOTICE '开始处理序列更新,共 % 个表', array_length(tables_with_pk, 1);
    
    -- 遍历所有表
    FOREACH tbl_info IN ARRAY tables_with_pk
    LOOP
        BEGIN
            -- 解析表名和主键字段名
            tbl_name := split_part(tbl_info, ':', 1);
            pk_field := split_part(tbl_info, ':', 2);
            
            -- 构建序列名(表名 + '_' + 主键字段名 + '_seq')
            seq_name := tbl_name || '_' || pk_field || '_seq';
            
            -- 获取表中当前最大ID
            EXECUTE 'SELECT COALESCE(MAX(' || quote_ident(pk_field) || '), 0) FROM ' || quote_ident(tbl_name) INTO current_max_id;
            start_id := current_max_id + 1;
            
            -- 检查序列是否存在
            SELECT EXISTS(
                SELECT 1 FROM information_schema.sequences 
                WHERE sequence_name = seq_name
            ) INTO sequence_exists;
            
            -- 检查表字段是否已经有默认值
            SELECT EXISTS(
                SELECT 1 FROM information_schema.columns 
                WHERE table_name = tbl_name 
                AND column_name = pk_field 
                AND column_default IS NOT NULL
                AND column_default LIKE '%' || seq_name || '%'
            ) INTO has_default;
            
            IF sequence_exists THEN
                -- 序列已存在,修改起始值
                EXECUTE 'ALTER SEQUENCE ' || quote_ident(seq_name) || ' RESTART WITH ' || start_id;
                
                -- 确保默认值设置正确
                IF NOT has_default THEN
                    EXECUTE 'ALTER TABLE ' || quote_ident(tbl_name) || 
                            ' ALTER COLUMN ' || quote_ident(pk_field) || ' SET DEFAULT nextval(''' || seq_name || ''')';
                END IF;
                
                RAISE NOTICE '表 % 的序列已存在,起始值已修改为: %', tbl_name, start_id;
            ELSE
                -- 序列不存在,创建新序列
                EXECUTE 'CREATE SEQUENCE ' || quote_ident(seq_name) || 
                        ' START WITH ' || start_id || ' INCREMENT BY 1';
                
                -- 设置表的默认值
                EXECUTE 'ALTER TABLE ' || quote_ident(tbl_name) || 
                        ' ALTER COLUMN ' || quote_ident(pk_field) || ' SET DEFAULT nextval(''' || seq_name || ''')';
                
                RAISE NOTICE '表 % 的序列已创建,起始值: %', tbl_name, start_id;
            END IF;
            
        EXCEPTION
            WHEN others THEN
                -- 捕获异常并记录错误信息
                GET STACKED DIAGNOSTICS error_msg = MESSAGE_TEXT;
                RAISE NOTICE '处理表 % 时出错: %', tbl_name, error_msg;
                -- 继续处理下一个表
                CONTINUE;
        END;
    END LOOP;
    
    RAISE NOTICE '序列更新处理完成';
END;
$procedure$
;

调用存储过程,更新瀚高表中的自增id字段

CALL xxx.seq_update();

项目中用到了flowable,需要处理相关表中的布尔类型字段

ALTER TABLE act_ru_execution
    ALTER COLUMN is_active_ TYPE boolean USING (CASE WHEN is_active_ = 1 THEN true ELSE false END),
    ALTER COLUMN is_concurrent_ TYPE boolean USING (CASE WHEN is_concurrent_ = 1 THEN true ELSE false END),
    ALTER COLUMN is_scope_ TYPE boolean USING (CASE WHEN is_scope_ = 1 THEN true ELSE false END),
    ALTER COLUMN is_event_scope_ TYPE boolean USING (CASE WHEN is_event_scope_ = 1 THEN true ELSE false END),
    ALTER COLUMN is_mi_root_ TYPE boolean USING (CASE WHEN is_mi_root_ = 1 THEN true ELSE false END),
    ALTER COLUMN is_count_enabled_ TYPE boolean USING (CASE WHEN is_count_enabled_ = 1 THEN true ELSE false END);

ALTER TABLE act_ru_task
    ALTER COLUMN is_count_enabled_ TYPE boolean USING (CASE WHEN is_count_enabled_ = 1 THEN true ELSE false END);
    
ALTER TABLE act_ru_job
    ALTER COLUMN exclusive_ TYPE boolean USING (CASE WHEN exclusive_ = 1 THEN true ELSE false END);

以上就将数据迁移到了瀚高中。
瀚高对字段类型要求严格,字符串类型的查询需要加单引号,数值类型的查询需要将字符串转为数值类型查询。

### 数据迁移方案 #### 工具准备 为了实现从 MySQL瀚高数据库的数据迁移,可以采用官方推荐的 **瀚高数据迁移工具**。该工具支持多种异构数据库之间的数据迁移操作,并提供了图形化界面以及命令行方式供用户选择[^1]。 #### 迁移流程概述 以下是基于引用内容整理的一份完整的迁移指南: --- #### 一、前期准备工作 1. **下载并安装瀚高数据库** - 参考文档中的 Windows 和 Linux 平台下的安装步骤完成瀚高数据库的部署。 - 确保数据库已正常启动,并能够通过客户端工具成功连接。 2. **获取迁移工具** - 下载适用于 MySQL瀚高的数据迁移工具 `migration-4.1.4-2023-11-23.zip`[^3]。 - 如果遇到依赖项缺失问题(如 MSVCR120.dll),可尝试使用第三方修复工具解决,例如 DirectXRepair39.zip。 3. **调整目标端配置** - 修改目标数据库的 `pg_hba.conf` 文件以允许外部连接。 ```bash host all all 0.0.0.0/0 md5 ``` - 执行 SQL 命令启用必要的兼容性和性能优化选项: ```sql ALTER SYSTEM SET max_connections TO '200'; ALTER SYSTEM SET shared_buffers TO '256MB'; ``` --- #### 二、具体迁移过程 ##### 1. 启动迁移工具 解压迁移工具压缩包后运行程序,在界面上依次完成以下操作: ###### (1)创建迁移任务 - 新建一个迁移任务组。 - 添加两个连接节点:一个是源数据库(即 MySQL 实例),另一个为目标数据库(即瀚高实例)。 ###### (2)配置源库信息 - 输入 MySQL 的主机地址、端口、用户名和密码。 - 测试连接以验证参数无误。 ###### (3)配置目标库信息 - 提供瀚高数据库的相关连接细节。 - 使用相同的测试功能确认连通性。 ##### 2. 设定迁移范围 - 在任务详情页面指定需要迁移的对象类型(如表结构、视图、存储过程等)。 - 若仅需部分数据,则可通过筛选条件进一步缩小范围。 ##### 3. 处理字段映射冲突 由于两者的语法存在差异,某些特殊类型的转换可能失败。例如: - MySQL 中的 `TINYINT(1)` 字段通常被解释为布尔值,但在实际应用中也可能携带其他数值(如 99)。这种情况下,建议将其显式声明为整数型来规避潜在错误[^2]。 ```sql ALTER TABLE example_table MODIFY COLUMN is_active INT; ``` ##### 4. 开始正式传输 点击“开始迁移”按钮等待进度条结束即可。期间可能会弹出警告提示框,请仔细阅读说明后再决定是否继续。 --- #### 三、后续校验工作 完成后务必抽样核对两端记录一致性,尤其是涉及金额计算或者日期处理的部分。如果发现异常情况可以通过 DML 脚本单独修正。 --- ### 技术要点总结 整个过程中需要注意以下几个方面: 1. 版本匹配——确保所使用的版本号处于官方支持列表之内; 2. 权限管理——授予充分的操作权限给执行账户以免中途中断; 3. 性能调优——针对大规模数据集提前规划分区策略减少耗时; ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值