基本所有的数据库都是从高版本兼容低版本,也就是可以把数据从低版本的数据库导入高版本,但如果把高版本数据库的数据导入低版本就会发生一些问题。此文章是记录的把数据从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文件
先点击数据库导出
选择源数据库,格式选择insert,选好导出后的sql文件名称,点击下一步
默认就好,选择下一步
先点击更多,选择用户,类型选择ALL_OBJETS,单机查找,把所有找到的内容移动到右边,再点击下一步
把数据移到上面,点击下一步
最后点击完成,
导出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:
解决方案:这里是创建触发器报错,这里我通过客户端图形界面创建了一个上面的触发器
创建完成后发现sql内容为:
与原来导出的sql对比发现少了EDITIONABLE这个词,于是把所有创建触发器的sql语句中EDITIONABLE去掉,触发器创建成功。
错误四:重建触发器报错ORA-02289:序列不存在
解决方案:先创建不存在的序列,再创建触发器,如图所实