eygle.com   eygle.com
eygle.com eygle
eygle.com  
 

« 2007上海Oracle Open World记事-之二 | Blog首页 | 2007上海Oracle Open World记事-之三 »

《循序渐进Oracle》第一章连载-之十

6. Oracle10g同字节序跨平台迁移

在Oracle10g中,同字节序跨平台的文件头信息Oracle会自动改写,不再需要转换。
我们看以下测试:

[oracle@danaly oradata]$ sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on Thu Jul 12 15:14:21 2007

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


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options

SQL> alter database mount;

Database altered.

SQL> alter database open;

Database altered.

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/opt/oracle/oradata/eygle/EYGLE/datafile/o1_mf_system_37tc1xns_.dbf
/opt/oracle/oradata/eygle/EYGLE/datafile/o1_mf_undotbs1_37tc29mb_.dbf
/opt/oracle/oradata/eygle/EYGLE/datafile/o1_mf_sysaux_37tc2gqc_.dbf
/opt/oracle/oradata/eygle/EYGLE/datafile/o1_mf_users_37tc2tth_.dbf

SQL> show parameter comp

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
compatible string 10.2.0.1.0
nls_comp string
plsql_compiler_flags string INTERPRETED, NON_DEBUG
plsql_v2_compatibility boolean FALSE
SQL> create tablespace trans
2 datafile '/opt/oracle/oradata/eygle/EYGLE/datafile/trans.dbf' size 10M;

Tablespace created.

SQL> create user trans identified by trans default tablespace trans;

User created.

SQL> grant connect,resource to trans;

Grant succeeded.

SQL> connect trans/trans
create table test as select * from dict;
Connected.
SQL>
Table created.

SQL> select count(*) from test;

COUNT(*)
----------
615

SQL> connect / as sysdba
Connected.
SQL> alter tablespace trans read only;

Tablespace altered.

SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options
[oracle@danaly oradata]$ exp \'/ as sysdba\' tablespaces=trans transport_tablespace=y file=exp_trans.dmp

Export: Release 10.2.0.1.0 - Production on Thu Jul 12 15:28:24 2007

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


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options
Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set
Note: table data (rows) will not be exported
About to export transportable tablespace metadata...
For tablespace TRANS ...
. exporting cluster definitions
. exporting table definitions
. . exporting table TEST
. exporting referential integrity constraints
. exporting triggers
. end transportable tablespace metadata export
Export terminated successfully without warnings.
[oracle@danaly oradata]$ ls -l exp_trans.dmp
-rw-r--r-- 1 oracle dba 16384 Jul 12 15:28 exp_trans.dmp
[oracle@danaly oradata]$ pwd
/opt/oracle/oradata

然后我们可以直接将这两个文件传输到Windows平台上:

C:\oracle\oradata\EYGLE\DATAFILE>ftp 172.16.33.109
Connected to 172.16.33.109.
220 (vsFTPd 2.0.3)
User (172.16.33.109:(none)): oracle
331 Please specify the password.
Password:
230 Login successful.
ftp> bin
200 Switching to Binary mode.
ftp> mget oradata/eygle/EYGLE/datafile/trans.dbf
200 Switching to Binary mode.
mget oradata/eygle/EYGLE/datafile/trans.dbf? y
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for oradata/eygle/EYGLE/datafile/trans.dbf (10493952 bytes).
226 File send OK.
ftp: 收到 10493952 字节,用时 1.13Seconds 9327.96Kbytes/sec.
ftp> mget oradata/exp_trans.dmp
200 Switching to Binary mode.
mget oradata/exp_trans.dmp? y
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for oradata/exp_trans.dmp (16384 bytes).
226 File send OK.
ftp: 收到 16384 字节,用时 0.00Seconds 16384000.00Kbytes/sec.
ftp> quit
221 Goodbye.

SQL> create user trans identified by trans;

用户已创建。

SQL> grant connect,resource to trans;

授权成功。


接下来执行导入:

C:\oracle\oradata\EYGLE\DATAFILE>imp '/ as sysdba' tablespaces=trans transport_tablespace=y file=exp_trans.dmp datafiles=C:\oracle\oradata\EYGLE\DATAFILE\trans.dbf

Import: Release 10.2.0.3.0 - Production on 星期四 7月 12 15:55:30 2007

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


连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options

经由常规路径由 EXPORT:V10.02.01 创建的导出文件
即将导入可传输的表空间元数据...
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
. 正在将 SYS 的对象导入到 SYS
. 正在将 SYS 的对象导入到 SYS
. 正在将 TRANS 的对象导入到 TRANS
. . 正在导入表 "TEST"
. 正在将 SYS 的对象导入到 SYS
成功终止导入, 没有出现警告。

我们看到这个文件可以直接被Windows上的系统识别。

SQL> select count(*) from trans.test;

COUNT(*)
----------
615

SQL> select tablespace_name,status from dba_tablespaces;

TABLESPACE_NAME STATUS
------------------------------ ---------
SYSTEM ONLINE
UNDOTBS1 ONLINE
SYSAUX ONLINE
TEMP ONLINE
USERS ONLINE
TRANS READ ONLY

已选择6行。

6. Oracle10g同字节序跨平台迁移的增强
上一节介绍的方法不免过于复杂,也许很多朋友会发出这样的疑问,既然同字节序数据文件跨平台的差异如此之小,为什么Oracle不直接实现这一技术呢?
也许是这一迁移的技术优先级较低,在Oracle10gR2中,Oracle开始支持同字节序数据库的跨平台迁移。
这一技术实现有以下几点注意事项:
1. 源平台和目的平台需要具有相同的字节序
2. 重做日志文件和控制文件不会传输,迁移之后需要重建控制文件使用RESETLOGS方式打开数据库;临时文件不会被传输
3. BFILES、外部表和Directories、口令文件等不会被传输。

我们通过Linux平台到Windows平台的迁移来看一下这一技术的实现。

1. 确认平台及版本

首先要确定源平台和目标平台具有相同的字节序:

SQL> select PLATFORM_NAME, ENDIAN_FORMAT from V$TRANSPORTABLE_PLATFORM
2 where platform_name in ('Linux IA (32-bit)','Microsoft Windows IA (32-bit)');
PLATFORM_NAME ENDIAN_FORMAT
---------------------------------------- --------------
Microsoft Windows IA (32-bit) Little
Linux IA (32-bit) Little

然后需要确定源平台及目标平台的数据库版本,通常需要这两者具有相同的数据库版本,本例的情况有所不同,Linux平台的数据库版本为10.2.0.1,Windows平台的数据库版本为10.2.0.3,数据库版本不同将使情况稍微复杂一点,而且需要注意的是,通常高版本的数据库不能向低版本迁移。

2. 确认迁移是否支持

跨平台迁移需要数据库处于READ ONLY模式打开,使用DBMS_TDB.CHECK_DB进行检查:

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

PL/SQL procedure successfully completed.

如果以上过程成功执行,并没有其他相关警告输出,则说明数据库可以支持跨平台转移。

3. 检查外部对象

使用DBMS_TDB.CHECK_EXTERNAL来识别外部表、Directories或BFILES等,这些对象所指向的外部数据不能被RMAN自动转移。

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 procedure successfully completed.

如果数据库中存在外部表、DIRECTORIES等,则以上过程执行后的输出与以上类似。

4. 使用RMAN进行跨平台文件迁移

执行跨平台迁移首先要通过RMAN对数据文件进行转换,RMAN执行过程如下:

[oracle@danaly eygle]$ rman target /

Recovery Manager: Release 10.2.0.1.0 - Production on Sat Jun 23 23:06:52 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.

connected to target database: EYGLE (DBID=1445136501)

RMAN> CONVERT DATABASE NEW DATABASE 'JULIA'
2> TRANSPORT SCRIPT '/opt/oracle/oradata/transport/transport.sql'
3> TO PLATFORM 'Microsoft Windows IA (32-bit)'
4> DB_FILE_NAME_CONVERT '/opt/oracle/oradata/eygle/EYGLE/datafile' '/opt/oracle/oradata/transport';

Starting convert at 23-JUN-07
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=159 devtype=DISK

Directory SYS.DATA_PUMP_DIR found in the database

User SYS with SYSDBA and SYSOPER privilege found in password file
channel ORA_DISK_1: starting datafile conversion
input datafile
fno=00001 name=/opt/oracle/oradata/eygle/EYGLE/datafile/o1_mf_system_37tc1xns_.dbf
converted datafile=/opt/oracle/oradata/transport/o1_mf_system_37tc1xns_.dbf
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting datafile conversion
input datafile
fno=00002 name=/opt/oracle/oradata/eygle/EYGLE/datafile/o1_mf_undotbs1_37tc29mb_.dbf
converted datafile=/opt/oracle/oradata/transport/o1_mf_undotbs1_37tc29mb_.dbf
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:07
channel ORA_DISK_1: starting datafile conversion
input datafile
fno=00003 name=/opt/oracle/oradata/eygle/EYGLE/datafile/o1_mf_sysaux_37tc2gqc_.dbf
converted datafile=/opt/oracle/oradata/transport/o1_mf_sysaux_37tc2gqc_.dbf
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:07
channel ORA_DISK_1: starting datafile conversion
input datafile
fno=00004 name=/opt/oracle/oradata/eygle/EYGLE/datafile/o1_mf_users_37tc2tth_.dbf
converted datafile=/opt/oracle/oradata/transport/o1_mf_users_37tc2tth_.dbf
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:01
Run SQL script /opt/oracle/oradata/transport/transport.sql on the target platform to create database
Edit init.ora file /opt/oracle/product/10.2.0/dbs/init_00il1i4r_1_0.ora. This PFILE will be used to create the database on the target platform
To recompile all PL/SQL modules, run utlirp.sql and utlrp.sql on the target platform
To change the internal database identifier, use DBNEWID Utility
Finished backup at 23-JUN-07

RMAN的转换语句中指定生成一个转换脚本transport.sql用于参考,转换的目标平台是Microsoft Windows IA (32-bit),所有的数据文件转换后存放在一个新的目录下。
最后RMAN还自动生成一个参数文件,这个文件是init_00il1i4r_1_0.ora,这个参数文件里包含了一些重要的初始化参数,可以根据需要进行相应的更改,由于平台以及路径的不同,很多涉及路径的参数都需要进行变更,这个参数文件的内容大致分为三个部分。
第一部分列出需要修改的参数:

# Please change the values of the following parameters:
control_files = "/opt/oracle/product/10.2.0/dbs/cf_D-JULIA_id-1445136501_00il1i4r"
db_create_file_dest = "/opt/oracle/product/10.2.0/dbs/eygle"
db_recovery_file_dest = "/opt/oracle/product/10.2.0/dbs/flash_recovery_area"
db_recovery_file_dest_size= 2147483648
background_dump_dest = "/opt/oracle/product/10.2.0/dbs/bdump"
user_dump_dest = "/opt/oracle/product/10.2.0/dbs/udump"
core_dump_dest = "/opt/oracle/product/10.2.0/dbs/cdump"
audit_file_dest = "/opt/oracle/product/10.2.0/dbs/adump"
db_name = "JULIA"

第二部分列出了建议Review的参数:

# Please review the values of the following parameters:
remote_login_passwordfile= "EXCLUSIVE"
db_domain = ""
dispatchers = "(PROTOCOL=TCP) (SERVICE=eygleXDB)"

第三部分列出了来自于源数据库的一些特殊设置,这些参数可以酌情修改:

# The values of the following parameters are from source database:
processes = 150
sga_target = 943718400
db_block_size = 8192
compatible = "10.2.0.1.0"
db_file_multiblock_read_count= 16
undo_management = "AUTO"
undo_tablespace = "UNDOTBS1"
job_queue_processes = 10
open_cursors = 300
pga_aggregate_target = 314572800

参数文件的内容我们可以在新的平台上重新创建,这个参数文件可以作为参考。

5. 转移文件到目标平台
源平台的工作完成之后,数据文件可以通过ftp等方式转移到目标平台,部署到相应目录,我的操作步骤如下:

C:\oracle\oradata>gzip -d trans.tar.gz
C:\oracle\oradata>tar -xvf trans.tar
tar: blocksize = 20
x transport/transport.sql, 2397 bytes, 5 tape blocks
x transport/o1_mf_sysaux_37tc2gqc_.dbf, 125837312 bytes, 245776 tape blocks
x transport/o1_mf_undotbs1_37tc29mb_.dbf, 209723392 bytes, 409616 tape blocks
x transport/o1_mf_system_37tc1xns_.dbf, 314580992 bytes, 614416 tape blocks
x transport/o1_mf_users_37tc2tth_.dbf, 5251072 bytes, 10256 tape blocks

C:\oracle\oradata>mkdir -p JULIA\DATAFILE
C:\oracle\oradata>mkdir JULIA\CONTROLFILE
C:\oracle\oradata>mkdir JULIA\ONLINELOG

C:\oracle\oradata>mv transport\* JULIA\DATAFILE

6. 创建基础环境

首先创建相关目录:

C:\oracle\oradata>mkdir C:\oracle\admin\julia\adump
C:\oracle\oradata>mkdir C:\oracle\admin\julia\bdump
C:\oracle\oradata>mkdir C:\oracle\admin\julia\cdump
C:\oracle\oradata>mkdir C:\oracle\admin\julia\dpdump
C:\oracle\oradata>mkdir C:\oracle\admin\julia\pfile
C:\oracle\oradata>mkdir C:\oracle\admin\julia\udump

创建Windows数据库服务:
C:\oracle\oradata>oradim -new -sid julia
实例已创建。

修改参数文件,参数文件可以从前面自动生成的参数文件进行修改得到,其中目录结构需要依据新平台的具体设置进行修改,和存储主要相关的两个参数修改如下:

db_create_file_dest = "C:\oracle\oradata"
db_recovery_file_dest = "C:\oracle\flash_recovery_area"

修改后的参数文件在Windows上应该位于$ORACLE_HOME/database下。参数文件中的另外一个重要参数是控制文件路径:

control_files = "/opt/oracle/product/10.2.0/dbs/cf_D-JULIA_id-1445136501_00il1i4r"

如果我们计划使用OMF管理,可以暂时注释这一参数,在创建控制文件后再将控制文件的名称路径追加到参数文件中。

7. 迁移步骤

准备工作完成之后,我们可以进行新平台的数据库加载等工作,这些工作还可以参考在源平台生成的transport.sql脚本。
这个脚本的第一部分给出了使用参数文件启动实例及重新创建控制文件的语法参考,当然我们还需要修改才能使用这段脚本:

STARTUP NOMOUNT PFILE='/opt/oracle/product/10.2.0/dbs/init_00il1i4r_1_0.ora'
CREATE CONTROLFILE REUSE SET DATABASE "LINDB10G" RESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 SIZE 50M,
GROUP 2 SIZE 50M,
GROUP 3 SIZE 50M
DATAFILE
'/opt/oracle/oradata/transport/o1_mf_system_37tc1xns_.dbf',
'/opt/oracle/oradata/transport/o1_mf_undotbs1_37tc29mb_.dbf',
'/opt/oracle/oradata/transport/o1_mf_sysaux_37tc2gqc_.dbf',
'/opt/oracle/oradata/transport/o1_mf_users_37tc2tth_.dbf'
CHARACTER SET ZHS16GBK
;

由于我们已经编辑好了新的参数文件,可以使用这个参数文件启动实例:

C:\oracle\oradata>set ORACLE_SID=julia
C:\oracle\oradata>sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.3.0 - Production on 星期一 6月 25 09:45:59 2007
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
已连接到空闲例程。
SQL> startup nomount pfile=?\database\initjulia.ora
ORACLE 例程已经启动。

Total System Global Area 943718400 bytes
Fixed Size 1293960 bytes
Variable Size 239075704 bytes
Database Buffers 700448768 bytes
Redo Buffers 2899968 bytes

接下来创建控制文件:

SQL> CREATE CONTROLFILE REUSE SET DATABASE "JULIA" RESETLOGS NOARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 292
7 LOGFILE
8 GROUP 1 SIZE 10M,
9 GROUP 2 SIZE 10M,
10 GROUP 3 SIZE 10M
11 DATAFILE
12 'C:\oracle\oradata\JULIA\DATAFILE\o1_mf_system_37tc1xns_.dbf',
13 'C:\oracle\oradata\JULIA\DATAFILE\o1_mf_undotbs1_37tc29mb_.dbf',
14 'C:\oracle\oradata\JULIA\DATAFILE\o1_mf_sysaux_37tc2gqc_.dbf',
15 'C:\oracle\oradata\JULIA\DATAFILE\o1_mf_users_37tc2tth_.dbf'
16 CHARACTER SET ZHS16GBK
17 ;

控制文件已创建。

然后将控制文件的名称等信息追加到参数文件中:

SQL> column ctl_files NEW_VALUE ctl_files;
SQL> SELECT CONCAT ('control_files=''',
2 CONCAT (REPLACE (VALUE, ', ', ''','''), '''')
3 ) ctl_files
4 FROM v$parameter WHERE NAME = 'control_files';

CTL_FILES
--------------------------------------------------------------------------------
control_files='C:\ORACLE\ORADATA\JULIA\CONTROLFILE\O1_MF_37Y7SZ9R_.CTL','C:\ORAC
LE\FLASH_RECOVERY_AREA\JULIA\CONTROLFILE\O1_MF_37Y7SZMK_.CTL'

SQL> host "echo &ctl_files >>C:\oracle\10.2.0\database\initjulia.ora";


注意:执行完以上命令后,需要检查参数文件的格式,如果控制文件名称未正确添加,可以手工调整一下。

完成了以上工作后,可以关闭数据库,再次启动数据库到Mount状态,这时候新的控制文件已经发挥作用:

SQL> shutdown immediate;
ORA-01109: ??????

已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area 943718400 bytes
Fixed Size 1293960 bytes
Variable Size 239075704 bytes
Database Buffers 700448768 bytes
Redo Buffers 2899968 bytes
数据库装载完毕。

8. 完成数据库恢复

接下来再参考一下transport.sql中的推荐步骤:

ALTER DATABASE OPEN RESETLOGS;

-- Commands to add tempfiles to temporary tablespaces.
-- Online tempfiles have complete space information.
-- Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE
SIZE 20971520 AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
-- End of tempfile additions.


现在我们需要通过RESETLOGS方式来重新生成日志文件,然后手工添加临时文件。

注意,在迁移过程中如果两个平台的数据库版本完全一致,则以上步骤可以顺利执行,参考transport.sql可以顺利完成迁移。而本例的测试平台由于Linux平台的数据库版本为10.2.0.1,Windows平台版本为10.2.0.3,所以实际操作中还会有所不同,在执行RESETLOGS过程中,数据库会发生中断:

SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出现错误:
ORA-01092: ORACLE 实例终止。强制断开连接

检查日志我们发现以下提示:

Mon Jun 25 10:03:19 2007
Errors in file c:\oracle\admin\julia\udump\julia_ora_3596.trc:
ORA-00704: 引导程序进程失败
ORA-39700: 必须用 UPGRADE 选项打开数据库

Oracle要求以UPGRADE选项打开数据库,对数据库执行跨版本迁移。

我们继续参考transport.sql的最后部分:

SHUTDOWN IMMEDIATE
STARTUP UPGRADE PFILE='/opt/oracle/product/10.2.0/dbs/init_00il1i4r_1_0.ora'
@@ ?/rdbms/admin/utlirp.sql
SHUTDOWN IMMEDIATE
STARTUP PFILE='/opt/oracle/product/10.2.0/dbs/init_00il1i4r_1_0.ora'
-- The following step will recompile all PL/SQL modules.
-- It may take serveral hours to complete.
@@ ?/rdbms/admin/utlrp.sql
set feedback 6;

再次启动数据库到UPGRADE模式,由于之前的数据库中断,现在这些需要进行一点恢复工作:

SQL> startup upgrade;
ORACLE 例程已经启动。

Total System Global Area 943718400 bytes
Fixed Size 1293960 bytes
Variable Size 239075704 bytes
Database Buffers 700448768 bytes
Redo Buffers 2899968 bytes
数据库装载完毕。
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1:'C:\ORACLE\ORADATA\JULIA\DATAFILE\O1_MF_SYSTEM_37TC1XNS_.DBF'
SQL> recover database;
完成介质恢复。
恢复完成之后启动数据库到UPGRADE模式:
SQL> shutdown immediate;
ORA-01109: 数据库未打开

已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup upgrade;
ORACLE 例程已经启动。

Total System Global Area 943718400 bytes
Fixed Size 1293960 bytes
Variable Size 239075704 bytes
Database Buffers 700448768 bytes
Redo Buffers 2899968 bytes
数据库装载完毕。
数据库已经打开。

执行脚本?/rdbms/admin/utlirp.sql,这个脚本执行完成之后会有如下提示:

DOC>#######################################################################
DOC> utlirp.sql completed successfully. All PL/SQL objects in the
DOC> database have been invalidated.
DOC>
DOC> Shut down and restart the database in normal mode and run utlrp.sql to
DOC> recompile invalid objects.
DOC>#######################################################################

也就是说,这个脚本的作用是使数据库中的PL/SQL对象INVALID,然后通过utlrp.sql的重新编译,消除跨平台的兼容性影响。
按照transport.sql脚本提示的步骤,我们可以重新启动数据库来执行utlrp.sql脚本(由于本例涉及到版本迁移,需要再次启动数据库到upgrade模式,如果数据库版本相同,则可以直接启动数据库,执行utlrp.sql脚本完成最后的编译工作):

SQL> @@ ?/rdbms/admin/utlrp.sql
TIMESTAMP
-------------------------------------------------------------------------------
COMP_TIMESTAMP UTLRP_BGN 2007-06-25 10:27:57
............
PL/SQL 过程已成功完成。
TIMESTAMP
-------------------------------------------------------------------------------
COMP_TIMESTAMP UTLRP_END 2007-06-25 10:39:43
PL/SQL 过程已成功完成。

utlrp.sql执行完成之后我们需要再执行和数据库升级相关的脚本,这个脚本是catupgrd.sql:

SQL> @?/rdbms/admin/catupgrd.sql

这个脚本调用catlog.sql和 catproc.sql来重建字典对象等,在执行完这个脚本之后,我们可以关闭数据库后,正常打开数据库:

SQL> startup
ORACLE 例程已经启动。

Total System Global Area 943718400 bytes
Fixed Size 1293960 bytes
Variable Size 239075704 bytes
Database Buffers 700448768 bytes
Redo Buffers 2899968 bytes
数据库装载完毕。
数据库已经打开。
SQL> select count(*) from dba_objects where status='INVALID';
COUNT(*)
----------
86
已选择 1 行。
SQL> @?\rdbms\admin\utlrp.sql

catupgrd.sql脚本可能会使部分字典对象失效,我们可以再次运行utlrp.sql脚本来进行编译,编译完成后,不要忘记为数据库添加临时文件:

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE
2 SIZE 20971520 AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;

表空间已更改。

至此同字节序的跨平台迁移全部完成,当然由于版本的不同,整个过程稍微复杂了一些,不过这个过程对于跨平台的迁移及版本升级是一个很好的参考。

7. 实现数据迁移的高可用性

通过以上测试实际上可以确认,对于可传输表空间,可以很容易从Oracle 9i向Oracle 10g迁移。那么这种方法对于可用性要求极高的环境进行数据迁移或数据库迁移具有极大的便利。
如果进行数据库升级,通常的方法是通过DBUA(Database Upgrade Assistant,Oracle 10g引入的新工具)进行,但是DBUA存在的问题在于,操作过程过长,而且如果升级过程中出现问题,数据文件可能不能重新被使用,这就需要从备份中进行恢复,这使得业务连续性要求高的企业很难采用这种方法进行升级。
另外一种常见的迁移的方法是通过逻辑导出导入(EXP/IMP),但是这种方法对于不断变化的数据无能为力,所以通常也不可行。
那么现在,可传输表空间就成了一个可以考虑的快速迁移或升级方法。
Oracle有一个小组,专注于设计高可用性架构的实现,以帮助用户最大限度的提高系统可用性,Oracle有一个专有名词用来命名这类技术-MAA(Maximum Availability Architecture ,MAA)。OTN上MAA部分有一个Amadeus公司的实践案例,通过可传输表空间从Oracle 9i向Oracle 10g实现快速数据迁移。
当然这种方法的使用要考虑的还有很多,通过各种技术和方法的结合使用才能最终的达到快速迁移的目标。
Amadeus公司的迁移是在同类型平台不同主机之间进行的,其实现步骤大致如下:
(1) 在升级主机安装Oracle 9i版本,并创建生产库的DataGuard数据库,这个工作可以在线进行,不影响主节点的工作。
(2) 在升级主机安装Oracle 10gR2数据库软件,创建数据库;此时升级主机上存在了2个数据库。
(3) 整理不能通过transport tablespace处理的内容,如sequence、synonyms、grants等。
(4) 在升级割接时间,将主库置为只读,将日志全部应用到备机,业务影响从此时开始。
(5) 将备机的数据文件通过可传输表空间迁移至Oracle 10gR2数据库,并创建sequencee、synonyms、grants等对象,检查验证。
(6) 如果没有问题,则即可将业务切换至新的Oracle 10gR2数据库运行,业务恢复正常运行。
在这个迁移过程中,如果迁移失败,那么直接读写打开主库即可恢复业务的正常运行,回退非常方便。
使用这种方法,业务影响仅发生在以上(4)~(6)步,在OTN的案例中,Amadeus公司在实际操作中,10分钟之内就将一个大型数据库迁移到Oracle 10gR2,这种方式是一种非常有新意的创新性应用。在熟悉了Oracle的各项技术之后,通过不断实践和探索,我们就能够不断发现充满价值的Oracle应用。

1.3.7 最后的脚本

以上脚本已经完成了主要的工作,剩下的是一些最后的维护工作。
这里还有两个脚本需要执行,首先执行的是postScripts.sql脚本,这个脚本主要对部分用户及部分数据库选件进行维护:

connect "SYS"/"&&sysPassword" as SYSDBA
set echo on
spool C:\oracle\admin\eygle\scripts\postScripts.log
@C:\oracle\10.2.0\rdbms\admin\dbmssml.sql;
execute dbms_datapump_utl.replace_default_dir;
commit;
connect "SYS"/"&&sysPassword" as SYSDBA
alter session set current_schema=ORDSYS;
@C:\oracle\10.2.0\ord\im\admin\ordlib.sql;
alter session set current_schema=SYS;
connect "SYS"/"&&sysPassword" as SYSDBA
connect "SYS"/"&&sysPassword" as SYSDBA
alter user CTXSYS account unlock identified by change_on_install;
connect "CTXSYS"/"change_on_install"
@C:\oracle\10.2.0\ctx\admin\defaults\dr0defdp.sql;
@C:\oracle\10.2.0\ctx\admin\defaults\dr0defin.sql "SIMPLIFIED CHINESE";
connect "SYS"/"&&sysPassword" as SYSDBA
execute dbms_swrf_internal.cleanup_database(cleanup_local => FALSE);
commit;
spool off

最后执行的脚本是postDBCreation.sql,在这个脚本中将创建spfile,解锁SYSMAN、DBSNMP用户,编译失效对象并配置DB Control:

connect "SYS"/"&&sysPassword" as SYSDBA
set echo on
spool C:\oracle\admin\eygle\scripts\postDBCreation.log
connect "SYS"/"&&sysPassword" as SYSDBA
set echo on
create spfile='C:\oracle\10.2.0/dbs/spfileeygle.ora'
FROM pfile='C:\oracle\admin\eygle\scripts\init.ora';
shutdown immediate;
connect "SYS"/"&&sysPassword" as SYSDBA
startup ;
alter user SYSMAN identified by "&&sysmanPassword" account unlock;
alter user DBSNMP identified by "&&dbsnmpPassword" account unlock;
select 'utl_recomp_begin: ' || to_char(sysdate, 'HH:MI:SS') from dual;
execute utl_recomp.recomp_serial();
select 'utl_recomp_end: ' || to_char(sysdate, 'HH:MI:SS') from dual;
host C:\oracle\10.2.0\bin\emca.bat -config dbcontrol db -silent -DB_UNIQUE_NAME eygle -PORT 1521 -EM_HOME C:\oracle\10.2.0 -LISTENER LISTENER -SERVICE_NAME eygle -SYS_PWD &&sysPassword -SID eygle -ORACLE_HOME C:\oracle\10.2.0 -DBSNMP_PWD &&dbsnmpPassword -HOST gqgai -LISTENER_OH C:\oracle\10.2.0 -LOG_FILE C:\oracle\admin\eygle\scripts\emConfig.log -SYSMAN_PWD &&sysmanPassword;
spool C:\oracle\admin\eygle\scripts\postDBCreation.log
exit;

看到在最后部分,通过emca.bat批处理文件,配置了DB Control,这里通过一条完整的命令快速地完成了DB Control的创建等工作,也可以通过手工方式对DB Control进行维护,关于这部分内容请参考"第2章 从OEM到iSQL*Plus"的内容。
此外需要注意的是以下几句命令:

select 'utl_recomp_begin: ' || to_char(sysdate, 'HH:MI:SS') from dual;
execute utl_recomp.recomp_serial();
select 'utl_recomp_end: ' || to_char(sysdate, 'HH:MI:SS') from dual;

在Oracle 9i的postDBCreation.sql的脚本中,这部分的内容如下:

@/opt/oracle/product/9.2.0/rdbms/admin/utlrp.sql;

其实两者是相同的,utlrp.sql中主体部分和Oracle 10g中是相同的:

@@utlrcmp.sql
execute utl_recomp.recomp_serial();

Rem =====================================================================
Rem Run component validation procedure
Rem =====================================================================

EXECUTE dbms_registry.validate_components;

Oracle在utlrp.sql脚本的注释中说得很明确:这是一个通用脚本,可以在任意时候运行以重新编译数据库失效对象。
通常我们会在Oracle的升级指导中看到这个脚本,Oracle强烈推荐在migration / upgrade / downgrade之后,通过运行此脚本编译失效对象。但是注意,此脚本需要用SQL*Plus以SYSDBA身份运行,并且当时数据库中最好不要有活动事物或DDL操作,否则极容易导致死锁的出现。
这样使用模板创建数据库就完成了。

-The End-


历史上的今天...
    >> 2012-08-07文章:
    >> 2009-08-07文章:
    >> 2005-08-07文章:
           Jan Dara 2-晚娘II

无觅

By eygle on 2007-08-07 21:36 | Comments (3) | Books | 1538 |

3 Comments

SQL>
Table created.

SQL> select count(*) from test;

test表的创建命令没有,书上也是这失误么 呵呵....

喜欢上你的风格了 呵呵....

SQL> connect trans/trans
create table test as select * from dict;
Connected.
SQL>
Table created.

SQL> select count(*) from test;

COUNT(*)
----------
615


仔细看,在上面,SQL*PLUS中cp + paste 执行会有这个问题。
btw:这小节没有包含在书上,可以忽略。


买了,这两天读了第一章,觉得本篇里倒数第二行的"活动事物"应该是"活动事务",如果真是这样的话,那印刷版里也有这样的错误.呵呵^_^


CopyRight © 2004~2020 云和恩墨,成就未来!, All rights reserved.
数据恢复·紧急救援·性能优化 云和恩墨 24x7 热线电话:400-600-8755 业务咨询:010-59007017-7040 or 7037 业务合作: marketing@enmotech.com