对于oracle10g 的可传输表空间特性而言,我觉着最另人兴奋的就是跨平台的传输了(尽管仍非所有平台都支持)。这意味着一旦数据库涉及到操作系统平台的变更,再不用像之前那样通过exp/imp 这类慢的要死的应用来操作了。更加值的庆幸的是,转换这个操作并不复杂,归根结底,它只是一个命令(挠头,难道真的只有一个吗,不像oracle 风格啊,oracle 一向是喜欢出选择题的),是的,只有一个--CONVERT。

CONVERT 命令可以转换数据文件、表空间甚至整个数据库的字节顺序,
CONVERT TABLESPACE:用于在源库转换指定表空间的数据文件(第3 步执行)。
CONVERT DATAFILE:用于在目标库转换数据文件到目标平台(第4 步执行)。
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 的所有应用,需要注意:
CONVERT 操作并不会改变源文件,转换操作也并不是在本地完成,而是直接写入目的地。
源库和目标库的初始化参数中COMPATIBLE 参数至少被设置为10.0
在10g 之前,CLOB 字段做为变长字符集创建,CONVERT 命令并不会转换这些列,而直接将其传输到目标库。直到后续有读取操作时,自动将其转换为目标字节顺序格式并保存。10g 之后CLOB 列的字符集被设置为AL16UTF16,完全平台无关,所以就更加不用考虑了。
CONVERT 命令并不会转换用户自定义的数据类型。如果你希望在数据库之间传输平台指定格式的映射对象,应该调用Data Pump。
在传输到其它平台之前,要传输的表空间至少要被置为read-write 状态一次(为什么?因为数据文件的文件头必须能够识别其所属的原平台是什么)。因此对于那些read-only 的待传输表空间,你必须先将其置为read-write,然后再置为read-only。

2、对于CONVERT DATAFILE 和CONVERT TABLESPACE 操作的一些注意事项:
如果在源库平台操作,必须使用CONVERT TABLESPACE… TO PLATFORM,不能使用CONVERTDATAFILE 转换个别数据文件。而如果是在目标库平台操作,则必须使用CONVERT DATAFILE… FROMPLATFORM… TO PLATFORM 而不能用CONVERT TABLESPACE。因为目标库还没有表空间的信息,自然也找到其对应的数据文件。
FORMAT 和DB_FILE_NAME_CONVERT 参数可以同时使用,也可以都不使用,如果两个参数都不使用的话,目标平台中的文件路径会默认引用源平台中的路径。
并非所有的平台都支持CONVERT,通过查询V$TRANSPORTABLE_PLATFORM 视图确认所操作的平台是否支持CONVERT 命令。要跨平台的传输表空间必须源和目标平台都在视图中的平台列表才可以。
由于操作系统命令不支持直接操作文件到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 命令而言也仍然需要转换的过程。这主要是为了保证各种类型,比如回滚段等都被重新格式以确保与目标平台的兼容性。

下面是些其它方面不支持直接使用的限制:
控制文件和Redo log 文件不会被传输。目标平台的控制文件和redo logs 会在传输过程中自动创建,并且目标库建立后以open resetlogs 方式打开新数据库。提示:由于目标库的控制文件是在传输过程中创建,源库中的RMAN 备份信息并不会被生成到新库中(即使有)。
BFILE 类型对应的文件不会被传输。不过RMAN 在执行CONVERT DATABASE 时会将引用BFILE类型的对象输出一个列表,用户可以根据列表手工操作BFILE 的文件到目标平台。
本地管理的临时表空间数据文件不会被传输,而在传输过程中自动重建。
外部表以及Directories 不会被传输。与BFILE 一样,RMAN 也会提供一个列表供你手工操作时参考。
密码文件不会被传输。不过RMAN 也会在执行CONVERT DATABASE 命令时输出用户以及其对应的权限,你可以对照输出手工创建新的密码文件。

CONVERT 命令的参数并不多,而且也都比较容易理解,不再一一详细介绍,后面我们通过具体示例演示来辅助理解。

一、使用CONVERTTABLESPACE
前面提到,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,以便能够查看到函数执行过程的输出。
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 的话)。

在serveroutput 被置为on 的情况下,如果DBMS_TDB.CHECK_DB 执行后除了pl/sql 成功执行外没有其它输出信息,说明数据库状态正常,支持传输操作。

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 状态了。

Trackback

no comment untill now

Add your comment now

切换到手机版