注:本文档是本人2010年6月将财政局的AIX上的ORACLE迁移到LINUX所做的测试实验
了解ORACLE的人都知道,如果要把ORACLE从一台机器迁移到别一台机器,如果操作系统类型和数据库版本相同时,直接可以把数据库干净的关闭之后,把数据文件、控制文件、参数文件拷贝到目标机算机,并在目标计算机上只安装数据库软件和创建相同的目录结构后,就可以完成数据库的迁移了。
那么在异构平台能够实现这样的迁移方法吗?在异构平台大家用得最多的迁移方法是EXP和EXPDP,还有RMAN的辅助通道、Dataguard、流复制等方法实现。但是利用EXP和EXPDP迁移大数据库时太慢,Dataguard、流复制等方法又太麻烦。其实在ORACLE 10G以后我们还可以利用RMAN Convert database的新特性进行跨平台数据迁移。
利用RMAN Convert database特性进行跨平台迁移数据在Oracle10g中,不仅可以利用跨平台传输表空间的新特性在异构平台数据库之间迁移数据,在特定条件下,还可以利用Convert database特性进行整个数据库跨平台的迁移。
如果要在10G中进行全库跨平台的迁移,那么只能在低位和低位或者高位和高位平台之间进行迁移,无法进行高位与低位平台的迁移。大家可以参考V$TRANSPORTABLE_PLATFORM中的信息以决定是否能够迁移。
1:Convert database特性介绍:
1)、只能传输数据表空间的数据文件。临时表空间将不会被传输,如果临时表空间是本地管理的话,那么传输数据库完成后将会自动在目标数据库创建临时表空间。
2)、假如源主数据库使用PFILE,那么PFILE也会被传输。如果源数据库使用的是SPFILE,那么将会自动产生一个PFILE进行传输,并在目标数据库生成SPFILE。
3)、控制文件和联机日志文件将不会被传输。在目标数据库open resetlogs的过程中,将会自动创建控制文件和联机日志文件。
4)、 BFILE、外部表和directory将不会被传输。RMAN检查的时候将会把这些对象列出,用户可以手工创建这些对象。
5)、密码文件将不会被传输,用户必须在目标数据库手工创建密码文件。
传输数据库的第一步是将源数据库置于READ ONLY模式:
2:查看ORACLE 10可以支持转换的目标数据库的平台
SQL> select * from V$TRANSPORTABLE_PLATFORM. order by 3;
PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT
----------- ----------------------------- ----------------
4 HP-UX IA (64-bit) Big
1 Solaris[tm] OE (32-bit) Big
16 Apple Mac OS Big
3 HP-UX (64-bit) Big
9 IBM zSeries Based Linux Big
6 AIX-Based Systems (64-bit) Big
2 Solaris[tm] OE (64-bit) Big
18 IBM Power Based Linux Big
17 Solaris Operating System (x86) Little
12 Microsoft Windows 64-bit for AMD Little
13 Linux 64-bit for AMD Little
8 Microsoft Windows IA (64-bit) Little
15 HP Open VMS Little
5 HP Tru64 UNIX Little
10 Linux IA (32-bit) Little
7 Microsoft Windows IA (32-bit) Little
11 Linux IA (64-bit) Little
通过上面的查询我们了解到,目标数据库除了WIN 32平台和LINUX 32平台不支持以外,其它的平台基本都支持。
在本实验中我们就以从WIN 32位系统中的数据库迁移到LINUX 64位系统数据库为例。
3:将源数据库置于READ ONLY模式:
SQL> shutdown immediate
SQL> startup mount
SQL> alter database open read only;
4:转换前的检验
利用dbms_tdb包检查数据库能否被传输以及列出外部表和DIRECTORY等无法传输的对象信息(测试案例采用Windows迁移至LINUX 64BIT平台):
SQL> set serveroutput on
SQL> declare
db_ready boolean;
begin
db_ready := dbms_tdb.check_db('Linux 64-bit for AMD',
dbms_tdb.skip_none);
end;
/
PS:如果没有输出表示正常
SQL> declare
external boolean;
begin
external := dbms_tdb.check_external;
end;
/
PS:如果没有输出表示正常
5:利用RMAN把数据库转换成64位LINUX格式
环境检查完毕后就可以利用RMAN的convert database命令在源数据库进行转换(convert database也可以在目标数据库进行,具体可以参考文档):
RMAN> CONVERT DATABASE NEW DATABASE 'testdb'
transport script. 'd:\bak\transportdb.sql'
to platform. 'Linux 64-bit for AMD'
db_file_name_convert 'd:\oracle\oradata\ufida' 'd:\oracle\oradata\testdb';
PS:1)、new database表示目标数据库的名字,
2)、transport script指定生成建库脚本的位置,
3)、to platform表示目标数据库的平台,
4)、db_file_name_convert中
指定源数据库数据文件所在的位置为:'d:\oracle\oradata\ufida'
转换后数据文件存放的目录为:'d:\oracle\oradata\testdb'
6:修改生成的参数文件
通过查看RMAN转换时生成的脚本d:\bak\transportdb.sql,可以找到生的的参数文件是:D:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\INIT_00LUACFK_1_0.ORA
由于WIN和LINUX的目录结构区别太大,我们需要修改这个脚本以适应LINUX系统。特别要注意大小写。修改完成之后我们把它复制到目标数据库的相关位置。
最终的参数文件如下
cat /u01/oracle/product/10.2.0/db_1/dbs/inittestdb.ora
# Please change the values of the following parameters:
control_files = "/u01/oradata/testdb/testdb.ctl"
audit_file_dest = "/u01/oracle/admin/testdb/adump"
background_dump_dest = "/u01/oracle/admin/testdb/bdump"
user_dump_dest = "/u01/oracle/admin/testdb/udump"
core_dump_dest = "/u01/oracle/admin/testdb/cdump"
db_name = "testdb"
# Please review the values of the following parameters:
__shared_pool_size = 282274688
__large_pool_size = 12194304
__java_pool_size = 12194304
__streams_pool_size = 0
__db_cache_size = 518743680
remote_login_passwordfile= "EXCLUSIVE"
db_domain = ""
dispatchers = "(PROTOCOL=TCP) (SERVICE=ufidaXDB)"
# The values of the following parameters are from source database:
processes = 150
nls_language = "SIMPLIFIED CHINESE"
nls_territory = "CHINA"
sga_target = 293601280
db_block_size = 8192
compatible = "10.2.0.1.0"
# log_archive_dest_1 = "location=/oracle/oradata/testdb/archive"
db_file_multiblock_read_count= 16
undo_management = "AUTO"
undo_tablespace = "UNDOTBS1"
job_queue_processes = 10
open_cursors = 300
pga_aggregate_target = 286468992
7:修改生成的SQL脚本
同样由于WIN和LINUX的目录结构区别太大,我们需要修改这个脚本以适应LINUX系统。特别要注意大小写。
最终的SQL脚本如下
-- The following commands will create a new control file and use it
-- to open the database.
-- Data used by Recovery Manager will be lost.
-- The contents of online logs will be lost and all backups will
-- be invalidated. Use this only if online logs are damaged.
-- After mounting the created controlfile, the following SQL
-- statement will place the database in the appropriate
-- protection mode:
-- ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE
STARTUP NOMOUNT PFILE='/u01/oracle/product/10.2.0/db_1/dbs/inittestdb.ora'
CREATE CONTROLFILE REUSE SET DATABASE "TESTDB" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/oradata/testdb/logfile01.log' SIZE 50M,
GROUP 2 '/u01/oradata/testdb/logfile02.log' SIZE 50M,
GROUP 3 '/u01/oradata/testdb/logfile03.log' SIZE 50M
DATAFILE
'/u01/oradata/testdb/SYSTEM01.DBF',
'/u01/oradata/testdb/UNDOTBS01.DBF',
'/u01/oradata/testdb/SYSAUX01.DBF',
'/u01/oradata/testdb/USERS01.DBF',
'/u01/oradata/testdb/NHCZCW01.DBF'
CHARACTER SET ZHS16GBK
;
-- Database can now be opened zeroing the online logs.
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 '/u01/oradata/testdb/temp01.dbf'
SIZE 239075328 AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
-- End of tempfile additions.
--
set echo off
prompt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prompt * Your database has been created successfully!
prompt * There are many things to think about for the new database. Here
prompt * is a checklist to help you stay on track:
prompt * 1. You may want to redefine the location of the directory objects.
prompt * 2. You may want to change the internal database identifier (DBID)
prompt * or the global database name for this database. Use the
prompt * NEWDBID Utility (nid).
prompt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SHUTDOWN IMMEDIATE
STARTUP UPGRADE PFILE='/u01/oracle/product/10.2.0/db_1/dbs/inittestdb.ora'
@@ ?/rdbms/admin/utlirp.sql
SHUTDOWN IMMEDIATE
STARTUP PFILE='/u01/oracle/product/10.2.0/db_1/dbs/inittestdb.ora'
-- The following step will recompile all PL/SQL modules.
-- It may take serveral hours to complete.
@@ ?/rdbms/admin/utlrp.sql
set feedback 6;
8:在目标数据库上还原数据库
1):在目标数据库上仅安装数据库软件,不建库
2):在目标数据库上创建如下目录
/u01/oracle/admin/testdb/adump
/u01/oracle/admin/testdb/bdump
/u01/oracle/admin/testdb/cdump
/u01/oracle/admin/testdb/ddump
/u01/oracle/admin/testdb/udump
/u01/oradata/testdb/archive
3) :拷贝相关的文件到目标数据库
把RMAN转换时生成数据文件、生成并修改过的SQL脚本和参数文件拷贝到如下位置
/u01/oradata/testdb/SYSTEM01.DBF
/u01/oradata/testdb/UNDOTBS01.DBF
/u01/oradata/testdb/SYSAUX01.DBF
/u01/oradata/testdb/USERS01.DBF
/u01/oradata/testdb/NHCZCW01.DBF
/u01/oracle/product/10.2.0/db_1/dbs/inittestdb.ora
/u01/oracle/transportdb.sql
4) :拷贝控制文件到目标数据库
由于控制文件不存在跨平台的差异,我们只需把源数据库的控制文件复制到目标数据库中即可,注意控制文件名字和路径要与参数文件中定义的致
/u01/oradata/testdb/testdb.ctl
5) :执行脚本,还原数据库
export oracle_sid=testdb
sqlplus / as sysdba
@/u01/oracle/transportdb.sql
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/235507/viewspace-1129121/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/235507/viewspace-1129121/