Oracle單執行個體遷移到RAC執行個體
将Oracle 單執行個體遷移到 RAC 執行個體上有兩種方法:
1. 使用RMAN 複制
2. 使用邏輯導出導入(exp/imp) 或者 資料泵(expdp/impdp)
Oracle單執行個體遷移到RAC執行個體--使用RMAN 異機恢複
一. 大緻操作步驟流程如下:
1. 安裝Clusterware 和 ASM 執行個體
2. 備份源庫,并将備份集copy到rac 節點上
3. 在RAC 上還原并修改初始化參數檔案,還原控制檔案和資料檔案
4. 增加undo 表空間和redo log 線程組,建立密鑰檔案
5. 配置RAC監聽
6. 将資料庫等資源添加到CRS
注意: 遷移的2個db版本版本要一緻。包括小版本。 比如10.2.0.4.0.
測試的時候是從10.2.0.5.0 遷移到10.2.0.5.0
Redhat 5.4 Orcle RAC 資料庫 從10.2.0.1更新到 10.2.0.5
二. 具體操作步驟
2.1 安裝Clusterware 和ASM 執行個體
上述安裝相信能閱讀小子此文檔的諸位此能力已然具備,是以不再贅述。
附圖參考:
2.1.1 運作DBCA 指令
[[email protected] ~]$ dbca
2.1.2 選擇 configure Automatic Storage Management, 來建立ASM 執行個體
2.1.3 選擇所有結點
2.1.4 輸入密碼:RAC 的spfile 必須放在共享目錄下。參數檔案我們選擇第一個initialization parameter。 也可以放在我們建的裸裝置上。
2.1.5 ASM 執行個體建立完後,用Create New 來建立ASM 磁盤組。我們用DATA來建立一個DATA 組,FRA 建立FLASH_RECOVERY_AREA組。
注: Redundancy 一般選external 就是也就是不考慮備援,假如選normal 則是mirror, 至少要一個FailGroup. 選High 就是triple mirror,3倍鏡像,需要三個FailGroup。
2.1.6 建立完成後,能看到組的狀态是Mount, ASM 組必須mount之後才能使用。
在這裡,如果asm 服務必須要啟動。如果沒有啟動,就手動啟動它。
安裝之後的程序如下:
[[email protected] ~]$ crs_stat -t
叢集監聽狀态檢視:
[[email protected] ~]$ lsnrctl status
2.2 在源庫用RMAN 備份,并将備份檔案copy到rac上
注意:保持單執行個體和RAC資料庫SID一緻(SID為db10g)
rman備份之前,單執行個體資料庫為歸檔模式(archilve log list 來檢視)
若未歸檔用:startup mount;
alter database archivelog; 改到歸檔模式
RAC上已經安裝CRS以及ORACLE軟體但未建庫
2.2.1備份全庫:
[[email protected] ~]$ rman target /
RMAN> list backup;
using target database control file instead of recovery catalog
RMAN> run {
2> backup full database format '/orabk/full_%d_%T_%U.bak';
3> backup archivelog all format '/orabk/arc_%U.bak' delete input;
4> copy current controlfile to '/orabk/control_bak.ctl';
5> }
備份之後的資訊如下:
RMAN> list backup summary;
[[email protected] orabk]$ ls -l
2.2.1将備份檔案SCP 到RAC 伺服器:
[[email protected] orabk]$ scp * 192.168.10.101:/orabk
2.3 還原并修改初始化檔案
2.3.1 還原spfile 到pfile(可複制、建立、RMAN恢複等)
[[email protected] ~]$ export ORACLE_SID=db10g1
[[email protected] ~]$ rman target /
RMAN> startup nomount
RMAN> restore spfile to pfile '/u01/app/oracle/product/10.2.0/db_1/dbs/initdb10g1.ora'
2> from '/orabk/full_DB10G_20130516_02o9pjb1_1_1.bak ';
檢視剛才恢複的參數檔案:
[[email protected] ~]$ cd /u01/app/oracle/product/10.2.0/db_1/dbs
[[email protected] dbs]$ ls
[[email protected] dbs]$ cat initdb10g1.ora
這裡面都是單執行個體的參數,需要把這個改成RAC的參數。
2.3.2 檢視ASM 執行個體的相關目錄資訊
[[email protected] ~]$ export ORACLE_SID=+ASM1
[[email protected] ~]$ sqlplus / as sysdba
SYS@+ASM1(rac1)> col state format a10
SYS@+ASM1(rac1)> col name format a15
SYS@+ASM1(rac1)> col failgroup format a20
SYS@+ASM1(rac1)> set line 200
SYS@+ASM1(rac1)> select state,redundancy,total_mb,free_mb,name,failgroup from v$asm_disk;
SYS@+ASM1(rac1)> select group_number,name,state,type,total_mb,free_mb,unbalanced from v$asm_diskgroup;
2.3.3 在ASM下建立目錄
[[email protected] ~]$ export ORACLE_SID=+ASM1
[[email protected] ~]$ asmcmd
建立的目錄結構如下:
DATA/
RAC/
CONTROLFILE/
DATAFILE/
TEMPFILE/
ONLINELOG/
PARAMETERFILE/
FRA/
RAC/
ARCHIVELOG
2.3.4 建立系統目錄(2個節點)
[[email protected] ~]$ cd $ORACLE_BASE/admin
[[email protected] admin]$ ls
+ASM
[[email protected] admin]$ mkdir db10g
[[email protected] admin]$ cd db10g
[orac[email protected] db10g]$ mkdir adump bdump cdump dpdump hdump pfile udump
[[email protected] db10g]$ ll
2.3.5 修改初始化參數
注意事項:
(1)RMAN 異機恢複的db_name 必須和備份的一緻,如果說想改成其他名稱,可以等還原之後,再用nid 指令修改。
(2)控制檔案需要指定到共享裝置上
(3)檢查audit_file_dest、background_dump_dest、core_dump_dest、log_archive_dest_1、user_dump_dest等參數的位置。如果2個節點和共享位置沒有對應的目錄,先把目錄建好。
最終修改之後的pfile 檔案如下:
[[email protected] db10g]$ cd $ORACLE_HOME/dbs
[[email protected] dbs]$ cat initanqing.ora
db10g.__db_cache_size=188743680
db10g.__java_pool_size=4194304
db10g.__large_pool_size=4194304
db10g.__shared_pool_size=79691776
db10g.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/db10g/adump'
*.background_dump_dest='/u01/app/oracle/admin/db10g/bdump'
*.cluster_database_instances=2
*.cluster_database=true
*.compatible='10.2.0.5.0'
*.control_files='+DATA/RAC/CONTROLFILE/control01.ctl','+DATA/RAC/CONTROLFILE /control02.ctl','+DATA/RAC/CONTROLFILE /control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/db10g/cdump'
*.db_block_size=8192
*.db_create_file_dest='+DATA'
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='db10g'
*.db_recovery_file_dest='+FRA'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=racXDB)'
db10g1.instance_name='anqing1'
db10g2.instance_name='anqing2'
db10g1.instance_number=1
db10g2.instance_number=2
*.job_queue_processes=10
*.log_archive_dest_1='LOCATION==+FRA/RAC/ARCHIVELOG'
*.log_archive_format='%t_%s_%r.arc'
*.open_cursors=300
*.pga_aggregate_target=94371840
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=283115520
db10g1.thread=1
db10g2.thread=2
*.undo_management='AUTO'
db10g1.undo_tablespace='UNDOTBS1'
db10g2.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/db10g/udump'
2.3.6 用修改的pfile 來建立spfile,注意放在共享裝置上
[[email protected] ~]$ export ORACLE_SID=db10g1
[[email protected] ~]$ sqlplus / as sysdba
SQL> create spfile='+DATA/RAC/PARAMETERFILE/spfiledb10g.ora'
2 from
3 pfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initdb10g1.ora';
到ASM裡驗證一下:
ASMCMD> pwd
+DATA/RAC/PARAMETERFILE
ASMCMD> ls
spfiledb10g.ora
在所有節點上,修改pfile内容,将其指向共享裝置上的spfile:
[[email protected] ~]$ echo "SPFILE='+DATA/RAC/PARAMETERFILE/spfiledb10g.ora'" > /u01/app/oracle/product/10.2.0/db_1/dbs/initdb10g1.ora
[[email protected] ~]$ cd $ORACLE_HOME/dbs
[[email protected] dbs]$ cat initdb10g1.ora
SPFILE='+DATA/RAC/PARAMETERFILE/spfiledb10g.ora'
2.4 建立密碼檔案
在所有節點執行:
[[email protected] ~]$ orapwd file=$ORACLE_HOME/dbs/orapwdb10g1 password=oracle
[[email protected] ~]$ orapwd file=$ORACLE_HOME/dbs/orapwdb10g2 password=oracle
2.5 還原控制檔案
在其中一個節點上執行。
2.5.1 用spfile,将DB 啟動到nomount 狀态
[[email protected] dbs]$ sqlplus / as sysdba
SQL> startup nomount;
SQL> show parameter spfile
2.5.2 RMAN 執行對控制檔案的恢複
[[email protected] dbs]$ rman target /
RMAN> restore controlfile from '/orabk/control_bak.ctl ';
這個位置是在初始化參數裡指定的,到ASM 執行個體裡驗證下:
ASMCMD> cd DATA/rac/controlfile
ASMCMD> ls
control01.ctl
control02.ctl
control03.ctl
2.6 restore資料庫
在其中一個節點執行
2.6.1 将資料庫啟動到MOUNT狀态
RMAN> alter database mount;
2.6.2 檢視源庫資料檔案存儲位置資訊
注意一點,單執行個體和RAC 執行個體存儲資料檔案的位置不同,如果使用rman 的duplicate,那麼使用log_file_name_convert 和 db_file_name_convert來進行轉換,在這個實驗中,使用的是RMAN的異機恢複,是以隻能在restore的時候用set newname來進行轉換。
SQL> col file_id format 9
SQL> col file_name format a30
SQL> select file_id,file_name from dba_data_files;
SQL> select file_id,file_name from dba_temp_files;
2.6.3 在RAC上restore 資料檔案
RMAN> run {
2> set newname for datafile 1 to '+DATA/rac/DATAFILE/system01.dbf';
3> set newname for datafile 2 to '+DATA/rac/DATAFILE/undotbs01.dbf';
4> set newname for datafile 3 to '+DATA/rac/DATAFILE/sysaux01.dbf';
5> set newname for datafile 4 to '+DATA';
6> set newname for tempfile 1 to '+DATA/rac/TEMPFILE/temp01.dbf';
7> restore database;
8> switch datafile all;
9> switch tempfile all;
10> }
-- 從這裡可以看到,對tempfile 僅僅是rename:即更新控制檔案。
注意:
(1)datafile 3 和 4的差別,datafile 4 我沒有指定具體的檔案名,那麼在還原時會使用ASM 自己的命名方式來命名datafile 4. 其他的檔案會建立别名。
(2)對switch的說明:
對于nocatalog 模式下,rman備份的資訊是儲存在控制檔案裡的,包括檔案的路徑資訊。 這裡的switch的作用,就是更新控制檔案裡的資訊。
(3)restore 的時候不會對temp 表空間進行restore。是以等restore 之後,需要手工建立temp表空間。
不過在這個測試裡,還是對tempfile 進行了指定。 但是這個操作隻更新控制檔案,不恢複資料檔案。
到ASM 執行個體裡檢視一下:
ASMCMD> cd db10g/datafile
ASMCMD> pwd
+DATA/db10g/datafile
ASMCMD> ls
SYSAUX.262.815794931
SYSTEM.260.815794931
UNDOTBS1.261.815794931
USERS.263.815794933
ASMCMD> ls -l
Type Redund Striped Time Sys Name
DATAFILE UNPROT COARSE MAY 19 01:00:00 Y SYSAUX.262.815794931
DATAFILE UNPROT COARSE MAY 19 01:00:00 Y SYSTEM.260.815794931
DATAFILE UNPROT COARSE MAY 19 01:00:00 Y UNDOTBS1.261.815794931
DATAFILE UNPROT COARSE MAY 19 01:00:00 Y USERS.263.815794933
-- 映射别名
ASMCMD> cd ../..
ASMCMD> cd rac/tempfile
ASMCMD> ls
--tempfile 對應的目錄為空,即沒有恢複資料檔案。
2.7 recover 資料庫
在執行restore的節點執行,因為備份檔案在該節點上。
RMAN> recover database;
最後一行的錯誤說明:
RMAN-06054: media recovery requesting unknown log: thread 1 seq 12 lowscn 206051
這裡是提醒恢複到一個未知的scn号。在alter database mount之後,通過set until scn或者set until time指令設定恢複到的scn号或時間,就可以避免這個錯誤。
2.8 處理online redo
因為此時另一個節點還沒有配好,是以我們隻能在執行恢複的節點上處理redo。
[email protected](rac1)> set wrap off;
[email protected](rac1)> select * from v$logfile;
[email protected](rac1)>alter database rename file '/oradata/db10g/redo01.log' to '+DATA/rac/onlinelog/redo01.log';
[email protected](rac1)> alter database rename file '/oradata/db10g/redo02.log' to '+DATA/rac/onlinelog/redo02.log';
[email protected](rac1)> alter database rename file '/oradata/db10g/redo03.log' to '+DATA/rac/onlinelog/redo03.log';
[email protected](rac1)> select * from v$logfile;
ASMCMD> pwd
+DATA/rac/onlinelog
ASMCMD> ls
注意這個時候,對應目錄還是空的,當open db 的時候,oracle 會自動建立online redo log。這裡修改的目的就是改變online redo 的位置。
2.9 open resetlogs 打開DB
在恢複的節點執行該操作。
[email protected](rac1)> alter database open resetlogs;
[email protected](rac1)> select name,open_mode from v$database;
[email protected](rac1)> col comp_name for a35
[email protected](rac1)> col version for a15
[email protected](rac1)> col status for a10
[email protected](rac1)> select comp_name,version,status from sys.dba_registry;
2.10檢查并修改幾個初始化參數
[email protected](rac1)> col parameter for a30
[email protected](rac1)> col value for a10
[email protected](rac1)> select * from v$option where parameter = 'Real Application Clusters';
[email protected](rac1)> show parameter cluster
[email protected](rac1)> show parameter thread
[email protected](rac1)> show parameter instance_number
由上述傳回結果可知,RAC特性是支援的,如果尚未啟用叢集資料庫,接下來首先要改的,就是enable CLUSTER DATABASE,操作如下:
[email protected](rac1)> alter system set cluster_database=true scope=spfile;
修改2個節點的配置參數:
[email protected](rac1)> alter system set cluster_database_instances=2 scope=spfile;
[email protected](rac1)> alter system set instance_number=1 scope=spfile sid='db10g1';
[email protected](rac1)> alter system set instance_number=2 scope=spfile sid='db10g2';
[email protected](rac1)> alter system set thread=1 scope=spfile sid='db10g1';
[email protected](rac1)> alter system set thread=2 scope=spfile sid='db10g2';
2.11建立節點2的undo 表空間
[email protected](rac1)> col name for a10
[email protected](rac1)> col type for a10
[email protected](rac1)> col value for a10
[email protected](rac1)> show parameter undo_tablespace
這個是rac1上節點的資訊,在之前的在spfile參數指定的rac2節點的undo 空間是UNDOTBS2。是以這裡建立該undo 表空間,并指定相關參數。
[email protected](rac1)> create undo tablespace UNDOTBS2 datafile '+DATA/rac/datafile/undotbs02.dbf' size 500m;
Tablespace created.
--這裡直接指定别名
ASMCMD> pwd
+DATA/rac/datafile
ASMCMD> ls
sysaux01.dbf
system01.dbf
undotbs01.dbf
undotbs02.dbf
ASMCMD> pwd
+DATA/db10g/datafile
ASMCMD> ls
SYSAUX.262.815794931
SYSTEM.260.815794931
UNDOTBS1.261.815794931
UNDOTBS2.268.815805971
USERS.263.815794933
[email protected](rac1)> alter system set undo_tablespace='UNDOTBS2' scope=spfile sid='db10g2';
System altered.
2.12添加rac2 節點的redo 檔案
rac 的redo 是接其他節點來的,我們之前的rac1上已經有3組,是以我們這裡從4開始,在添加2組給rac2,使用thread 2.
[email protected](rac1)> alter database add logfile thread 2 group 4 '+DATA' size 100m;
Database altered.
[email protected](rac1)> alter database add logfile thread 2 group 5 '+DATA' size100m;
Database altered.
[email protected](rac1)> alter database enable thread 2;
Database altered.
2.13重新開機節點1和節點2 上的執行個體,使相關參數生效
節點1:
[email protected](rac1)> shutdown immediate
[email protected](rac1)> startup
[email protected](rac1)> show parameter cluster
節點2:
[[email protected] dbs]$ sqlplus / as sysdba
SQL> startup
SQL> show parameter cluster
最後确認:
[email protected](rac1)> select instance_number,instance_name,host_name from gv$instance;
到現在已經是叢集了,不過還有一些收尾的工作要做。
2.14執行catclust.sql腳本來建立相關視圖
[email protected](rac1)> @$ORACLE_HOME/rdbms/admin/catclust.sql
2.15 重建Temp 表空間
步驟如下:
[email protected](rac1)> select name from v$tempfile;
[email protected](rac1)> alter tablespace temp
add tempfile '+DATA/rac/tempfile/temp02.dbf' size 100M;
[email protected](rac1)> alter database tempfile
'+DATA/anqing/tempfile/temp01.dbf' offline;
[email protected](rac1)> alter database tempfile
'+DATA/anqing/tempfile/temp01.dbf' drop including datafiles;
[email protected](rac1)> select name from v$tempfile;
2.16 添加叢集的監聽
2.17添加資訊注冊到CRS
[[email protected] ~]$ srvctl add database -d db10g -o $ORACLE_HOME -p +DATA/ANQING/PARAMETERFILE/spfileanqing.ora
[[email protected] ~]$ srvctl add instance -d db10g -i db10g1 -n rac1
[[email protected] ~]$ srvctl add instance -d db10g -i db10g2 -n rac2
修改instance 和 asm 之間的依賴關系:
[or[email protected] ~]$ srvctl modify instance -d db10g -i db10g1 -s +ASM1
[or[email protected] ~]$ srvctl modify instance -d db10g -i db10g2 -s +ASM2
檢視:
[[email protected] ~]$ crs_stat -t
這裡并沒有啟動,因為服務是剛添加上來的,還沒有同步。啟動一下就ok了。
[[email protected] ~]$ srvctl start database -d db10g
啟動之後再來查,各個程序正常:
[[email protected] ~]$ crs_stat -t
Oracle單執行個體遷移到RAC執行個體--使用導出導入方法
詳細見之前的Oracle-備份與恢複(一)expdp/impdp詳解。