Oracle11g RAC下ASM 的管理與維護

不一樣的天空w發表於2016-12-09

一,  基本維護  :  

注意: 以下除OS之外的命令及過程基本都可以透過ASMCA中的ASM相關操作以及
Oracle Enterprise Mananger 來管理 .


1. 檢視ASM磁碟及磁碟組 :

--SQL檢視有哪些磁碟組 .
[root@rac01 ~]# su - grid
[grid@rac01 ~]$ sqlplus "/as sysasm"

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

GROUP_NUMBER NAME STATE TYPE
------------ ------------------------------ ----------- ------
1 OCR_VOTE MOUNTED EXTERN
2 ORADATA MOUNTED EXTERN
3 ORAFLASH MOUNTED EXTERN

透過一些欄位total_mb及free_mb 等可以看出磁碟組的空間使用情況.



-- 透過SQL語句檢視ASM磁碟
SQL> set line 2000
SQL> select group_number, name,failgroup, path from v$asm_disk;

GROUP_NUMBER NAME FAILGROUP PATH
------------ ---------- -------------- ----------------------------------------------------------------
2 ASMDATA01 ASMDATA01 ORCL:ASMDATA01
3 ASMDATA02 ASMDATA02 ORCL:ASMDATA02
1 OCR_VOTE01 OCR_VOTE01 ORCL:OCR_VOTE01

透過group_number可以將磁碟與磁碟組聯絡起來(一個磁碟組可以對應多個磁碟). 這裡
可以看到磁碟OCR_VOTE01對應OCR_VOTE磁碟組, 磁碟ASMDATA01對應ORADATA
磁碟組, 磁碟ASMDATA02 對應ORAFLASH 磁碟組 (建議名稱一致比較好) 。



--透過asmcmd檢視磁碟組(每個磁碟組表現為一個目錄) :
[root@rac01 ~]# su - grid
[grid@rac01 ~]$ asmcmd
ASMCMD> ls -al
State Type Rebal Name
MOUNTED EXTERN N OCR_VOTE/
MOUNTED EXTERN N ORADATA/
MOUNTED EXTERN N ORAFLASH/
備註 : 或者 ASMCMD> lsdg



-- 透過OS下oracleasm 命令檢視ASM磁碟 .
[root@rac01 bin]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
OCR_VOTE01






2. 認識ASM相關路徑 :

透過asmcm 命令可以看到ASM會根據dbca時制定的datafile路徑, 在ORADATA磁碟組
下面建立一些預設的路徑 (一般是 db_name 下ARCHIVELOG/ , CONTROLFILE/,
DATAFILE/ , ONLINELOG/ , PARAMETERFILE/ , TEMPFILE/ , 目錄都是大寫, 其
中後面小寫的arch是使用者自己建的, SYS欄位為Y的都是系統自建的, N是使用者定義
的 )

[root@rac01 bin]# su - grid
[grid@rac01 ~]$ asmcmd
ASMCMD> ls
OCR_VOTE/
ORADATA/
ORAFLASH/
ASMCMD> cd oradata
ASMCMD> ls
RACDB/
ASMCMD> cd racdb
ASMCMD> ls -l
Type Redund Striped Time Sys Name
Y ARCHIVELOG/
Y CONTROLFILE/
Y DATAFILE/
Y ONLINELOG/
Y PARAMETERFILE/
Y TEMPFILE/
N arch/
N control01.ctl => +ORADATA/RACDB/CONTROLFILE/Current.256.739387263
N control02.ctl => +ORADATA/RACDB/CONTROLFILE/Current.257.739387265
N redo01.log => +ORADATA/RACDB/ONLINELOG/group_1.258.739387273
N redo02.log => +ORADATA/RACDB/ONLINELOG/group_2.259.739387281
N redo03.log => +ORADATA/RACDB/ONLINELOG/group_3.266.739393547
N redo04.log => +ORADATA/RACDB/ONLINELOG/group_4.267.739393547
N spfileracdb.ora => +ORADATA/RACDB/PARAMETERFILE/spfile.268.739393555
ASMCMD>


--歸檔路徑ARCHIVELOG :

透過oracle資料庫引數檔案看到歸檔路徑 :
SQL> show parameter log_archive_dest
log_archive_dest_1 string LOCATION=+ORADATA/RACDB/arch
可以看到歸檔路徑 " +ORADATA/RACDB/arch " , 那麼 +ORADATA/RACDB/ARCHIVELOG
下面又是儲存的什麼檔案呢 ?

ASMCMD> pwd
+oradata/racdb/arch -- 檢視引數中的歸檔路徑
ASMCMD> ls -l
Type Redund Striped Time Sys Name
N 1_204_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_28/thread_1_seq_204.478.768441403
N 1_205_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_205.481.768443221
N 1_206_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_206.482.768443233
N 1_207_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_207.483.768443239
N 1_208_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_208.485.768443253
N 1_209_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_209.486.768443277
N 1_210_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_210.487.768443293
N 1_211_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_211.489.768443319
N 1_212_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_212.490.768511059
N 1_213_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_213.493.768512249
N 1_214_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_214.494.768512253
N 1_215_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_215.499.768522885
N 1_216_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_30/thread_1_seq_216.500.768530093
N 2_100_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_2_seq_100.488.768443301
N 2_101_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_2_seq_101.491.768511059
N 2_102_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_2_seq_102.492.768511065
ASMCMD>
使用者自己定義的歸檔格式以及歸檔路徑指向ASM自動建立的目錄及檔案, 自定義生成的
歸檔相當於快捷方式(或軟連線), 實際檔案為ASM預設路徑的歸檔檔案。


也可以手工為Oracle ASM Filename 生成別名:
ALTER DISKGROUP ORADATA ADD ALIAS
'+oradata/racdb/datafile/test01.dbf'
FOR '+oradata/racdb/datafile/TEST.340.740166807' ;




ASMCMD> pwd
+oradata/racdb/ARCHIVELOG --檢視ASM系統自己預設的歸檔路徑
ASMCMD> ls -l
Type Redund Striped Time Sys Name
Y 2011_11_28/
Y 2011_11_29/
Y 2011_11_30/

歸檔檔案是按照每天來進行儲存的 , 並且有目錄分開 .

