轉至:https://cloud.tencent.com/developer/article/1494403
為什么要寫這么一篇基礎知識呢?還是有那么一點點原因的,不是胡編亂造還真是有真實存在的事件的,前兩周里因一套生產環境數據庫磁盤不足無法對其進行表空間擴容,需要向存儲崗申請存儲資源,當存儲崗划好資源加完存儲時,操作系統崗對其進行掃盤以及權限處理時忘記對 RAC2 節點的磁盤進行屬主的設置。
當到我們數據庫崗對其磁盤組添加磁盤時,我們的小伙伴沒有對其權限及屬主進行檢查,直接使用 alter diskgroup XXX add disk ‘XXX’添加磁盤,當然此命名是沒有任何問題的,添加成功,進行重新平衡。便興高采烈的下班了,但隨后而來的悲劇便上演了,由於節點2權限不對新添加的磁盤 ASM 實例無法訪問,導致數據庫宕機。使其業務系統不能正常訪問導致事故發生。
添加磁盤組磁盤,應使用類似如下的操作命令,可誰想盡沒有檢查權限導致悲劇發生。所以本次才對 ASM 磁盤組的基礎操作命令做了一個整理及簡化操作,希望對正在閱讀中的你有所幫助。
ASM:Automatic Storage Management(自動存儲管理)。 ASM 是 Oracle 內置的邏輯卷管理器,它進一步簡化了數據庫管理工作,是 Oracle 牆裂推薦使用的存儲管理機制。先說一嘴 OMF,Oracle 11g 的一個新的特點就是文件和存儲的自動管理,簡稱為 OMF,這么說吧,就是在 11g 單實例的數據庫你創建一個數據文件需要寫全路徑,而在 ASM 里可以簡寫,不需要全部寫完,例如:這么寫:
而不用
注意:'+DATA' 前面的+號不能丟, ASM 文件名字的格式是固定的:+group/dbname/file type/tag.file.incarnation
但這個功能需要以下初始化參數指定:
這里就不在細說了,今天主要說的是 ASM 磁盤組命令行的相關操作。
ASM 命令行工具 ASMCMD
當安裝完 grid 的時候,可使用命令行 asmca 來創建磁盤組,如下圖:
那也可以使用圖形化來管理磁盤組了,不過出現這個圖形化不是很方便,各種申請,故放棄,對於 DBA 來說,使用命令行是很方便的,那么就從 ASM 實例說起吧。
一、ASM 實例的啟動與關閉
ASMCMD 工具是一個強大的管理工具,可以對實例、磁盤組、文件進行管理。可以有交互式和非交互式的兩種方式,非交互式的直接就是 asmcmd 加一條 asmcmd 內部的命令,如 asmcmd lsdg;交互式的即先輸入asmcmd 進入命令提示符界面后在執行 lsdg。
啟動實例沒啥說的,和數據庫實例是一樣的,直接 startup 就行,關閉也就是 shutdown;那么 ASM 實例也是后台進程加 SGA 內存組成,除了數據庫實例所具有的進程外,還有 RBAL 和 ABRn; RBAL 這個進程也叫 Rebalancer 進程,負責規划 ASM 磁盤組的 Rebalance 活動;ABRn 是 RBAL 進程的子進程,這個進程在數量上可以有多個, n 從 1-9,這組進程負責真正完成 Reblance 活動。
ASM 隨着 SGA 的分配和后台進程的啟動而啟動,從 nomount 啟動到最終的 mount 狀態。期間,也是需要參數文件的,也是可以啟動到 nomount,如
ASM 實例用戶
在 ASM 實例創建時,默認會創建兩個特權用戶:SYS 和 ASMSNMP,類似數據庫里的 SYS 和 SYSTEM 賬號。我們可以通過命令行命令 lspwusr 查看 ASM 實例中的特權用戶,也可以通過 orapwusr 命令創建、刪除、修改特權用戶,而特權用戶的口令文件則放在 ASM 實例的口令文件中。
SYS@ ydjttest2>select USERNAME,ACCOUNT_STATUS, EXPIRY_DATE from dba_users where username in('SYS','DBSNMP'); USERNAME ACCOUNT_STATUS EXPIRY_DA ------------------------------ -------------------------------- --------- SYS OPEN 24-FEB-19 DBSNMP EXPIRED & LOCKED 13-AUG-09 [grid@JiekeXu1 ~]$ asmcmd ASMCMD> ASMCMD> lspwusr Username sysdba sysoper sysasm SYS TRUE TRUE TRUE ASMSNMP TRUE FALSE FALSE ASMCMD>
下面通過命令行創建特權用戶 jiekexu, 密碼同名具有 SYSASM 權限,也可登錄 ASM 實例,通過動態性能視圖 V$PWFILE_USERS 也可查看到特權用戶。
二、命令行修改和刪除特權用戶
三、ASMCMD 命令管理磁盤組
ASMCMD 工具命令行中的 lsdg 可以查看磁盤組的詳細信息,如狀態、冗余級別、是否正在進行重新平衡、總大小、剩余空間等。這個命令的信息則是來自動態性能視圖 V$ASM_DISKGROUP 的,如下所示:
當然,我們一般都是使用如下語句查看磁盤組使用率,發現了吧,上面的語句多簡單那!!!
set lin 1000 pagesize 999 col NAME for a15 SYS@ ydjttest1>select group_number,name,total_mb/1024 total_gb,free_mb/1024 free_gb,TYPE from v$asm_diskgroup; GROUP_NUMBER NAME TOTAL_GB FREE_GB TYPE ------------ --------------- ---------- ---------- ------ 1 DATA 9.33007813 5.52929688 NORMAL 2 FRA 7.4609375 4.484375 NORMAL 3 OCR_VOTE 2.82421875 1.91992188 NORMAL
lsdsk 命令
lsdsk 可查看磁盤組中的磁盤或者系統中可用的磁盤。這個命令也有 -k、-p、-t、--statistics 等幾個參數可以獲得不同的信息,選項 -k 可以看到總大小以及剩余大小,磁盤名以及磁盤對應操作系統路徑等。 選項 -p 可以看到磁盤組序號,磁盤狀態以及磁盤冗余度和路徑等等信息。選項 -t 則是查看磁盤創建時間以及掛載時間和路徑等信息。選項 --statistics 則是查看磁盤組中讀寫 IO 信息,包括在每個磁盤上的讀和寫的次數、所用時間和數據量以及磁盤路徑等信息。而這些信息主要來自於動態性能視圖 V$ASM_DISK 和 V$ASM_DISK_STAT。部分舉例如下圖所示。
lsdsk --candidate -p 還可以獲取 系統中的“候選磁盤”,所謂候選磁盤就是那些可以作為磁盤組中的成員,但是目前還不屬於任何磁盤組的磁盤。如果沒有則會如上圖所示一樣只顯示了表頭。
ASMCMD> lsdsk --candidate -p Group_Num Disk_Num Mount_Stat Header_Stat Mode_Stat State Path 0 1 CLOSED FORMER ONLINE NORMAL /dev/rhdisk4 0 0 CLOSED FORMER ONLINE NORMAL /dev
lsop 和 lsattr 命令
lsop 用於查看磁盤組中被打開的磁盤。可用此命令查看數據庫后台有哪些進程訪問磁盤組中的磁盤。 lsattr 命令可用於查看磁盤組的屬性信息,這些屬性是在磁盤組創建時自動指定的,而且有些屬性是可以修改的。setattr 命令可用於修改磁盤組的屬性值。
當然,通過 SQL 命令也可以修改這些參數,如下所示修改 compatible.rdbms 參數,Oracle 11g 中,asm 同時支持 10g 和 11g 數據庫。但是 asm 的版本不能低於數據庫的版本。該屬性用來指定 disk group 最小能夠兼容的數據庫實例,在修改這個參數之前,必須先確保所有的數據庫實例的 COMPATIBLE 參數大於等於該參數的值。在 Oracle 11g 數據庫中,Oracle ASM disk group 的 COMPATIBLE.RDBMS 屬性值默認是: 10.1。
SYS@ +ASM2>col value for a30 SYS@ +ASM2>col name for a30 SYS@ +ASM2>set lin 120 SYS@ +ASM2>select name,value from v$asm_attribute where group_number=1 and name like 'compatible%'; NAME VALUE ------------------------------ ------------------------------ compatible.asm 11.2.0.0.0 compatible.rdbms 11.2.0.0.0 SYS@ +ASM2>ALTER DISKGROUP DATA SET ATTRIBUTE 'compatible.rdbms' = '11.2.0.0.0'; Diskgroup altered. SYS@ +ASM2>
四、磁盤組的創建與刪除
利用 asmcmd 工具中的 mkdg 命令,可以創建 ASM 磁盤組,而磁盤組的結構是通過一個 XML 文件來指定,在這個文件中需要指定磁盤組的名稱、冗余級別、包含磁盤及相關屬性。ORACLE ASM 提供的三種冗余方式有 external、normal、high 即外部、正常、高。一般情況下三種模式需要的磁盤組:external 1塊,normal,3塊,high,5塊。
1、 外部冗余(external redundancy):表示 Oracle 不幫你管理鏡像,功能由外部存儲系統實現,比如通過 RAID 技術;有效磁盤空間是所有磁盤設備空間的大小之和。
2、 默認冗余(normal redundancy):表示 Oracle 提供 2 份鏡像來保護數據(鏡像數據一次),有效磁盤空間是所有磁盤設備大小之和的 1/2 (使用最多)。
3、 高度冗余(high redundancy):表示 Oracle 提供3份鏡像來保護數據(鏡像數據兩次),以提高性能和數據的安全,最少需要三塊磁盤(三個 failure group);有效磁盤空間是所有磁盤設備大小之和的 1/3,雖然冗余級別高了,但是硬件的代價也最高。
如下的 XML 文件:
mkdg 和 dropdg 命令
在創建磁盤組之前,首先需要在操作系統中創建一個 XML 文件,定義磁盤組的結構,然后在 ASMCMD 工具中將這個 XML 文件作為 mkdg 命令的參數,即可創建磁盤組。
通過 dropdg 命令可以刪除一個磁盤組。如磁盤組總包含文件,磁盤組是不能被直接刪除的,需要添加參數 -r 刪除,當磁盤組出現故障無法掛載時需要強制刪除,則需要添加參數 -f 強制刪除。
SQL 創建磁盤組
su - grid sqlplus / as sysasm create diskgroup data normal redunancy failgroup DA1 disk '/dev/rhdisk2','/dev/rhdisk3' failgroup DA2 disk '/dev/rhdisk4','/dev/rhdisk5';
SQL 刪除磁盤組
磁盤組的掛載與卸載
Oracle 11g RAC 一般數據文件都是存放於共享盤之上,要訪問數據文件磁盤組必須得 mount ;當 ASM 實例啟動后磁盤組自動被掛載, ASM 實例關閉后自動卸載。當在任意節點上新建的磁盤組時默認已經 mount 了,不過對於其他的節點需要手動掛載此磁盤組才行。
而在命令行下對於磁盤組的掛載需要在每個節點上進行,掛載磁盤組的命令是 mount,卸載則是 umount.
在不影響整個磁盤組的情況下,可以通過 offline 命令使其中的一個磁盤脫機,這時這個磁盤中的數據將無法訪問,此命令會立即生效,如想延后生效可通過 -t 參數指定一段時間,以小時(h)或分鍾(m)為單位使其在指定的時間段里脫機。當然相反的則是 online 重新聯機。
磁盤組重新平衡
當磁盤組中的磁盤數量發生變化時,磁盤組就會出現一次重新平衡,平衡的參數由 asm_power_limit 控制,一般默認為 1 ;最大為 11 最小為 0,共有 12 級,當為 0 時表示停止平衡,當為 11 時表示最快平衡速度,當然參數越大消耗資源越多。
在命令行下通過 rebal 對其進行重新平衡,通過 --power 來指定平衡級別,當使用 -w 參數時等待平衡完成才會返回結果,當不使用 -w 時則可以使用 lsop 來查磁盤進行的平衡操作。
當然可可以通過 SQL 語句來進行操作,不過就是有點麻煩,如下所示。
設置磁盤組重新平衡參數為 11,查看平衡時間,當 v$asm_operation 視圖無任何輸出則表示平衡完成。
su - grid sqlplus / as sysasm alter diskgroup data rebalance power 11; select * from v$asm_operation; SYS@ +ASM1>alter diskgroup data rebalance power 11; Diskgroup altered. SYS@ +ASM1>select * from v$asm_operation; GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE EST_MINUTES ERROR_CODE ------------ ----- ---- ---------- ---------- ---------- ---------- ---------- ----------- -------------------------------------------- 2 REBAL RUN 11 11 4 16 990 0 SYS@ +ASM1>select * from v$asm_operation; GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE EST_MINUTES ERROR_CODE ------------ ----- ---- ---------- ---------- ---------- ---------- ---------- ----------- -------------------------------------------- 2 REBAL WAIT 11 SYS@ +ASM1>/ no rows selected
五、磁盤組的讀寫信息
磁盤組中的數據是均衡分布在各個磁盤上的,但用戶對於數據的訪問卻不一定是均衡分布在各個磁盤上的。通過 iostat 命令可以查看磁盤組中各個磁盤 IO 情況,便可以掌握數據庫的基礎性能,也可以對數據庫調優提供依據。通過這條命令可以獲取磁盤上的讀和寫的次數、數據量、所用時間、發生錯誤次數等信息。
iostat -G data
iostat -t -G data
iostat -e -G data
iostat --io -G data
以下是幾個使用頻率較高的 SQL:
SQL 添加磁盤組磁盤
SQL 強制添加磁盤組
su - grid sqlplus / as sysasm create diskgroup ARCH external redundancy disk '/dev/asm2' force; col name for a20 set line 200 select group_number,name,state,total_mb/1024 total_gb,free_mb/1024 free_gb,type from v$asm_diskgroup;
SQL 刪除磁盤組磁盤
SQL 查看磁盤組使用率
SQL 查看磁盤組對應磁盤路徑
SQL 查看磁盤組訪問情況
su - oracle sqlplus / as sysdba select group_number,instance_name,db_name,status from v$asm_client; SYS@ ydjttest1>select group_number,instance_name,db_name,status from v$asm_client; GROUP_NUMBER INSTANCE_NAME DB_NAME STATUS ------------ ---------------------------------------------------------------- -------- ------------ 2 +ASM1 ydjt_tes CONNECTED 3 +ASM1 ydjt_tes CONNECTED SYS@ ydjttest2>select group_number,instance_name,db_name,status from v$asm_client; GROUP_NUMBER INSTANCE_NAME DB_NAME STATUS ------------ ---------------------------------------------------------------- -------- ------------ 2 +ASM2 ydjt_tes CONNECTED 3 +ASM2 ydjt_tes CONNECTED
六、磁盤組中的目錄管理
ASM 里面有一整套完整的目錄層次,此目錄由 ASM 實例或者數據庫實例自動創建。而磁盤組中的文件則是由實例自動產生,他們實際上只是一些“系統別名”,相當於操作系統中的符號鏈接文件或者快捷方式。下面是一個簡單的列舉方便查看,更多的信息可自行查看這里不做介紹,本次就到這里了,花費巨大時間希望對你有所幫助。