跳到主要内容

Oracle的导出和导入

·2116 字·5 分钟

实战过程中对Oracle导出/导入的总结

1.Oracle导出/导入数据库 #

导入导出关键字说明

关键字说明(默认)关键字说明(默认)
USERID用户名/口令RECORDLENGTH IO记录的长度
FULL导入整个文件 (N)GRANTS导入权限 (Y)
BUFFER数据缓冲区大小INCTYPE增量导入类型
FROMUSER所有人用户名列表INDEXES导入索引 (Y)
FILE输入文件 (EXPDAT.DMP)COMMIT提交数组插入 (N)
TOUSER用户名列表ROWS导入数据行 (Y)
SHOW只列出文件内容 (N)PARFILE参数文件名
TABLES表名列表LOG屏幕输出的日志文件
IGNORE忽略创建错误 (N)CONSTRAINTS导入限制 (Y)
关键字说明(默认)关键字说明(默认)
DESTROY覆盖表空间数据文件 (N)INDEXFILE将表/索引信息写入指定的文件
SKIP_UNUSABLE_INDEXES跳过不可用索引的维护 (N)FEEDBACK每 x 行显示进度 (0)
TOID_NOVALIDATE跳过指定类型 ID 的验证FILESIZE每个转储文件的最大大小
STATISTICS始终导入预计算的统计信息RESUMABLE遇到与空格有关的错误时挂起 (N)
RESUMABLE_NAME用来标识可恢复语句的文本字符串RESUMABLE_TIMEOUTRESUMABLE 的等待时间
COMPILE编译过程, 程序包和函数 (Y)

下列关键字仅用于可传输的表空间

关键字说明(默认)
TRANSPORT_TABLESPACE导入可传输的表空间元数据 (N)
TABLESPACES将要传输到数据库的表空间
DATAFILES将要传输到数据库的数据文件
TTS_OWNERS拥有可传输表空间集中数据的用户

以下为经常用到的关键字

--如果要对dmp文件进行压缩,可以加上compress=y
--STATISTICS 始终导入预计算的统计信息。如果表很大,导入统计信息会花很长时间。如果不想导入导出统计信息,可以在语句后追加statistics=none。比如在导入数据库的过程中,出现“IMP-00003:遇到ORACLE错误20001  Invalid or inconsistent input values”的错误。加上了“statistics=none”之后,就没有问题了。
--IGNORE   忽略创建错误 (N)
--GRANTS 导入权限 (Y)
1.1导出 #
  • 模式一:全量导出(需要具备dba权限,慎用)

    --如果要对dmp文件进行压缩,可以加上compress=y
    --STATISTICS 始终导入预计算的统计信息。如果表很大,导入统计信息会花很长时间。如果不想导入导出统计信息,可以在语句后追加statistics=none
    --full=y是导出整个文件
    exp 用户名/密码@数据库实例 owner=用户名 file=文件存储路径 log=日志存储路径 full=y
    
    --例子
    exp nnjy/nnjy@10.4.131.30:1521/ora11g file=d:/export/nnjy.emp log=d:/export/nnjy.log full=y
    
    exp nnjy/nnjy@dl30 file=d:/export/nnjy.emp log=d:/export/nnjy.log full=y compress=y
    
  • 模式二:导出指定用户(推荐使用)(可以导出一个或多个用户)

    --如果要对dmp文件进行压缩,可以加上compress=y
    --导出一个用户
    exp 用户名/密码@数据库实例 owner=用户名 file=文件存储路径 log=日志存储路径 owner=指定用户
    
    --导出多个用户(需具备dba权限)
    exp 用户名/密码@数据库实例 owner=用户名 file=文件存储路径 log=日志存储路径 owner=(指定用户1,指定用户2,指定用户3)
    
    --例子
    exp nnjyu33/nnjyu33@10.4.131.30:1521/ora11g owner=nnjyu33 file=d:/nnjyu33.emp log=d:/nnjyu33.log
    
    exp nnjyu33/nnjyu33@dl30 owner=nnjyu33 file=d:/nnjyu33.emp log=d:/nnjyu33.log compress=y
    
    --将数据库中system用户与sys用户导出(需要具备dba权限)
    exp system/manager@TestDB file=E:\sampleDB.dmp owner=(system,sys)
    
  • 模式三:导出指定表(可以导出一个或多个表)

    --导出一个表
    exp 用户名/密码@数据库实例 owner=用户名 file=文件存储路径 log=日志存储路径 owner=指定用户 tables=(指定表)
    
    --导出多个表
    exp 用户名/密码@数据库实例 owner=用户名 file=文件存储路径 log=日志存储路径 owner=指定用户 statistics=none tables=(指定表1,指定表2,指定表3)
    
    exp nnjy/nnjy@dl30 file=E:\TFF1.dmp log=E:\TFF1.log tables=(TFF1)
    
    exp nnjy/nnjy@dl30 file=E:\TFF1F2.dmp log=E:\TFF1F2.log tables=(TFF1,TFF2)
    
  • 模式四:导出指定表的指定数据

    exp nnjy/nnjy@dl30 file=文件存储路径 log=日志存储路径 tables=(指定表1) query=\where条件\"
    
    --需要使用\转义
    exp nnjy/nnjy@dl30 file=E:\conTFF1.dmp log=E:\conTFF1.log tables=(TFF1) query=\"where ATFF11='A01'\"
    