ASMCMD> cd 2011_11_29/
ASMCMD> ls -l
Type Redund Striped Time Sys Name
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_205.481.768443221
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_206.482.768443233
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_207.483.768443239
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_208.485.768443253
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_209.486.768443277
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_210.487.768443293
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_211.489.768443319
ARCHIVELOG UNPROT COARSE NOV 29 19:00:00 Y thread_1_seq_212.490.768511059
ARCHIVELOG UNPROT COARSE NOV 29 19:00:00 Y thread_1_seq_213.493.768512249
ARCHIVELOG UNPROT COARSE NOV 29 19:00:00 Y thread_1_seq_214.494.768512253
ARCHIVELOG UNPROT COARSE NOV 29 22:00:00 Y thread_1_seq_215.499.768522885
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_2_seq_100.488.768443301
ARCHIVELOG UNPROT COARSE NOV 29 19:00:00 Y thread_2_seq_101.491.768511059
ARCHIVELOG UNPROT COARSE NOV 29 19:00:00 Y thread_2_seq_102.492.768511065
ARCHIVELOG UNPROT COARSE NOV 29 22:00:00 Y thread_2_seq_103.495.768522877
ARCHIVELOG UNPROT COARSE NOV 29 22:00:00 Y thread_2_seq_104.496.768522879
ARCHIVELOG UNPROT COARSE NOV 29 22:00:00 Y thread_2_seq_105.497.768522883
ARCHIVELOG UNPROT COARSE NOV 29 22:00:00 Y thread_2_seq_106.498.768522883
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_2_seq_99.484.768443235
ASMCMD>




--控制檔案路徑 CONTROLFILE :
ASMCMD> cd racdb
ASMCMD> ls -l
Type Redund Striped Time Sys Name
N control01.ctl => +ORADATA/RACDB/CONTROLFILE/Current.256.739387263
N control02.ctl => +ORADATA/RACDB/CONTROLFILE/Current.257.739387265

檢視初始化引數檔案位置, 實際檔案也是類似軟連結方式 :
SQL> show parameter control

NAME TYPE VALUE
------------------------------------ ----------- ----------------------------
control_files string +ORADATA/racdb/control01.ctl,
+ORADATA/racdb/control02.ctl

如何增加控制檔案呢 ? 例子如下:
SQL> alter database mount database;
SQL> alter database backup controlfile to '+ORADATA/racdb/control02.ctl';
SQL> alter database backup controlfile to '+ORADATA/racdb/control03.ctl';
SQL> alter system set control_files='+ORADATA/racdb/control01.ctl','+DATA/racdb/control02.ctl','+DATA/racdb/control03.ctl'

scope=spfile;
SQL> startup mount





--資料檔案路徑 DATAFILE :

ASMCMD> pwd
+oradata/racdb/datafile
ASMCMD>
ASMCMD> ls -l
Type Redund Striped Time Sys Name
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y BASE_DATA.317.754072293
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y BASE_DATA.318.754072319
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y BASE_DATA.319.754072331
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y BASE_DATA.320.754072345
N BASE_DATA01.DBF => +ORADATA/RACDB/DATAFILE/BASE_DATA.317.754072293
N BASE_DATA02.DBF => +ORADATA/RACDB/DATAFILE/BASE_DATA.318.754072319
N BASE_DATA03.DBF => +ORADATA/RACDB/DATAFILE/BASE_DATA.319.754072331
N BASE_DATA04.DBF => +ORADATA/RACDB/DATAFILE/BASE_DATA.320.754072345
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y LOGMNRTS.321.754072935
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y LOG_DATA.322.754072961
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y LOG_DATA.323.754072985
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y LOG_DATA.324.754073009
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y LOG_DATA.325.754073035
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y none => SYSAUX.261.754063795
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y none => SYSTEM.263.754063787
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y +ORADATA/RACDB/DATAFILE/undotbs101.dbf =>

UNDOTBS1.260.758741005
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y none => UNDOTBS2.258.754063807
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y none => UNDOTBS3.257.754063809
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y none => USERS.256.754063811

可以看出連結的名稱及對應的實體檔名稱都出現在 datafile目錄下, 當然並
不是每個實體檔案都有一個對應的連結的檔名稱, 例如初始建立資料庫的
時候指定 +ORADATA 磁碟組後, 資料庫會自動建立初始資料檔案, 那時候的
檔案就只有系統生成的, 而沒有使用者指定的名稱(連結名稱) , 例如上面例子中
的 LOGMNRTS.321.754072935 , SYSTEM.263.754063787 等 .

在加入datafile或建立表空間時, 如果只是指定 +ORADATA, 而不明確寫出路徑
及檔名稱 , 那麼就會生成系統自建檔案而沒有連結名稱, 如果檔案使用類似
' +ORADATA/racdb/datafile/mytbs01.dbf ' , 那麼就會生成系統自建檔案及對應的
連結檔案 . 同樣可以利用ALTER DISKGROUP XX ADD ALIAS 增加別名.

----------------------------------------------------------------------------
-- 認識檔名
BASE_DATA.317.754072293 是表空間名+檔案編號.Incarnation .

+group/dbname/file type/tag.file.incarnation 格式中分別是磁碟組名, file type是Oracle
檔案型別, tag一般對一個表空間名, file.incarnation 結合在一起確保唯一性.
----------------------------------------------------------------------------


測試 : 新增資料檔案或表空間

CREATE TABLESPACE MYTBS DATAFILE
'+ORADATA/racdb/datafile/mytbs01.dbf' SIZE 10M AUTOEXTEND OFF
LOGGING
ONLINE
PERMANENT
EXTENT MANAGEMENT LOCAL UNIFORM. SIZE 5M
BLOCKSIZE 16K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON ;

或者

CREATE TABLESPACE TONYTBS DATAFILE
'+ORADATA' SIZE 10M AUTOEXTEND ON NEXT 5M MAXSIZE 1024M
LOGGING
ONLINE
PERMANENT
EXTENT MANAGEMENT LOCAL UNIFORM. SIZE 5M
BLOCKSIZE 16K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON ;

增加資料檔案
ALTER TABLESPACE MYTBS ADD DATAFILE
'+ORADATA' SIZE 10M AUTOEXTEND OFF ;


如果設定了初始化引數db_create_file_dest(預設為空),連磁碟組名都不
需要寫了,例如:
SQL> show parameter db_create_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string +ORADATA

SQL> ALTER TABLESPACE MYTBS ADD DATAFILE SIZE 10M AUTOEXTEND OFF ;
ablespace altered.

Tips :
對於現有系統想遷入ASM儲存,最簡單的方式,莫過於使用RMAN了

3個語句建立完畢後, 檢視系統檔案:
[root@rac01 ~]# su - grid
[grid@rac01 ~]$
[grid@rac01 ~]$ asmcmd
ASMCMD> ls
OCR_VOTE/
ORADATA/
ORAFLASH/
ASMCMD> cd oradata/racdb

