前言
公司要把数据库迁移到另一台服务器,旧库用的是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先连接两边的数据库,然后选择“工具”-“数据传输”,打开如图窗口
选择刚才创建的连接,源的连接就是要迁移的库的地址,数据库就是用户名,同理目标库就目标库的信息。
“选项”配置,我的配置如图
因为只同步数据不同步表结构,不要勾选“创建表”选项,下一步。
勾选要同步数据的表。
如果有序列,序列不用选,因为同步过来序列是从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;