此次练习主要参照eygle在《循序渐进》中的范例(P49),考虑到书中的状况在实际应用中一般比较少见,因此测试将改成从Windows平台迁移至Linux平台。

1. 测试环境
(1) 源数据库

SQL> select * from v$version where rownum=1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

SQL> select x.platform_name, y.endian_format
2 from v$database x, v$transportable_platform y
3 where x.platform_name=y.platform_name;

PLATFORM_NAME                  ENDIAN_FORMAT
-----------------------------  ------------------
Microsoft Windows IA (32-bit)  Little

以Read Only模式开启数据库,首先确认是否支持迁移:

SQL> set serveroutput on
SQL> declare
2 db_ready boolean;
3 begin
4 db_ready := dbms_tdb.check_db ('Linux IA (32-bit)');
5 end;
6 /

PL/SQL 过程已成功完成。

然后检查一下外部对象:

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, SYS.ADMIN_DIR, SYS.WORK_DIR

PL/SQL 过程已成功完成。

数据库中存在指向外部数据的目录,由于这些目录中并不存在外部数据,在此选择忽略。

(2) 目标数据库

SQL> select * from v$version where rownum=1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

SQL> select x.platform_name, y.endian_format
2 from v$database x, v$transportable_platform y
3 where x.platform_name=y.platform_name;

PLATFORM_NAME      ENDIAN_FORMAT
-----------------  ------------------
Linux IA (32-bit)  Little

[root@rhel ~]# cat /etc/redhat-release
Red Hat Enterprise Linux AS release 4 (Nahant Update 5)

2. 使用RMAN转换源数据库之数据文件

C:\Documents and Settings\oldyang>rman target /

恢复管理器: Release 10.2.0.1.0 - Production on 星期五 12月 12 17:20:00 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

连接到目标数据库: PIVOT904 (DBID=1969483486)

RMAN> CONVERT DATABASE NEW DATABASE 'OLDYANG'
2> TRANSPORT SCRIPT 'D:\DB\oracle\product\10.2.0\oradata\trans.sql'
3> TO PLATFORM 'Linux IA (32-bit)'
4> DB_FILE_NAME_CONVERT 'D:\DB\oracle\product\10.2.0\oradata\pivot904\' 'D:\DB\oracle\product\10.2.0\oradata\oldyang\';

启动 convert 于 12-12月-08
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=153 devtype=DISK

在数据库中找到目录 SYS.DATA_PUMP_DIR
在数据库中找到目录 SYS.ADMIN_DIR
在数据库中找到目录 SYS.WORK_DIR

在口令文件中找到用户 SYS (具有 SYSDBA and SYSOPER 权限)
通道 ORA_DISK_1: 启动数据文件转换
输入数据文件 fno=00001 name=D:\DB\ORACLE\PRODUCT\10.2.0\ORADATA\PIVOT904\SYSTEM01.DBF
已转换的数据文件 = D:\DB\ORACLE\PRODUCT\10.2.0\ORADATA\OLDYANG\SYSTEM01.DBF
通道 ORA_DISK_1: 数据文件转换完毕, 经过时间: 00:00:25
通道 ORA_DISK_1: 启动数据文件转换
输入数据文件 fno=00003 name=D:\DB\ORACLE\PRODUCT\10.2.0\ORADATA\PIVOT904\SYSAUX01.DBF
已转换的数据文件 = D:\DB\ORACLE\PRODUCT\10.2.0\ORADATA\OLDYANG\SYSAUX01.DBF
通道 ORA_DISK_1: 数据文件转换完毕, 经过时间: 00:00:35
通道 ORA_DISK_1: 启动数据文件转换
输入数据文件 fno=00005 name=D:\DB\ORACLE\PRODUCT\10.2.0\ORADATA\PIVOT904\OLDYANG.DBF
已转换的数据文件 = D:\DB\ORACLE\PRODUCT\10.2.0\ORADATA\OLDYANG\OLDYANG.DBF
通道 ORA_DISK_1: 数据文件转换完毕, 经过时间: 00:00:25
通道 ORA_DISK_1: 启动数据文件转换
输入数据文件 fno=00002 name=D:\DB\ORACLE\PRODUCT\10.2.0\ORADATA\PIVOT904\UNDOTBS01.DBF
已转换的数据文件 = D:\DB\ORACLE\PRODUCT\10.2.0\ORADATA\OLDYANG\UNDOTBS01.DBF
通道 ORA_DISK_1: 数据文件转换完毕, 经过时间: 00:00:07
通道 ORA_DISK_1: 启动数据文件转换
输入数据文件 fno=00004 name=D:\DB\ORACLE\PRODUCT\10.2.0\ORADATA\PIVOT904\USERS01.DBF
已转换的数据文件 = D:\DB\ORACLE\PRODUCT\10.2.0\ORADATA\OLDYANG\USERS01.DBF
通道 ORA_DISK_1: 数据文件转换完毕, 经过时间: 00:00:01
在目标平台上运行 SQL 脚本 D:\DB\ORACLE\PRODUCT\10.2.0\ORADATA\TRANS.SQL 以创建数据库
编辑 init.ora 文件 D:\DB\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\INIT_00K236U8_1_0.ORA。此 PFILE将用于在目标平台上创建数据库

