前言

公司要把数据库迁移到另一台服务器,旧库用的是11G,新库用的19c


提示:以下是本篇文章正文内容,下面案例可供参考

一、第一次迁移

由其他同事迁移,使用数据泵,迁移过程报了很多错误,数据不全,故此次迁移失败。

虽然数据不全,但是这些同事把表结构都创建了。

二、第二次迁移

1.创建表

第一次迁移的时候表结构已经创建好了,不需要再创建,这里只是说说我建表的其它思路:

使用plsql以sql方式导出表结构,如果表空间不一样,批量替换sql文本中的表空间。

2.清空表数据

因为第一次到表结构的时候,有些表也导了数据,故我需要清空表数据,如果表没有数据,跳过此步骤。

(1)禁用表约束

select 'alter table ' || table_name || ' disable constraint ' ||
constraint_name || ';'
from user_constraints
where constraint_type = 'R';

拿查询结果去执行

(2)启用表约束(导完数据后再执行)

select 'alter table ' || table_name || ' enable constraint ' ||
constraint_name || ';'
from user_constraints
where constraint_type = 'R';

先备份查询结果,执行完下面清空表数据sql后再执行启用约束sql(此查询结果)

(3)生成清空表数据sql

select 'truncate table '||table_name||';' from user_tables;

拿查询结果去执行

2.导入数据

思路

优先使用数据泵,exp次之,最次的思路:

如果两个数据库是相通,可以使用dblink和navicat同步数据。

如果两个数据库是不相通,就使用navicat同步数据。

(1)dblink同步数据

表有大字段可能会报错,所以此方式同步没有大字段的表。

生成dblink复制表数据sql语句,执行这些语句剩下的拥有大字段得表可用navicat或exp同步

--生成插入数据语句
select 'insert into '|| TABLE_NAME || ' select * from ' || TABLE_NAME || '@dblink_name;' from user_tables where TABLE_NAME not in(
--查询所有拥有大字段的表
select distinct t_tables.table_name
  from user_tab_columns t_column, user_tables t_tables
 where t_column.table_name = t_tables.table_name
   and t_column.data_type in('CLOB','NCLOB','BLOB','BFILE')
  
 )

(2)navicat同步数据

navicat先连接两边的数据库,然后选择“工具”-“数据传输”,打开如图窗口

postgresql 数据库迁移 plsql迁移数据库_开发语言

选择刚才创建的连接,源的连接就是要迁移的库的地址,数据库就是用户名,同理目标库就目标库的信息。

“选项”配置,我的配置如图

postgresql 数据库迁移 plsql迁移数据库_python_02

因为只同步数据不同步表结构,不要勾选“创建表”选项,下一步。

勾选要同步数据的表。

如果有序列,序列不用选,因为同步过来序列是从1开始,是不正确的。

使用下面语句去旧库查询所有序列,把结果拿到新库执行序列就同步了

select to_char(DBMS_MetaDATA.GET_DDL('SEQUENCE',u.SEQUENCE_NAME)||';') as aa from dba_sequences u where sequence_owner=(SELECT USER FROM DUAL) ORDER BY SEQUENCE_NAME;

三、验证数据是否导正确

1、先刷新再统计,在旧库和新库执行,拿结果到对比工具对比是否一样

-- 刷新对应统计表 分析用户所有的对象(包括表、索引、簇)
call dbms_stats.gather_schema_stats('用户名');

--统计所有表的记录数
select TABLE_NAME,num_rows  from user_tables ORDER BY TABLE_NAME;