目录
导出环境:Red Hat enterprise linux server release 6.6(santiago)/ Oracle11g
导入环境:Red Hat enterprise linux server release 6.8(santiago)/ Oracle11g
- 本次操作的是单表导入导出(从准生产环境导入测试)
- 导入导出表空间不同
- 导入导出用户名不同
- 导入导出表名相同
- 导入导出结构相同
- 导入表中需进行追加数据
1.导出dump文件
expdp 用户名/密码@IP地址/实例名 tables=需要导出的表名 dumpfile=导出的dump文件名.dmp logfile=生成的日志名.log
如果导入导出的两个表结构等完全一致,可以加上参数 rows = y ,表示只导出数据,这样的导出速度会快很多。
原始的imp/exp工具有很多参数用来调优,(BUFFER, COMMIT, COMPRESS,CONSISTENT, DIRECT, 和RECORDLENGTH),数据泵无需设置这些参数,它本身会找到最适合的参数
注意数据泵只有Parallelism参数调整并行度来提升性能,比如开启4个并行执行expdp,导出多个文件 DUMPFILE=export_%u.dmp PARALLEL=4
链接到服务器上Oracle用户执行导出命令,不需要sqlplus链接数据库。
执行效果如下:
2.导入dump文件
2.1创建逻辑目录
注意:执行此SQL语句为ORACLE指定了一个逻辑目录,但是ORACLE不能判断此逻辑目录是否存在,如果你是第一次执行,需要到服务器上自己手动创建一个目录,否则会在导入时报错。
--创建逻辑目录
create directory dump_dir_20230106 as '/home/oracle/dump_dir_20230106 ';
--修改逻辑目录
create or replace directory 目录名称 as '/存放目录路径'
--赋权逻辑目录
grant read,write on directory dump_dir_20230106 to CPR;
--删除逻辑目录
drop directory 目录名称;
2.2检查逻辑目录是否成功创建
注意:逻辑目录有些情况可能需要system用户授权,在此没遇到。
select * from dba_directories;
2.3创建物理目录
服务器上手动创建SQL中指定逻辑目录的物理目录。
进行数据泵导入时,可以把导入的dmp文件存到此文件夹。
生成的log日志也会存于此。
2.4数据泵导入
数据泵导入涉及很多问题
- 指定逻辑目录文件夹
- 指定导入dump文件名
- 指定源用户名与导入用户名
- 指定源表空间与导入表空间
- 指定表存在的动作
- 指定导入的日志
impdp 用户名/密码@IP地址/实例名 DIRECTORY=指定逻辑目录 DUMPFILE=dmp文件名.dmp REMAP_SCHEMA=原用户名:导入用户名 REMAP_TABLESPACE=原表空间名:现表空间名 TABLE_EXISTS_ACTION=表存在执行动作 LOGFILE=生成日志名.log
执行效果如下:
如果出现意外可以去指定逻辑目录下查看日志,具体问题具体分析。
3.问题
第一个问题是因为同事不会使用数据泵,导出的.dump文件中给导出语句加了rows = y参数,即只导出数据,结果我再导入的时候因为表空间、用户、表名等等原因频繁导入失败。
解决方案:去掉这个参数,正常导出。
第二个问题是因为我再使用导入命令是给TABLE_EXISTS_ACTION=REPLACE 指定了REPLACE,REPLACE是需要先DROP这个表,再CREATE。
引用官网:“Only objects created by the Import will be remapped. In particular, the tablespaces for preexisting tables will not be remapped if TABLE_EXISTS_ACTION is set to SKIP, TRUNCATE, or APPEND.”
结果因为权限问题无法CREATE,导致了报错ORA-39112。
出现问题后再去数据查询,因为这个表是别的用户grant 查询权限后创建的同义词,在查询时还爆出了同义词循环链ORA-01775。
解决方案:拿到建表语句重新建一个表,如果这个表是别的用户授权后创建的同义词,需要让别的用户重新授权,同义词可以直接复用,不用改变
4.调优参数
未完待续......