Oracle中使用可传输表空间备份数据

可传输表空间:使用一组自包含、只读的表空间,只导出元数据,在操作系统层将这些表空间的数据文件拷贝至目标平台,并将元数据导入数据字典。在 Oracle9i 数据库和更低版本中,可传输表空间仅限于在目标数据库和源数据库都运行在同一操作系统平台上的少数情况下才有用 — 例如,您不能在 Solaris 和 HP-UX 平台之间传输表空间。在 Oracle 数据库 10g 中,这个局限消失了:只要操作系统字节顺序相同,您就可以在平台之间传输表空间。
对于可传输表空间有一个重要概念:自包含(Self-Contained)。
在表空间传输的中,要求表空间集为自包含的,自包含表示用于传输的内部表空间集没有引用指向外部表空间集。自包含分为两种:一般自包含表空间集和完全(严格)自包含表空间集。
常见的以下情况是违反自包含原则的:
索引在内部表空间集,而表在外部表空间集(相反地,如果表在内部表空间集,而索引在外部表空间集,则不违反自包含原则)。
分区表一部分区在内部表空间集,一部分在外部表空间集(对于分区表,要么全部包含在内部表空间集中,要么全不包含)。
如果在传输表空间时同时传输约束,则对于引用完整性约束,约束指向的表在外部表空间集,则违反自包含约束;如果不传输约束,则与约束指向无关。
表在内部表空间集,而lob列在外部表空间集,则违反自包含约束。
通常可以通过系统包DBMS_TTS来检查表空间是否自包含,验证可以以两种方式执行:非严格方式和严格方式。

以下是一个简单的验证过程:
以SYS用户执行非严格自包含检查(full_check=false):
telnet 172.19.111.38
SQL> connect / as sysdba
SQL> desc dbms_tts;
PROCEDURE DOWNGRADE
FUNCTION ISSELFCONTAINED RETURNS BOOLEAN
Argument Name                  Type                    In/Out Default?
------------------------------ ----------------------- ------ --------
TS_LIST                        CLOB                    IN
INCL_CONSTRAINTS               BOOLEAN                 IN
FULL_CHECK                     BOOLEAN                 IN
PROCEDURE KFP_CKCMP
PROCEDURE TRANSPORT_SET_CHECK
Argument Name                  Type                    In/Out Default?
------------------------------ ----------------------- ------ --------
TS_LIST                        CLOB                    IN
INCL_CONSTRAINTS               BOOLEAN                 IN     DEFAULT
FULL_CHECK                     BOOLEAN                 IN     DEFAULT
SQL> exec dbms_tts.transport_set_check('IPAS_ACCT_DATA', TRUE);
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
no rows selected

执行严格自包含检查(full_check=true):
SQL> exec dbms_tts.transport_set_check('IPAS_ACCT_DATA', TRUE, True);
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
VIOLATIONS
----------------------------------------------------------------------------------------
Index IPAS_ACCT_DATA.IND_ID in tablespace IPAS_ACCT_DATA points to table UTCORE.IPAS_ACCT_DATA in tablespace UTSERS
反过来对于USERS表空间来说,非严格检查也是无法通过的:
SQL> exec dbms_tts.transport_set_check('USERS', TRUE);
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
VIOLATIONS
----------------------------------------------------------------------------------------
Index IPAS_ACCT_DATA.IND_ID in tablespace USERS points to table UTCORE.IPAS_ACCT_DATA in tablespace IPAS_ACCT_DATA
但是可以对多个表空间同时传输,则一些自包含问题就可以得到解决:
SQL> exec dbms_tts.transport_set_check('USERS,IPAS_ACCT_DATA', TRUE, True);
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
no rows selected

表空间自包含确认之后,进行表空间传输就很方便了,注意必须以sys as sysdba身份进行导出导入操作,一般包含如下几个步骤。

1、在源库使表空间为只读。

