现在的位置: 首页 > 综合 > 正文

备份恢复9——逻辑备份与恢复(empdp/impdp)

2013年09月08日 ⁄ 综合 ⁄ 共 15552字 ⁄ 字号 评论关闭

1、expdp和impdp简介

数据泵导出工具(expdp):使用expdp将数据库对象的元数据(对象定义) 或者 数据 导出到转储文件中。

数据泵导入工具(impdp):使用impdp将转储文件的数据库对象的元数据(对象结构定义) 或者 数据 导入到oracle数据库中。

数据泵的工作流程是这个样子的:

1)在操作系统命令行执行 命令。

2)expdp,impdp命令调用DBMS_DATAPUMP  PL/SQL包,这个api提供高速的导出导入功能。

3)当data移动的时候,data pump会自动选择direct path 或者external table mechanism 或者两种方式结合,当matedata(元数据,即数据定义)移动的时候,data pump 会使用DBMS_METADATA  PL/SQL包,metadata API 会将元数据存储在XML里面,所有的进程都能load和unload这些元数据。

因为data pump 调用的是服务器端的API, 所以当一个任务被调度或者执行的时候。客户端就可以退出连接,任务job会在server端继续执行。随后通过客户端实用程序,从任何地方检查任务的的状态和进行修改。

2、使用expdp/impdp

使用数据泵导出包括:导出表,导出方案,导出表空间,导出数据库。

expdp工具可以带有多个命令行选项,下面详细介绍expdp工具的所有命令选项。

1) ATTACH : 用于在客户会话与已存在导出导入作业之间建立关联。语法如下:

 ATTACH = [schema_name.] job_name

如上所示,schema_name用于指定方案名,job_name用于指定导出作业名。注意,如果要使用ATTACH选项,那么在命令行除了连接字符串和attach选项之外,不能指定任何其他选项。示例:

expdp  scott /tiger ATTACH = scott.export_job

impdp  scott/tiget ATTACH = import_job


2)CONTENT:用于指定要导出导入的内容,其默认值ALL, 语法如下:

 CONTENT = {ALL | DATA_ONLY | METADATA_ONLY} 

  如上所示,当设置CONTENT选项为ALL时,会导出导入对象定义及其所有数据。当设置选项为DATA_ONLY时,只会导出导入对象数据;当设置选项为METADATA_ONLY时,只会导出导入对象定义。示例如下:

expdp  scott/tiger  DIRECTORY = dump DUMPFILE = a.dmp  CONTENT = METADATA_ONLY


3) DIRECTORY :该选项用于指定转储文件和日志文件所在的位置。语法如下:

DIRECTORY = directory_object  。 其中directtory _object 用于指定目录对象名,注意:目录对象是使用CREATE DIRECTORY 语句所建立的对象,而不是os目录。示例:

expdp scott/tiger  DIRECTORY = dump DUMPFILE = a.dmp

impdp scott/tiger directory = dump  dumpfile = a.dmp tables= emp

4)DUMPFIL : 用于指定转储文件的名称,默认名为expdp.dmp。 语法如下:

  DUMPFILE =[ directory_object:] file_name[ ,/..]  

 directory_object指定目录对象名。file_name用于指定转储文件名。注意,如果不指定directory_object. 那么导出工具会自动使用directory选项所  指定的目录对象。示例:

expdp scott/tiger DIRECTORY = dump1  DUMPFILE = dump2:a.dmp  —— 这个就会使用dump2目录,而不会使用DIRECTORY所指定的目录。

impdp scott/tiger directory=dump  dumpfile = a.dmp  tables=emp


5)ESTIMATE:指定估算被导出导入表所占用的磁盘空间的方法。默认值为BLOCKS,语法如下:

ESTIMATE = {BLOCKS | STATISTICS} 当设置选项为BLOCKS时,oracle后按照目标对象所占用的数据块个数乘以数据块尺寸估算对象占用的空间;当设置该选项为statistics时,oracle会根据最近的统计值估算对象占用的空间,示例:

expdp scott/tiger  TABLES= emp ESTIMATE = STATISTICS  DIRECTORY = dump  DUMPFILE = a.dmp.

impdp  scott/tiger  TABLES= sales NETWORK_LINK=db_link   DIRECTORY = dump  ESTIMATE = STATISTICS 


