ASM管理

ORACLE10g推出了ASM(Automatic Storage Management --自動存儲管理)特性,該特性擁有易管理,高自動性,並且,擁有號稱超越裸設備IO性能。這個特性實際上就是oracle回收了數據庫依賴的第三方文件系統的功能,與oracle一貫的習慣是一致的。在oracle10gr2中又推出了ASMCMD增強對ASM的管理。升級到11gR2版本後,又被正名爲傳說中的ASMFS,並推出了ASMCA,這也說明了ORACLE對這一特性的重視程度。 

 1、ASM實例 

  ASM實例與ORACLE實例差不多,都是由sga和一堆後臺進程組成,從功能上來看,區別在於oracle實例管理的是數據庫,而asm實例只是管理asm盤陣。 

  通過Oracle EM或DBCA或者11g中的ASMCA都可以對asm進行一些配置,同樣sqlplus也是管理ASM的常用工具。在進入sqlplus前需要設置ORACLE_SID的環境變量,其他與操作數據庫的sqlplus完全一樣。 

  ASM實例沒有數據字典之類的東西存儲用戶系統,因此最常見的連接認證方式就是操作系統認證as sysdba進入(OSDBA組的用戶)。如果是通過遠程連接的話(比如遠程通過tnsnames或OEM管理),也可以使用密鑰文件進行驗證,該密鑰文件直數據庫的密鑰文件在命名規則及使用規則上完全一模一樣。如果使用dbca建庫的話,默認就會創建asm的密鑰文件,當然也可以自行手動通過orapwd命令進行創建,與數據庫的密鑰文件有所不同的是,asm的密鑰文件對應的用戶只有一個----sys。 

提示:什麼是ASMLib! 
即ASM support Library,是由ORACLE提供的簡化管理操作系統管理的API。 

1.1、啓動/關閉ASM實例 
  ASM實例與DB實例高度相似,啓動和停止實例的命令也一模一樣,就啓動來說,也同樣擁有NOMOUNT/MOUNT/OPEN /FORCE幾種狀態。 

NOMOUNT:僅啓動實例; 
MOUNT、OPEN:啓動實例並加載磁盤,注意加載的是磁盤組(如果當前未創建或配置任何磁盤組,則提示敬告信息),OPEN選項對於ASM實例無意義,等同於MOUNT。 
FORCE:相當於先執行shutdown abort,然後再startup。 
[oracle@jssdbn1 ~]$ export ORACLE_SID=+ASM1 

[oracle@jssdbn1 ~]$ sqlplus / as sysdba 

SQL*Plus: Release 10.2.0.4.0 - Production on Wed May 19 08:34:22 2010 

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved. 

Connected to an idle instance. 

SQL> startup nomount 

ASM instance started 

Total System Global Area  130023424 bytes 

Fixed Size                  2082208 bytes 

Variable Size             102775392 bytes 

ASM Cache                  25165824 bytes 

SQL> select name,state from v$asm_diskgroup; 

NAME                           STATE 

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

ASMDISK1                       DISMOUNTED 

ASMDISK2                       DISMOUNTED 

SQL> select instance_name,status from v$instance; 

INSTANCE_NAME    STATUS 

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

+ASM1            STARTED 
  加載磁盤組,注意,不是alter database: 

SQL> alter diskgroup all mount; 

Diskgroup altered. 

SQL> select name,state from v$asm_diskgroup; 

NAME                           STATE 

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

ASMDISK1                       MOUNTED 

ASMDISK2                       MOUNTED 

  這樣,該ASM就可以提供存儲服務了。 

  提示一點,在10g版本中,ASM是依賴於CSS守護進程的,因此在啓動ASM實例前要確保css守護進程已經啓動。CSS(Cluster Synchronization Services)守護進程用來維持ASM及客戶端數據庫實例間的一致性同步,如果是通過dbca建庫的話,那麼CSS守護進程默認即會啓動(跟隨系統reboot)。 

  檢查css守護進程是否啓動非常簡單,直接使用crsctl check cssd即可,如果啓動的話會收到"CSS appears healthy"的返回消息,例如: 