telnet 172.19.111.38
$ sqlplus '/as sysdba'
SQL> set lines 1000
SQL> col file_name format a50
SQL> select tablespace_name,FILE_NAME from dba_data_files where tablespace_name='IPAS_ACCT_DATA';
TABLESPACE_NAME                FILE_NAME
------------------------------ --------------------------------------------------
IPAS_ACCT_DATA                 /opt/oracle/wacosdata/ipas_acct_data001.dbf
源库和目标要求compatible参数兼容:
SQL> show parameter compatible
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
compatible                           string      9.2.0
SQL> alter tablespace IPAS_ACCT_DATA read only;

2、从源库导出表空间。

$ exp tablespaces=IPAS_ACCT_DATA transport_tablespace=y file=exp_ts_IPAS_ACCT_DATA.dmp
Username: sys as sysdba
Password: change_on_install
$ ls -otr
...
-rw-r--r--   1 oracle     51200 Aug 20 19:03 exp_ts_IPAS_ACCT_DATA.dmp
dmp 文件只包含元数据(不是表空间的内容)因此它将非常小。

3、将文件 exp_ts_IPAS_ACCT_DATA.dmp 和 /opt/oracle/wacosdata/ipas_acct_data001.dbf 拷贝至目标主机。如果您使用 FTP,那么您将需要指定二进制选项。
$ ftp 172.19.111.34
ftp> bi
ftp> ha
ftp> prompt off
ftp> put exp_ts_IPAS_ACCT_DATA.dmp
ftp> put /opt/oracle/wacosdata/ipas_acct_data001.dbf
226 Transfer complete.
local: /opt/oracle/wacosdata/ipas_acct_data001.dbf remote: /opt/oracle/wacosdata/ipas_acct_data001.dbf
ftp> by
传输完后可以把源库表空间置为可读:
$ sqlplus '/as sysdba'
SQL> alter tablespace IPAS_ACCT_DATA read write;

4、在目标主机将表空间插入到数据库中。

telnet 172.19.111.34
$pwd
/opt/oracle
$ls -otr
-rw-r--r--   1 oracle     51200 Aug 21 11:10 exp_ts_IPAS_ACCT_DATA.dmp
$ls -l /opt/oracle/wacosdata/ipas_acct_data001.dbf
-rw-r-----   1 oracle   dba      1073750016 Aug 20 19:05 /opt/oracle/wacosdata/ipas_acct_data001.dbf
$imp tablespaces=IPAS_ACCT_DATA transport_tablespace=y file=exp_ts_IPAS_ACCT_DATA.dmp datafiles='/opt/oracle/wacosdata/ipas_acct_data001.dbf'
Username: sys as sysdba
Password: change_on_install
. importing SYS's objects into SYS
. importing WACOS's objects into WACOS
. . importing table          "PIMBALANCELOGDETAIL"
...
Import terminated successfully with warnings.
导入成功,时间飞快。

最后把该表空间置为可写,目标库可在此表空间读写数据了:
SQL> alter tablespace IPAS_ACCT_DATA read write;

 

然而,在 Oracle9i 数据库和更低版本中,可传输表空间仅限于在目标数据库和源数据库都运行在同一操作系统平台上的少数情况下才有用 ? 例如,你不能在 Solaris 和 HP-UX 平台之间传输表空间。
  
  在 Oracle 数据库 10g 中,这个局限消失了:只要操作系统字节顺序相同,你就能在平台之间传输表空间。本文将不就字节顺序展开长篇的讨论,但这里只要提几句话就足够了:一些操作系统(包括 视窗系统)在低位内存地址中用最低有效字节存储多字节二进制数据;因此这种系统被称为低地址低字节序。相反,其他的操作系统(包括 Solaris)将最高有效字节存储在低位内存地址中,因此这种系统被称为低地址高字节序。当一个低地址高字节序的系统试图从一个低地址低字节序的系统中读取数据时,需要一个转换过程 ? 否则,字节顺序将导致不能正确解释读取的数据。(有关字节顺序的周详说明,请阅读嵌入式系统编程的 2002 年 1 月刊中的一篇极好的文章“字节顺序介绍”。)不过,当在相同字节顺序的平台之间传输表空间时,不必所有转换。