6) ESTIMATE_ONLY : 该选项用于指定是否只估算导出作业所占用的磁盘空间,其默认值为n,语法如下:

  ESTIMATE_ONLY={Y|N} 

   当设置该选项为Y时,导出作业只会估算对象所占用的磁盘空间,而不会执行导出操作;当设置该选项为n时,导出作业不仅会估算对象所占用的磁盘空间。而且会执行导出操作。示例:

expdp scott/tiger ESTIMATE_ONLY = Y NOLOGFILE =y 


7)EXCLUDE : 指定当执行导出导入操作时要排除的对象类型或相关对象。语法如下:

 EXCLUDE = object_type [ :name_clause] [ ,...]  

object_type 用于指定要排除的类型,name_clause用于指定要排除的具体对象。注意,EXCLUDE 和 INCLUDE 不能同时使用。示例:

expdp  scott/tiger  DIRECTORY = dump DUMPFILE= a.dmp  EXCLUDE = VIEW;

impdp scott/tiger directory=dump dumpfile=a,dmp exclude=cluseter

8)FILESIZE : 用于指定导出文件的最大尺寸,其默认值为0(标识文件尺寸无限制)语法:

FILESIZE = integer [B | K | M | G ]  示例:

expdp scott/tiger  DIRECTORY= dump  DUMPFILE = hr_3.dmp  FILRSIZE= 3M

9) FLASHBACK_SCN :用于指定导出导入特定scn时刻的表数据,语法如下: 

FLASHBACK_SCN = scn_value

如上所示,scn_value 用于标识scn值,当设置该选项时,oracle 会激活flashback特质。注意FLASHBACK_SNC 和 FLASHBACK_TIME 不能同时使用,示例:

expdp scott/tiger DIRECTORY = dump DUMPFILE = a.dmp  FLASHBACK_SCN = 385823;

impdp scott/tiger directory = dump flashback_scn = scn_number network=db_link

10)FLASHBACK_TIME :用于指定导出导入特征时间点的表数据。语法如下:

FLASHBACK_TIME=" to_timestamp(time-value)" 

注意,FLASHBACK_TIME 和 FLASHBACK_SCN 不能同时使用。 示例:

expdp scott/tiger directory = dump DUMPFILE = a.dmp  FLASHBACK_TIME = "to_timestamp('2012-05-12 14:35:24 ' , ' yyyy-mm-dd hh24:mi:ss')"

impdp scott/tiger directory = dump  FLASHBACK_TIME = "to_timestamp('2012-05-12 14:35:24 ' , ' yyyy-mm-dd hh24:mi:ss')"


11) FULL :用于指定数据库模式导出,其默认值为N,语法如下:

 FULL={Y| N} 

选项为y时,标识执行数据库导出,导入转储文件的所有内容。注意,当执行数据库导出时,

数据库用户必须具有exp_full_database 角色或dba角色 ,那么导入该文件时,用户必须具有imp_full_database
角色或dba角色 
,

expdp scott/tiger  DIRECTORY= dump  DUMPFILE= full.dmp  FULL = y

impdp system/manager directory=dump dumpfile = a.dump full= y 

12) HELP :用于指定是够显示expdp命令行或导入选项的帮助信息,其默认值为n,语法如下:

HELP={y | n} 当设置选项为y时,会显示导出选项的帮助信息。示例如下:

expdp help = y

impdp help = y


13)INCLUDE : 用于指定导出导入时要包含的对象类型及相关对象。语法如下:

INCLUDE = object_type [:name_clause] [,....]

如上所示,object_type 用于指定要导出的队形类型,name_clause 用于指定要导出的对象名。注意,include和exclude选项不能同时使用,示例:

expdp scott/tiger DIRECTORY = dump DUMPFILE = a.dmp  INCLUDE = TABLE

impdp scott/tiger  directory = dump dumpfile = a.dmp  include = view


14) JOB_NAME 指定导出导入作业的名称,默认为SYS_XXX.。前文说过,调用的API都是job,注意作业名称不能超过30字符,示例:

expdp scott/tiger DIRECTORY = dump  DUMPFILE = a.dmp  JOB_NAME = empjob_name

impdp scott/tiger DIRECTORY = dump  DUMPFILE = a.dmp  JOB_NAME =impjob_name

15) LOGFILE: 用于指定导出导入日志文件的名称,默认名称为export.log 语法如下:

LOGFILE = [directory_object:] file_name

 这里directory_object 用于指定目录对象名称,file_name用于指定导出日志文件名。注意,如果不指定directory_object,那么导出作业会自动使用DIRECTORY的相应选项值,示例如下:

expdp scott/tiger  DIRECTORY = dump DUMPFILE= a.dmp  logfile = a.log

impdp scott/tiger  directory=dump  dumpfile = a.dmp  logfile = a.txy

16) NETWORK_LINK  用于指定数据库链名。如果要将远程数据库对象导出到本地实例的转储文件中,必须设置该选项。语法如下:

NETWORK_LINK = source_database_link 

这个source_database_link用于指定数据库链名。注意,对象表不支持远程导出。对于导入时,导入工具会将远程数据库对象导入到本地数据库,并且使用该选项时不能指定dumpfile。示例:

expdp scott/tiger DIRECTORY = dump  DUMPFILE= a.dmp  NETWORK_L;INK = orcl

impdp scott/tiger  directory = dump  tables = emp network_link=orcl

 

17) NOLOGFILE : 用于指定禁止生成导出导入日志文件,默认为n(表示不禁止,即允许生成)语法如下:

NOLOGFILE = {Y | N} 当设置选项为y时,导出导入操作不会生成日志文件。示例:

expdp scott/tiger  DUMPFILE = dump:a.dump  NOLOGFILE = Y

impdp scott/tiger directory=dump  dumpfile=a.dmp  nologfile=y

18) PARALLEL :用于指定指定导出导入操作的并行进程个数,默认值为1.语法如下:

  PARALLEL = integer  

 通过执行并行导出操作,可以加快导导入出速度。示例:

expdp scott/tiger  DIRECTORY = dump DUMPFILR = a.dmp  PARALLEL = 3

impdp scott/tiger  DIRECTORY = dump DUMPFILR = a.dmp  PARALLEL = 3

19 ) PARFLE : 用于指定导出导入参数文件的名称。语法如下:

PARFILE = [directory_path] file_name

如上所示:directory_path 用于指定参数文件所在的目录,file_name用于指定参数文件名。参数文件(parm.txt) 示例如下:

TABLES = DEMP , EMP

DIRECTORY = dump 

DUMPFILE = tab.dmp 

 注意,在expdp/impdp 参数文件中不能包含parafile选项,另外,如果在使用参数文件时不指定directory_path 那么导出导入工具会将当前的目录作为参数文件的路径。使用参数文件的示例如下:

expdp scott/tiget PARFILE = d:\dump\parm.txt

impdp scott/tiget PARFILE = d:\dump\parm.txt

20 ) QUERY 用于指定过滤导出导入数据的where条件,语法如下:

QUERY = [schema.] [table_name:] query_alause  

 这里,schema用于指定方案名,table_name用于指定表名,query _clause用于指定条件限制子句。注意query选项不能与 CONNECT= METADATA_ONLY  , ESTIMATE_ONLY, TRANSPORT_TALESPACES 等选项同时使用。示例如下:

expdp scott/tiger DIRECTORY = dump DUMPFILE = a.dmp  TABLES = emp  QUERY = ' " wheree deptno=20" '

impdp scott/tiger directory = dump dumpfile=tab.dmp  tables=emp  query=' " where deptno=10 " '

21.1)REMAP_DATAFILE :(只用于impdp)该选项用于将源数据文件的名称转变为目标数据文件名称,当在不同平台之间搬移表空间时可能需要使用该选项。语法如下:

REMAP_DATAFILE = source_datafile:target_datafile

如上所示:source_datafile用于指定源数据库的数据文件名,target_datafile用于指定目标数据库的数据文件名。注意,当使用该选项时要求用户必须具有imp_full_database角色或者dba角色,示例:

impdp scott/tiger full=y  directory=dump dumpfile = full.cmp remap_datafile='DB1$:tbs6.f ' : ' /db1/hrdata/payroll/tbs6.f '

21.2)REMAP_SCHEMA : (只适用于impdp)用于将原方案所有对象装载到目标方案中,语法如下:

REMAP_SCHEMA=source_schema:target_schema

如上,source_schema指定 原方案,target_schema用于指定目标方案。注意,使用该选项要求用户必须具有IMP_FULL_DATABASE角色或者dba角色。示例如下:

impdp system/manager directory=dump  dumpfile=tab.dmp  remap_schema=scott :system

