赞
踩
公司要把数据库迁移到另一台服务器,旧库用的是11G,新库用的19c
提示:以下是本篇文章正文内容,下面案例可供参考
由其他同事迁移,使用数据泵,迁移过程报了很多错误,数据不全,故此次迁移失败。
虽然数据不全,但是这些同事把表结构都创建了。
第一次迁移的时候表结构已经创建好了,不需要再创建,这里只是说说我建表的其它思路:
使用plsql以sql方式导出表结构,如果表空间不一样,批量替换sql文本中的表空间。
因为第一次到表结构的时候,有些表也导了数据,故我需要清空表数据,如果表没有数据,跳过此步骤。
(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;
拿查询结果去执行
思路
优先使用数据泵,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;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。