ASMCMD> ls -l
Type Redund Striped Time Sys Name
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y MYTBS.504.768590521
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y MYTBS.505.768590741
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y SYSAUX.261.739387301
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y SYSTEM.260.739387283
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y TEST.340.740166807
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y TEST.341.740166937
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y TONYTBS.506.768590761
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y UNDOTBS1.262.739387315
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y UNDOTBS2.264.739387351
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y USERS.265.739387361
N mytbs01.dbf => +ORADATA/RACDB/DATAFILE/MYTBS.504.768590521
N test01.dbf => +ORADATA/RACDB/DATAFILE/TEST.340.740166807
N test02.dbf => +ORADATA/RACDB/DATAFILE/TEST.341.740166937

我們可以看到, mytbs01 指定了路徑 '+ORADATA/racdb/datafile/mytbs01.dbf' , 所以
顯示時既有mytbs01.dbf, 也有對應的 MYTBS.504.768590521 , 新加入的 MYTBS表
空間檔案只是寫了 '+ORADATA' , 生成檔案為 MYTBS.505.768590741 , 同樣建立
的TONYTBS也是, 對應檔案為 TONYTBS.506.768590761 , 沒有連結檔案 .

修改資料檔案大小 (與檔案系統操作相似) :
ALTER DATABASE DATAFILE '+DATA/wsjdell/datafile/users.256.754063811' RESIZE 200M;


對於歸檔目錄及資料檔案目錄, 還有一個比較關心的問題就是空間問題, 我們如
何來判斷磁碟組需要加入新的磁碟或新建磁碟組來滿足資料增長呢 ?

ASMCMD> pwd
+oradata/racdb/datafile
ASMCMD> du
Used_MB Mirror_used_MB
2949 2949

ASMCMD> lsdg
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files

Name
MOUNTED EXTERN N 512 4096 1048576 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN N 512 4096 1048576 10236 465 0 465 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3999 0 3999 0 N ORAFLASH/

[root@rac01 ~]# su - grid
[grid@rac01 ~]$ sqlplus "/as sysasm"
SQL> select name , total_mb, free_mb,cold_used_mb from v$asm_diskgroup ;
NAME TOTAL_MB FREE_MB COLD_USED_MB
------------------------------ ---------- ---------- ------------
OCR_VOTE 10236 9840 396
ORADATA 10236 465 9771
ORAFLASH 4094 3999 95

可以看到透過asmcmd 及 asm 例項中的 sql 語句查詢出來的 free_mb(或Usable_file_MB)
大小是一致的 .

表空間的使用情況需要透過資料庫SQL或輔助工具(如Toad)來進行檢視.




--線上日誌檔案路徑 ONLINELOG

ASMCMD> pwd
+oradata/racdb
ASMCMD> ls -l
Type Redund Striped Time Sys Name
Y ARCHIVELOG/
Y CONTROLFILE/
Y DATAFILE/
Y ONLINELOG/
Y PARAMETERFILE/
Y TEMPFILE/
N arch/
N control01.ctl => +ORADATA/RACDB/CONTROLFILE/Current.256.739387263
N control02.ctl => +ORADATA/RACDB/CONTROLFILE/Current.257.739387265
N redo01.log => +ORADATA/RACDB/ONLINELOG/group_1.258.739387273
N redo02.log => +ORADATA/RACDB/ONLINELOG/group_2.259.739387281
N redo03.log => +ORADATA/RACDB/ONLINELOG/group_3.266.739393547
N redo04.log => +ORADATA/RACDB/ONLINELOG/group_4.267.739393547
N spfileracdb.ora => +ORADATA/RACDB/PARAMETERFILE/spfile.268.739393555
ASMCMD> cd onlinelog
ASMCMD> ls -l
Type Redund Striped Time Sys Name
ONLINELOG UNPROT COARSE NOV 30 17:00:00 Y group_1.258.739387273
ONLINELOG UNPROT COARSE NOV 30 17:00:00 Y group_2.259.739387281
ONLINELOG UNPROT COARSE NOV 30 17:00:00 Y group_3.266.739393547
ONLINELOG UNPROT COARSE NOV 30 17:00:00 Y group_4.267.739393547

和其他關鍵檔案一樣, 在建庫的時候手工指定了目錄 +oradata/racdb , 所以畢竟
好辨認的名稱 redo01.log, redo02.log 等都以連結名稱方式存在 .

Redo logfile的冗餘設定可以設定在不同的磁碟組上, 比如 ORADATA和ORAFLASH .
加入冗餘組的方式和檔案系統下一樣(唯一的區別是不能在file上加括號, 如果只加入
一個member的話 ) .

alter database add logfile member '+ORAFLASH' to group 1 ;
alter database add logfile member '+ORAFLASH' to group 2 ;
alter database add logfile member '+ORAFLASH' to group 3 ;
alter database add logfile member '+ORAFLASH' to group 4 ;

加入後查詢 v$logfile 可以看到每組2個成員 .

ASMCMD> cd +oraflash
ASMCMD> ls
RACDB/
ASMCMD> cd racdb
ASMCMD> ls
ONLINELOG/
ASMCMD> ls -l
Type Redund Striped Time Sys Name
ONLINELOG UNPROT COARSE NOV 30 20:00:00 Y group_1.256.768602255
ONLINELOG UNPROT COARSE NOV 30 21:00:00 Y group_2.257.768603599
ONLINELOG UNPROT COARSE NOV 30 21:00:00 Y group_3.258.768603683
ONLINELOG UNPROT COARSE NOV 30 21:00:00 Y group_4.259.768603705

加入一個redo log group .
alter database add logfile group 5 ('+ORADATA' , '+ORAFLASH') size 50M ;


SQL> select member from v$logfile;
MEMBER
--------------------
+ORADATA/racdb/redo01.log
+ORADATA/racdb/redo02.log
+ORADATA/racdb/redo03.log
+ORADATA/racdb/redo04.log
+ORAFLASH/racdb/onlinelog/group_1.256.768602255
+ORAFLASH/racdb/onlinelog/group_2.257.768603599
+ORAFLASH/racdb/onlinelog/group_3.258.768603683
+ORAFLASH/racdb/onlinelog/group_4.259.768603705
+ORADATA/racdb/onlinelog/group_5.508.768604159
+ORAFLASH/racdb/onlinelog/group_5.260.768604161

10 rows selected.
SQL>



--引數檔案路徑 PARAMETERFILE (DB引數檔案, 非ASM例項引數檔案)

