【MySQL\Oracle\PostgreSQL】迁移到openGauss数据出现的问题解决方案

【MySQL\Oracle\PostgreSQL】迁移到openGauss数据出现的问题解决方案

问题1:序列值不自动刷新问题

下面SQL只针对单库操作以及每个序列只绑定一张表的情况

复制代码
-- 自动生成的序列,设置序列值
with sequences as (select *
                   from (select table_schema,
                                table_name,
                                column_name,
                                pg_get_serial_sequence(format('%I.%I', table_schema,
                                                              table_name), column_name) as auto_seq, --<<自动
                                (string_to_array(column_default, E'\''))[2]             as col_seq   --<<手动
                         from information_schema.columns
                         where table_schema not in ('pg_catalog', 'information_schema')
                           and column_default ILIKE 'nextval(%'
                           and table_schema = 'usc') t
--                    where auto_seq is not null
                   ),
     maxvals as (select table_schema,
                        table_name,
                        column_name,
                        auto_seq,
                        col_seq,
                        (xpath('/row/max/text()',
                               query_to_xml(format('select max(%I) as max from %I.%I', column_name, table_schema,
                                                   table_name),
                                            true, true, ''))
                            )[1]::text::bigint as max_val,
                                         (xpath('/row/cur/text()',
                               query_to_xml(format('select last_value as cur from %I.%I',table_schema, col_seq),
                                            true, true, ''))
                            )[1]::text::bigint as cur_val
                 from sequences)
select table_schema,
       table_name,
       column_name,
       auto_seq,
       col_seq,
       cur_val,
       coalesce(max_val, 0) as max_val,
       setval(col_seq, coalesce(max_val, 1)) --<<设置序列值
from maxvals;

问题2:

字符类型为空字符串迁移后会变成null排查,需要考虑大表问题,防止慢SQL

复制代码
-- 数据库迁移出现null/空字符串 排除
with t as (select table_schema,
       table_name,
       column_name,
       (xpath('/row/cnt/text()',
              query_to_xml(format(E'select count(*) as cnt from %I.%I where %I = \'\'', table_schema,
                                  table_name, column_name),
                           true, true, ''))
           )[1]::text::bigint as null_cnt
from information_schema.columns
where table_schema not in ('pg_catalog', 'information_schema')
  and table_schema = 'usc'
  and is_nullable = 'NO'
  and udt_name in ('varchar', 'text', 'bpchar'))
select * from t where null_cnt > 0;

问题3:

时间精度问题,导致时间范围查询失败。批量调整时间字段精度

复制代码
DO
$$
    DECLARE
        r RECORD;
    BEGIN
        FOR r IN
            select table_name, column_name, udt_name
            from information_schema.columns
            where table_schema not in ('pg_catalog', 'information_schema')
              and table_schema = 'usc'
              and udt_name in ('timestamp','timestamptz')
            LOOP
                EXECUTE 'ALTER TABLE ' || r.table_name || ' ALTER COLUMN ' || r.column_name || ' TYPE ' || r.udt_name ||
                        '(0)';
            END LOOP;
    END
$$;
相关推荐
小马同学-6 小时前
MySQL主从复制和读写分离
数据库·mysql
海绵宝宝转agent7 小时前
MySql高频面试八股开源笔记总结
mysql·面试·开源
余槐i8 小时前
数据没回滚也不报错:@Transactional 自调用失效的 3 种复现与修复
spring boot·mysql·多线程·spring 事务
写后端的胖头鱼13 小时前
【高频面试题】FullText 全文索引(MySQL)
数据库·mysql·索引·全文索引
lie..14 小时前
30天从零开始学AI应用开发(Day 17):ChromaDB 上手:给本地文档建一个“外挂大脑”
数据库·人工智能·oracle
code_whiter14 小时前
01-MySQL数据库基础
数据库·mysql
vx_Biye_Design17 小时前
springboot宠物领养与救助平台64334-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·课程设计·宠物
做运维的阿瑞18 小时前
mysql数据库视图笔记:创建、修改、删除与适用场景
数据库·笔记·mysql
java1234_小锋18 小时前
【技术专题】Mysql8 数据库 - Mysql8 数据库基本操作
数据库·mysql
其实防守也摸鱼19 小时前
DeepSeek Harness 开源贡献手记:从 Issue 到 Merge 的完整旅程
android·数据库·学习·ai·oracle·自动化