21.3) REMAP_TABLESPACE:(是适用于impdp)用于将源表空间的所有对象导入到目标表空间,示例如下:

REMAP_TABLESPACE= source_tablespace : target_tablespace

如上,source_tablespace指定 源表空间,target_tablespace用于指定目标表空间。

impdp  system/manager  directory =dump dumpfile=tab.dmp  REMAP_TABLESPACE=user01 : user02

21.4)REUSE_DATAFILES : 用于指定在建立表空间时是否需要覆盖已经存在的数据文件,默认值为n,语法如下:

REUSE_DATAFILES={Y | N }

如上所示:当设置选项为y时,在执行create tablespace命令时会覆盖已经存在的数据文件;当设置选项为n时,如果文件已经存在,那么在执行create tablespace命令时会显示错误信息:

impdp system/manager  directory = dump  dumpfile=tab.dmp  reuse_datafiles=y

21.5)  SCHEMAS: 用于指定执行方案模式导出导入,默认为当前用户方案。语法如下:

SCHEMAS = dvhrms_name [,...] 

如上所示,schema_name 用于指定执行方案名,用户可以导出导入自身方案,但如果要导出导入其他方案,则要求用户必须具有exp/imp_full_database角色或者dba角色,示例如下:

expdp system/manager DIRECTORY= dump DUMPFILE= a.dmp SCHEMA= scott,system

impdp system/manager DIRECTORY= dump DUMPFILE= a.dmp SCHEMA= scott

22.1) SKIP_UNUSABLE_INDEXS :(只适用于impdp)用于指定在导入时是否需要跳过不可使用的索引,其默认值为n。

SKIP_UNUSABLE_INDEXES={Y | N}

如上所示:当选项为y时,会跳过不可用的索引。当设置该选项为n时,会导入不可用的索引。示例:

impdp system/manager  directory=dump  dumpfile=full.dmp  skip_unusable_indexes=y

22.2) SQLFILE: (只适用于impdp) 用于指定将导入操作需要执行的所有ddl语句写入到sql脚本文件中。语法如下:

SQLFILE = [directory_object : ] file_name

如上所示,directory_object用于指定目录对象名,file_name用于指定要生成的sql语句文件名。注意,如果不指定directory_object,那么导入工具会在directory选项所对应的os目录中建立sql脚本。示例如下:

impdp scott/tiger directory=dump dumpfile = tab.dmp  SQLFILE= a.sql


22.3) STATUS :指定显示导出导入作业进程的详细状态,默认值为0,语法如下: 

STATUS = integer

如上所示,integer用于指定显示导出导入作业状态的时间间隔(单位:秒)。当指定了该选项之后,每隔特定的时间间隔就会显示作业完成的百分比,示例:

expdp system/manager DIRECTORY = dump  DUMPFILE= a.dmp FULL = y STATUS = 30 

impdp  system/manager DIRECTORY = dump  DUMPFILE= a.dmp FULL = y  STATUS = 10 

22.4) STREAMS_CONFIGURATION:(只适用于impdp)该选项用于确定是否要导入流元数据(strean metadata) 默认值为y

sreams_donfiguraton = {y | n }

如上所示:当设置选项为y时,会导入流元数据;当设置选项为n时,不会导入流元数据。示例如下:

impdp system/manager directory=dump  dumpfile = full.dmp  tables=scott.emp  streams_configration=n

23.1) TABLE_EXISTS_ACTION: (只适用于impdp) 该选项用于指定档表已经 存在时,导入作业应该执行的操作,默认值为SKIP,语法如下:

TABLE_EXISTS_ACTION={SKIP | APPEND | TRUNCATE | REPLACE }

如上所示:当设置为SKIP时,导入作业会跳过已经很存在的表并处理下一个对象;当设置该选项为APPEND时,导入作业会为表追加数据;当设置为TRUNCATE时,导入作业会截断表,然后为其追加新数据;当设置该选项为REPLACE时,导入作业会删除已经存在表,重新建表并追加数据。注意,TRUNCATE选项不适用于簇表和NETWORK_LINK选项,示例:

impdp scott/tiger directory =dump dumpfile=tab.dmp  table_exists_action=append

23.2) TABLES :用于指定表模式导出导入,语法:

TABLES=[schema_name.] table_name [:partition_name] [ , ....] 

