Oracle 通过逻辑方式导出数据,当导出的数据量比较大的时候,磁盘存储空间不够时可以使用
impdp + dblink 方式实现,这样省去了expdp 导出的过程,不过这种方式不支持 long 类型的字段
会报错:
ORA-31679: and longs can not be loaded/unloaded using a network link
实现前提:
- 在目标数据库必须要开启 streams_pool_size 参数
否则会报错:
UDI-31623: operation generated ORACLE error 31623
ORA-31623: a job is not attached to this session via the specified handle
ORA-06512: at "SYS.DBMS_DATAPUMP", line 3326
ORA-06512: at "SYS.DBMS_DATAPUMP", line 4551
ORA-06512: at line 1
查看是否开启
show parameter stream
开启 streams_pool_size
alter system set sga_max_size=2200m scope=spfile;
startup force;
alter system set streams_pool_size=1200M scope=spfile;
2.如果impdp 时指定了 logfile选项,则需要在Oracle 创建directory 对象
查询当前数据库中所有的directory 对象
select * from dba_directories;
如果查询出来的路径在操作系统上面不存在则需要创建
否则会报错
ORA-39002: invalid operation
ORA-39070: Unable to open the log file.
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 475
ORA-29283: invalid file operation
解决:
select * from dba_directories;
查询到当前数据库的所有 directory 对象, 如果directory 对象指向的路径在操作系统不存在,则需要创建
3.如果导出的数据量比较大,比如上百G则需要需要设置临时表空间为自动增长,因为impdp 导入数据时需要用到临时表空间
查询临时表空间的路径
select TABLESPACE_NAME,FILE_NAME from dba_temp_files;
设置临时表空间自动增长:
alter database tempfile 'D:\ORACLE\ORADATA\DBA\TEMP01.DBF' autoextend on next 20m;
4.如果导入的数据量比较大,则最好将目标用户的表空间设置为bigfile 否则当表空间增长导32G时 由于文件系统的限制,则无法继续增长导致导出失败
5.为了提高导入效率。需要增加日志组
查询当前有多少日志组
select * from v$logfile;
查询日志组大小
select GROUP# ,BYTES/1024/1024 size_M,STATUS,ARCHIVED from v$log;
增加日志组
alter database add logfile group 4 ('/tmp/192.168.1.52/share/imp2/u01/app/oracle/oradata/abc/redo04.dbf') size 200M;
创建 dblink
create /* public */ database link mylink connect to duni_exp identified by duni_exp using \
'(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.1.190)(PORT = 1521))) \
"(CONNECT_DATA =(SID = orcl)))';
导入数据,指定使用dblink
impdp \'/ as sysdba\' nologfile=y tables=TEST table_exists_action=skip parallel=10 \
remap_schema=TEST:ORCL cluster=no network_link=mylink remap_tablespace=USERS:SYSTEM