把oracle19c数据导入oracle11g

背景:

       基本所有的数据库都是从高版本兼容低版本,也就是可以把数据从低版本的数据库导入高版本,但如果把高版本数据库的数据导入低版本就会发生一些问题。此文章是记录的把数据从oracle19.3版本导入11g中

源数据版本: 19.3.0.0.0

目标数据库版本:11.2.0.4.0

oracle客户端版本:sqldeveloper  19.1

 

操作过程

首先我尝试使用expdp和impdp来导出导入,导出没有问题,导入dmp文件的时候直接报版本相关错误

然后尝试通过oracle图形客户端sqldeveloper来导出sql文件,再导入到目标数据库

首先在目标数据库建立好对应的表空间和用户,推荐和源数据库名字一样,这样方便,如果名字和源数据库不一样需要导入sql的时候替换应该的表空间名称和用户名。

建立对应表空间和用户

SQL> CREATE TEMPORARY TABLESPACE  schedule2_TEMP TEMPFILE '/opt/oracle/oradata/orcl/sch/schedule2_temp.dbf' SIZE 1000M AUTOEXTEND ON NEXT 500M MAXSIZE 31480M EXTENT MANAGEMENT LOCAL;

SQL> create tablespace schedule2 logging datafile  '/opt/oracle/oradata/orcl/sch/schedule2_data.dbf' size 100M autoextend on next 1000M maxsize 32000M autoallocate extent management local segment space management auto;
  
SQL> create user sch  identified by "sch1234" default tablespace schedule2   temporary tablespace schedule2_TEMP profile DEFAULT;
 
SQL> GRANT CONNECT,RESOURCE TO sch;

用sqldeveloper登陆源数据库来导出sql文件

先点击数据库导出

把oracle19c数据导入oracle11g_第1张图片

选择源数据库,格式选择insert,选好导出后的sql文件名称,点击下一步

把oracle19c数据导入oracle11g_第2张图片

默认就好,选择下一步

把oracle19c数据导入oracle11g_第3张图片

先点击更多,选择用户,类型选择ALL_OBJETS,单机查找,把所有找到的内容移动到右边,再点击下一步

把oracle19c数据导入oracle11g_第4张图片

把数据移到上面,点击下一步

把oracle19c数据导入oracle11g_第5张图片

最后点击完成,

把oracle19c数据导入oracle11g_第6张图片

导出sql文件后直接把sql文件中的内容全选,然后再通过sqldeveloper的工作表执行,部分执行成功,部分失败,大概有四种错误,下面说一下解决方法

错误一

在行: 8 上开始执行命令时出错 -
   CREATE SEQUENCE  "SCH"."BATCH_JOB_SEQ"  MINVALUE 0 MAXVALUE 6854775807 INCREMENT BY 1 START WITH 0 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE  GLOBAL
错误报告 -
ORA-00933: SQL 命令未正确结束
00933. 00000 -  "SQL command not properly ended"
*Cause:    
*Action:

解决方案:很多语句出现上面错误,我认为是版本兼容性问题,把上述sql语句中NOORDER  NOCYCLE  NOKEEP  NOSCALE  GLOBAL去掉问题解决。

sql语句改正为:CREATE SEQUENCE  "SCH"."BATCH_JOB_SEQ"  MINVALUE 0 MAXVALUE 6854775807 INCREMENT BY 1 START WITH 0 CACHE 20 ;

错误二

在行: 775 上开始执行命令时出错 -
  CREATE TABLE "SCH"."SCHEDULE_TASK_SHARDINGING_EXECUTION" 

错误报告 -
ORA-00972: 标识符过长
00972. 00000 -  "identifier is too long"
*Cause:    An identifier with more than 30 characters was specified.
*Action:   Specify at most 30 characters.

解决方案:11g中表名不能超过30个字符,通过把长表名的sql表名改短解决。

错误三

在行: 1,207 上开始执行命令时出错 -
  CREATE OR REPLACE EDITIONABLE TRIGGER "SCH"."AUDIT_TRIG" 

before insert on SCHEDULE_AUDIT_RECORD

for each row 

begin
select seq_audit.nextval     

into :new.RECORD_ID from dual;        
end;
错误报告 -
ORA-00922: 选项缺失或无效
00922. 00000 -  "missing or invalid option"
*Cause:    
*Action:

解决方案:这里是创建触发器报错,这里我通过客户端图形界面创建了一个上面的触发器

把oracle19c数据导入oracle11g_第7张图片

创建完成后发现sql内容为:

把oracle19c数据导入oracle11g_第8张图片

与原来导出的sql对比发现少了EDITIONABLE这个词,于是把所有创建触发器的sql语句中EDITIONABLE去掉,触发器创建成功。

错误四:重建触发器报错ORA-02289:序列不存在

把oracle19c数据导入oracle11g_第9张图片

解决方案:先创建不存在的序列,再创建触发器,如图所实

把oracle19c数据导入oracle11g_第10张图片

你可能感兴趣的:(oracle,oracle,数据库)