RAC中誤將資料檔案建立在本地盤時的修正

pxbibm發表於2014-12-08

使用者建立表空間時誤將資料檔案放到了本地盤,重啟資料庫時一個例項啟動不了,只能offline該表空間後啟動資料庫。
現使用者想知道怎樣能把這個表空間資料檔案中的資料恢復出來。

測試目的:驗證RAC中誤將資料檔案建立在本地盤時的修復辦法
環境說明:
兩節點RAC,資料庫名為db10g 版本10.2.0.5
使用了ASM作為共享儲存解決方案。


1
,場景準備

1
)節點2:建立表空間test1,資料檔案不放到ASM,而是放到本地盤:

SQL> create tablespace test1 datafile '/home/oracle/test1.dbf' size 10m;


Tablespace created.


SQL> select name,status from v$datafile;


NAME                                                                          STATUS

-----------------------------------------------------------         -----------------------

+DG/db10g/datafile/system.256.821723567                    SYSTEM
+DG/db10g/datafile/undotbs1.258.821723569                ONLINE
+DG/db10g/datafile/sysaux.257.821723569                    ONLINE
+DG/db10g/datafile/users.259.821723569                      ONLINE
+DG/db10g/datafile/undotbs2.264.821723755                ONLINE
/home/oracle/test1.dbf                                                 ONLINE

6 rows selected.


2
)節點2:在表空間test1中建立表沒問題


SQL> create table test1 (id int) tablespace test1;


Table created.

SQL> create table test2 tablespace test1 as select * from dba_tables;


Table created.


3
)節點1:能查到表空間test1,但建立表報錯

SQL> select name ,status from v$datafile;


NAME                                                                    STATUS

---------------------------------------------------------     ------------------
+DG/db10g/datafile/system.256.821723567              SYSTEM
+DG/db10g/datafile/undotbs1.258.821723569          ONLINE
+DG/db10g/datafile/sysaux.257.821723569              ONLINE
+DG/db10g/datafile/users.259.821723569                ONLINE
+DG/db10g/datafile/undotbs2.264.821723755          ONLINE
/home/oracle/test1.dbf                                           ONLINE

6 rows selected.

SQL> create table test1 (id int) tablespace test1;

create table test1 (id int) tablespace test1

*
ERROR at line 1:

ORA-01157: cannot identify/lock data file 6 - see DBWR trace file

ORA-01110: data file 6: '/home/oracle/test1.dbf'


4
)重啟資料庫,會發現節點1例項起不來,因為節點1無法讀取節點2本地盤上的/home/oracle/test1.dbf

[oracle@rac10g2 ~]$ srvctl stop database -d db10g

[oracle@rac10g2 ~]$ srvctl start database -d db10g

PRKP-1001 : Error starting instance db10g1 on node rac10g1

CRS-0215: Could not start resource 'ora.db10g.db10g1.inst'.

[oracle@rac10g2 ~]$ crs_stat -t

Name          Type          Target    State    Host        

------------------------------------------------------------

ora.db10g.db   application    ONLINE   ONLINE    rac10g1     

ora....g1.inst application    ONLINE   OFFLINE             

ora....g2.inst application    ONLINE   ONLINE    rac10g2     

ora....SM1.asm application    ONLINE   ONLINE    rac10g1     

ora....G1.lsnr application    ONLINE   ONLINE    rac10g1     

ora....0g1.gsd application    ONLINE   ONLINE    rac10g1     

ora....0g1.ons application    ONLINE   ONLINE    rac10g1     

ora....0g1.vip application    ONLINE   ONLINE    rac10g1     

ora....SM2.asm application    ONLINE   ONLINE    rac10g2     

ora....G2.lsnr application    ONLINE   ONLINE    rac10g2     

ora....0g2.gsd application    ONLINE   ONLINE    rac10g2     

ora....0g2.ons application    ONLINE   ONLINE    rac10g2     

ora....0g2.vip application    ONLINE   ONLINE    rac10g2   


2
,處理過程


由於該過程中需要從本地盤把資料檔案遷移到ASM共享儲存,ASM檔案的訪問無法透過作業系統級別直接進行。


