【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
$$;
相关推荐
Edingbrugh.南空8 分钟前
Flink MySQL CDC 环境配置与验证
mysql·adb·flink
BD_Marathon43 分钟前
Ubuntu:Mysql服务器
服务器·mysql·ubuntu
程序猿小D1 小时前
[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的电影小说网站管理系统,推荐!
java·数据库·mysql·spring·毕业设计·ssm框架·电影小说网站
羊小猪~~2 小时前
数据库学习笔记(十七)--触发器的使用
数据库·人工智能·后端·sql·深度学习·mysql·考研
叁沐3 小时前
MySQL 05 深入浅出索引(下)
mysql
陈卓4103 小时前
MySQL-主从复制&分库分表
android·mysql·adb
你都会上树?4 小时前
MySQL MVCC 详解
数据库·mysql
长征coder5 小时前
AWS MySQL 读写分离配置指南
mysql·云计算·aws
ladymorgana5 小时前
【docker】修改 MySQL 密码后 Navicat 仍能用原密码连接
mysql·adb·docker
PanZonghui5 小时前
Centos项目部署之安装数据库MySQL8
linux·后端·mysql