要重新编译所有 PL/SQL 模块, 请在目标平台上运行 utlirp.sql 和 utlrp.sql
要更改内部数据库标识符, 请使用 DBNEWID 实用程序
完成 backup 于 12-12月-08

注意粗体字部分,RMAN生成了脚本TRANS.SQL和样本参数文件INIT_00K236U8_1_0.ORA,稍后我们可以利用它们完成重建控制文件以及参数文件的步骤。

3. 传输数据文件至目标数据库
由于只是VMware(Network: host-only)环境下的测试,为了节省时间,我们使用Samba将数据文件、脚本以及参数文件传输至RHEL。

传输完成后,将oldyang转移到oradata目录中:

[oracle@rhel ~]$ ll ~/oldyang
total 1076320
-rwxr--r-- 1 oracle oinstall 251666432 Dec 12 17:21 OLDYANG.DBF
-rwxr--r-- 1 oracle oinstall 262152192 Dec 12 17:21 SYSAUX01.DBF
-rwxr--r-- 1 oracle oinstall 513810432 Dec 12 17:20 SYSTEM01.DBF
-rwxr--r-- 1 oracle oinstall 68165632 Dec 12 17:21 UNDOTBS01.DBF
-rwxr--r-- 1 oracle oinstall 5251072 Dec 12 17:21 USERS01.DBF
[oracle@rhel ~]$ mv oldyang /opt/ora10g/oradata

创建相关的目录:

[oracle@rhel ~]$ mkdir /opt/ora10g/admin/adump
[oracle@rhel ~]$ mkdir /opt/ora10g/admin/bdump
[oracle@rhel ~]$ mkdir /opt/ora10g/admin/cdump
[oracle@rhel ~]$ mkdir /opt/ora10g/admin/dpdump
[oracle@rhel ~]$ mkdir /opt/ora10g/admin/pfile
[oracle@rhel ~]$ mkdir /opt/ora10g/admin/udump
[oracle@rhel ~]$ mkdir /opt/ora10g/logarchive

4. 创建参数文件
修改INIT_00K236U8_1_0.ORA中的部分参数:

db_recovery_file_dest = "/opt/ora10g/flash_recovery_area"
audit_file_dest = "/opt/ora10g/admin/adump"
background_dump_dest = "/opt/ora10g/admin/bdump"
user_dump_dest = "/opt/ora10g/admin/udump"
core_dump_dest = "/opt/ora10g/admin/cdump"
db_file_multiblock_read_count= 16

考虑到Linux虚拟机的内存比Windows主机要小得多,因此还需要调整以下参数:

__shared_pool_size = 62914560
__db_cache_size = 130023424
sga_target = 205520896
pga_aggregate_target = 68157440

重命名为initoldyang.ora并移动到dbs目录中

[oracle@rhel ~]$ ls ~/scripts
INIT_00K236U8_1_0.ORA TRANS.SQL
[oracle@rhel ~]$ mv ~/scripts/INIT_00K* $ORACLE_HOME/dbs/initoldyang.ora

5. 启动实例并创建控制文件
首先我们截取TRANS.SQL中建立控制文件的部分,创建新的脚本recrectl.sql,内容如下:

CREATE CONTROLFILE REUSE SET DATABASE "OLDYANG" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/opt/ora10g/oradata/oldyang/redo01.log' SIZE 50M,
GROUP 2 '/opt/ora10g/oradata/oldyang/redo02.log' SIZE 50M,
GROUP 3 '/opt/ora10g/oradata/oldyang/redo03.log' SIZE 50M
DATAFILE
'/opt/ora10g/oradata/oldyang/SYSTEM01.DBF',
'/opt/ora10g/oradata/oldyang/UNDOTBS01.DBF',
'/opt/ora10g/oradata/oldyang/SYSAUX01.DBF',
'/opt/ora10g/oradata/oldyang/USERS01.DBF',
'/opt/ora10g/oradata/oldyang/OLDYANG.DBF'
CHARACTER SET AL32UTF8
;

接着我们使用先前的参数文件启动实例,然后创建控制文件:

[oracle@rhel ~]$ export $ORACLE_SID=OLDYANG
[oracle@rhel ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Fri Dec 12 18:58:27 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to an idle instance.

SQL> STARTUP NOMOUNT PFILE='/opt/ora10g/product/10.2.0/db_1/dbs/initoldyang.ora'
ORACLE instance started.

Total System Global Area 205520896 bytes
Fixed Size 1218532 bytes
Variable Size 71305244 bytes
Database Buffers 130023424 bytes
Redo Buffers 2973696 bytes

SQL> @ /home/oracle/recrectl.sql

Control file created.

SQL> select value from v$parameter where name='control_files';

VALUE
--------------------------------------------------------------------------------
/opt/ora10g/product/10.2.0/db_1/dbs/D: DBORACLEPRODUCT10.2.0DB_1DATABASECF_D-OLDY
ANG_ID-1969483486_00K236U8

SQL> shutdown immediate;
ORA-01109: database not open

Database dismounted.
ORACLE instance shut down.

6. 启动目标数据库
将重建的控制文件移动并复用到相应的目录中,然后修改下面的参数:

control_files = "/opt/ora10g/oradata/oldyang/CONTROL01.CTL","/opt/o
ra10g/oradata/oldyang/CONTROL02.CTL","/opt/ora10g/oradata/oldyang/CONTROL03.CTL"

以resetlogs的方式启动数据库:

SQL> startup mount;
ORACLE instance started.

Total System Global Area 205520896 bytes
Fixed Size 1218532 bytes
Variable Size 71305244 bytes
Database Buffers 130023424 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> alter database open resetlogs;

Database altered.

依据TRANS.SQL的提示手工添加临时文件:

SQL> alter tablespace temp add tempfile '/opt/ora10g/oradata/oldyang/TEMP01.DBF' size 20M autoextend on next 1M maxsize 5000M;

Tablespace altered.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

7. 收尾步骤
继续按照TRANS.SQL的提示进行操作,依次执行utlirp.sql、utlrp.sql,注意,对于非跨版本的迁移,在执行utlirp.sql之前同样需要使用upgrade选项打开数据库:

SQL> startup upgrade;
ORACLE instance started.

Total System Global Area 205520896 bytes
Fixed Size 1218532 bytes
Variable Size 71305244 bytes
Database Buffers 130023424 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
SQL> @@ ?/rdbms/admin/utlirp.sql

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup;
ORACLE instance started.

Total System Global Area 205520896 bytes
Fixed Size 1218532 bytes
Variable Size 71305244 bytes
Database Buffers 130023424 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
SQL> @@ ?/rdbms/admin/utlrp.sql
.......
.......
.......

PL/SQL procedure successfully completed.

Rand Posts:



我们在天上的父
愿人都尊你的名为圣
愿你的国降临
愿你的旨意行在地上如同行在天上
我们将顺着你的指引前行
直至重归你的梯下


6 条评论



  1. 强忍阅闭,心中一朵汗,臣闻阿贵有云:年壮与英雄问鼎,年老与方外论教!微臣现混迹于CSDN forum,斗胆进贱,发表于CSDN为好,一来避免伤害无辜的淫众,二来觅到同流合污的淫党.....

    [ 引用 ]


  2. 超爱卿快快请起,朕在此册封你为第三代A师,改法号“来不及YD”

    [ 引用 ]


  3. :roll: 最近似乎神龙见首不见尾的说~

    [ 引用 ]


  4. 我靠,又深夜灌水呀。。。应该不是在录山寨MF2000光碟吧。。。 :lol:

    [ 引用 ]


  5. 呵呵,这也算深夜啊~ 圣诞有啥节目哈?

    [ 引用 ]


  6. 一碗面一个水果一杯牛奶 :(

    [ 引用 ]

发表评论

文明上网,共建和谐社会。