[oracle@jssdbn1 ~]$ crsctl check cssd 

CSS appears healthy 

  關閉ASM實例,簡單了,NORMAL/IMMEDIATE/TRANSACTIONAL/ABORT幾個選項的定義與關閉普通數據庫實例完全一模一樣!例如: 

SQL> shutdown immediate 

ASM diskgroups dismounted 

ASM instance shutdown 

1.2、關於ASM實例的初始化參數 
  ASM實例的初始化參數形式上與數據庫的初始化參數相同,也分spfile和pfile,操作方式也完全相同,只不過具體的參數及參數值略有差異,大多數數據庫的初始化參數在這裏也能見到,並且某些參數意義都完全相同,同樣也有一些參數雖然見到了,不過並不需要設置,這個可以理解,畢竟asm只有實例,相對比數據庫的初始化參數要簡單的多了,還有一些參數則是數據庫初始化參數中沒有的。比如ASM開頭的那幾個初始化參數。 

  ASM實例在內存佔用這塊還是比較輕量級的,基本上有個100m空間就很充足了,因此內存這塊相關參數就不說了,下面說說幾個ASM實例特別需要的參數。 

首先,初始化參數中的INSTANCE_TYPE,該參數必須被設置爲ASM,如: 

INSTANCE_TYPE=ASM 
標識要啓動的實例是ASM,而不是數據庫實例(數據庫實例對應類型爲RDBMS)。 

與ASM相關的初始化參數有三個: 

