ORACLE CONVERT DATABASE

来源:互联网 发布:有朋自远方来不亦说乎 编辑:程序博客网 时间:2024/05/16 05:02

        RMAN新增了CONVERT命令,对于相同字节序的数据库,Oracle还提供了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模式。 
如: 设置SERVEROUTPUT为on         SQL> set serveroutput on
declare
  db_ready boolean;
begin
  db_ready := dbms_tdb.check_db('Microsoft Windows IA (32-bit)', 2);
  if (db_ready) then
    dbms_output.put_line('True');
  else
    dbms_output.put_line('False');
  end if;
end;

         如果数据库可被传输,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成功执行外没有其它输出信息,说明数据库状态正常,支持传输操作。 
DBMS_TDB.CHECK_EXTERNAL确认外部对象
必须使用DBMS_TDB.CHECK_EXTERNAL函数来检查是否存在外部表,directories或Bfiles,因为RMAN的CONVERT命令不能自动传输这些对象。DBMS_TDB.CHECK_EXTERNAL函数没有参数,直接执行即可。

如:设置SERVEROUTPUT为on         SQL> set serveroutput on
declare
  external boolean;
begin
  external := dbms_tdb.check_external;
end;

        如果没有任何外部的对象,除了pl/sql成功执行外不会有其它输出信息,但一旦有输出信息,你就需要注意,最好记录下来,当传输完成之后,根据需要手工创建这些对象到目标数据库中。

2、转换数据库 
        转换操作即可以在源平台执行也可以在目标平台执行,可以通过视图v$transportable_platform查询数据库支持的平台。我们推荐转换操作在目标平台执行,对于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状态了。

原创粉丝点击