1.2导入 #
  • 模式一:全量导入(需要具备dba权限,慎用)

    --ignore:是否忽略创建错误(已存在的表不重复导入)
    imp 用户名/密码@数据库实例 file=文件存储路径 full=y ignore=y
    
    --例子
    imp nnjy/nnjy@@dl30 file=e:/nnjy_db.dmp full=y ignore=y
    
  • 模式二:导入指定用户(推荐)

    imp 用户名/密码@数据库实例 file=文件存储路径 fromuser=资源用户名 touser=目标用户名 ignore=y
    
    --例子
    --grants=n 不导入权限
    imp nnjy/nnjy@dl30 file=E:\nnjy_db.dmp fromuser=nnjy touser=nnjy grants=n
    
  • 模式三:导入指定表

    imp 用户名/密码@数据库实例 file=文件存储路径 owner=指定用户 tables=(指定表)
    
    imp nnjy/nnjy@dl30 file=e:/TFF1_db.dmp owner=nnjy tables=(TFF1)
    

2.一些实战总结 #

实战中,数据库上有些用户是从现场或者其他用户导过来的,表、大字段、索引表空间都还是原先的表空间,需要改到现在用户的表空间下,导完用户或者表看看是不是都在默认的表空间,不是的话参考下面的语句重建一下即可。

2.1表不在默认表空间的重建语句 #
select u.username,
       u.default_tablespace,
       s.segment_name,
       s.segment_type,
       s.tablespace_name,
       'alter table ' || segment_name || ' move tablespace ' ||
       u.default_tablespace || ';'
  from dba_users u, dba_segments s
 where u.username = s.owner
   and u.default_tablespace != s.tablespace_name
   and u.username ='CCRCWEB'
   and s.segment_type = 'TABLE';
2.2大字段表空间不在默认表空间中的重组语句 #
SELECT T.TABLE_NAME,
       T.COLUMN_NAME,
       T.SEGMENT_NAME,
       T.TABLESPACE_NAME,
       'ALTER TABLE ' || T.TABLE_NAME || ' MOVE LOB(' || T.COLUMN_NAME || ') STORE AS ' || T.SEGMENT_NAME || ' (TABLESPACE ' || 'CCRCDATA' || ' DISABLE STORAGE IN ROW  CHUNK 16384  RETENTION  FREEPOOLS 1  NOCACHE);'
        FROM USER_LOBS T
 WHERE T.TABLESPACE_NAME <> 'CCRCDATA';
2.3索引重建语句 #
select s.segment_name,
       s.segment_type,
       s.tablespace_name,
       'alter index ' || segment_name || ' rebuild tablespace CCRCDATA;'
  from user_segments s
 where s.segment_type = 'INDEX' and tablespace_name<>'CCRCDATA';
--实战使用的重建索引语句
select 'alter index ' || index_name ||
       ' rebuild tablespace WHRSRCDATA;'
  from user_indexes;

3.数据泵导入及一些问题 #

--新建directory并授权
create directory dirdp as 'E:\nmhf';
grant read,write on directory dirdp to system;

--nmgjy是dmp中的用户,nmgjy_cs是要导入的用户
impdp nmgjy_cs/nmgjy_cs DIRECTORY=dirdp dumpfile=nmgrlzy_cs.dmp REMAP_SCHEMA=nmgjy:nmgjy_cs

impdp nmgjy/nmgjy DIRECTORY=dirdp dumpfile=nmgrlzy_cs.dmp REMAP_SCHEMA=nmgjy:nmgjy

impdp nmgrlzy_cs/nmgrlzy_cs DIRECTORY=dirdp dumpfile=nmgrlzy_cs.dmp REMAP_SCHEMA=nmgrlzy:nmgrlzy_cs

impdp nmgrlzy_zs/nmgrlzy_zs DIRECTORY=dirdp dumpfile=nmgrlzy.dmp REMAP_SCHEMA=nmgrlzy:nmgrlzy_zs

--还可以切换表空间
impdp nmgjy_cs/nmgjy_cs DIRECTORY=dirdp dumpfile=nmgrlzy_cs.dmp REMAP_SCHEMA=nmgjy:nmgjy_cs remap_tablespace=EXAMPLE:newtablespace,EXAMPLE_TEMP:newtablespace_temp

--也可以使用系统自带的directory
impdp system/admin@DNACLIENT directory=DATA_PUMP_DIR dumpfile=example.DMP REMAP_SCHEMA=olduser:newuser remap_tablespace=EXAMPLE:newtablespace,EXAMPLE_TEMP:newtablespace_temp

--注意:
1、此处directory使用了系统自带的,如果需要自定义,请使用 create directory命令创建;

2、remap_tablespace多个表空间转换用逗号隔开。