ASM_POWER_LIMIT:指定磁盤rebalance的程度,有0-11個級別,默認值爲1,指定的級別越高,則rebalance的操作就會越快被完成(當然這也意味着這個時間段內將佔用更多的資源),指定級別較低的話,雖然rebalance操作會耗時更久,但對當前系統的IO及負載影響會更少,這中間的度需要DBA根據實際情況衡量。另外,這個參數指定的只是一個默認值,在操作過程中,即可以隨便動態修改,也可以在語句級命令行時指定power,覆蓋該默認值。 
提示:關於rebalance操作,如果你沒接觸過,還不明白是什麼意思,沒關係,繼續往下看! 
ASM_DISKSTRING:用最簡單的話說,就是設置ASM啓動時檢查的磁盤,該選項可以同時指定多個值,並且支持通配符。比如說,只檢查/dev/dsk/下的設備,可以設置該參數如下:/dev/dsk/*,默認情況下該參數爲空,爲空的話,表示ASM將查找系統中所有ASM擁有讀寫權限的設備。 
ASM_DISKGROUPS:指定實例啓動或alter diskgroup all mount語句時要加載的磁盤組,如果爲空的話,那麼實際就僅啓動到NOMOUNT狀態了。如果是使用SPFILE的話,該參數一般不需要手動修改,ASM能夠自動更新該初始化參數中的值。 
修改ASM實例初始化參數文件的命令規則與數據庫初始化參數完全相同,比如說: 

SQL> alter system set asm_power_limit=5 sid='*'; 

System altered. 
2、管理ASM磁盤 

  ASM磁盤組的管理其實非常簡單,主要是由於10gR2中這個東西透明度不夠,ORACLE提供的功能有限,因此我們能夠做的操作就更加有限了。 

  ASM磁盤組的管理方式呢也比較多,比如像DBCA、EM、SQL*PLUS等均可操作(不同工具易用性不同,不過功能也有差異),除此之外ORACLE還專門提供了ASMCMD命令行方式,像操作文件系統一樣來操作磁盤組。本節操作主要使用sqlplus命令行工具. 

  在管理ASM之前不得不提與ASM相關的動態性能視圖,這些視圖將對我們後面的操作起到重要作用,查詢數據庫中ASM相關視圖可以通過下列SQL語句: 

SQL> select * from dict where table_name like 'V$ASM_%'; 

TABLE_NAME                     COMMENTS 

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

V$ASM_ALIAS                    Synonym for V_$ASM_ALIAS 

V$ASM_CLIENT                   Synonym for V_$ASM_CLIENT 

V$ASM_DISK                     Synonym for V_$ASM_DISK 

V$ASM_DISKGROUP                Synonym for V_$ASM_DISKGROUP 

V$ASM_DISKGROUP_STAT           Synonym for V_$ASM_DISKGROUP_STAT 

V$ASM_DISK_STAT                Synonym for V_$ASM_DISK_STAT 

V$ASM_FILE                     Synonym for V_$ASM_FILE 

V$ASM_OPERATION                Synonym for V_$ASM_OPERATION 

V$ASM_TEMPLATE                 Synonym for V_$ASM_TEMPLATE 

9 rows selected 
  這其中,V$ASM_ALIAS視圖中記錄文件別名信息,V$ASM_CLIENT返回當前連接的客戶端實例信息,V$ASM_DISK*相關視圖中記錄的是ASM管理的磁盤及磁盤組信息,V$ASM_OPERATION記錄當前磁盤的操作信息,例如: 

SQL> select group_number,name,state,total_mb,free_mb from v$asm_diskgroup; 

GROUP_NUMBER NAME                           STATE         TOTAL_MB    FREE_MB 

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

           1 ASMDISK1                       MOUNTED          20472      18667 

           2 ASMDISK2                       MOUNTED          16378      14621 

SQL> select header_status,name,failgroup,path,total_mb,free_mb from v$asm_disk where GROUP_NUMBER in(1,2); 

HEADER_STATU NAME                           FAILGROUP                      PATH                             TOTAL_MB    FREE_MB 

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

MEMBER       ASMDISK2_0000                  ASMDISK2_0000                  /dev/raw/raw5                        8189       7309 

MEMBER       ASMDISK2_0001                  ASMDISK2_0001                  /dev/raw/raw6                        8189       7312 

MEMBER       ASMDISK1_0000                  ASMDISK1_0000                  /dev/raw/raw1                       10236       9333 

MEMBER       ASMDISK1_0001                  ASMDISK1_0001                  /dev/raw/raw2                       10236       9334 

  在真正開始操作ASM之前呢,我覺着還是有必要先描述一下關於ASM磁盤總的原則供參考。 

2.1、添加或刪除磁盤的影響 
  當發生添加/刪除磁盤組中磁盤的操作時,ASM能夠自動平衡。對於普通的刪除操作(無force選項),被刪除的磁盤在該上數據被有效處理前並不會立刻釋放,同樣,新增磁盤時,在重分配工作完成前,該盤也不會承擔I/O負載的工作。 

2.2、ASM如何處理磁盤故障 
  ASM中的磁盤組可以分成兩類:普通磁盤組和failure磁盤組,後者又與ASM的冗餘方式有所關聯。普通磁盤組就是標準的存儲單元,ASM可以向其可訪問的磁盤組中讀寫數據,failure磁盤組是爲了提高數據的高可用性。ASM中的磁盤冗餘策略非常簡單,概要成三類:外部冗餘、標準冗餘和高度冗餘,其中前者與failure磁盤組無關,如果設置了後者,那麼該磁盤組就必須擁有failure磁盤組。聽起來像在說failure磁盤組是普通磁盤組的子集,其實差不多可以這麼理解,外部冗餘的話磁盤屬於磁盤組,內部冗餘的話,磁盤屬於磁盤組的同時,還屬於某個(並且只能是一個)failure磁盤組。 

  比如說對於標準冗餘(Normal Redundancy),ASM要求該磁盤組至少要擁有兩個failure磁盤組,即提供雙倍鏡像保護,對於同一份數據(ASM中鏡像單位不是磁盤,也不是塊,而是一種AU的單位,該單位大小默認是1M)將有主從兩份鏡像,並且ASM通過算法來自動確保主、從鏡像不會存在於同一份failure磁盤組,這樣就保障了就算整個failure磁盤組都損壞,數據也不會丟失。至於高度冗餘(High Redundancy)就更安全了,它至少需要三個failure磁盤組,也就是一份AU有一主多從的鏡像,理論上將更加安全。 

  如果磁盤發生損壞,那麼損壞的磁盤默認自動offlice並被drop掉,不過該磁盤所在的磁盤組仍將保持MOUNT狀態,如果該盤有鏡像的話,那麼應用不會有影響,鏡像盤將自動實現接管--只要不是所有failure磁盤組都損壞掉,否則的話,該磁盤組將自動DISMOUNT。舉個例子吧,某標準冗餘的failure組有6個盤(對應6個裸設備),假如說此時壞了一塊盤,沒關係,操作繼續,壞了那塊會被自動dropped,剩下的5塊盤仍然能夠負擔起正常的讀寫操作。 

2.3、ASM擴展性 
最多支持63個磁盤組; 
最多支持10000個磁盤; 
最大支持4pb/磁盤; 
最大支持40 exabyte/ASM存儲; 
最大支持1百W個文件/磁盤組; 
外部冗餘時單個文件最大35tb,標準冗餘時單個文件最大5.8tb,高冗餘度時單個文件最大3.9tb。 
2.4、 添加磁盤組 
DBCA中創建磁盤組想必大家都很熟悉了,對,不過是點兩下鼠標,SQL*PLUS下操作也很簡單,主要是使用CREATE DISKGROUP語句,該語句的語法如下: 

CREATE DISKGROUP diskgroup_name 

[ { HIGH | NORMAL | EXTERNAL } REDUNDANCY ] 

[ FAILGROUP failgroup_name ] 

DISK [ NAME disk_name ] [ SIZE size_clause ] [ FORCE | NOFORCE ] ...; 
語法很簡單,大多數都是可選項: 

首先要指定的就是磁盤組名稱(diskgroup_name); 
指定冗餘度,有三個選擇:HIGH(高度冗餘>三路)、NORMAL(標準冗餘--雙路)和EXTERNAL(外部存儲冗餘); 
選擇是否指定FAILGROUP(如果選擇非external則必須指定); 
指定該磁盤組中的成員(對應的LUN),在指定成員時一般ASM能夠自動檢測出磁盤的容量,不過如果DBA基於某些方面的考慮,希望限制ASM使用的空間的話,也可以在指定成員過程中,順便指定大小(只要指定的大小不超出磁盤實際容量),在添加成員時,ASM也會自動檢查磁盤頭以確定該磁盤是否被加入到其它的磁盤組中,當發現該盤已加入其它磁盤組的話,你可以通過FORCE選項來強制修改該盤所屬磁盤組。 
2.5、 修改磁盤組 
事物總是在變化中前進,這是事物的一般規律,磁盤組也不例外,在其創建完之後,保不齊什麼時候可能就需要加或刪個磁盤,或者修改某個盤的大小(如果還有機會改的話)。這時候你就需要ALTER DISKGROUP語句了,ALTER DISKGROUP語句的語法太簡單(靈活)了,因此這裏三思就不列了,後面通過幾個實際應用的示例來說明其語法規則。 

ASM最好的一點就是,不管你是加還是刪磁盤組中的磁盤,它都能自動進行平衡,確保該磁盤組中每塊盤存儲的數據量平均,以實現最優化的IO性能,並且這一過程不會對數據造成影響 

2.5.1 添加磁盤 

比如,添加一個磁盤到磁盤組asmdisk1,語句如下: 

SQL> Alter diskgroup asmdisk2 add disk '/dev/raw/raw7' name asmdisk2_0002; 

Diskgroup altered. 

事實上,alter diskgroup添加磁盤時,也可以使用通配符,比如添加所有raw_a0開頭的設備,可執行語句如下: 

Alter diskgroup asmdisk1 add disk '/dev/raw/raw_a0*' ; 

再比如添加raw_a5,raw_a6,raw_a7,可以執行語句如下: 

Alter diskgroup asmdisk1 add disk '/dev/raw/raw_a[567]' ; 

總之非常靈活,大家可以根據實際情況自行嘗試以簡化操作。這也屬於優化着幹活的範疇嘛。 

注意:語句雖然執行了,不過ASM需要自動平均磁盤組中的數據,這必然需要消耗一定的時間(視數據量多少),默認情況下ALTER DISKGROUP語句並不會等待所有工作全部完成才返回控制權,要監控後臺進行的操作,可以通過V$ASM_OPERATION視圖查詢。 

如果希望ALTER DISKGROUP語句完成所有工作才返回的話,可以在執行時附加REBALANCE WAIT子句,這樣該語句就會等待自動平衡的操作,直接所有操作完成才返回結果,當然在等待期間,如果你改主意了不願意繼續等待,CTRL+C中斷即可獲得控制權,而平衡的操作不受影響,會在後臺繼續進行。 

2.5.2 刪除磁盤 

雖然刪除磁盤也涉及到數據庫的重新平衡,因此刪除跟添加還有點兒不同,就是當刪除磁盤時,當ASM發現怎麼平衡都平衡不過來時(比如剩下的磁盤空間不足以存放所有數據時),刪除操作也會失敗。這種情況要麼先刪數據,要麼取消刪除的操作。 

簡單舉個例子,比如說刪除asmdisk2磁盤組中的asmdisk2_0001磁盤,操作如下: 

SQL> alter diskgroup asmdisk2 drop disk asmdisk2_0001; 

Diskgroup altered. 

不知道算不算是優點,由於前面提到的ASM自動平衡的特性,上述語句返回後並不代表磁盤已經被刪除,此時後臺可能由於正忙碌地執行着IO重平衡的工作,因此如果在這個當口,DBA忽然意識到操作失誤,其實磁盤並不需要被刪除,那也可以馬上通過alter diskgroup dgname undrop disks語句來取消刪除的操作,例如: 

SQL> alter diskgroup asmdisk2 undrop disks; 

Diskgroup altered. 

只要刪除操作還沒有真正完成,任何就會被取消,否則的話,上述語句也挽回不了什麼了,如果希望挽回,那DBA只能再通過ADD語句將該磁盤重新加入到磁盤組了。 

2.5.3 修改磁盤大小 

ASM中的磁盤也可以被RESIZE--擴大或縮小,不過需要注意的是,擴大的話,要確保該磁盤對應的裸卷確實有足夠的空間去擴大(比如該卷原有20g,創建時僅用了10g,則最大可擴大到20g-塊頭佔用的nM空間);縮小的話,要確保縮小後剩餘的空間仍以放的下當前磁盤上已存在的數據,不然操作就會報錯。 

具體的操作是很簡單的,例如將磁盤組asmdisk2的磁盤asmdisk2_0000的磁盤空間調整爲1000m(原爲8189m),操作如下: 

SQL> alter diskgroup asmdisk2 resize disk asmdisk2_0000 size 1000m; 

Diskgroup altered. 

2.5.4 手動平衡磁盤組 

一般情況下ASM都會自動對其下的磁盤組進行平衡,不過ORACLE也提供了手動平衡磁盤組的方式,通過alter diskgroup ... power 語句。前面提到過磁盤組的平衡度有0到11多個級別,默認是按照ASM_POWER_LIMIT初始化參數中設置的值,手動平衡的話,設置的平衡度可以與初始化參數中並不相同,例如,設置磁盤組平衡度爲5,語句如下: 

SQL> alter diskgroup asmdisk2 rebalance power 5; 

Diskgroup altered. 

手動平衡磁盤組可能涉及大量的工作,該操作可能費時較久,因此DBA在執行該語句時,一定要注意該操作對IO性能的影響。另外再次強調,上述語句將很快返回diskgroup altered的提示,但這並不表示操作真正完成,它只是反饋語句提交而已,查看磁盤後臺的操作,可以通過v$asm_operator視圖,或者在語句執行時增加wait子句,這樣ASM將會等到操作真正完成時,才返回提示信息。 

2.6 mount/unmount磁盤組 
只有被mount的磁盤組才能被數據庫使用並執行add/drop等磁盤操作,ASM中的磁盤組默認會在ASM實例啓動時自動加載,當然也可以手動通過命令行語句mount/unmount磁盤組。 

查詢ASM實例中創建的磁盤組可以通過V$ASM_DISKGROUP視圖查看,例如: 

SQL> select group_number,name,state,total_mb,free_mb from v$asm_diskgroup; 

GROUP_NUMBER NAME                           STATE         TOTAL_MB    FREE_MB 

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

1 ASMDISK1                       MOUNTED          20472      18667 

2 ASMDISK2                       MOUNTED          16378      14621 

當前兩個磁盤組均爲MOUNT狀態,要將其置爲UNMOUNT,執行語句如下,例如將ASMDISK2磁盤組UNMOUNT:

SQL> alter diskgroup asmdisk2 dismount; 

Diskgroup altered. 

SQL> select group_number,name,state from v$asm_diskgroup; 

GROUP_NUMBER NAME                           STATE 

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

1 ASMDISK1                       MOUNTED 

0 ASMDISK2                       DISMOUNTED 

注意喲,UNMOUNT磁盤組的話務必慎重操作,要確保UNMOUNT的磁盤組中保存的文件對應的數據庫當前未啓動,而且該操作也會直接導致數據庫SHUTDOWN。 

再將其置回MOUNT狀態,操作如下: 

SQL> alter diskgroup asmdisk2 mount; 

Diskgroup altered. 

SQL> select group_number,name,state from v$asm_diskgroup; 

GROUP_NUMBER NAME                           STATE 

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

1 ASMDISK1                       MOUNTED 

2 ASMDISK2                       MOUNTED 

2.7 管理目錄及文件 
ASM磁盤組中文件和目錄的管理自動化水平相當高,應該說基本上完全不需要DBA參與,它自己就能玩的很好,當然,如果你非要動動手,那也是可以的。 

2.7.1 管理磁盤組目錄 

創建新目錄: 

SQL> alter diskgroup asmdisk2 add directory '+ASMDISK2/JSS1'; 

Diskgroup altered. 

修改目錄名: 

SQL> alter diskgroup asmdisk2 rename directory '+ASMDISK2/JSS1' 

2  to '+ASMDISK2/JSS2'; 

Diskgroup altered. 

刪除目錄名: 

SQL> alter diskgroup asmdisk2 drop directory '+ASMDISK2/JSS2'; 

Diskgroup altered. 

實際上,ASM中目錄和文件的管理,也可以通過ASMCMD命令行方式進行,該命令行進入之後,是一個類似文件系統的管理界面,ORACLE提供了一些最基礎的,如cd、ls、mkdir、rm等等幾個有限的操作命令,如果對這部分內容感興趣,可以參考官方文檔中的介紹,或者搭個環境實踐操作,可用命令很少且簡單,熟悉Linux/Unix的話極易上手。 

2.7.2 管理別名(Alias Names) 

別名就是外號,比如說當系統自動產生的名稱太過複雜不怎麼好記,DBA可以通過別名,爲它創建一個簡單化的名稱,而又不會對其現有名稱造成任何影響。ASM中創建別名是通過alter diskgroup的alias子句實現,支持增加/修改/刪除等多項操作。V$ASM_ALIAS視圖中可以查詢到當前實例中創建的別名。 

例如,增加別名: 

SQL> alter diskgroup asmdisk2 add alias '+ASMDISK2/repdb/datafile/temp01.dbf' for '+ASMDISK2/repdb/TEMPFILE/TEMP.267.714576831'; 

Diskgroup altered. 

修改別名: 

SQL> alter diskgroup asmdisk2 rename alias '+ASMDISK2/repdb/datafile/temp01.dbf' to '+ASMDISK2/repdb/TEMPFILE/temp01.dbf'; 

Diskgroup altered. 

刪除別名: 

SQL> alter diskgroup asmdisk2 drop alias '+ASMDISK2/repdb/TEMPFILE/temp01.dbf'; 

Diskgroup altered. 

不管是添加/刪除或是修改別名,對原有文件路徑均不會有影響。 

2.7.3 刪除磁盤組中文件/別名 

破壞總是最簡單的,當然我不是說刪除就一定是破壞,不過從嚴謹的角度講,刪除這樣的操作要少做(沒說不做),做前得再三確認,三思而行並留有備份,即使做錯了,還有恢復的可能。 

當然啦,ASM中遇到刪除文件這樣需求的機率很低,但也不是完全沒有,比如說執行了數據庫不完全恢復操作後,某部分數據文件就不再需要,而恢復操作不會處理這部分文件,爲合理利用空間,就會需要DBA手動刪除這類文件,真遇到這樣的需求,表急,語法也是黑簡單的吶,例如,刪除磁盤組2上的別名temp01: 

SQL> alter diskgroup asmdisk2 drop file '+ASMDISK2/repdb/datafile/temp01.dbf'; 

Diskgroup altered. 

沒錯,即能刪文件也能刪別名,只不過如果刪除的是文件的話,其關聯的別名(Alias)也會被自動刪除。 

2.7.4 刪除磁盤組 

太簡單了,語法:drop diskgroup gpname即可!不演示了!需要注意一點,如果刪除的diskgroup非空的話,直接執行上述語句會報錯,這時候可以通過附加including contents子句,來自動刪除該磁盤組中包含的文件。刪除磁盤組的操作會自動修改spfile中ASM_DISKGROUPS初始化參數的值(如果使用了SPFILE的話) 

3、管理ASM磁盤中的文件 
ASM中的磁盤與物理磁盤並非完全一一對應,由於ASM在存儲數據時是打散處理,ASM中的(同一個)文件在保存時也並非保存在某個磁盤中,而是完全由ASM自動控制,甚至連創建文件時的文件名,都由ASM通過OMF(Oracle managed files)管理。 

接下來,三思跟大家一起聊聊ASM中文件的那些事兒~~~ 

3.1、ASM中支持的文件類型 

大多數的ORACLE文件類型均能被ASM支持,注意,我說的是大多數,而沒說全部,像trace文件、alert文件、dmp文件等還不能直接被存儲到ASM中,注意,我說的是不能直接,沒說不能間接。 

下表列出了ASM直接支持的文件類型: 

Control files 
Datafiles 
Redo log files 
Archive log files 
Trace files 
Temporary files 
Datafile backup pieces 
Datafile incremental backup pieces 
Archive log backup piece 
Datafile copy 
Persistent initialization parameter file (SPFILE) 
Disaster recovery configurations 
Flashback logs 
Change tracking file 
DataPump dumpset 
Automatically generated control file backup 
Cross-platform. transportable datafiles 

如果想向ASM中存儲任意類型的文件,FTP會是個好方式,yangtingkun的這篇BLOG詳細描述了這一方法:http://space.itpub.net/4227/viewspace-448289,通過這一方式,可以將任意文件放入ASM中,而不用考慮是否能夠被直接支持,這其實提供了很大的靈活度,ASM不再是個嚴絲合縫的黑匣子,它也是有縫兒的~~ 

3.2、ASM中的文件名 

ASM創建的文件均由系統自動命名,這種命名方式官方定義爲完全定義文件名(Fully Qualified Filename),這種方式命名的文件包含完整的文件路徑,比如像這樣的形式: 

+ASMDISK2/repdb/TEMPFILE/TEMP.267.714576831 
上述名稱是在文件創建時完全由ASM自動生成,事上述名稱的生成格式爲: 

+diskgroup/dbname/file_type/file_type_tag.file.incarnation 
+diskgroup:磁盤組名稱; 
dbname:數據庫的DB_UNIQUE_NAME參數值; 
file_type:創建的文件類型,比如CONTROLFILE/DATAFILE/ONLINELOG/ARCHIVELOG/TEMPFILE/BACKUPSET/FLASHBACK等等,類型衆多此處不一一例舉; 
file_type_tag:文件類型的標籤,比如表空間對應的通常爲該表空間名稱; 
file.incarnation:文件序號+incarnation,用來確保文件的唯一; 
實際上,即使DBA在創建時想手動指定這樣格式的文件名也是不行的(即使指定了,創建的也只是別名),例如: 

SQL>alter tablespace jsstbs add datafile '+ASMDISK2/repdb/datafile/jsstbs.280.722005095' size 100m; 

alter tablespace jsstbs add datafile '+ASMDISK2/repdb/datafile/jsstbs.280.722005095' size 100m 



ERROR at line 1: 

ORA-01276: Cannot add file +ASMDISK2/repdb/datafile/jsstbs.280.722005095. File has an Oracle Managed Files file name. 

指定非OMF格式的方式名: 

SQL>alter tablespace jsstbs add datafile '+ASMDISK2/repdb/datafile/jsstbs02.dbf' size 100m; 

Tablespace altered. 

看起來o了,其實不然,到asmcmd下查看一下實際創建的文件: 

ASMCMD>pwd 

+ASMDISK2/repdb/datafile 

ASMCMD>ls -l jsstbs* 

Type Redund Striped Time Sys Name 

DATAFILE UNPROT COARSE JUN 18 12:00:00 Y JSSTBS.263.714575967 

DATAFILE UNPROT COARSE JUN 18 13:00:00 Y JSSTBS.271.722005397 

N jsstbs01.dbf => +ASMDISK2/repdb/datafile/JSSTBS.263.714575967 

N jsstbs02.dbf => +ASMDISK2/repdb/datafile/JSSTBS.271.722005397 

由上可以看出,系統雖然創建了名爲jsstb02.dbf的文件,但只是別名,實際指向了由系統自動命名的JSSTBS.271.722005397。 

即然文件創建時無法指定實際文件名及路徑,那麼創建語句當然還可以更簡化,例如: 

SQL>alter tablespace jsstbs add datafile '+ASMDISK2' size 10m; 

Tablespace altered. 

SQL>select file_name from dba_data_files where tablespace_name='JSSTBS'; 

FILE_NAME 

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

+ASMDISK2/repdb/datafile/jsstbs01.dbf 

+ASMDISK2/repdb/datafile/jsstbs02.dbf 

+ASMDISK2/repdb/datafile/jsstbs.272.722005653 

這樣就完全由ORACLE的OMF控制和管理了。 

如果設置了初始化參數db_create_file_dest,甚至連磁盤組名都不需要寫了,例如: 

SQL>show parameter db_create_file_dest 

NAME TYPE VALUE 

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

db_create_file_dest string +ASMDISK2 

SQL>alter tablespace jsstbs add datafile size 10m; 

Tablespace altered. 

通過上述示例,相信大家對於使用ASM做爲存儲的數據庫,添加數據文件已無疑惑,不過如何添加其它類型文件,比如重做日誌文件、歸檔文件(當然歸檔文件本來也就不需要特殊處理,只要LOG_ARCHIVE_DEST_n設置好即可)等還不明瞭,其實沒有那麼複雜,操作方式都是同理的。由上述示例可知,ASM中文件名完全可由其自行管理,因此在創建文件時,只需指定磁盤組路徑即可,文件名嘛,就由ASM自己玩吧~~ 
發佈了60 篇原創文章 · 獲贊 9 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章