【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
$$;
相关推荐
dLYG DUMS10 小时前
DBeaver连接本地MySQL、创建数据库表的基础操作
数据库·mysql
苍煜10 小时前
MySQL分库分表和ES到底怎么选?
数据库·mysql·elasticsearch
czlczl2002092511 小时前
松散索引扫描/跳跃索引扫描
数据库·mysql·性能优化
苍煜12 小时前
二叉树、红黑树、B树、B+树通俗教学:各自适配场景+MySQL索引终极选型原因
数据结构·b树·mysql
星马梦缘13 小时前
数据库作战记录 实验7、8
数据库·sql·oracle
苍煜13 小时前
一篇讲懂分库分表:概念、spirngboot实战
数据库·oracle
梦想画家14 小时前
PostgreSQL 物化视图实战:从数据固化到智能刷新的全链路指南
数据库·postgresql·物化视图
Database_Cool_14 小时前
在 RDS PostgreSQL 中实现 RaBitQ 量化
数据库·阿里云·ai·postgresql
【心态好不摆烂】14 小时前
MySQL操作库
数据库·mysql
道法自然,人法天17 小时前
PostgreSQL安装与初始化教程(二进制压缩包)
数据库·postgresql