schema_name用于指定方案名,table_name用于指定要导出导入的表名,partition_name用于指定要导出导入的分区名。注意,用户可以直接导出其自身方案的表,单如果要导出其他方案的表,则要就用户必须具有exp_full_database角色或者dba角色 ,示例:

expdp system/manager DIRECTORY=dump DUMPFILE= a.dmp tables=scott.dept scott.emp

impdp  scott/tiger  DIRECTORY=dump DUMPFILE= a.dmp tables=emp

24) TABLESPACES  :指定要导出的表空间列表,语法如下:TABLESPACES= tablespace_name[ ,...]

当指定了该选项后,会到处该表空间上所有的表,示例:

expdp system/manager DIRECTORY= dump DUMFILE= a.dmp TABLESPACES= user01;

impdp scott/tiger DIRECTORY= dump DUMFILE= a.dmp TABLESPACES= user01;

25.1)TRANSFORM :( 只适用于impdp) 用于指定是够需要修改建立对象的ddl语句,语法如下:

TRANSFORM = transform_name:value [:object_tyoe]

如上所示,transform_name用于指定转换名,其中segment_attributes用于标识段属性(物理属性,存储属性,表空间,日志等信息)storage用于标识段存储数据;value用于指定是够要包含段属性或段存储属性(Y:包含 , N,不包含) object_type用于指定对象类型,示例如下:

impdp scott/tiger  DIRECTORY=dump  DUMPFILE=tab.dmp  TRANSRORM =segment_attributes:n:table

25.2)TRANSPORT_DATAFILES: (只适用于impdp) 用于指定当搬移表空间时要被导入到目标数据库的数据文件名称,语法如下:

TRANSPORT_DATAFILES=datafile_name  示例:

impdp system/manager  directory=dum dumpfile=tts.dmp  transport_datafiles='/user01/data/tbs1.f '

25.3) TRANSPORT_FULL_CHECK. 该选项用于指定被搬移表空间和未搬移表空间关联关系的检查,其默认值为n,语法如下:

TRANSPORT_FULL_CHECK={Y | N}

如上所示,当设置该选项为Y时,导出导入作业会检查表空间之间的完整关系,如果表所在的表空间或其其索引所在的表空间只有一个表空间被搬移。则会显示错误信息,当设置该选项为n时,导出导入作业只会检查单端依赖,如果要搬移索引所在的表空间,单未搬移表所在的表空间,那么会显示错误信息; 但是如果要搬移表所在的表空间,未搬移索引所在的表空间,则不会显示错误信息。注意,当执行impdp时,该选项必须与NETWORK_LINK同时使用。示例:

expdb system/manager  DIRECTORY= dump DUMPFILE = b.dmp   TRANSPORT_TABLESPACES = user01  TRANSPORT_FULL_CHECK=Y;

impdb system/manager  DIRECTORY= dump   TRANSPORT_TABLESPACES = user01  NETWOEK_LINK=source_database_link  TRANSPORT_FULL_CHECK=Y  TRANSPORT_DATAFILES='/wkdir/data/user_01.f '

26) TRANSPORT_TABLESPACES 用于指定执行表空间模式导出导入,语法如下:

TRANSPORT_TABLESPACES = tablwspace_name [,..]  

这里tablespace_name表示要导出表空间名称,当搬移表空间时,要求数据库用户必须具有EXP/IMP_FULL_DATABASE角色或者dba角色。示例如下:

expdp system/manager  DIRECTORY = dump  DUMPFILE = b.dmp  TRANSPORT_TABLESPACE = user01;

impdp system/manager directory=dump  transport_tablespaces=tabs_6 NETWORK_LINK=source_database_link TRANSPORT_FULL_CHECK=y TRANSPORT_DATAFILES=‘/wkdir/data/tbs6.f ’

27) VERSION : 用于指定被导出对象的数据库版本,其默认值为COMPARIBLE 语法如下:

VERSION = {COMPATIBLE |LATEST | version_string }   当设置该数据项为COMPATIBLE时,会根据初始化参数COMPATIBLE生成对象元数据; 当设置该参数为LATEST 时,会根据数据库的实际版本生成对象元数据;version_string 用于指定数据库版本字符串,示例如下:

expdp scott/tiger  DIRECTORY = dump  DUMPFILE = c.dmp   VERSION = latest

impdp scott/tiger  DIRECTORY = dump  DUMPFILE = c.dmp   VERSION = latest


3、调用 expdp/impdp

