實驗目的:將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數據庫實例的重命名( http://blog.sina.com.cn/s/blog_67be3b4501016dgu.html )
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
驗證完成,驗證的結果表明,遷移確實已經成功,並且已經達到了預期的目的。
源端:
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數據庫實例的重命名( http://blog.sina.com.cn/s/blog_67be3b4501016dgu.html )
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
驗證完成,驗證的結果表明,遷移確實已經成功,並且已經達到了預期的目的。