SYSASM 角色 ios
自動存儲管理 (ASM) 是在 Oracle 數據庫 10g 中引入的,它在某種程度上打破了 DBA 和系統管理員之間在存儲分配功能上的界限。ASM 實例由 DBA 管理,正如常規的 DBA 工做須要以 SYSDBA 角色進行鏈接同樣。可是隨着時間的推移,角色變得更加清楚,咱們看到發生了基本的分工。所以,一些 ASM 操做返還給系統管理員。在某些狀況下,會出現單獨的一類「ASM 管理員」,他們只進行 ASM 管理,並不涉及數據庫管理。 sql
然而,這個新角色的出現引起了一個衝突:須要用 SYSDBA 角色來管理 ASM 實例,但運行在同一臺服務器上的生產數據庫的許多 DBA 感受很難共享該角色。 數據庫
Oracle 數據庫 11g 消除了這個衝突。有一個新角色 SYSASM,只用於管理 ASM 實例。這相似於針對 ASM 實例的 SYSDBA 角色。下面將演示如何鏈接到 ASM 實例: 服務器
$ sqlplus / as sysasm
SQL*Plus: Release 11.1.0.6.0 - Production on Fri Sep 28 20:37:39 2007
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining
and Real Application Testing options
SQL> oracle
注意鏈接子句「as sysasm」。在 Oracle 數據庫 11g 第 1 版中,該 SYSASM 角色被授予具備 SYSDBA 權限的操做系統組(大多數狀況下爲「dba」)。換言之,Unix 中屬於 dba 組的用戶也能夠做爲 SYSASM 進行鏈接。(從此的版本會更改這種安排;sysdba 和 sysasm 角色將分紅不一樣的 OS 組。) ide
以 sys 用戶身份鏈接到 ASM 實例後,您能夠更新在口令文件中更新的 SYS 口令: 函數
SQL> alter user sys identified by oracle
2 /
User altered. 性能
儘管這個 ASM 實例不帶數據庫,您仍然能夠建立用戶: spa
SQL> create user asmoper identified by dumboper
2 /
User created. 操作系統
如今,您能夠將 SYSASM 角色授予該用戶:
SQL> grant sysasm to asmoper;
Grant succeeded.
進行受權以後,asmoper 用戶(而非 SYS 用戶)能夠執行全部 ASM 管理功能。該用戶能夠經過子句 as sysasm 進行鏈接,該子句相似於常規數據庫中的「as sysdba」子句。
$ sqlplus asmoper/dumboper as sysasm
這個特性實現了迫切須要的 ASM 和 DBA 職權分離。
可變的區大小
ASM 存儲中結構最小的元素是分配單元 (AU),與 Oracle 數據庫塊的概念相似。建立表和索引之類的數據庫段時,分配的最小單元不是一個塊,而是一個包含多個塊的區。您能夠更改段的區大小。
ASM 中有一個很是相似的概念:在 ASM 磁盤組上建立文件時,最小的可尋址單元是區,而不是 AU.在 Oracle 數據庫 10g 中,AU 和區是可互換的;一個區只包含一個 AU.
10g 兼容的磁盤組須要共享池爲每一個區提供內存。對於大型數據庫,這又須要大量內存。所以,若是 AU 大小爲 1MB(默認值),1TB 的數據庫須要在共享池中管理超過一百萬個區。
在 Oracle 數據庫 11g 中,區大小再也不等於 AU 大小。建立文件時,區大小從 1MB 開始。文件達到某個閾值時,區大小增長至 4MB,而後是 16MB,最後當達到某個閾值後,區大小爲 64MB.您沒必要擔憂大小;ASM 實例會自動分配合適的區大小。因爲較少數量的區便可容納大量數據,所以能夠大大減小共享池中的區總數,從而將性能提升數倍。
當文件急劇擴大和縮小時,可變的區大小可能會產生一些碎片。若是須要進行碎片整理,ASM 將自動解決該問題。
可變的 AU 大小
正如我在前面提到的,AU 的默認大小爲 1MB.對許多數據庫而言,這可能足夠大了,但請考慮一個大小超過 10TB 的大型數據庫。對象可能超過 1MB,所以您可能但願擴大 AU 大小以減小 AU 數量。在 Oracle 數據庫 10g 中,您能夠設置一個底線參數來更改 AU 大小。然而,這會影響這以後建立的全部磁盤組,並且還須要一個 ASM 實例週期來設置該參數。
在 Oracle 數據庫 11g 中,只需在建立 DG 期間設置一個磁盤組屬性 au_size 便可輕鬆完成此任務,以下所示:
create diskgroup dg6
external redundancy
disk
'/dev/raw/raw13'
attribute 'au_size' = '2M'
AU_SIZE 應爲 1M、2M、4M、8M、16M、32M 或 64M(M 表明 MB)。您還能夠將該值設成一個絕對值(單位爲字節):
attribute 'au_size' = ' 2097152'
建立磁盤組以後,您能夠經過如下查詢來查看 AU 大小:
select name, allocation_unit_size
from v$asm_diskgroup
/
NAME ALLOCATION_UNIT_SIZE
------- --------------------
DG1 1048576
DG3 1048576
DG6 2097152
DG5 1048576
DG4 1048576
DG2 1048576
注意各個磁盤組名稱的 AU 大小。如今,您能夠建立具備合適 AU 大小的磁盤組,以知足每一個應用程序的須要。
磁盤組屬性
ASM 是一個適用於從 10g 到當前版本的 Oracle 數據庫的存儲平臺。所以,11g 上的 ASM 實例能夠保存 10g 第 1 版、10g 第 2 版以及 11g 第 1 版(以及更高版本)的數據庫。只要 ASM 版本與 RDBMS 的版本相同或者更高,就能夠在該 ASM 實例上建立數據庫。若是 ASM 和 RDBMS 實例的版本不一樣,它們將如何通訊呢?很簡單:ASM 將消息轉換成適合 RDBMS 的版本。
默認狀況下,ASM 實例能夠支持 10g 數據庫。但若是您但願在該 ASM 實例上僅放置 11g RDBMS,該怎麼辦?無需進行消息轉換來支持版本差別。但若是能夠告訴 ASM 實例惟一支持的數據庫是 11g 第 1 版,該怎麼辦?這將消除,至少能夠減小消息轉換。在 Oracle 數據庫 11g 中,可使用 ASM 兼容性和 RDBMS 兼容性磁盤組屬性實現。
首先,咱們將檢查磁盤組的當前屬性:
SQL> select compatibility, database_compatibility
2 from v$asm_diskgroup
3 where name = 'DG1'
4 /
COMPATIBILITY DATABASE_COMPATIBILITY
---------------------- ----------------------
10.1.0.0.0 10.1.0.0.0
如您所見,ASM 兼容性(由 COMPATIBILITY 顯示)設置爲 10.1.0.0.0,這意味着該磁盤組最高可支持 10.1 ASM 結構。所以,該磁盤組能夠具備任意 RDBMS 結構。另外一列 DATABASE_COMPATIBILITY 顯示 RDBMS 兼容性設置爲 10.1.這意味着,ASM 磁盤組 DG1 可用於 10.1 版的任何 RDBMS.
因爲您只但願建立 11g ASM 和 RDBMS 結構,所以無需擁有 10g 元素。要將該磁盤組的 ASM 兼容性屬性設置爲 11.1,您能夠執行如下語句(在 ASM 實例中):
SQL> alter diskgroup dg1 set attribute 'compatible.asm'='11.1';
如今,若是您檢查磁盤組的屬性:
COMPATIBILITY DATABASE_COMPATIBILITY
---------------------- ----------------------
11.1.0.0.0 10.1.0.0.0
ASM 兼容性設置爲 11.1;但 RDBMS 兼容性仍然設置爲 10.1.要將它也更改成 11.1,請使用:
SQL> alter diskgroup dg1 set attribute 'compatible.rdbms'='11.1';
須要特別注意的是:兼容性是針對磁盤組設置的,而不是針對整個 ASM 實例。使用該特性,您只需使用一個 ASM 實例便可知足全部數據庫版本類型的須要。根據所使用的版本,您能夠相應地設置屬性,從而減小版本間通訊。
首選的鏡像讀取
在 Oracle RAC 數據庫中,多個節點可能指向同一個 ASM 實例。若是您在一個 ASM 磁盤組中使用正常鏡像,訪問磁盤的行爲可能並不像您預想的那樣。
假設您有一個名爲 DG2 的磁盤組,它包含兩個 failgroup(DG2_0000 和 DG2_0001),每一個具備一個單獨的磁盤,以下圖所示:
向磁盤組 DG2 寫入某些內容時,會以循環方式寫入區中:第一個進入 DG2_0000,副本進入 DG2_0001,第二個進入 DG2_0001,副本在 DG2_0000 上,第三個進入 DG2_0000,副本在 DG2_0001 上,依此類推。ASM 以這種方式在一個磁盤上維護另外一個磁盤的備份。
可是在讀取這些區時,始終從主 failgroup(在本例中爲 DG2_0000)中讀取,而不是從輔助 failgroup (DG2_0001) 中讀取。僅當主 failgroup 不可用時纔讀取輔助 failgroup.
這在大多數狀況下能夠正常工做,但有時可能不是所但願的。在 Oracle 數據庫 11g 中,您能夠將一個節點配置爲從特定 failgroup 中讀取。例如,在上面的示例中,若是您但願將實例 1 配置爲從 failgroup DG2_0000 中讀取,將實例 2 配置爲從 DG2_0001 中讀取,您能夠設置這些磁盤組的首選讀取組。在實例 1 中執行的如下命令致使磁盤組 DG2 和 DG3 中的 failgroup DG2_0000 和 DG3_0000 分別是實例 1 上的首選磁盤:
SQL> alter system set asm_preferred_read_failure_groups = 'DG2.DG2_0000','DG3.DG3_0000'
一樣,在另外一個實例上,您能夠執行如下命令使其餘 failgroup 成爲首選磁盤:
SQL> alter system set asm_preferred_read_failure_groups = 'DG2.DG2_0001','DG3.DG3_0001'
執行這些語句後,當來自實例 1 的某個會話但願從磁盤組 DG2 中讀取時,將讀取磁盤 DG2_0000.若是該磁盤不可用,則讀取另外一個磁盤 DG2_0001.一樣,當某個鏈接到實例 2 的會話讀取數據時,將讀取磁盤 DG2_0001.
若是您要檢查磁盤組中不一樣磁盤的使用狀況,能夠參考一個新的字典視圖 V$ASM_DISK_IOSTAT,它模擬了 UNIX 系統中的 IOSTAT 實用程序:
select
instname,
dbname,
group_number,
failgroup,
disk_number,
reads,
writes
from v$asm_disk_iostat
order by 1,2,3,4,5,6
/
示例輸出以下:
INSTNAM DBNAME GROUP_NUMBER FAILGROUP DISK_NUMBER READS WRITES
------- -------- ------------ ---------- ----------- ---------- ----------
PRONE31 PRONE3 2 DG2_0000 0 4450 910
PRONE32 PRONE3 2 DG2_0001 1 2256 910
PRONE31 PRONE3 3 DG3_0000 0 300 29
PRONE32 PRONE3 3 DG3_0001 1 560 29
該輸出顯示了實例 PRONE31 和 PRONE32 的首選 failgroup 分別爲 DG2_0000 和 DG2_0001.注意 WRITES 列;它們在 910 處相同。這是由於統一寫入到兩個磁盤中。如今,注意 READS 列。針對實例 PRONE31 和 PRONE32 分別爲 4450 和 2256.爲何?由於實例 PRONE3 發出屢次讀取命令,這些讀取均來自於其首選 failgroup DG2_0000.對於磁盤組 DG3,實例 PRONE32 發出屢次來自於其首選 failgroup (DG3_0001) 的讀取命令,所以該磁盤顯示更多讀取。
首選讀取在「拉伸」集羣(節點之間地理距離較遠的集羣)中尤其有用。首選讀取經過將讀取隔離到特定磁盤,加快了讀取速度。
Drop Diskgroup Force
當一個磁盤再也不可用時(損壞到沒法修復的程度)會發生什麼?您但願徹底刪除該磁盤組而後從新建立,或者將該磁盤組的磁盤添加到其餘磁盤組。該磁盤組還沒有掛載。因爲其中一個磁盤缺乏,您甚至沒法掛載它。要刪除該磁盤組,您必須掛載它,但因爲缺乏磁盤,您沒法進行掛載 — 絕對是一個「沒法擺脫的困境」。您應該作些什麼?
在 Oracle 數據庫 10g 中,您可使用一種變通方法 — 使用 dd 命令擦除磁盤表頭:
$ dd if=/dev/zero of=/dev/raw/raw13 bs=1024 count=4
這將在磁盤 /dev/raw/raw13 的表頭中放入零,擦除全部信息。若是該方法生效,它將徹底擦除磁盤表頭的信息,並刪除用做磁盤組一部分的磁盤。
在 Oracle 數據庫 11g 中,您沒必要求助於該變通方法。您只需執行帶 force 選項的 drop 命令:
SQL> drop diskgroup dg7 force including contents;
使用該命令,即便沒有掛載磁盤,也能夠刪除磁盤組。可用的磁盤顯示爲 FORMER;即,它們用做某個磁盤組的一部分。(注:您必須使用「including contents」子句。)
元數據備份和恢復
許多人將 ASM 看做一個具備本身的存儲的數據庫。事實並不是如此,ASM 並不存儲數據,而是由數據庫進行存儲。但 ASM 實例須要維護磁盤組名稱、其中的磁盤、目錄等元數據。這些元數據存儲在磁盤表頭中。
假設全部磁盤都損壞且表頭信息消失,您該怎麼辦?固然,您已經使用 RMAN 對數據庫進行了備份,所以能夠恢復。但您只有在建立了全部磁盤組和目錄後才能進行恢復。但願您保留了全部記錄。(對嗎?)即便您進行了備份,這個過程也須要時間。
若是您進行了備份,該怎麼辦呢?在 Oracle 數據庫 11g 中,您可使用 md_backup 命令經過 ASM 命令行選項 (ASMCMD) 備份 ASM 實例的元數據。
$ asmcmd -p
ASMCMD [+] > md_backup
該命令將建立一個名爲 ambr_backup_intermediate_file 的文件。如下是該文件從頂部開始的一部分:
@diskgroup_set = (
{
'DISKSINFO' => {
'DG1_0000' => {
'DG1_0000' => {
'TOTAL_MB' => '103',
'FAILGROUP' => 'DG1_0000',
'NAME' => 'DG1_0000',
'DGNAME' => 'DG1',
'PATH' => '/dev/raw/raw5'
}
}
},
'DGINFO' => {
'DGTORESTORE' => 0,
'DGCOMPAT' => '10.1.0.0.0',
'DGNAME' => 'DG1',
'DGDBCOMPAT' => '10.1.0.0.0',
'DGTYPE' => 'EXTERN',
'DGAUSZ' => '1048576'
},
'ALIASINFO' => {},
'TEMPLATEINFO' => {
'6' => {
'DGNAME' => 'DG1',
'STRIPE' => 'COARSE',
'TEMPNAME' => 'ASM_STALE',
'REDUNDANCY' => 'UNPROT',
'SYSTEM' => 'Y'
... and more ...
爲了節省空間,此處沒有顯示整個文件。它記錄了全部磁盤組、磁盤、目錄、磁盤屬性,等等。默認狀況下,該文件會記錄全部磁盤組。若是您但願僅備份特定磁盤組,可使用 -g 選項。此外,您還可使用 -b 選項建立特定的命名文件。
ASMCMD [+] > md_backup -g dg1 -b prolin3_asm.backup
這會將磁盤組 DG1 的元數據備份到一個名爲 prolin3_asm.backup 的文件,而不是默認的 ambr_backup_intermediate_file.該文件必須是新建的,若是在生成前該文件已存在,您必須刪除它。
如今,讓咱們看看恢復操做是如何工做的。恢復有不一樣的類型。最簡單的用法是恢復一個之前刪除的磁盤組及其目錄。首選,在磁盤組上建立一個目錄:
ASMCMD [+] > cd DG7
ASMCMD [+DG7] > mkdir TEST
ASMCMD [+DG7] > ls
TEST/
該磁盤組有一個名爲 TEST 的目錄。如今,備份該磁盤組:
ASMCMD [+] > md_backup -g dg7 -b g7.backup
備份以後,假設您刪除該磁盤組來模擬一次意外刪除:
SQL> drop diskgroup dg7;
Diskgroup dropped.
如今,磁盤組 DG7 已從 ASM 實例刪除,您但願使用之前的備份恢復它。可使用 md_restore 命令恢復它:
$ asmcmd md_restore -b dg7.backup -t full
Current Diskgroup being restored: DG7
Diskgroup DG7 created!
System template TEMPFILE modified!
System template FLASHBACK modified!
System template ARCHIVELOG modified!
System template BACKUPSET modified!
System template XTRANSPORT modified!
System template DATAGUARDCONFIG modified!
System template CONTROLFILE modified!
System template AUTOBACKUP modified!
System template DUMPSET modified!
System template ONLINELOG modified!
System template PARAMETERFILE modified!
System template ASM_STALE modified!
System template CHANGETRACKING modified!
System template DATAFILE modified!
Directory +DG7/TEST re-created!
看看輸出;它建立了該磁盤組以及模板和目錄。若是之前有任何數據,固然,這些數據將丟失。md_backup 不是數據的備份,而是 ASM 實例元數據的備份。表面上,數據是由 RMAN 備份的。建立磁盤組和全部目錄以後,您能夠將 RMAN 備份恢復到該磁盤組。
另外一個選項 -f 使您能夠將命令放在一個腳本文件中,而不是執行這些命令:
ASMCMD [+] > md_restore -b dg7.backup -t full -f cr_dg7.sql
它會建立一個名爲 cr_dg7.sql 的 SQL 腳本,該腳本用於建立磁盤組以及全部其餘對象。您能夠在 ASM 實例中手動運行該腳本。該文件以下所示:
create diskgroup DG7 EXTERNAL redundancy disk '/dev/raw/raw14' name DG7_0000 size 100M ; alter diskgroup /*ASMCMD AMBR*/DG7 alter template TEMPFILE attributes (UNPROTECTED COARSE); alter diskgroup /*ASMCMD AMBR*/DG7 alter template FLASHBACK attributes (UNPROTECTED FINE); alter diskgroup /*ASMCMD AMBR*/DG7 alter template ARCHIVELOG attributes (UNPROTECTED COARSE); alter diskgroup /*ASMCMD AMBR*/DG7 alter template BACKUPSET attributes (UNPROTECTED COARSE); alter diskgroup /*ASMCMD AMBR*/DG7 alter template XTRANSPORT attributes (UNPROTECTED COARSE); alter diskgroup /*ASMCMD AMBR*/DG7 alter template DATAGUARDCONFIG attributes (UNPROTECTED COARSE); alter diskgroup /*ASMCMD AMBR*/DG7 alter template CONTROLFILE attributes (UNPROTECTED FINE); alter diskgroup /*ASMCMD AMBR*/DG7 alter template AUTOBACKUP attributes (UNPROTECTED COARSE); alter diskgroup /*ASMCMD AMBR*/DG7 alter template DUMPSET attributes (UNPROTECTED COARSE); alter diskgroup /*ASMCMD AMBR*/DG7 alter template ONLINELOG attributes (UNPROTECTED FINE); alter diskgroup /*ASMCMD AMBR*/DG7 alter template PARAMETERFILE attributes (UNPROTECTED COARSE); alter diskgroup /*ASMCMD AMBR*/DG7 alter template ASM_STALE attributes (UNPROTECTED COARSE); alter diskgroup /*ASMCMD AMBR*/DG7 alter template CHANGETRACKING attributes (UNPROTECTED COARSE); alter diskgroup /*ASMCMD AMBR*/DG7 alter template DATAFILE attributes (UNPROTECTED COARSE); alter diskgroup /*ASMCMD AMBR */ DG7 add directory '+DG7/TEST';