ASMCMD> pwd
+oradata/racdb/parameterfile
ASMCMD> ls -l
Type Redund Striped Time Sys Name
PARAMETERFILE UNPROT COARSE NOV 30 17:00:00 Y spfile.268.739393555
ASMCMD>



--臨時檔案路徑 TEMPFILE

ASMCMD> cd tempfile
ASMCMD> ls -l
Type Redund Striped Time Sys Name
TEMPFILE UNPROT COARSE NOV 30 17:00:00 Y TEMP.263.739387321






3. 擴充磁碟組大小

ASMCMD> lsdg
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files

Name
MOUNTED EXTERN N 512 4096 1048576 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN N 512 4096 1048576 10236 414 0 414 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3737 0 3737 0 N ORAFLASH/

透過lsdg或v$asm_diskgroup檢視我們發現磁碟組空間可能不夠了, 那麼我們
是新加入一個磁碟組呢, 還是在原來磁碟組基礎上加入新的磁碟呢 ? 為了
更好的得到I/O效能 , 一般採用在磁碟組中加入新的磁碟 . ASM磁碟組支援
動態擴充套件,我們可以向現有的磁碟組動態加入新的磁碟,新磁碟加入後,Oracle
透過後臺RBAL進行Rebalance,將當前的資料均衡到新增加的磁碟上。Drop磁
盤亦會Rebalance。

asm_power_limit 引數用於控制Rebalance的速度,取值1~11,power表示啟動的
rebalance的程式RBAL的個數數字越大,平衡速度越快,預設值是1。但是該數
字越大,可能因為Rebalance而影響效能, 一般為了平衡, 設定為 3~6之間。


加入新磁碟後, 假設為 /dev/sde, /dev/sdf , fdisk 劃分分割槽為 /dev/sde1, /dev/sdf1 .

[grid@rac01 ~]$ sqlplus "/as sysasm"
SQL*Plus: Release 11.2.0.1.0 Production on Wed Nov 30 23:04:08 2011
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Real Application Clusters and Automatic Storage Management options

SQL> show parameter asm_power_limit

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
asm_power_limit integer 1

SQL> alter system set asm_power_limit=5 ; -- 修改power值 .
System altered.
或者使用
ALTER DISKGROUP diskgroupname REBALANCE POWER 5 ;

-- 檢視已有的磁碟 .
SQL> select group_number, name from v$asm_disk order by 1;

GROUP_NUMBER NAME
------------ ------------------------------
0
1 OCR_VOTE01
2 ASMDATA01
3 ASMDATA02


-- 檢視已有的磁碟組 .
SQL> select group_number, name from v$asm_diskgroup order by 1 ;

GROUP_NUMBER NAME
------------ ------------------------------
1 OCR_VOTE
2 ORADATA
3 ORAFLASH


建立新磁碟:
[root@rac01 ~]# /usr/sbin/oracleasm createdisk ASMDATA03 /dev/sde1
Writing disk header: done
Instantiating disk: done

[root@rac01 ~]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
ASMDATA03
OCR_VOTE01

其他節點上:
[root@rac02 ~]# /usr/sbin/oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...

[root@rac02 ~]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
ASMDATA03
OCR_VOTE01

新磁碟ASMDATA03 需要加入到 ORADATA 磁碟組中:

[grid@rac01 ~]$ sqlplus "/as sysasm"
SQL> ALTER DISKGROUP ORADATA ADD DISK 'ORCL:ASMDATA03' ;
Diskgroup altered .

或者( 需要在初始引數指定 ASM_DISKSTRING = '/dev/*' )
SQL>ALTER DISKGROUP ORADATA ADD DISK '/dev/sde1' name ASMDATA03 ;

速度還是非常快的(可能是沒有多少資料需要在各磁碟間轉移), 大家可以
找一些大的測試庫進行不同power值時的速度及效能測試 . 注意完畢後將
asm_power_limit 值修改為預設的 1 .
SQL> alter system set asm_power_limit=1 ;
System altered.


-------------------------------------------------------------------------
注意, 如果擴容的磁碟組是Normal Redundant 的, 那麼還需要failure group.
修改及新增磁碟組相關的語句類似 (需要設定初始引數ASM_DISKSTRING='/dev/*'):
具體參考:


一個磁碟組成failgroup (Normal):
ALTER DISKGROUP dgroup1 NORMAL REDUNDANCY
FAILGROUP fg1 DISK '/dev/sde1' NAME ASMDATA05
FAILGROUP fg2 DISK '/dev/sdf1' NAME ASMDATA06 ;

一個磁碟組成failgroup (High):
create diskgroup data2 high redundancy
failgroup fg1 disk '/dev/raw/raw3' name d2a
failgroup fg2 disk '/dev/raw/raw4' name d2b
failgroup fg3 disk '/dev/raw/raw5' name d2c;

多個磁碟組成failgroup (Normal):
CREATE DISKGROUP dgroup1 NORMAL REDUNDANCY
FAILGROUP controller1 DISK
'/dev/diska1',
'/dev/diska2',
'/dev/diska3',
'/dev/diska4'
FAILGROUP controller2 DISK
'/dev/diskb1',
'/dev/diskb2',
'/dev/diskb3',
'/dev/diskb4';

語法:
CREATE DISKGROUP diskgroup_name
[ { HIGH | NORMAL | EXTERNAL } REDUNDANCY ]
[ FAILGROUP failgroup_name ]
DISK [ NAME disk_name ] [ SIZE size_clause ] [ FORCE | NOFORCE ] ...;
-------------------------------------------------------------------------




可以透過v$asm_operation檢視來檢視正在進行的操作 .
--------------------------------------------------------------------------
這裡有幾點要注意:
(1), 首先 sqlplus登入需要 sysasm角色, 因為sysdba只能檢視, 不能修改.
(2), add disk 後接的磁碟資訊為 'ORCL:XXX' , XXX是listdisks看到的ASM磁碟label .
如果只是 add disk 'XXX' 會報錯.
(3), 同樣 add disk 後面直接寫 '/dev/sde1' 也是不行的, 會報許可權錯誤.
--------------------------------------------------------------------------

透過asmcmd 檢視磁碟組空間擴充套件情況 :
[root@rac02 ~]# su - grid
[grid@rac02 ~]$
[grid@rac02 ~]$ asmcmd
ASMCMD> lsdg
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files

Name
MOUNTED EXTERN N 512 4096 1048576 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN Y 512 4096 1048576 30709 20694 0 20694 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3737 0 3737 0 N ORAFLASH/
ASMCMD>
可以看到ORADATA 磁碟組的 Total_MB變成了30G (30709M), 顯然是
成功加入了20G 的 /dev/sde1 .

