【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
$$;
相关推荐
IvorySQL2 小时前
PostgreSQL 日报|建库策略致备库静默丢数据(9 月 12 日)
数据库·人工智能·postgresql
程序员阿鹏4 小时前
如何实现MySQL分库分表?
数据结构·数据库·sql·mysql·缓存
风哥2号4 小时前
数据库教程FGMT33‑MySQL主从复制项目实施与维护06(MySQL8.4/9.7 MGR组复制)
数据库·mysql
杨云龙UP5 小时前
MySQL Host is blocked because of many connection errors 导致 JDBC 连接失败排查与解决
linux·运维·网络·数据库·sql·mysql·登录失败
程序员梅雨7 小时前
MySQL底层探索(一):什么是脏页?什么是冷热分离?
mysql·面试
瀚高PG实验室8 小时前
瀚高数据库如何克隆表
数据库·sql·postgresql·瀚高数据库
严同学正在努力8 小时前
认识 SQL Server 的 T-SQL 语法
数据库·人工智能·ai·oracle·dba
bksczm9 小时前
MySQL基础篇之表的增删查改(CRUD)细则
sql·mysql
莫陌尛.18 小时前
Docker MySQL 删表卡死、执行超时(MDL锁阻塞)问题复盘与根治方案
mysql·docker·容器
毕业设计70321 小时前
(免费领源码) 基于微信小程序的预制菜商城的设计与实现25172-java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
vue.js·python·mysql·微信小程序·pycharm·微信开发者工具·推荐算法