当使用expdp工具时,必须首先建立directory对象,而且需要为数据库用户授予使用directory对象的权限,操作如下:

SQL> conn / as sysdba

SQL> create directory dump_dir as '/home/oracle/exp';

SQL>grant read , write on directory dump_dir to scott;

如果这个导出目录不想要了,可用下列语句删除:

SQL>drop  directory  dump_dir;

1.1、导出表:导出表是指将一个或者多个表的数据结构集齐数据存储到转储文件中,导出表是通过使用tables选项来完成的。普通用户只能导出自身方案表,如果要导出其他方案表,则要求用户必须具有exp_full_database 角色或 dba角色。注意,当使用导出表模式时,每次只能导出同属于一个方案的表,下面以导出scott方案的dept和emp表为例,说明导出表的方法。

expdp scott/tiger DIRECTORY = dump_dir  DUMPFIEL = tab.dmp  TABLES= dept,emp. 


1.2、导入表:当导入表时,既可以将表导入到源方案中,也可以蒋彪导入到其他方案中,注意如果要将表导入到其他方案,则必须制定:remap_schema选项。下面将表dept,emp分别导入到自身方案scott和方案system为例说明:

impdp scott/tiger directory=dump_dir  dumpfile=tab.dmp  tables=dept,emp

impdp system/manager directory=dump_dir  dumpfile=tab.dmp tables=scott.dept , scott.emp  remap_schema=scott : system

2.1、导出方案:是指将一个或多个方案的所有对象结构及数据  存储到转储文件中,导出方案是通过schemas 选项来完成的。普通用户只能导出自身方案。如果要导出其他方案,则要求用户必须有dba角色,或EXP_FULL_DATABASE角色,下面以导出system方案和scott方案的所有对象为例说明:

expdp system/manager directory = dump_dir dumpfile = schema.dmp schemas = system,scott


2.2、导入方案:普通用户只能导入自身方案。如果要导入其他方案,则要求用户必须有dba角色,或IMP_FULL_DATABASE角色。当导入方案时,既可以将方案的所有对象导入到原方案中,也可以将方案的所有队形导入到其他方案中。注意,如果要将方案对象导入到其他方案中,则必须制定remap_schema选项,

impdp scott/tiger directory=dump_dir  dumpfile=schema.dmp  schemas=scott

impdp system/manager directory=dump_dir  dumpfile=schema.dmp schemas = scott  remap_schema = scott : system


3.1、导出表空间:是指将一个或多个表空间的所有对象结构及数据  存储到转储文件中,导出表空间是通过tablespaces选项来完成的。导出表空间,要求用户必须有dba角色,或EXP_FULL_DATABASE角色,下面以导出user01和 user02为例说明:

expdp system/manager directory = dump_dir dumpfile = tablespace.dmp tablespaces = user01,user02。


3.2、导入表空间:是指将转储文件中的一个或多个表空间的所有对象结构及数据 装载到数据库中,导入表空间是通过tablespaces选项来完成的。

impdp system/manager directory = dump_dir dumpfile = tablespace.dmp tablespaces = user01

4.1、导出数据库:导出数据库是指将数据库的所有对象及数据存储到转储文件中,倒数数据库是通过full选项来完成的,导出数据库要求用户必须具有dba角色或exp_full_database角色,注意当导出数据库时,不会导出sys,ordsys,ordplugins,ctxsys。mdsys,lbacsys,xdb等方案对象。

expdp system/manager directory = dump_dir  dumpfile= full.dmp  full = y;

4.2、导入数据库:如果到处转储文件时要求用户必须具有exp_full_database 角色或者dba角色,那么导入数据库时也要求用户必须具有imp_full_database角色或者dba角色,示例如下:

impdp system/manager directory =dump_dir dumpfile = fill.dmp  full=y.

4、搬移表空间

同过查询动态性能视图v$transportable_platform可以显示在哪些os平台之间可以搬移表空间。

SQL> select platform_name from v$transportable_platform;

搬移表空间可以使用emp/imp工具,还可以使用expdp/impdp更快。但是搬移表空间有以下限制:

1)要求源数据库和目标数据库必须具有相同的数据库字符集和民族字符集,通过查询数据字典视图NLS_DATABASE_PARAMETERS,dba用户可以取得数据库字符集(NLS_CHARACTERSET)和民族字符集(NLS_NCHAR_CHARARCTERSET)

