移动表空间
概念:可跨平台移动的表空间:
简化数据仓库和数据集市之间的数据分发
允许从一个平台向另一个平台移植数据库
受支持的平台:
Solaris[tm] OE(32 位) HP-UX(64 位) Microsoft Windows IA(64 位)
Solaris[tm] OE(64 位) HP Tru64 UNIX 基于IBM zSeries 的Linux
Microsoft Windows IA(32 位) HP-UX IA(64 位)适用于AMD 的64 位Linux
Linux IA(32 位) Linux IA(64 位) Apple Mac OS
基于AIX 的系统(64 位) HP Open VMS Microsoft Windows for AMD(64 位)
Solaris 操作系统(x86)
移动表空间
可以使用可移动表空间功能跨平台移动数据。此功能简化了从数据仓库环境向数据集市
(数据集市通常在较小的平台上运行)分发数据的过程。此功能还允许通过重建字典并
移动用户表空间的方式,将数据库从一个平台移植到另一个平台。
为了能够将数据文件从一个平台移动到另一个平台,必须确保源系统和目标系统都在支持
的平台上运行。
注:可跨平台移动的表空间功能要求两个平台使用相同的字符集。
概念:最低兼容级别
源数据库和目标数据库都必须将COMPATIBLE
设置为10.0.0 或更高。
数据文件头可以识别平台。
在移动前,请确保所有只读文件和脱机文件可以
识别平台
概念:最低兼容级别
源数据库和目标数据库都需要先将其数据库COMPATIBLE 初始化参数提高到10.0.0 或
更高,才能使用可跨平台移动的表空间功能。
数据文件第一次在COMPATIBLE 设置为10.0.0(或更高)的Oracle Database 10g 中打
开时,这些文件将设置为可识别平台。这一点由图表中的对勾标记表示。每个文件都可以
确定其所属的平台。这些文件在磁盘上有相同的文件头块格式,这些格式用于文件标识
和验证。只读文件和脱机文件只有在变为读/写状态或变为联机之后才能提高其兼容性。
这意味着在Oracle Database 10g 版本之前的数据库中处于只读状态的表空间必须至少变为
读/写状态一次才能使用可跨平台移动的功能。
可移动表空间过程
将表空间置于只读状态。
使用数据泵提取元数据。
目标是否使用相同的endian 格式是
传送数据文件并将文件转储到目标。
使用数据泵导入元数据。
将表空间置于读/写状态。
目标是否使用相同的endian 格式否
使用RMAN
转换数据文件。
传送数据文件并将文件转储到目标。
使用数据泵导入元数据。
将表空间置于读/写状态。
可移动表空间过程
要将表空间从一个平台移动到另一个平台(源到目标),必须将表空间集内的数据文件转
换为目标数据库可以理解的格式。虽然使用Oracle Database 10g,磁盘结构符合通用格式,
但源平台和目标平台还是可能使用不同的endian 格式(字节顺序)。转至不同的endian
平台时,必须使用RMAN 实用程序的CONVERT 命令来转换字节顺序。可以在源平台或
目标平台上执行此操作。对于endian 格式相同的平台,则不需要转换。
幻灯片中的图形描述了从源平台向目标平台移动表空间可能用到的步骤。但是,也可以在
将文件传送到目标平台后执行转换。必须在目标平台上执行最后两步。
一般情况下,此过程与使用Oracle 数据库的旧发行版时相同,除非两个平台使用不同的
endian 格式。此处假定两个平台都支持跨平台移动。
注:读写数据时,字节顺序会影响结果。例如,2 个字节的整数值1 在big-endian 系统
(如Sun SPARC Solaris)上写为0x0001,而在little-endian 系统(如兼容Intel 的PC)
上写为0x0100。
确定平台的Endian 格式
SELECT tp.endian_format FROM v$transportable_platform. tp, v$database d WHERE tp.platform_name = d.platform_name;
确定平台的Endian 格式
可以查询V$TRANSPORTABLE_PLATFORM. 来确定两个平台上的endian 顺序是否相同。
V$DATABASE 有两个列可以用于确定您自己的平台名称和平台标识符。
在两个平台上使用幻灯片中的查询,然后比较结果。在Sun SPARC Solaris 系统上,
SELECT 语句生成以下输出:
ENDIAN_FORMAT
————-
Big
在Microsoft Windows 基于Intel 的平台上,SELECT 语句生成以下输出:
ENDIAN_FORMAT
————-
Little
移动数据库
概述可移动表空间功能。
可以轻松地从数据仓库环境向数据集市(数据集市通常
在较小的平台上运行)分发数据。
数据库可以非常迅速地从一个平台移植到另一个平台。
移动数据库
在不同平台之间移动数据时,使用可移动表空间功能可以将移动速度加快许多。但仍然
需要卸载元数据,因为无法移动系统表空间。
数据库移动功能的目的是在endian 格式相同的不同平台之间轻松快捷地移动数据库。
但是,源平台和目标平台的磁盘对齐可以不同。例如,HP-UX 和Solaris 都是big endian
格式,但HP-UX 上的磁盘对齐为八,而在Solaris 上为四。
要从一个平台向另一个平台移动数据库,必须确保源系统和目标系统都运行于
V$TRANSPORTABLE_PLATFORM. 中列出的一个平台上,并且具有相同的endian 格式。
例如,可以将在Linux IA(32 位)上运行的数据库移动到一个Windows 平台上。
如果两个数据库中至少有一个使用自动存储管理(ASM),则可能需要使用
DBMS_FILE_TRANSFER 程序包来将文件上传到FTP。
此功能与可移动表空间不同,可移动表空间有一个可以插入数据的目标数据库,而此功能
将在目标平台上创建新的数据库。新创建的数据库中包含的数据与源数据库中相同。除了
数据库名、实例名和文件位置等,新数据库与源数据库的设置也相同。
注:移动数据库比使用“数据泵”移动数据更快。
数据库移动过程:源系统转换
在只读模式下打开数据库
并且COMPATIBLE=10.0.0
数据库移动过程:源系统转换
必须先在只读模式下打开数据库,才能移动该数据库。然后使用RMAN 转换数据库的必
要数据文件。
在源平台上执行转换时,新的RMAN 命令CONVERT DATABASE 将生成一个包含正确的
CREATE CONTROLFILE RESETLOGS 命令的脚本,此命令用于在目标系统上创建新数
据库。然后CONVERT DATABASE 命令将转换识别出的所有数据文件,以便这些文件可
以在目标系统上使用。接着,您需要将已转换的数据文件和生成的脚本传送到目标平台。
通过在目标平台上执行生成的脚本,可以创建数据库的新副本。
注:源数据库必须在COMPATIBLE 初始化参数设为10.0.0 或更高的条件下运行。
自COMPATIBLE 设置为10.0.0 或更高以来,识别出的所有表空间必须至少被读写一次。
数据库移动过程:目标系统转换
在只读模式下打开数据库
并且COMPATIBLE=10.0.0
数据库移动过程:目标系统转换
必须先在只读模式下打开数据库,才能移动该数据库。然后使用RMAN 转换数据库的必
要数据文件。
在目标平台上执行转换时,(在源系统上执行的)CONVERT DATABASE 命令只生成两个
脚本,用于在目标系统上转换数据文件以及重新创建新数据库的控制文件。然后,请将识
别出的数据文件和两个脚本都传送到目标平台。完成后,请按正确的顺序执行这两个脚本。
第一个脚本使用现有的CONVERT DATAFILE RMAN 命令来进行转换,第二个脚本随已
转换的数据文件一起发出CREATE CONTROLFILE RESETLOGS SQL 命令来创建新数
据库。
注:源数据库必须在COMPATIBLE 初始化参数设为10.0.0 或更高的条件下运行。
自COMPATIBLE 设置为10.0.0 或更高以来,识别出的所有表空间必须至少被读写一次。
数据库移动:注意事项
在目标平台上创建口令文件。
移动在源数据库中使用的BFILE。
生成的pfile 和移动脚本使用OMF。
使用DBNEWID 来更改DBID。
数据库移动:注意事项
不会移动重做日志、控制文件和临时文件。将在目标平台上为新数据库重新创建这些
文件。因此,目标平台上的新数据库必须用RESETLOGS 选项打开。
使用口令文件时,不会移动该文件,需要您在目标平台上创建该文件。这是因为口令
文件支持的文件名类型是特定于操作系统的。但是,CONVERT DATABASE 命令的输出
将列出所有用户名及其系统权限,并且建议在目标平台上重新创建口令文件并为这些
用户添加条目。
CONVERT DATABASE 命令列出源数据库中的所有目录对象以及使用BFILE 数据类型
或外部表的对象。可能需要用新的目录名和文件名来更新这些对象。如果在数据库中
使用了BFILE,则必须移动BFILE。
生成的pfile 和移动脚本将Oracle Managed Files (OMF) 用于数据库文件。如果不想使用
OMF,则必须修改pfile 和移动脚本。
移动的数据库与源数据库具有相同的DBID。可以使用DBNEWID 实用程序来更改DBID。
在移动脚本以及CONVERT DATABASE 命令的输出中,系统将提示您使用DBNEWID
实用程序来更改数据库ID。
下面的使用参数说明来自网络
http://tech.it168.com/db/2007-12-19/200712191131170.shtml
对于oracle10g的可传输表空间特性而言,我觉着最另人兴奋的就是跨平台的传输了(尽管仍非所有平台都支持)。这意味着一旦数据库涉及到操作系统平台的变更,再不用像之前那样通过exp/imp这类慢的要死的应用来操作了。更加值的庆幸的是,转换这个操作并不复杂,归根结底,它只是一个命令(挠头,难道真的只有一个吗,不像oracle风格啊,oracle一向是喜欢出选择题的),是的,只有一个--CONVERT。
CONVERT是RMAN中提供的一个命令,专门用于进行字节顺序转换的解决方案,其语法如图所示:
由上图可见,CONVERT命令可以转换数据文件、表空间甚至整个数据库的字节顺序,
l CONVERT TABLESPACE:用于在源库转换指定表空间的数据文件(第3步执行)。
l CONVERT DATAFILE:用于在目标库转换数据文件到目标平台(第4步执行)。
l CONVERT DATABASE:用于从源平台转换及传输整个数据库到目标平台,并确保创建需要的数据文件,视你的需求即可以在源库执行也可以在目标库执行。
CONVERT DATAFILE和CONVERT TABLESPACE还可用于操作ASM(Automatic Storage Management自动存储管理)文件的移入移出,这项功能用处极大,因为众所周知通常操作系统的命令例如Unix系统的cp或Windows系统的copy等命令是不能直接读写ASM中文件。要想操作ASM中文件,只有RMAN,这可是真正的华山一条路,舍它其谁。
没有CONVERT是不行的,但是CONVERT也不是万能的。
1、对于CONVERT DATAFILE, CONVERT TABLESPACE以及CONVERT DATABASE的所有应用,需要注意:
l CONVERT操作并不会改变源文件,转换操作也并不是在本地完成,而是直接写入目的地。
l 源库和目标库的初始化参数中COMPATIBLE参数至少被设置为10.0
l 在10g之前,CLOB字段做为变长字符集创建,CONVERT命令并不会转换这些列,而直接将其传输到目标库。直到后续有读取操作时,自动将其转换为目标字节顺序格式并保存。10g之后CLOB列的字符集被设置为AL16UTF16,完全平台无关,所以就更加不用考虑了。
l CONVERT命令并不会转换用户自定义的数据类型。如果你希望在数据库之间传输平台指定格式的映射对象,应该调用Data Pump。
l 在传输到其它平台之前,要传输的表空间至少要被置为read-write状态一次(为什么因为数据文件的文件头必须能够识别其所属的原平台是什么)。因此对于那些read-only的待传输表空间,你必须先将其置为read-write,然后再置为read-only。
2、对于CONVERT DATAFILE和CONVERT TABLESPACE操作的一些注意事项:
l 如果在源库平台操作,必须使用CONVERT TABLESPACE… TO PLATFORM,不能使用CONVERT DATAFILE转换个别数据文件。而如果是在目标库平台操作,则必须使用CONVERT DATAFILE… FROM PLATFORM… TO PLATFORM而不能用CONVERT TABLESPACE。因为目标库还没有表空间的信息,自然也找到其对应的数据文件。
l FORMAT和DB_FILE_NAME_CONVERT参数可以同时使用,也可以都不使用,如果两个参数都不使用的话,目标平台中的文件路径会默认引用源平台中的路径。
l 并非所有的平台都支持CONVERT,通过查询V$TRANSPORTABLE_PLATFORM视图确认所操作的平台是否支持CONVERT命令。要跨平台的传输表空间必须源和目标平台都在视图中的平台列表才可以。
l 由于操作系统命令不支持直接操作文件到ASM,你可以通过CONVERT TABLESPACE或CONVERT DATAFILE移动文件到ASM中即使不涉及endian format的转换。使用CONVERT命令可以提供与操作系统的copy操作等同的功能,所不同的是CONVERT操作的是ASM。
3、对于CONVERT DATABASE的操作,除了上述第1条中的限制外,还有些其它的注意事项:
对于传输整个数据库而言最主要的一个限制是源平台和目标平台必须拥有相同的endian format(只能有限跨平台了)。例如,你可以从Windows系统传输数据库到Linux x86系统,或者从HP-UX到AIX,但是如果你想从Solaris传输整个数据库到Linux x86的话就不能应用这项特性了。当然如果必须在这种情况下传输的话,可以选择手工建库,然后通过CONVERT TABLESPACE或CONVERT DATAFILE命令传输。
提示:事实上,即使源平台和目标平台的endian formats完全相同,对于CONVERT DATABASE命令而言也仍然需要转换的过程。这主要是为了保证各种类型,比如回滚段等都被重新格式以确保与目标平台的兼容性。
下面是些其它方面不支持直接使用的限制:
l 控制文件和Redo log文件不会被传输。目标平台的控制文件和redo logs会在传输过程中自动创建,并且目标库建立后以open resetlogs方式打开新数据库。
提示:由于目标库的控制文件是在传输过程中创建,源库中的RMAN备份信息并不会被生成到新库中(即使有)。
l BFILE类型对应的文件不会被传输。不过RMAN在执行CONVERT DATABASE时会将引用BFILE类型的对象输出一个列表,用户可以根据列表手工操作BFILE的文件到目标平台。
l 本地管理的临时表空间数据文件不会被传输,而在传输过程中自动重建。
l 外部表以及Directories不会被传输。与BFILE一样,RMAN也会提供一个列表供你手工操作时参考。
l 密码文件不会被传输。不过RMAN也会在执行CONVERT DATABASE命令时输出用户以及其对应的权限,你可以对照输出手工创建新的密码文件。
CONVERT命令的参数并不多,而且也都比较容易理解,不再一一详细介绍,后面我们通过具体示例演示来辅助理解。
一、使用CONVERT TABLESPACE
前面提到,CONVERT TABLESPACE必须在源平台执行,用于转换表空间的endian format到目标平台,通常的调用形式是:
RMAN> CONVERT TABLESPACE ts_1, ts_2... TO PLATFORM. 'platform_name';
并且可以在命令中指定FORMAT或DB_FILE_NAME_CONVERT参数来设置转换后数据文件的命名规则,PARALLELISM参数指定转换的并行度(用于提高转换效率的,有点类似rman备份恢复中的通道数概念)。例如:
RMAN> CONVERT TABLESPACE jssweb TO PLATFORM. 'Linux IA (32-bit)' db_file_name_convert 'E:\ora10g\oradata\jssweb','e:\oratmp\oradata' PARALLELISM 3;
注意示例中的PARALLELISM参数,如果该参数值设置的不合理,有可能适得其反,花费的时间反而更长,一般而言,推荐并行度大小不要超过要转换的数据文件的数量。
另外对于FORMAT和DB_FILE_NAME_CONVERT参数前面介绍中也提到了,两个参数可以同时指定,如果同时指定了两个参数,则rman会以FORMAT参数的设定为准。如果两个参数都未指定的话,rman就会按照它自己的规则生成文件。具体规则呢这里就不描述了,总之就是数字和字母组合,如果你决定按照它的规则命令文件,那么我至少能确认一件事—单看文件名,你已经不能分辩这个文件是干嘛的了。
二、使用CONVERT DATAFILE
CONVERT DATAFILE则是必须在目标平台执行,用于转换指定数据文件到指定的endian format.通常的调用形式如下:
RMAN> CONVERT DATAFILE datafile_1, datafile_2... FROM PLATFORM. 'platform_name';
可以通过指定TO PLATFORM参数设定转换到的字节顺序,如果不指定该参数,默认转换到当前平台。不过FROM PLATFORM参数的值必须是与其对应的源平台,不然convert可能会出错。同样CONVERT DATAFILE也可以指定FORMAT,DB_FILE_NAME_CONVERT,PARALLELISM等参数,如例:
RMAN> CONVERT DATAFILE 2> 'E:\ora10g\oradata\jssweb\jssweb1.dbf', 3> 'E:\ora10g\oradata\jssweb\jssweb2.dbf' 5> TO PLATFORM="Linux IA (32-bit)" 6> FROM PLATFORM="Microsoft Windows IA (32-bit)" 7> DB_FILE_NAME_CONVERT= 8> "E:\ora10g\oradata", "/opt/oar10g/oradata";
这些参数的功能的格式与CONVERT TABLESPACE中介绍的完全一致,这里就不多废话了。
三、使用CONVERT DATABASE
假设源平台与目标平台拥有相同的字节顺序,RMAN能够自动处理大多数在目标平台创建新库的操作。CONVERT DATABASE 传输数据库到新平台需要一个较长的过程,主要包含下面一些部分:
1、准备工作:使用DBMS_TDB包。
DMBS_TDB包提供了两个非常有用的函数:
提示:建议将SERVEROUTPUT设置为ON,以便能够查看到函数执行过程的输出。
l DBMS_TDB.CHECK_DB检查数据库状态
此函数检查数据库是否能被传输到目标平台以及数据库当前状态是否能够进行传输操作。拥有下列几个可选参数:
target_platform_name:目标平台的名称,可以通过V$DB_TRANSPORTABLE_PLATFORM视图查询获得。此参数并非必选,但如果你指定了skip_option参数,则本参数也必须指定。忽略此参数,则默认目标平台与源平台相同,
skip_option:非必选参数,指定待传输的数据库要跳过检查的选项(如果有)。支持字符或数值调用。
DBMS_TDB.SKIP_NONE或0:检查所有表空间
DBMS_TDB.SKIP_OFFLINE或2:跳过offline表空间的数据文件
DBMS_TDB.SKIP_READONLY或3:跳过read-only表空间的数据文件
例如:
提示:执行前先将数据库置为read-only模式。
SQL> set serveroutput on SQL> declare 2 db_ready boolean; 3 begin 4 db_ready := dbms_tdb.check_db('Microsoft Windows IA (32-bit)', 2); 5 if (db_ready) then 6 dbms_output.put_line('True'); 7 else 8 dbms_output.put_line('False'); 9 end if; 10 end; 11 / Database is not open in READ-ONLY mode. Open the database in READ-ONLY mode and retry. False
如果数据库可被传输,DBMS_TDB.CHECK_DB会返回true,否则返回false,如果执行结果返回false,会自动输出数据库不能够传输的原因(如果SERVEROUTPUT被置为on的话),下表是一些可能遇到的问题以及解决方案:
提示信息
解决方案
Unrecognized target platform. name.
不能识别目标平台的名称
检查V$DB_TRANSPORTABLE_PLATFORM视图,确实目标平台在视图列表中,或者,你没敲错字母。
Target platform. has a different endian format.
目标平台拥有不同的字节顺序,不能被CONVERT DATABASE所支持,死了这条心吧。
Database is not open read-only.
源库未被以read only模式打开,shutdown了重开一遍再试试。
There are active or in-doubt transactions in the database.
源库存在活动事务,回滚或解决该事务然后打开数据库到read-only模式再重试。
Deferred transaction rollback needs to be done.
源库有未完成的延期事务,以正常模式打开数据库完成它,然后再read only模式打开数据库重试
Database compatibility version is below 10.
源库初始化参数中COMPATIBLE参数低于10,修改该参数,重启数据库到read only后重试
Some tablespaces have not been open read-write with compatibility version is 10 or higher.
源库初始化参数中COMPATIBLE参数修改后,表空间尚未被置为read-write过,还记得我们前面说过的吗表空间至少要被置为read-write一次。
在serveroutput被置为on的情况下,如果DBMS_TDB.CHECK_DB执行后除了pl/sql成功执行外没有其它输出信息,说明数据库状态正常,支持传输操作。
l DBMS_TDB.CHECK_EXTERNAL确认外部对象
必须使用DBMS_TDB.CHECK_EXTERNAL函数来检查是否存在外部表,directories或Bfiles,因为RMAN的CONVERT命令不能自动传输这些对象。DBMS_TDB.CHECK_EXTERNAL函数没有参数,直接执行即可。例如:
SQL> set serveroutput on SQL> declare 2 external boolean; 3 begin 4 external := dbms_tdb.check_external; 5 end; 6 / The following directories exist in the database: SYS.DATA_PUMP_DIR
如果没有任何外部的对象,除了pl/sql成功执行外不会有其它输出信息,但一旦有输出信息,如上例中所示的你就需要注意,最好记录下来,当传输完成之后,根据需要手工创建这些对象到目标数据库中。听明白了吧,本函数成功执行与否并不会影响传输操作,这个函数说白了就是给你列个单儿,然后告诉你单子上有的这些它都不负责传送,如果确实需要那你就得自个干。
2、转换数据库
前面就已经提到过,转换操作即可以在源平台执行也可以在目标平台执行,并且我们推荐转换操作在目标平台执行,对于CONVERT DATABASE而言,源平台执行和目标平台执行还是有些区别,具体操作的时候还得根据实据情况做选择,下面分别说明:
对于在源平台执行转换操作而言,通常步骤如下:
启动数据库到read only模式。
DBMS_TDB.CHECK_DB检查数据库是否可被传输
DBMS_TDB.CHECK_EXTERNAL检查外部对象
执行CONVERT DATABASE命令,例如:
RMAN> convert database new database 'jsstts' 2> transport script. 'e:\oratmp\script\ts.sql' 3> to platform. 'Linux IA (32-bit)' 4> db_file_name_convert 'E:\ora10g\oradata\jssweb' 'e:\oratmp\oradata';
得到下列文件:
转换后的数据文件:已转换的待传输文件,本例中保存至:e:\oratmp\oradata’,文件名与源库中相同。
transport script:在目标平台执行的创建数据库的脚本,本例中名为ts.sql,该文件内容仅供参考,你需要再根据实际情况修改其中的参数值。
客户端初始化参数文件:文件名及路径包含在CONVERT DATABASE的输出内容中,在输出结果的最后。文件中的参数值多继承自源库,你可以根据需要进行适当修改。
转换完成(此时可将源库置为read-write了),然后将文件复制到目标数据库,在目标平台执行transport script,创建数据库即可。注意,如果前一步操作生成的文件复制到目标平台后路径发生修改,务必修改transport script文件中对应的参数值。
对于在目标平台执行转换操作:
前面的准备工作与在源平台进行转换操作是一样的,所不同的仅仅只是执行CONVERT DATABASE命令时调用的参数,如例:
RMAN> convert database on target platform 2> convert script. 'e:\oratmp\script\cs.rman' 3> transport script. 'e:\oratmp\script\ts.sql' 4> new database 'jsstts' 5> db_file_name_convert 'E:\ora10g\oradata\jssweb' 'e:\oratmp\oradata';
得到下列文件:
convert script:在目标平台执行的转换数据文件的脚本(实际内容就是前面讲到的convert datafile命令,不过这个是convert database命令自动生成的)。
transport script:在目标平台执行的创建数据库的脚本,本例中名为ts.sql,该文件内容仅供参考,你需要再根据实际情况修改其中的参数值。
客户端初始化参数文件:文件名及路径包含在CONVERT DATABASE的输出内容中,在输出结果的最后。文件中的参数值多继承自源库,你可以根据需要进行适当修改。
你大概也注意到了,此时并未生成数据文件,这是因为转换操作将在目标平台执行,所以你直接将源平台中的数据文件复制到目标平台即可。然后即可将源库置为read-write状态了。