巧用Rman 來管理裸設備上的數據庫
2024-07-21 02:37:53
供稿:網友
 
             
  我們知道,Unix 上面的Oracle 數據庫大多都存放在裸設備上面,以利于磁盤IO 性能的提升。但是裸設備的治理比較麻煩,尤其是把數據文件從文件系統轉換到裸設備,或者從裸設備把數據文件轉換到文件系統,這些給dba 帶來很頭疼的事情。 
  
                                                                                              本文介紹一個辦法,可以用Rman 來輕松搞定裸設備/文件系統之間數據文件的遷移。 
  
  在傳統方法里面,我們必須對于每個Unix 不同的Block 大小,OS 卷治理的overhead 的值作計算,才能非常小心的用dd 來做這些拷貝和移動,但是現在在Rman 的幫助下,我們可以完全忽略這些不同的地方,在所有Unix 平臺/NT 平臺上直接在Oracle 內部實現這種數據 
  
  一. 把數據文件從文件系統轉移到裸設備 
  比如我們現在有一個數據庫,其rbs.dbf 數據文件的IO 量非常大,造成比較大的IO 等待,我們希望把它轉移到裸設備上,以提升性能。可以看到,我們這個rbs.dbf 的大小為60M,所以我們需要創建一個61M 的裸設備(1M 空間用來讓操作系統使用,治理卷組信息,其實不用1M 也可以,我們方便起見,給1M)。 
  s80_svc:oraprd 22> ls -l rbs.dbf 
  -rw-r----- 1 oraPRd dba 62916608 Jan 20 21:48 rbs.dbf 
  我們先要知道操作系統的一個PP(Physical Partition)的大小,我們這個例子里面,他 
  VOLUME GROUP: oravg VG IDENTIFIER: 000c738d015de954 
  VG STATE: active PP SIZE: 64 megabyte(s) 
  VG PERMISSION: read/write TOTAL PPs: 543 (34752 megabytes) 
  MAX LVs: 256 FREE PPs: 114 (7296 megabytes) 
  LVs: 8 USED PPs: 429 (27456 megabytes) 
  OPEN LVs: 8 QUORUM: 2 
  TOTAL PVs: 1 VG DESCRipTORS: 2 
  STALE PVs: 0 STALE PPs: 0 
  ACTIVE PVs: 1 AUTO ON: no 
  MAX PPs per PV: 1016 MAX PVs: 32 
  我們轉換到root 用戶,創建這樣一個邏輯卷,大小是66M, 并且把這個邏輯卷給oracle 
  # mklv -y lvorarbs oravg 1 
  # chown oraprd:dba /dev/rlvorarbs 
  由于這個是回滾段所在的表空間,需要把表空間offline,先要offline 回滾段: 
  
  SQL> select segment_name,status from dba_rollback_segs; 
  SEGMENT_NAME STATUS 
  ------------------------------ ---------------- 
  SYSTEM ONLINE 
  RBS01 ONLINE 
  RBS02 ONLINE 
  RBS03 ONLINE 
  SQL> alter rollback segment rbs01 offline; 
  Rollback segment altered. 
  SQL> alter rollback segment rbs02 offline; 
  Rollback segment altered. 
  SQL> alter rollback segment rbs03 offline; 
  Rollback segment altered. 
  然后我們登陸進入rman,連接到目標數據庫: 
  s80_svc:oraprd 25> rman target / nocatalog 
  Recovery Manager: Release 8.1.7.2.0 - ProdUCtion 
  RMAN-06005: connected to target database: TEST (DBID=1749460842) 
  RMAN-06009: using target database controlfile instead of recovery catalog 
  我們開始把數據文件從文件系統拷貝到磁盤裸設備上面: 
  RMAN> run{ 
  2> allocate channel c3 type disk; 
  3> sql 'alter tablespace rbs offline'; 
  4> copy datafile '/backup/test/datafile/rbs.dbf' to '/dev/rlvorarbs'; 
  5> } 
  執行這個命令可以看到,命令成功執行: 
  RMAN-03022: compiling command: allocate 
  RMAN-03023: executing command: allocate 
  RMAN-08030: allocated channel: c3 
  RMAN-08500: channel c3: sid=9 devtype=DISK 
  RMAN-03022: compiling command: sql 
  RMAN-06162: sql statement: alter tablespace rbs offline 
  RMAN-03023: executing command: sql 
  RMAN-03022: compiling command: copy 
  
  RMAN-03023: executing command: copy 
  RMAN-08000: channel c3: copied datafile 4 
  RMAN-08501: output filename=/dev/rlvorarbs recid=8 stamp=451692882 
  RMAN-08031: released channel: c3 
  然后我們再更新控制文件里面回滾段表空間數據文件的定義: 
  SQL> alter tablespace rbs rename datafile 
  2 '/backup/test/datafile/rbs.dbf' to '/dev/rlvorarbs'; 
  Tablespace altered. 
  SQL> alter tablespace rbs online; 
  Tablespace altered. 
  我們檢查數據字典,可以看到正確的新的數據文件: 
  SQL> l 
  1* select tablespace_name,file_name from dba_data_files where 
  tablespace_name='RBS' 
  SQL> / 
  TABLESPACE_NAME FILE_NAME 
  ------------------------------ -------------------- 
  RBS /dev/rlvorarbs 
  把幾個回滾段分別重新online 就可以了。
                          
  
  二. 把數據文件從裸設備轉移到文件系統 
  下面我們再演示一下如何把數據文件從裸設備轉移到文件系統上面: 
  我們先建立一個裸設備,再歸屬于Oracle 用戶,用這個裸設備來創建標空間: 
  # mklv -y lvrawtest oravg 1 
  lvrawtest 
  # chown oraprd:dba /dev/rlvrawtest 
  然后我們再Oracle 里面創建表空間,創建表,插入示例數據: 
  SQL> create tablespace rawtofs datafile 
  2 '/dev/rlvrawtest' size 60m; 
  Tablespace created. 
  注重這里我們創建的表空間大小不能大于65M,因為裸分區大小只有66M,有1M 要作為OS 的治理使用。 
  SQL> create table testforraw (id number) tablespace rawtofs; 
  
  Table created. 
  SQL> insert into testforraw values(100); 
  1 row created. 
  SQL> commit; 
  Commit complete. 
  RMAN> run{ 
  2> allocate channel c3 type disk; 
  3> sql 'alter tablespace rawtofs offline'; 
  4> copy datafile '/dev/rlvrawtest' to '/backup/test/datafile/testforraw.dbf'; 
  5> } 
  RMAN-03022: compiling command: allocate 
  RMAN-03023: executing command: allocate 
  RMAN-08030: allocated channel: c3 
  RMAN-08500: channel c3: sid=13 devtype=DISK 
  RMAN-03022: compiling command: sql 
  RMAN-06162: sql statement: alter tablespace rawtofs offline 
  RMAN-03023: executing command: sql 
  RMAN-03022: compiling command: copy 
  RMAN-03023: executing command: copy 
  RMAN-08000: channel c3: copied datafile 5 
  RMAN-08501: output filename=/backup/test/datafile/testforraw.dbf recid=7 
  stamp=451692581 
  RMAN-08031: released channel: c3 
  然后我們再在Oracle 里面對這個數據文件更新定義: 
  SQL> alter tablespace rawtofs rename datafile '/dev/rlvrawtest' to 
  '/backup/test/datafile/testforraw.dbf'; 
  Tablespace altered. 
  SQL> alter tablespace rawtofs online; 
  Tablespace altered. 
  我們檢查一下我們插入的數據,沒有問題: 
  SQL> select *from testforraw; 
  ID 
  ---------- 
  100 
  我們檢查數據字典,也正確反映了這個新的數據文件: 
  
  SQL> L 
  1* select tablespace_name,file_name from dba_data_files where 
  tablespace_name='RAWTOFS' 
  SQL> / 
  TABLESPACE_NAME FILE_NAME 
  ------------------------------ -------------------------------------------------- 
  RAWTOFS /backup/test/datafile/testforraw.dbf 
  >