刪除磁碟組中的磁碟(同樣也需要設定power值來使RBAL速度加快) :
SQL> ALTER DISKGROUP ORADATA DROP DISK 'ASMDATA03' ;
Diskgroup altered.

如果執行後立刻檢視的話, 可能ORADATA磁碟組大小不會變, 需要觀察
v$asm_operation檢視來檢視正在進行的操作, 完畢後才會變化, 執行drop
命令後不等待和等待3分鐘後檢視的結果如下:

ASMCMD> lsdg -- 馬上檢視(大小沒有變化)
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files

Name
MOUNTED EXTERN N 512 4096 1048576 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN Y 512 4096 1048576 30709 20694 0 20694 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3737 0 3737 0 N ORAFLASH/
ASMCMD>
ASMCMD> lsdg -- 等待3分鐘後檢視 (當然資料量大的話等待時間更久)
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files

Name
MOUNTED EXTERN N 512 4096 1048576 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN N 512 4096 1048576 10236 223 0 223 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3737 0 3737 0 N ORAFLASH/
可以看到 ORADATA 的total_mb 又變回 10G了 .

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

ASMCMD> lsdsk -- ASMDATA03 磁碟消失.
Path
ORCL:ASMDATA01
ORCL:ASMDATA02
ORCL:OCR_VOTE01

注意 DROP DISK 只是將ASMDATA03 從磁碟組中刪除 :
[root@rac02 ~]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
ASMDATA03
OCR_VOTE01

--------------------------------------------------------------
備註:
(1), 也可以只對某個diskgroup設定rebalance power, 比如:
alter diskgroup ORADATA rebalance power 8 ;
(2), 或者在命令中設定
alter diskgroup ORADATA add disk 'ORCL:ASMDATA03' rebalance power 8;
alter diskgroup ORADATA drop disk 'ASMDATA03' rebalance power 8;
--------------------------------------------------------------


需要注意的是, add 及 drop之後都需要等待一些時間再做針對此磁碟
或磁碟組的動作, 否則可能報錯, 或者觀察v$asm_operation 來檢視事務.
如下:
SQL> select * from v$asm_operation ;

GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE
------------ ----- ---- ---------- ---------- ---------- ---------- ----------
EST_MINUTES ERROR_CODE
----------- --------------------------------------------
2 REBAL RUN 8 8 173 6680 741
8

隔一段時間再次檢視(直到相關事務從此檢視消失) :

SQL> select * from v$asm_operation ;

GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE
------------ ----- ---- ---------- ---------- ---------- ---------- ----------
EST_MINUTES ERROR_CODE
----------- --------------------------------------------
2 REBAL RUN 8 8 2674 6677 1028
3

SQL> select * from v$asm_operation ;

GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE
------------ ----- ---- ---------- ---------- ---------- ---------- ----------
EST_MINUTES ERROR_CODE
----------- --------------------------------------------
2 REBAL RUN 8 8 6458 6663 1254
0

SQL> select * from v$asm_operation ;
no rows selected



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

SQL> alter diskgroup ORADATA undrop disks;
Diskgroup altered.

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





4. 增加新的磁碟組

-- 檢視已有的磁碟 .
SQL> select group_number, name from v$asm_disk order by 1;
GROUP_NUMBER NAME
------------ ------------------------------
1 OCR_VOTE01
2 ASMDATA01
2 ASMDATA03
3 ASMDATA02

-- 檢視已有的磁碟組 .
SQL> select group_number, name from v$asm_diskgroup order by 1 ;

GROUP_NUMBER NAME
------------ ------------------------------
1 OCR_VOTE
2 ORADATA
3 ORAFLASH

建立新磁碟 (/dev/sdf1):
[root@rac01 ~]# /usr/sbin/oracleasm createdisk ASMDATA04 /dev/sdf1
Writing disk header: done
Instantiating disk: done

[root@rac01 ~]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
ASMDATA03
ASMDATA04
OCR_VOTE01

其他節點上:
[root@rac02 ~]# /usr/sbin/oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...
Instantiating disk "ASMDATA04"

[root@rac02 ~]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
ASMDATA03
ASMDATA04
OCR_VOTE01

開始建立磁碟組(這裡是external模式, 具體語法參考文件) :

在節點1 上建立新的磁碟組:

SQL> CREATE DISKGROUP ORAINDX EXTERNAL REDUNDANCY
DISK 'ORCL:ASMDATA04' ;

SQL> select group_number, name from v$asm_diskgroup ;
GROUP_NUMBER NAME
------------ ------------------------------
1 OCR_VOTE
2 ORADATA
3 ORAFLASH
4 ORAINDX

ASMCMD> lsdg
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files

Name
MOUNTED EXTERN N 512 4096 1048576 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN N 512 4096 1048576 30709 20694 0 20694 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3737 0 3737 0 N ORAFLASH/
MOUNTED EXTERN N 512 4096 1048576 10236 10186 0 10186 0 N ORAINDX/
ASMCMD>

可以看到在節點1上都生效了. 但是其他節點沒有生效(lsdg, lsdsk都看不到),
需要手工掛載新磁碟組 .

SQL> ALTER DISKGROUP ORAINDX MOUNT ;
Diskgroup altered.

在其他節點上檢視即可以看到了 :
SQL> select name from v$asm_diskgroup;
SQL> select name from v$asm_disk;
ASMCMD> lsdsk
ASMCMD> lsdg



5 , 刪除磁碟組

語法:drop diskgroup gpname, 如果刪除的diskgroup非空的話,直接執行上述
語句會報錯,這時候可以透過附加including contents子句,來自動刪除該磁碟
組中包含的檔案。刪除磁碟組的操作會自動修改spfile中ASM_DISKGROUPS
初始化引數的值(如果使用了SPFILE的話) .

-- Tips :
如果刪除的是檔案的話,其關聯的別名(Alias)也會被自動刪除。
SQL> alter diskgroup asmdisk2 drop file '+ASMDISK2/repdb/datafile/temp01.dbf';
Diskgroup altered.






二 , ASM 例項相關


1. ASM 相關的許可權及角色

安裝Grid Infrastructure時候的常用使用者及組:
Grid Infrastructure 作業系統使用者grid , 主組為oinstall, 輔助組為asmadmin, asmdba, asmoper
Oracle RAC 作業系統使用者 oracle , 主組為oinstall , 輔助組為dba, oper , asmdba

11g release2中oracle建議獨立地管理Grid Infrastructure和ASM例項 .