10gR2中,我們可以使用RMAN命令備份和恢復ASM檔案,使用ASMCMD命令可以瀏覽和操縱目錄結構。不過,
Oracle 10g包中的DBMS_FILE_TRANSFER是處理ASM的另一種方式。 DBMS_FILE_TRANSFER可以在同一臺Oracle
伺服器上或兩臺Oracle 伺服器之間複製檔案。它使用目錄物件來指定源目錄和目的目錄,因為目錄物件支援ASM路徑
名稱,所以DBMS_FILE_TRANSFER也支援ASM路徑名。這使得從常規檔案系統的ASM儲存區移入和移出檔案變得十分
簡單,使用它可以完成如下的遷移:


ASM->ASMASM->OS
Flie
OS File->ASMOS
File->OS File



建錯的表空間test1資料檔案在節點2,所以只能從節點2上開啟。可在節點2上將表空間offline之後使用dbms_file_transfer將資料
檔案移到ASM共享儲存(如使用的是叢集檔案系統,直接複製資料檔案即可)


1)為兩個資料檔案路徑建立目錄


節點2:建立兩個directory,一個指向本地盤該資料檔案目錄;一個指向ASM資料檔案目錄。

SQL> create directory test1 as '/home/oracle';


Directory created.


SQL> create directory test2 as '+DG/db10g/datafile';


Directory created.


2
offline表空間


節點2offline表空間test1

SQL> alter tablespace test1 offline;


Tablespace altered.


3
)複製資料檔案到ASM


節點2:使用dbms_file_transfer複製該資料檔案到ASM

SQL> exec
dbms_file_transfer.copy_file('TEST1','test1.dbf','TEST2','test1.dbf');


PL/SQL procedure successfully completed.


4
)修改控制檔案中的資料檔案路徑


節點2

SQL> alter database rename file '/home/oracle/test1.dbf' to
'+DG/db10g/datafile/test1.dbf'

SQL> /


Database altered.


5
online表空間test1


節點2online表空間test1

SQL> alter tablespace test1 online;


Tablespace altered.


6
)啟動例項1

[oracle@rac10g2 ~]$ srvctl start instance -d db10g -i db10g1

[oracle@rac10g2 ~]$ crs_stat -t

Name          Type          Target    State    Host        

------------------------------------------------------------

ora.db10g.db   application    ONLINE   ONLINE    rac10g1     

ora....g1.inst application    ONLINE   ONLINE    rac10g1     

ora....g2.inst application    ONLINE   ONLINE    rac10g2     

ora....SM1.asm application    ONLINE   ONLINE    rac10g1     

ora....G1.lsnr application    ONLINE   ONLINE    rac10g1     

ora....0g1.gsd application    ONLINE   ONLINE    rac10g1     

ora....0g1.ons application    ONLINE   ONLINE    rac10g1     

ora....0g1.vip application    ONLINE   ONLINE    rac10g1     

ora....SM2.asm application    ONLINE   ONLINE    rac10g2     

ora....G2.lsnr application    ONLINE   ONLINE    rac10g2     

ora....0g2.gsd application    ONLINE   ONLINE    rac10g2     

ora....0g2.ons application    ONLINE   ONLINE    rac10g2     

ora....0g2.vip application    ONLINE   ONLINE    rac10g2     


7
)節點1:檢查資料檔案狀態和表空間內資料

SQL> select name ,status from v$datafile;


NAME                                                                     STATUS


----------------------------------------------------           ------------------

+DG/db10g/datafile/system.256.821723567             SYSTEM
+DG/db10g/datafile/undotbs1.258.821723569         ONLINE
+DG/db10g/datafile/sysaux.257.821723569             ONLINE
+DG/db10g/datafile/users.259.821723569               ONLINE
+DG/db10g/datafile/undotbs2.264.821723755         ONLINE
+DG/db10g/datafile/test1.dbf                                ONLINE

6 rows selected.

SQL> select count(*) from test2;


  COUNT(*)

----------

      1522 




3、備註


以上遷移資料檔案時是採用 dbms_file_transfer.copy_file遷移資料檔案的方法,也可以使用RMAN來做:


SQL>select tablespace_name,file_name,status,online_status from
dba_data_files;

需要對錶空間進行OFFLINE
登入RMAN

 RMAN> sql "alter tablespace test1 offline";


  RMAN> copy datafile '/home/oracle/test1.dbf' to
'+DG/rac10g/datafile/test1.dbf';


SQL> alter database rename file '/home/oracle/test1.dbf' to
'+DG/rac10g/datafile/test1.dbf';

SQL> alter tablespace test1 online;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12798004/viewspace-1360627/,如需轉載,請註明出處,否則將追究法律責任。

相關文章