2)不能将表空间搬移到具有同名 表空间的目标数据库中,在10g之前,如果在目标数据库中存在同名表空间。那么表空间将无法搬移。但从10g开始,通过使用alter tablespace rename 命令可以修改元数据库表空间或目标数据库表空间的名称。

3)不能搬移system表空间和sys用户对象所在的表空间。

4)如果要将表空间搬移到其他os平台上,则必须将初始化参数compatible设置为10.0以上。

下面以在windows平台上将demo数据库的user02表空间搬移到orcl数据库中为例,说明搬移表空间的方法,具体操作步骤如下:

1、确定自包含表空间集合,自包含表空间集合是指具有关联关系的表空间集合。当搬移表空间是,如果两个表空间之间存在关联关系,则必须同时搬移这两个表空间。(就像一个表空间a含有表,另个一表空间b含有a表空间表的索引)。发生以下情况时,我们说违反了自包含表空间集合的规则,也就是不能搬移:

表空间集合含有sys方案对象。

表空间集合包含了索引所在的表空间,但是没有包含索引基表所在的表空间。

表空间集合没有包含分区表的所有分区。

表空间集合包含了表所在的表空间,但是没有包含其lob列所在的表空间。

在搬移之前,为了确保特定的表空间集合可以被搬移,必须先检查表空间集合是否为自包含的,通过执行包:DBMS_TTS的过程TRANSPORT_SET_CHECK可以完成这项任务,当执行 了该过程之后,系统会将违反自包含表空间集合规则的信息写入到临时表transport_set_violations 。当查询该临时表时,如果没有返回任何信息,则说明表空间集合是自包含的,否则会返回违反自包含表空间集合规则的详细信息。注意,执行DBMS_TTS包要求用户必须具有EXECUTE_CATALOG_ROLE角色,示例:

SQL> conn  system/manager 

SQL> execute sys.dbms_tts.tranport_set_check('user02' , true)

SQL > select * from sys.transport_set_violations  ——此时会显示一些违反自包含规则的信息。

为了确保成功执行搬移,可以删除其中的索引,或者将索引移动到其他表空间。

SQL > drop  index scott.dept_emp_idx; ——将产生冲突的索引删除。

2、生成要搬移的表空间集合。

首先将所有要搬移的表空间转变为只读状态,以确保其内容不会发生改变,示例:

SQL> alter tablespace user02  read only;

这时就可以使用数据泵导出工具搬移表空间集合了。注意,当生成要搬移的表空间集合时,要求用户必须具有emp_full_database角色或者dba角色。示例如下:

SQL > HOST expdp system/manager directory=dump_dir  dumpfile=transport.dmp  tranport_tablespaces=user02

3、传送转储文件和数据库文件到目标数据库。在生车了转储文件之后,可以使用任何拷贝工具(如cp命令等)将转储文件和自包含表空间集合的数据文件传送到目标数据库所在的机器的合适位置。本例假定demo数据库和orcl数据库在同一台机器上,所以在这里只是拷贝数据文件到相应的目录。示例:

SQL> host copy d:\demo\user02.dbf

 d:\oracle\oradata\orcl\user02.dbf

4、插入表空间到目标数据库:

在将这两个文件传送到目标数据库之后,就可以使用数据泵导入工具将表空间user02插入到目标数据库了。注意,插入表空间到数据库要求用户必须具有imp_full_database角色或者dba角色;另外,如果目标数据库有同名表空间,则需要执行alter tablespace rename命令修改表空间名称,因为demo数据库的标准块尺寸为4K,orcl数据库的标准块支持为8K,所以需要在orcl数据中分配非标准数据库高速缓存DB_4K_CACHE_SIZE,然后才能将表空间user02插入到orcl数据库,具体示例如下:

SQL> alter system set db_cache_size=20M;

SQL> alter system set db_4k_cache_size= 4M;

SQL.> HOST Impdp system/manager@orcl directory=dump_dir dumpfile=trandport.dmp  tranport_datafiles=d:\oracle\oradata\orcl\user02.dbf  remap_schema= scott: hr

 在执行了以上命令之后,就将user02表空间插入到目标数据库orcl中 了,应为user02表空间处于只读状态,所以为了在该表空间上执行dml和ddl操作,还应该将表空间转变为可续写状态:

SQL> alter tablespace user02 read  write;

http://blog.csdn.net/tianlesoftware/article/details/4674224

抱歉!评论已关闭.