OSASM(asmadmin)使用者組
如果使用ASM,我們必須建立osasm(asmadmin)使用者組,該OSASM使用者組的成員將被賦予
SYSASM許可權,以滿足組成員管理Oracle Clusterware和 ASM的許可權需求。

OSDBA for ASM group(asmdba)使用者組
OSDBA(asmdba)使用者組的成員將被賦予讀寫訪問ASM檔案的許可權。GI/CRS擁有者使用者和
所有oracle資料庫軟體的擁有者必須是該組的成員。同時所有OSDBA(dba)使用者組的成員也
必須是asmdba組的成員。

OSOPER for ASM(asmoper)使用者組
asmoper和osoper類似都是額外的可選擇建立的使用者組,建立該獨立的使用者組以滿足賦予
使用者一套受限的ASM例項管理許可權(ASM的SYSOPER角色),該許可權包括了啟動和停止ASM
例項,預設情況下OSASM(asmadmin)組成員將擁有所有SYSOPER的ASM管理許可權。

grid使用者單獨安裝叢集,比如包括asm例項,監聽資源,節點資源等
oracle使用者就只安裝oracle程式碼

# groupadd oinstall  
# groupadd asmadmin   
# groupadd asmdba
# groupadd asmoper  
# groupadd dba
# groupadd oper

#useradd -g oinstall -G asmadmin,asmdba,asmoper grid
#useradd -g oinstall -G dba, oper, asmdba oracle

具體代表含義參考 :


使用者組 所屬該組的使用者 使用者組描述
oinstall grid, oracle Oracle Inventory and Software Owner
dba oracle Database Administrator
asmadmin grid Oracle ASM Group
asmdba grid, oracle ASM Database Administrator Group
asmoper grid ASM Operator Group
oper oracle Database Operator

如果對oracle使用者沒賦予asmdba組的話,則會導致oracle使用者認不到diskgroup,
啟動對應節點例項失敗。

---------------------------------------------------------------------
備註 :
Oracle10g中還是使用sysdba管理asm例項,Oracle11g中使用一個新角色sysasm, 專用於
管理asm, 相當於針對asm例項的sysdba角色。 在Oracle11g RAC 中以grid使用者登入後 , 以
sysdba登入也是可以檢視asm例項相關的狀態, 但是不能做變更, sysasm 角色連線後才
可以。
---------------------------------------------------------------------





2. ASM 例項

ASM 例項與 ORACLE 資料庫例項差不多, 都是由SGA和後臺程式組成, 區別在於
oracle例項管理的是資料庫,而asm例項只管理ASM磁碟組. 這裡grid使用者是屬於
asmadmin組, 用於管理ASM,

[root@rac01 ~]# su - grid
[grid@rac01 ~]$ id
uid=501(grid) gid=501(oinstall) groups=501(oinstall),504(asmadmin),506(asmdba),507(asmoper)
[grid@rac01 ~]$ORACLE_SID=+ASM1 (一般不用,因為grid使用者下只有一個ASM例項)
[grid@rac01 ~]$ env | grep ORA
ORA_NLS11=/u01/grid/11.2.0/nls/data
ORACLE_SID=+ASM1
ORACLE_BASE=/u01/grid/crs
ORACLE_TERM=vt100
ORACLE_HOME=/u01/grid/11.2.0

[grid@rac01 ~]$ sqlplus / as sysasm
SQL*Plus: Release 11.2.0.1.0 Production on Sat Dec 3 07:13:39 2011
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Real Application Clusters and Automatic Storage Management options

SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string +ASM1

以grid使用者身份, 連線到ASM例項 , 使用sysdba 及 sysasm 角色都可以,
以sysdba登入也是可以檢視asm例項相關的狀態 , 但是不能做變更,
sysasm 角色連線後才可以 .


A. ASM例項開啟及關閉
同樣的, ASM 例項也可以 startup nomount / mount / open / force .
nomount : 只是啟動例項 ;
mount / open : 啟動例項及載入磁碟組, open和mount一樣 ;
force : 先執行shutdown abort , 然後再startup ;

測試 :
[grid@rac01 ~]$ sqlplus / as sysasm
SQL> startup nomount
ASM instance started
Total System Global Area 120023424 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例項 : NORMAL/IMMEDIATE/TRANSACTIONAL/ABORT 幾個選項
與關閉普通資料庫例項一樣 :
SQL> shutdown immediate
ASM diskgroups dismounted
ASM instance shutdown




B. ASM 例項的初始化引數

ASM初始化也分spfile及pfile, 操作也相同. 和RDBMS資料庫比起來, 還是有一些差異
引數.
SQL> create pfile='/tmp/asminit.ora' from spfile;
File created.

因為ASM例項在記憶體佔用方面非常小, 基本上100M記憶體空間就足夠了, 記憶體相關就不提了.

INSTANCE_TYPE : 在ASM中值為ASM , 在資料庫例項中是RDBMS .

ASM_POWER_LIMIT :指定磁碟rebalance的程度,有0-11個級別,預設值為1,指定
的級別越高,則rebalance的操作就會越快被完成(當然這也意味著這個時間段內將
佔用更多的資源),指定級別較低的話,雖然rebalance操作會耗時更久,但對當前
系統的IO及負載影響會更少,這中間的度需要DBA根據實際情況衡量。另外,這個參
數指定的只是一個預設值,在操作過程中,即可以動態修改,也可以在語句級命令列
時指定power,覆蓋該預設值。