中国.网管联盟
  
  你怎么知道哪一种操作系统采用哪一种字节顺序?不需猜测或搜索互连网,相反只需简单地执行以下查询:
  SQL> select * from v$transportable_platform order by platform_id;
  
  PLATFORM_ID PLATFORM_NAME            ENDIAN_FORMAT
  ----------- ----------------------------------- --------------
  1 Solaris[tm] OE (32-bit)       Big
  2 Solaris[tm] OE (64-bit)       Big
  3 HP-UX (64-bit)           Big
  4 HP-UX IA (64-bit)          Big
  5 HP Tru64 UNIX            Little
  6 AIX-Based Systems (64-bit)     Big
  7 Microsoft 视窗系统 IA (32-bit)    Little
  8 Microsoft 视窗系统 IA (64-bit)    Little
  9 IBM zSeries Based Linux       Big
  10 Linux IA (32-bit)          Little
  11 Linux IA (64-bit)          Little
  12 Microsoft 视窗系统 64-bit for AMD  Little
  13 Linux 64-bit for AMD        Little
  15 HP Open VMS             Little
BBS.bitsCN.com网管论坛
  16 Apple Mac OS            Big
  
  假设你想从一台在 Intel 体系结构上运行 Linux 操作系统的主机 SRC1 中将一个表空间 USERS 传输到运行 Microsoft 视窗系统 操作系统的计算机 TGT1 上。源平台和目标平台都是低地址低字节序的。表空间 USERS 的数据文件是 users_01.dbf。你将按照类似以下的方法来进行操作。
  
  使表空间为只读:
  alter tablespace users read only;
  导出表空间。在操作系统提示符下执行:
  exp tablespaces=users transport_tablespace=y file=exp_ts_users.dmp
  exp_ts_users.dmp 文件只包含元数据(不是表空间 USERS 的内容)因此他将非常小。
  
  将文件 exp_ts_users.dmp 和 users_01.dbf 拷贝至主机 TGT1。如果你使用 FTP,那么你将需要指定二进制选项。
  
  将表空间插入到数据库中。在操作系统命令提示符下执行下面的语句:
  imp tablespaces=users transport_tablespace=y file=exp_ts_users.dmp datafiles=’users_01.dbf’
  在第 4 步之后,目标数据库将有一个名称为 USERS 的表空间,并将提供该表空间的内容。
  
  请记住,系统 SRC1 和 TGT1 分别是 Linux 和 视窗系统。到 Oracle9i 为止,运行在 TGT1 上的数据库不能识别第 4 步中的数据文件 users_01.dbf,从而使得整个过程无用。你将必须求助其他一些方法(如常规的导出和导入、创建纯文本文件并通过 SQL*Loader 加载,或直接在不同的数据库间连接加载插入)。
