【ASM】自動儲存管理的新特性

楊奇龍發表於2011-11-14
內容摘要:用於管理 ASM 例項的新的 SYSASM 角色、用於降低共享池使用的可變的區大小,以及例項能夠讀取磁碟組的特定磁碟,這些都是 Oracle 資料庫 11g ASM 中引入的一些重要新特性。
轉自:
SYSASM 角色
    自動儲存管理 (ASM) 是在 Oracle 資料庫 10g 中引入的,它在某種程度上打破了 DBA 和系統管理員之間在儲存分配功能上的界限。ASM 例項由 DBA 管理,正如常規的 DBA 工作需要以 SYSDBA 角色進行連線一樣。但是隨著時間的推移,角色變得更加清楚,我們看到發生了基本的分工。因此,一些 ASM 操作返還給系統管理員。在某些情況下,會出現單獨的一類“ASM 管理員”,他們只進行 ASM 管理,並不涉及資料庫管理。
    然而,這個新角色的出現引發了一個衝突:需要用 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>
注意連線子句“as sysasm”。在 Oracle 資料庫 11g 第 1 版中,該 SYSASM 角色     被授予具有 SYSDBA 許可權的作業系統組(大多數情況下為“dba”)。換言之,Unix 中屬於 dba 組的使用者也可以作為 SYSASM 進行連線。(今後的版本會更改這種安排;sysdba 和 sysasm 角色將分成不同的 OS 組。)
以 sys 使用者身份連線到 ASM 例項後,您可以更新在口令檔案中更新的 SYS 口令:
SQL> alter user sys identified by oracle
 2 /
User altered.
儘管這個 ASM 例項不帶資料庫,您仍然可以建立使用者:
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 f=/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';

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

相關文章