2013年(350)
分类: Oracle
2013-04-24 16:28:42
对于oracle10g的可传输表空间特性而言,我觉着最另人兴奋的就是跨平台的传输了(尽管仍非所有平台都支持)。这意味着一旦涉及到操作系统平台的变更,再不用像之前那样通过exp/imp这类慢的要死的应用来操作了。更加值的庆幸的是,转换这个操作并不复杂,归根结底,它只是一个命令(挠头,难道真的只有一个吗,不像风格啊,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命令时调用的参数,如例: