实验目的:将oracle数据库从一台机器迁移到另外的一台机器(同为linux平台),设置为不同的路径,不同的实例名 源端: ORACLE_BASE=/u01/app/oracle ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1 ORACLE_SID=test 数据文件位置:/oradata/test 目标端: ORACLE_BASE=/u02/app/oracle ORACLE_HOME=/u02/app/oracle/product/10.2.0/db_1 ORALCE_SID=test2 数据文件位置:/oradata2/test2 注:两台主机非一台,但是主机名一致均为model.rhel5 第一步:在源端取得备份数据 查询一下MAI用户下的数据,做最后校验使用 MAI@test > select * from tab; TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- BONUS TABLE DEPT TABLE EMP TABLE SALGRADE TABLE TEST TABLE TEST01 TABLE 开始备份: $ oracle@model /mnt/hgfs/software/backup> rman target / RMAN> run{ 2> allocate channel c1 device type disk format '/mnt/hgfs/software/backup/%T_%U'; 3> backup database; 4> backup current controlfile format '/mnt/hgfs/software/backup/%T_CTL_%U'; 5> backup spfile format '/mnt/hgfs/software/backup/%T_SPFILE_%U'; 6> release channel c1; 7> } 备份集信息: $ oracle@model /mnt/hgfs/software/backup> ls -lh total 304M -rwxrwxrwx 1 root root 594M Aug 29 20:31 20120829_02njsrtb_1_1* -rwxrwxrwx 1 root root 6.9M Aug 29 20:31 20120829_03njss0b_1_1* -rwxrwxrwx 1 root root 6.8M Aug 29 20:31 20120829_CTL_04njss0k_1_1* -rwxrwxrwx 1 root root 96K Aug 29 20:31 20120829_SPFILE_05njss0m_1_1* 第二步:备端的准备 1、安装数据库软件,基位置参考上文说明。 2、创建相关的目录: $ oracle@model ~> env | grep ORACLE ORACLE_BASE=/u02/app/oracle ORACLE_HOME=/u02/app/oracle/product/10.2.0/db_1 $ oracle@model ~> cd $ORACLE_BASE $ oracle@model /u02/app/oracle> mkdir flash_recovery_area $ oracle@model /u02/app/oracle> mkdir -p admin/test2 $ oracle@model /u02/app/oracle> cd admin/test2 $ oracle@model /u02/app/oracle/admin/test2> mkdir {a,b,c,d,u}dump 第三步:开始恢复,此时恢复的实例名为test $ oracle@model ~> export ORACLE_SID=test $ oracle@model ~> rman target / RMAN> startup nomount 1、恢复spfile: RMAN> restore spfile from '/mnt/hgfs/software/backup/20120829_SPFILE_05njss0m_1_1'; RMAN> shutdown immediate; 2、编辑参数文件,使参数中的相关路径变更为新路径 $ oracle@model ~> sqlplus / as sysdba SYS@test > create pfile from spfile; 编辑生成的$ORACLE_HOME/dbs/inittest.ora文件,将文件中的路径改为新的路径,即: /oradata/test/修改为/oradata2/test2/ /u01/app/oracle/修改为/u02/app/oracle /u01/app/oracle/admin/test修改为/u02/app/oracle/admin/test2 $ oracle@model ~> sqlplus / as sysdba SYS@test > create spfile from pfile; 3、恢复控制文件: $ oracle@model ~> rman target / RMAN> startup nomount RMAN> restore controlfile from '/mnt/hgfs/software/backup/20120829_CTL_04njss0k_1_1'; 4、恢复数据文件: RMAN> alter database mount; RMAN> run { 2> set newname for datafile 1 to '/oradata2/test2/system01.dbf'; 3> set newname for datafile 2 to '/oradata2/test2/undotbs01.dbf'; 4> set newname for datafile 3 to '/oradata2/test2/sysaux01.dbf'; 5> set newname for datafile 4 to '/oradata2/test2/users01.dbf'; 6> set newname for datafile 5 to '/oradata2/test2/example01.dbf'; 7> restore database; 8> } 5、重建控制文件,更新控制文件中的数据文件路径 $ oracle@model ~> sqlplus / as sysdba SYS@test > alter database backup controlfile to trace; 到$ORACLE_BASE/admin/udump中找到刚才生成的TRACE文件,复制出其中的创建文件集的片段,修改其中的路径信息为新的路径信息,备用 SYS@test > shutdown immediate; SYS@test > startup nomount 利用刚才修改过的控制文件创建脚本重建控制文件: SYS@test > CREATE CONTROLFILE REUSE DATABASE "TEST" RESETLOGS ARCHIVELOG 2 MAXLOGFILES 16 3 MAXLOGMEMBERS 3 4 MAXDATAFILES 100 5 MAXINSTANCES 8 6 MAXLOGHISTORY 292 7 LOGFILE 8 GROUP 1 '/oradata2/test2/redo01.log' SIZE 50M, 9 GROUP 2 '/oradata2/test2/redo02.log' SIZE 50M, 10 GROUP 3 '/oradata2/test2/redo03.log' SIZE 50M 11 -- STANDBY LOGFILE 12 DATAFILE 13 '/oradata2/test2/system01.dbf', 14 '/oradata2/test2/undotbs01.dbf', 15 '/oradata2/test2/sysaux01.dbf', 16 '/oradata2/test2/users01.dbf', 17 '/oradata2/test2/example01.dbf' 18 CHARACTER SET ZHS16GBK 19 ; SYS@test > alter database open resetlogs; 至此,数据库已经能够正常启动了,但是此时的实例名以及数据库名均为test,需要将其更改为test2,继续向下走 第四部分:修改实例名,以及数据库名 相关内容可以参见先前的文章:ORACLE数据库实例的重命名( ) SYS@test > shutdown immediate; SYS@test > startup mount 修改数据文件、控制文件中的数据库名称,修改之后会关闭数据库 SYS@test > !nid target=sys/oracle dbname=test2 logfile=/tmp/change_name2test2.log 启动数据库,这个时候会报数据库名称不一致的错误,不去管他(ORA-01103: database name 'MAI' in control file is not 'TEST') SYS@test > startup mount 将数据库名更新到spfile文件中 SYS@test > alter system set db_name='test2' scope=spfile; SYS@test > create pfile from spfile; SYS@test > shutdown immediate; $ oracle@model ~> export ORACLE_SID=test2 $ oracle@model ~> sqlplus / as sysdba SYS@test2 > startup pfile='/u02/app/oracle/product/10.2.0/db_1/dbs/inittest.ora' SYS@test2 > create spfile from pfile='/u02/app/oracle/product/10.2.0/db_1/dbs/inittest.ora'; SYS@test2 > shutdown immediate; SYS@test2 > startup mount; SYS@test2 > create pfile from spfile; SYS@test2 > alter database open resetlogs; 将ORACLE_SID=test2写入到oracle用户的.bash_profile文件中: $ oracle@model ~> echo export ORACLE_SID=test2 >> .bash_profile 至此呢,数据库迁移才算是彻底的完成了。 第五部分:最后的校验 1、MAI用户验证: MAI@test2 > select * from tab; TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- BONUS TABLE DEPT TABLE EMP TABLE SALGRADE TABLE TEST TABLE TEST01 TABLE 2、数据库名验证: SYS@test2 > select name,open_mode from v$database; NAME OPEN_MODE --------- ---------- TEST2 READ WRITE 3、实例名验证: SYS@test2 > select instance_name,status from v$instance; INSTANCE_NAME STATUS ---------------- ------------ test2 OPEN 4、进程验证: $ oracle@model ~> ps aux | grep ora_ | grep -v grep oracle 25592 0.0 1.2 261864 12756 ? Ss 00:23 0:00 ora_pmon_test2 oracle 25594 0.0 1.0 261252 11104 ? Ss 00:23 0:00 ora_psp0_test2 oracle 25596 0.0 1.3 261252 13848 ? Ss 00:23 0:00 ora_mman_test2 oracle 25598 0.0 1.3 263320 13708 ? Ss 00:23 0:00 ora_dbw0_test2 oracle 25600 0.0 2.9 276804 30644 ? Ss 00:23 0:00 ora_lgwr_test2 oracle 25602 0.0 1.6 261236 16956 ? Ss 00:23 0:00 ora_ckpt_test2 oracle 25604 0.0 3.4 261784 35812 ? Ss 00:23 0:00 ora_smon_test2 oracle 25606 0.0 1.6 261252 17224 ? Ss 00:23 0:00 ora_reco_test2 oracle 25608 0.0 2.2 262812 22948 ? Ss 00:23 0:00 ora_cjq0_test2 oracle 25610 0.1 4.2 262988 43768 ? Ss 00:23 0:00 ora_mmon_test2 oracle 25612 0.0 1.2 261252 12832 ? Ss 00:23 0:00 ora_mmnl_test2 oracle 25614 0.0 1.0 261248 10672 ? Ss 00:23 0:00 ora_d000_test2 oracle 25616 0.0 1.0 261248 10656 ? Ss 00:23 0:00 ora_d001_test2 oracle 25626 0.0 2.6 276804 27168 ? Ss 00:24 0:00 ora_arc0_test2 oracle 25628 0.0 2.6 276804 27040 ? Ss 00:24 0:00 ora_arc1_test2 oracle 25630 0.0 2.6 276804 26920 ? Ss 00:24 0:00 ora_arc2_test2 oracle 25632 0.0 1.5 261252 15660 ? Ss 00:24 0:00 ora_qmnc_test2 oracle 25638 0.0 1.1 261248 11656 ? Ss 00:24 0:00 ora_q000_test2 oracle 25640 0.0 1.3 261248 13912 ? Ss 00:24 0:00 ora_q001_test2 5、oracle用户的变量验证: $ oracle@model ~> env | grep ORACLE ORACLE_SID=test2 ORACLE_BASE=/u02/app/oracle ORACLE_HOME=/u02/app/oracle/product/10.2.0/db_1 验证完成,验证的结果表明,迁移确实已经成功,并且已经达到了预期的目的。