中国网管论坛
  
  在 10g 中,不再需要这些替代方法,因为目标数据库能够识别来自另一个平台的数据文件。在我们的示例中,源主机和目标主机运行的操作系统的字节顺序是相同的(低地址低字节序),因此不必所有转换。
  
  这个功能在数据仓库中特别有用,其中更小的面向对象的数据集市常常在刷新之后从仓库中进行填充。利用 10g,这些数据集市目前能够放在更小、更廉价的计算机(如运行 Linux 的 Intel boxes)中,而将数据仓库服务器放在更大的企业级计算机中。从本质上讲,利用可传输表空间,你目前能更好地利用各种硬件和操作系统的组合。
  
  跨不同字节顺序的平台
  如果平台是不同字节顺序的,那么你将怎么实现可传输性?正如我之前说明的,目标计算机的字节顺序如果和源计算机的字节顺序不同,那么将不能正确地读取数据文件,因而不可能简单地拷贝数据文件。但别灰心,在 Oracle 10g RMAN 实用程式中提供了帮助,他支持将数据文件从一种字节顺序向另一种字节顺序转换。
  
  在上面的例子中,如果主机 SRC1 运行在 Linux 上(低地址低字节序),而目标主机 TGT1 运行在 HP-UX 上(低地址高字节序),那么你需要在第 3 步和第 4 步之间引入另一个步骤,以进行转换。利用 RMAN,你将在源计算机 SRC1 上把数据文件从 Linux 转换成 HP-UX 格式(假定你已使表空间变为只读): bitsCN.nET中国网管博客
  RMAN> convert tablespace users
  2> to platform ’HP-UX (64-bit)’
  3> format=’/home/oracle/rman_bkups/%N_%f’;
  
  Starting backup at 14-MAR-04
  using channel ORA_DISK_1
  channel ORA_DISK_1:starting datafile conversion
  input datafile fno=00004 name=/usr/oradata/dw/starz10/users01.dbf
  converted datafile=/home/oracle/rman_bkups/USERS_4
  channel ORA_DISK_1:datafile conversion complete, elapsed time: 00:00:07
  Finished backup at 14-MAR-04
  
  这个步骤在目录 /home/oracle/rman_bkups 中创建了一个标准 RMAN 文件格式 <tablespace_name>_<absolute_datafile_no> 的文件。注意我们没有触及表空间 USERS 的数据文件;而是为 HP-UX 创建了一个新文件。目前能将这个文件拷贝至目标系统,剩下的步骤非常简单。
  
  这个 RMAN 转换命令非常强大。按照上面给定的形式,他能按顺序创建数据文件。对于包含多个数据文件的表空间,你能命令同时转换并运行多个数据文件。要实现这一目的,你将需要在上述命令中添加一个子句:
  parallelism = 4
  
  该子句创建四个 RMAN 通道,每一个通道处理一个数据文件。不过,一种更有用的方法是用一个步骤转换大量的表空间,在这种情况下并行转换将真正带来非常大的帮助。下面我们将两个表空间 USERS 和 MAINTS 转换至 HP-UX:

BBS.bitsCN.com网管论坛


  RMAN> convert tablespace users, maints
  2> to platform ’HP-UX (64-bit)’
  3> format=’/home/oracle/rman_bkups/%N_%f’
  4> parallelism = 5;
  
  Starting backup at 14-MAR-04
  using target database controlfile instead of recovery catalog
  allocated channel:ORA_DISK_1
  channel ORA_DISK_1:sid=244 devtype=DISK
  allocated channel:ORA_DISK_2
  channel ORA_DISK_2:sid=243 devtype=DISK
  allocated channel:ORA_DISK_3
  channel ORA_DISK_3:sid=245 devtype=DISK
  allocated channel:ORA_DISK_4
  channel ORA_DISK_4:sid=272 devtype=DISK
  allocated channel:ORA_DISK_5
  channel ORA_DISK_5:sid=253 devtype=DISK
  channel ORA_DISK_1:starting datafile conversion
  input datafile fno=00004 name=/usr/oradata/dw10/dw10/users01.dbf
  channel ORA_DISK_2:starting datafile conversion
  input datafile fno=00005 name=/usr/oradata/dw10/dw10/users02.dbf
  channel ORA_DISK_3:starting datafile conversion
  input datafile fno=00006 name=/usr/oradata/dw10/dw10/maints01.dbf
bitsCN.Com
  channel ORA_DISK_4:starting datafile conversion
  input datafile fno=00007 name=/usr/oradata/dw10/dw10/maints02.dbf
  converted datafile=/home/oracle/rman_bkups/USERS_4
  channel ORA_DISK_1:datafile conversion complete, elapsed time: 00:00:03
  converted datafile=/home/oracle/rman_bkups/USERS_5
  channel ORA_DISK_2:datafile conversion complete, elapsed time: 00:00:00
  converted datafile=/home/oracle/rman_bkups/MAINTS_6
  channel ORA_DISK_3:datafile conversion complete, elapsed time: 00:00:01
  converted datafile=/home/oracle/rman_bkups/MAINTS_7
  channel ORA_DISK_4:datafile conversion complete, elapsed time: 00:00:01
  Finished backup at 14-MAR-04

 

posted on 2009-06-18 19:27  .net学习交流  阅读(529)  评论(0编辑  收藏  举报

导航