ASM_DISKSTRING :用最簡單的話說,就是設定ASM啟動時檢查的磁碟,該選項可以
同時指定多個值,並且支援萬用字元。比如說,只檢查/dev/dsk/下的裝置,可以設定
該引數如下:/dev/dsk/*,預設情況下該引數為空,為空的話,表示ASM將查詢系統
中所有ASM擁有讀寫許可權的裝置。

ASM_DISKGROUPS : 指定例項啟動或alter diskgroup all mount語句時要載入的磁
盤組,如果為空的話,那麼實際就僅啟動到NOMOUNT狀態了。如果是使用SPFILE的話,
該引數一般不需要手動修改,ASM能夠自動更新該初始化引數中的值。

[grid@rac01 tmp]$ sqlplus / as sysasm

SQL*Plus: Release 11.2.0.1.0 Production on Tue Nov 29 05:24:38 2011
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Real Application Clusters and Automatic Storage Management options

SQL> show parameter

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
asm_diskgroups string ORADATA, ORAFLASH
asm_diskstring string
asm_power_limit integer 1
......




3. ASM 相關檢視

[root@rac01 ~]# su - oracle
[oracle@rac01 ~]$ sqlplus "/as sysdba"

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

TABLE_NAME
------------------------------
V$ASM_ACFSSNAPSHOTS
V$ASM_ACFSVOLUMES
V$ASM_ALIAS -- 記錄檔案別名
V$ASM_ATTRIBUTE -- 記錄ASM磁碟組的屬性
V$ASM_CLIENT -- 當前連線的客戶端例項資訊
V$ASM_DISK -- ASM管理的磁碟及磁碟組資訊
V$ASM_DISKGROUP -- ASM磁碟組
V$ASM_DISKGROUP_STAT -- ASM磁碟組狀態, 大小
V$ASM_DISK_IOSTAT -- ASM磁碟組I/O狀態
V$ASM_DISK_STAT
V$ASM_FILE

TABLE_NAME
------------------------------
V$ASM_FILESYSTEM
V$ASM_OPERATION -- 當前磁碟的操作資訊
V$ASM_TEMPLATE
V$ASM_USER
V$ASM_USERGROUP
V$ASM_USERGROUP_MEMBER
V$ASM_VOLUME
V$ASM_VOLUME_STAT

19 rows selected.



4. ASM 體系結構

ASM例項 :
1) RBAL: rebalancer程式,負責規劃ASM磁碟組的Reblance活動
2) ABRn: 是RBAL程式的子程式,真正完成Reblance活動

RDBMS例項 :
1) RBAL: 負責開啟每個磁碟組的所有磁碟
2) ASMB: 這個程式作為ASM例項和資料庫例項之間的資訊通道.這個程式負責與
ASM例項的通訊,它先利用Diskgroup name從CSS獲得管理該Diskgroup的ASM例項的
連線串,然後建立到ASM的持久連線,兩個例項透過這條連線定期交換資訊,同時也
是一種心跳機制.
3)O0nn 01-10:這組程式建立到ASM例項的連線,某些長時間操作比如建立資料檔案,
RDBMS會透過這些程式向ASM傳送資訊


ASM Instance 與RDBMS 的互動
當ASM例項掛載一個磁碟組之後,ASM會把Disk Group Name, ASM Instance Name,
Oracle Home Path等資訊註冊到CSS(Cluster Sychronization Service), 這些資訊會被用
來構造Connect String. 當RDBMS啟動過程中需要訪問某個ASM File時, RDBMS會
和CSS聯絡, 從CSS中獲取Connect String,然後發起一個到ASM例項的連線, 這條
ASM和RDBMS例項之間的初始連線叫作Umbilicu(臍帶), 只要RDBMS開啟ASM File,
這個連線就會保持活動. 直到所有ASM File都被RDBMS例項關閉之後,這個連線才
會關閉.

對ASM的理解, ASM其實就是LVM披上了Oracle的馬甲, Disk 對應PV, Diskgroup 對應VG,



5. ASM 高效儲存技術

   自動儲存管理直接在Oracle 核心提供了檔案系統和卷管理器的垂直整合,
從而帶來了儲存區域網系統提供的“虛擬化”型別的優點(易於管理、更高的可用性),
並專門用於Oracle 資料庫檔案。ASM 提供了配置資料庫的快捷方法,以達到最佳效能
和資源利用率。它透過Oracle 核心自動管理資料庫檔案和這些檔案的放置,不再需要
第三方檔案系統和卷管理器來管理Oracle 檔案。ASM 免去了耗時的手動I/O 效能與調
整任務,大大節省了DBA 的時間。

ASM的映象(mirroring)與條帶化(striping):ASM 將檔案分成1MB 大小的區(extent, AU),
並將所有檔案的區平均分佈到磁碟組的所有磁碟中。ASM 不使用數學函式跟蹤每個區的
放置,而使用指標記錄區的位置。這樣,ASM 就可以在磁碟組配置變化時移動某個文
件的某些區,而不必按照公式並根據磁碟數來移動所有的區。對於需要低延遲的檔案
(例如日誌檔案),ASM 提供了細粒度(128k) 分段,以便由多個磁碟並行分隔並處理較
大的I/O。ASM 在所有可用的資源中分佈I/O 負載,在免除手動I/O 調節需要(透過分
散資料庫檔案來避免熱點)的同時最佳化效能。
ASM的映象比作業系統的磁碟映象更為靈活,因為ASM可基於檔案設定冗餘級別,
也就是說在同一磁碟組中的兩個檔案可以一個是映象的, 而另一個不做映象。ASM鏡
像發生在區級。

  ASM的動態儲存配置:ASM使得線上調整儲存配置成為可能,即它幫助DBA 管理
動態資料庫環境,讓DBA 能夠在擴大或縮小資料庫規模的情況下,無需關閉資料庫
以調整儲存配置。而在往磁碟組中增加磁碟或從磁碟組中刪除磁碟後,ASM將自動
重新平衡――均衡地在磁碟組中的所有磁碟上重新分佈檔案資料。








三, ASM 磁碟冗餘及故障處理


ASM的磁碟冗餘策略可以分成三類:外部冗餘、標準冗餘和高度冗餘,
其中外部冗餘不需要failure 磁碟組, 標準和高度冗餘必須要有failure磁碟組,

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

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

ASM 擴充套件性:
最多支援63個磁碟組;
最多支援10000個磁碟;
最大支援4pb/磁碟;
最大支援40 exabyte/ASM儲存;
最大支援1百W個檔案/磁碟組;
外部冗餘時單個檔案最大35tb,標準冗餘時單個檔案最大5.8tb,高冗餘度時單個
檔案最大3.9tb。



載入及解除安裝磁碟組

UNMOUNT磁碟組的話務必慎重操作,要確保UNMOUNT的磁碟組中儲存的
檔案對應的資料庫當前未啟動,而且該操作也會直接導致資料庫SHUTDOWN。
只有mount的磁碟組才能被資料庫使用兵執行add/drop操作, ASM中的磁碟組默
認會在ASM例項啟動時自動載入 .

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

GROUP_NUMBER NAME STATE TOTAL_MB FREE_MB
------------ ------------------------------ ----------- ---------- ----------

1 ASMDATA1 MOUNTED 20472 18667
2 ASMDATA2 MOUNTED 16378 14621

將ASMDATA2磁碟組UNMOUNT:
SQL> alter diskgroup ASMDATA2 dismount;
Diskgroup altered.

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

GROUP_NUMBER NAME STATE
------------ ------------------------------ -----------
1 ASMDATA1 MOUNTED
0 ASMDATA2 DISMOUNTED

SQL> alter diskgroup ASMDATA2 mount; -- 再掛載.
Diskgroup altered.








四 , ASM 在Linux下的相關命令ORACLEASM , ASMCMD, ASMCA

1. ORACLEASM命令

安裝asm lib後我們可以透過man 來檢視相關命令:
[grid@rac01 tmp]$ man oracleasm

使用 ASMLib 建立 ASM Disks ,  語法如下:  
# /usr/sbin/oracleasm   createdisk   disk_name   device_partition_name    
其中 disk_name 是你為 ASM  Disk 選擇的一個名字,名字只能包含數字字母及下劃線,
比如OCR01  ,  DATA01  等.   device_partition_name  標示為 ASM 的系磁碟分割槽,如
/dev/sdb1 ,  /dev/sdc1  等  
如果你發現設定錯誤或需要 unmark這個磁碟,可以執行如下命令:  
# /usr/sbin/oracleasm    deletedisk   disk_name   

設定共享磁碟。  
# /usr/sbin/oracleasm   createdisk   OCR_VOTE01   /dev/sdb1   
# /usr/sbin/oracleasm   createdisk   ASM_DATA01   /dev/sdc1   

使用 listdisks  命令確認他們的可用性。 
[root@rac001 ~]# /usr/sbin/oracleasm listdisks
ASM_DATA01
ASM_DATA02
ASM_FRA
OCR_VOTE01

在所有其他節點上以 root 使用者身份,使用 scandisks 命令掃描已經建立的 ASM
磁碟,也就是說,我們只需要在節點 1 上建立 ASM 磁碟,其他節點不需要。  
[root@rac002 ~]# /usr/sbin/oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...
Instantiating disk "OCR_VOTE01"
Instantiating disk "ASM_DATA01"
Instantiating disk "ASM_DATA02"
Instantiating disk "ASM_FRA"

最後在其他節點透過 listdisks  檢查 ASM 磁碟的可用性。  
[root@rac002 ~]# /usr/sbin/oracleasm listdisks
ASM_DATA01
ASM_DATA02
ASM_FRA
OCR_VOTE01



2 . ASMCMD 命令

[root@rac01 ~]# su - grid
[grid@rac01 ~]$ id
uid=501(grid) gid=501(oinstall) groups=501(oinstall),504(asmadmin),506(asmdba),507(asmoper)
[grid@rac01 ~]$ asmcmd
ASMCMD>

如果 asm -p 進入的話, 就會帶路徑 (path)
[grid@rac01 ~]$ asmcmd -p
ASMCMD [+] > cd oradata
ASMCMD [+oradata] >

獲取幫助 help [command] :
ASMCMD [+oradata] > help du
du [-H] [dir]
Display total space used for files located recursively under [dir],
similar to "du -s" under UNIX; default is the current directory. Two
values are returned, both in units of megabytes. The first value does
not take into account mirroring of the diskgroup while the second does.
For instance, if a file occupies 100 MB of space, then it actually
takes up 200 MB of space on a normal redundancy diskgroup and 300 MB
of space on a high redundancy diskgroup.
[dir] can also contain wildcards.
The -H flag suppresses the column headers from the output.
ASMCMD [+oradata] >




3 . ASMCA 命令

執行ASMCA建立磁碟組。

以grid使用者登入開始ASMCA配置磁碟組,因為是圖形介面,我們使用grid使用者的
vnc session ( 如果是root的vnc進入到su 到grid會報錯 ) .

[grid@rac001 bin]$ pwd 
/u01/grid/11.2.0/bin 
[grid@rac001 bin]$ ./asmca  
 
圖形介面顯示到Disk Groups 。我們可以看到先前配置的OCR_VOTE已經在列。點選
下面的create 建立datafile及flash recovery area的ASM磁碟組。

磁碟組名稱ORADATA, 冗餘部分選擇External, 點選磁碟為ORCL:ASMDATA01,點選OK.
繼續create
磁碟組名稱ORAFLASH, 冗餘部分選擇External, 磁碟為ORCL:ASMDATA02,點選OK.
全部OK後點選QUIT退出。




4 . ASMLib 及其他常用命令

ORCL關鍵字說明:

Linux ASMLib 的發現字串
ASMLib 使用發現字串來確定 ASM 正在請求哪些磁碟。一般的 Linux ASMLib 使用
glob 字串。字串必須以 "ORCL:" 為字首。磁碟透過名稱來指定。可以透過發現字
符串 "ORCL:VOL1" 在 ASM 中,發現以名稱 "VOL1" 建立的磁碟。類似地,可以用發
現字串 "ORCL:VOL*" 來查詢所有以字串 "VOL" 開始的磁碟。

不能在發現字串中用路徑名稱來發現磁碟。如果缺少字首,那麼一般的 Linux ASMLib
將完全忽略發現字串,認為它適用於一個不同的 ASMLib。唯一的例外是空字串 (""),
它被認為是一個全萬用字元。這與發現字串 "ORCL:*" 完全等價。


其他常用命令 :

SQL>create diskgroup dg2 external redundancy disk 'ORCL:VOL3';

SQL>drop diskgroup dg2 including contents; 預設是可以刪除empty的diskgroup , 如果磁碟組
不是空的, 不接including contents 會報錯 . 指定 including contents 即刪除磁碟組中所有檔案,
即使不是為空 .

SQL>alter diskgroup dg1 add disk 'ORCL:VOL3';
Diskgroup altered.

SQL>alter diskgroup dg1 rebalance power 8 ;
Diskgroup altered.

SQL>alter diskgroup dg1 check all ; -- 檢查ASM磁碟組內部consistency
Diskgroup altered.

SQL>alter diskgroup dg1 check all repair; -- 檢查並通知ASM修復錯誤
Diskgroup altered.





5 . ASM與檔案系統之間的遷移及檔案傳輸/複製

A, 檔案傳輸或複製

10g 下ASM下的檔案和OS檔案系統是不能互相複製的 。
11g 下從ASM到檔案系統或檔案系統到ASM 都很方便 。

ASMCMD> cp spfileracdb.ora /tmp
copying +oradata/racdb/spfileracdb.ora -> /tmp/spfileracdb.ora
[root@rac01 tmp]# ls -al spfileracdb.ora
-rw-r----- 1 grid oinstall 4096 Dec 4 06:05 spfileracdb.ora

10g 下如果需要實現檔案複製有以下方式 :
具體參考 http://space.itpub.net/35489/viewspace-712638

(1). ... ro_asm_access1.html
ASM Access Through FTP and HTML Using XDB Configuration
(2). rman
(3). dbms_file_transfer




B. 利用RMAN進行遷移 .
參考 :

   

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

相關文章