1. 数据导入导出
1.1exp/imp 模式
exp/imp有四种模式,即:full(全库导出), owner(用户导出), table(表导出), tablespace(表空间导出).
(1)full( 全库导出):
导出除ordsys,mdsys,ctxsys,ordplugins,lbacsys 这些系统用户之外的所有用户的数据.需要用户具备exp_full_database
(2)owner( 用户导出):
导出某个或某些用户的所有权限和数据.
(3)tables( 表导出):
导出某些表(可以是不同用户的)的结构和数据.
(4)tablespace( 表空间导出):
表空间导出数据.
1.2exp/imp 参数
(1)exp 参数
exp help=y
●userid:用户名/口令
●full:导出整个文件(n),这个用于导出整个数据库,在rows=n一起使用时,可以导出整个数据库的结构
●buffer:数据缓冲区大小,每次得到缓存的数据;buffer用于指定提取行数据时的缓冲区尺寸。通过设置该参数,可以确定导出数组的提取尺寸。可以按照公式rows_in_array*maximun_row_size确定buffer的设置,即表中行的最大值乘以总的行数。buffer默认为4k,并非buffer的值越大越好,buffer定义了每一次读取导出文件的数据量,设的越大,就越减少export进程读取数据的次数,从而提高导入效率。buffer的大小取决于系统应用、数据库规模,通常来说,设为百兆就足够了。
●owner:所有者用户名列表
●file:输出文件(expdat.dmp)
●tables:表名称列表
●compress:导入到一个区(n),导出的同时合并碎块,尽量把数据压缩到initial的EXTENT里,默认是N,一般建议使用。DIRECT参数将告诉EXP直接读取数据,而不像传统的EXP那样,使用SELECT来读取表中的数据,这样就减少了SQL语句处理过程。一般也建议使用。不过有些情况下DIRECT参数是无法使用的。
●recordlength:定义了Export I/O缓冲的大小,作用类似于常规路径导出使用的BUFFER参数,默认为buffer选项值。建议设置RECORDLENGTH参数为最大I/O缓冲,即65535(64kb)。
●grants:导出权限(y)
●indexes:导出索引(y)
●direct:直接路径(n),即常规导出,常规导出不能使用recordlength参数。当为Y时会采用直接导出方式,直接导出不能使用query子查询和buffer参数。
●triggers:导出触发器(y)
●log:屏幕输出的日志文件
●statistics:分析对象(estimate),默认是estimate,表示导入时采用analyze table estimate语句生成统计信息;当设定为compute,表示导入时使用analyze table compute生成统计信息;还可以设定为none表示导入时不生成统计信息。
●rows:导出数据行(y)
●parfile:参数文件名
●consistent:交叉表一致性,consistent=y冻结来自其它会话的对export操作的数据对象的更新,这样可以保证dump结果的一致性。但这个过程不能太长,以免回滚段和联机日志消耗完
●constraints:导出约束条件(y)
●feedback:每x行显示进度(0)
●filesize:每个转储文件的最大大小
●flashback_scn:用于回调会话快照的scn
●flashback_time:用来获得最接近于指定时间的scn的时间
●query:用来导出表的子集的选择子句
●resumable:遇到与空格有关的错误时挂起(n)
●resumable_name:用来标识可恢复语句的文本字符串
●resumable_timeout:resumable的等待时间
●tts_full_check:对tts执行完全或部分相关性检查
●tablespaces:要导出的表空间列表
●transport_tablespace:导出可传输的表空间元数据(n)
●template:调用ias模式导出的模板名称
(2)imp 参数
●userid:用户名/口令
●full:导入整个文件(n)
●buffer:数据缓冲区大小
●fromuser:所有人用户名列表
●file:输入文件(expdat.dmp)
●touser:用户名列表
●show:只列出文件内容(n)
●tables:表名列表
●ignore:忽略创建错误(n)
●recordlength:io记录的长度
●grants:导入权限(y)
●indexes:导入索引(y)
●commit:提交数组插入(n)
●rows:导入数据行(y)
●parfile:参数文件名
●log:屏幕输出的日志文件
●constraints:导入限制(y)
●destroy:覆盖表空间数据文件(n)
●indexfile:将表/索引信息写入指定的文件
●skip_unusable_indexes:跳过不可用索引的维护(n)
●feedback:每x行显示进度(0)
●toid_novalidate:跳过指定类型id的验证
●filesize:每个转储文件的最大大小
●statistics:始终导入预计算的统计信息
●resumable:遇到与空格有关的错误时挂起(n)
●resumable_name:用来标识可恢复语句的文本字符串
●resumable_timeout:resumable的等待时间
●compile:编译过程,程序包和函数(y)
下列关键字仅用于可传输的表空间
●transport_tablespace:导入可传输的表空间元数据(n)
●tablespaces:将要传输到数据库的表空间
●datafiles:将要传输到数据库的数据文件
●tts_owners:拥有可传输表空间集中数据的用户
1.3exp/imp 应用举例
(1) 导出全库,需有exp_full_database权限
exp system/admin@//10.138.1.100:1521/rac file=(C:\dmp\full_database01.dmp,C:\dmp\full_database02.dmp) log=C:\dmp\full_database01.log
buffer=10485760
compress=y
consistent=y
feedback=1000
filesize=300M
full=y
(2) 导出schema
exp system/admin@//10.138.1.100:1521/pdb
file=(C:\dmp\owner01.dmp,C:\dmp\owner02.dmp)
owner=(user1,user2)
flashback_scn=2535623
log=C:\dmp\owner.log
direct=y
rows=y
compress=y
feedback=1000
recordlength=10485760
filesize=100m
statistics=estimate
exp c##ogg/admin@//10.138.2.100:1521/rac file=exp.dmp log=exp.log tables=c##ogg.t1,c##ogg.t2 compress=y buffer=100000000 filesize=1g feedback=1000000 consistent=y indexes=y constraints=y triggers=y recordlength=65535 query=\'where v1 like \'\'u\%\'\'\'
(3) 导出表
exp user1/admin@//10.138.1.100:1521/pdb
file=(C:\dmp\table01.dmp,C:\dmp\table02.dmp)
log=C:\dmp\table.log tables=(aa_obejct,aa_table)
query='where owner=''SYS'''
compress=yes
buffer=10485760
indexes=no
grants=yes
rows=yes
statistics=estimate
constraints=yes
feedback=10000
filesize=300M
imp c##ogg/admin file=/home/oracle/exp1.dmp log=/home/oracle/imp.log tables=t1 fromuser=c##rman touser=c##ogg indexes=n constraints=n grants=n buffer=100000000 recordlength=65535 feedback=10000000 commit=y ignore=y rows=y
(4) 可传输表空间
自包含: 表示用于传输的内部表空间集没有引用指向外部的表空间集
自包含又分为两种:一种自包含表空间集 第二为:完全(严格)自包含表空间集
常见的一下情况是违反自包含原则的
**●**索引在内部表空间集,而表在外部表空间集(相反的,如果表在内部表空间集,而索引在外部表空间集,则不违反自包含原则)
**●**分区表一部分区在内部表空间集,一部份在外部表空间集(对于分区表,要么全部包含在内部表空间集中,要么全不包含)
**●**如果在传输表空间同事传输约束,则对于用完整性约束,约束指向的表在外部表空间集,则违反自包含约束,如果不传输约束,则与约束指向无关。
**●**表在内部表空间集,而lob列在外部表空间集,则违反自包含约束。
①检查自包含
SQL> exec dbms_tts.transport_set_check('TB1',true); #自包含检查
SQL> exec dbms_tts.transport_set_check('TB1', true, true); #严格自包含检查
此时发现index在users表空间,可两张表一起检查;
SQL> exec dbms_tts.transport_set_check('TB1,USERS',true,true);
sql> select * from transport_set_violations;
这个视图没数据,表示是自包含;
②导出导入表空间
**●**将表空间置为只读;
SQL> alter tablespace users read only;
SQL> alter tablespace tb1 read only;
exp 'sys/admin@//10.138.1.100:1521/rac as sysdba'
file=c:\dmp\tablespace.dmp
tablespaces=(tb1,users)
transport_tablespace=y
●导出表空间
exp 'sys/admin@//10.138.1.100:1521/pdb as sysdba' file=c:\dmp\tablespace.dmp tablespaces=(tb1,users) transport_tablespace=y
●转移需要数据
将导出的dmp文件传输到目标数据库上,执行导入;
●导入数据
imp 'sys/admin@//10.138.1.100:1521/pdb as sysdba' file=c:\dmp\tablespace.dmp tablespaces=(tb1,users) transport_tablespace=y datafiles=('+FF/tb1.dbf','+FF/users.dbf')