此次练习主要参照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 - ProdSQL> 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_DIRPL/SQL 过程已成功完成。
数据库中存在指向外部数据的目录,由于这些目录中并不存在外部数据,在此选择忽略。
(2) 目标数据库
SQL> select * from v$version where rownum=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProdSQL> 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 sysdbaSQL*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 bytesSQL> @ /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_00K236U8SQL> shutdown immediate;
ORA-01109: database not openDatabase 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.sqlSQL> 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.
强忍阅闭,心中一朵汗,臣闻阿贵有云:年壮与英雄问鼎,年老与方外论教!微臣现混迹于CSDN forum,斗胆进贱,发表于CSDN为好,一来避免伤害无辜的淫众,二来觅到同流合污的淫党.....
来不及悲伤 —— 2008年12月13日@12:15
超爱卿快快请起,朕在此册封你为第三代A师,改法号“来不及YD”
老杨 —— 2008年12月14日@08:10
小小 —— 2008年12月22日@00:10
我靠,又深夜灌水呀。。。应该不是在录山寨MF2000光碟吧。。。
老杨 —— 2008年12月22日@20:43
呵呵,这也算深夜啊~ 圣诞有啥节目哈?
小小 —— 2008年12月23日@23:27
一碗面一个水果一杯牛奶
老杨 —— 2008年12月24日@13:51