【oracle 12c asm專題】flex diskgroup相關概念

沃趣科技發表於2017-08-16
沃趣科技   周天鵬(譯


 在上一部分中,我講了一些基礎知識和人們使用ASM Flex Diskgroup一般想達到的目的。這一部分我將介紹一些Flex Diskgroup的相關新概念。

### Flex ASM Diskgroup相關新概念
當Flex Diskgroup掛載之後,下一步就是建立一些新的實體(這裡的實體指檔案組和配額組等)了。首先,需要建立配額組(quota group),顧名思義,配額組可以給組內的實體設定配額(儲存空間上限)。你可以選擇自己根據自己的需求建立一個配額組,當然也可以不建立,因為Oracle會預設為你建立一個沒有儲存上限的預設配額組。稍後你將看到,預設配額組將被分配給這個Flex Diskgroup中所有新建的資料庫。


配額組內部還存在檔案組,服務於邏輯上的一組檔案(例如屬於同一個資料庫的一組檔案)。看下這篇官方文件()
,就可以知道檔案組可以建立給:
* 一個資料庫(non-cdb, cdb, pdb)
* 一個叢集
* 一個ASM Volume

記住,Flex Diskgroup的引數compatible.rdbms和compatible.asm必須設定為12.2.0.1及以上來排除12c之前版本的資料庫。這篇文章中,我打算把所有資料庫相關的檔案存在檔案組中。而且因為我比較喜歡CDB,所以我決定使用這種型別的資料庫。


### 資料庫建立
我打算用dbca靜默方式在我的Flex Diskgroup上建一個庫 。但是在這之前,我需要先連上我的ASM例項建立個配額組,命令如下:
```
SQL> alter diskgroup flex add quotagroup QG_CDB set quota = 20g;

Diskgroup altered.

SQL> select QUOTAGROUP_NUMBER,NAME,USED_QUOTA_MB,QUOTA_LIMIT_MB from v$asm_quotagroup;

QUOTAGROUP_NUMBER NAME                           USED_QUOTA_MB QUOTA_LIMIT_MB
----------------- ------------------------------ ------------- --------------
                1 GENERIC                                    0              0
                3 QG_CDB                                     0          20480
SQL> 
```
在建立Flex Diskgroup的時候oracle會預設建立一個無儲存容量上限的預設配額組。QG_CDB是我建立的配額組。事後回想了以下,我並不認為現在這個階段需要建立配額組,因為他不會立即被用到。但我當時並不知道。。。。。。


這是後面我用dbca靜默建立雙節點資料庫的命令:
```
[oracle@rac122pri1 ~]$ dbca -silent -createDatabase -templateName martin_cdb12cr2_001.dbc \
> -gdbName CDB -sysPassword secretpwd1 -systemPassword secretpwd2 -storageType ASM \
> -diskGroupName FLEX -recoveryGroupName FLEX -sampleSchema true \
> -totalMemory 2048 -dbsnmpPassword secretpwd3 -nodeinfo rac122pri1,rac122pri2 \
> -createAsContainerDatabase true -databaseConfigType RAC
```
或許我還需要建立flexreco給我做fast recovery area用, 但這是實驗環境,我不想浪費額外的空間。如果你的實驗環境空間很充裕,就可以按照你自己的思路做,我的文章並不是指導方針,這只是我對這種新技術的嚐鮮。 :-)

dbca命令執行完成需要一定的時間。在這期間,我發現資料庫好像會自動給cdb的元件建立預設的檔案組,並且對映到預設的配額組。查詢asm例項 我得到如下結果
```
SQL> select FILEGROUP_NUMBER, NAME, CLIENT_NAME, USED_QUOTA_MB, QUOTAGROUP_NUMBER from v$asm_filegroup
  2  /

FILEGROUP_NUMBER NAME                 CLIENT_NAME          USED_QUOTA_MB QUOTAGROUP_NUMBER
---------------- -------------------- -------------------- ------------- -----------------
               0 DEFAULT_FILEGROUP                                     0                 1
               1 CDB_CDB$ROOT         CDB_CDB$ROOT                  6704                 1
               2 CDB_PDB$SEED         CDB_PDB$SEED                  1656                 1
```
就像預設配額組一樣,這也是一個預設建立的實體,叫做default filegroup。CDB_CDB$ROOT和CDB_PDB$SEED看來是給新建的資料庫用的。如果你之前接觸過cdb/pdb你應該很熟悉這些名詞。

oracle自動給新建的資料庫建立預設檔案組的功能還是挺不錯的,因為這可以省掉我的部分工作。為了驗證這一點,再新建一個pdb測試下。我在我的cdb中新建了個pdb叫pdb1。這下可以確定了,create pdb命令完成後,這裡有了一個新的檔案組:
```
SQL> select FILEGROUP_NUMBER, NAME, CLIENT_NAME from v$asm_filegroup;

FILEGROUP_NUMBER NAME                 CLIENT_NAME
---------------- -------------------- --------------------
               0 DEFAULT_FILEGROUP
               1 CDB_CDB$ROOT         CDB_CDB$ROOT
               2 CDB_PDB$SEED         CDB_PDB$SEED
               3 PDB1                 PDB1
```
這個輸出結果讓我想到了一個問題,這些NAME和CLIENT_NAME看起來無法建立我的CDB和PDB1之間的關係呀。雖然從技術角度看好像沒這個必要,但是,我如果有兩個PDB(在不同的CDB裡)都叫做PDB1怎麼辦呢?CDB1裡的PDB1可能很重要,CDB2裡的PDB1可能只是個測試庫。一種辦法是給這些PDB命名時人工的把CDB名作為字首或字尾加入名字中(例如,CDB1裡的PDB1叫做CDB1_PDB1,CDB2裡的PDB1叫CDB2_PDB1)。但是我相信絕大部分人不願意這麼多,因為如果你把CDB1_PDB1拔下來再插入到CDB2中,看起來就很矬了。。。。。。

### 插曲
你是不是也很想知道如果其他CDB中也有一個PDB叫做PDB1,v$asm_filegroup中的資訊會是什麼樣?反正我是很想知道。微調了下我的dbca建立命令,我又建立了一個CDB叫做ORCL。然後我在ORCL裡建立了一個叫PDB1的PDB,輸出結果如下:
```
SQL> select filegroup_number, name, client_name, guid from v$asm_filegroup;

FILEGROUP_NUMBER NAME                 CLIENT_NAME          GUID
---------------- -------------------- -------------------- --------------------------------
               0 DEFAULT_FILEGROUP
               1 CDB_CDB$ROOT         CDB_CDB$ROOT         4700A987085A3DFAE05387E5E50A8C7B
               2 CDB_PDB$SEED         CDB_PDB$SEED         536DF51E8E28221BE0534764A8C0FD81
               3 PDB1                 PDB1                 537B677EF8DA0F1AE0534764A8C05729
               4 ORCL_CDB$ROOT        ORCL_CDB$ROOT        4700A987085A3DFAE05387E5E50A8C7B
               5 ORCL_PDB$SEED        ORCL_PDB$SEED        537E63B952183748E0534764A8C09A7F
               6 PDB1_0001            PDB1                 537EB5B87E62586EE0534764A8C05530

7 rows selected.
```
很贊,建立pdb的命令並沒有報錯。新庫的CDB$ROOT和PDB$SEED的預設檔案組名稱本身就不應該有衝突,因為前面有資料庫名作為字首。而且CDB.PDB1和ORCL.PDB1也沒有衝突,因為Oracle預設給檔案組名後面加了一串數字。

但壞訊息是,檔案組名稱變得有點模稜兩可了。但是,後來我發現可以用GUID來作為唯一識別符號。
```
SQL> select sys_context('USERENV','CDB_NAME') cdb_name, guid 
  2  from v$pdbs where guid = '537EB5B87E62586EE0534764A8C05530';

CDB_NAME                       GUID
------------------------------ --------------------------------
ORCL                           537EB5B87E62586EE0534764A8C05530
```
看起來是時候研究研究GUID了,後面的更新應該很快會講。 :-)

### 配額
正如你前面看到的例子,建立配額組並不是必須的。但為了完整性,我需要建立一個。

很多檔案組和配額組相關的管理命令都可以透過asmcmd實現,如下所示:
```
ASMCMD> lsqg
Group_Num  Quotagroup_Num  Quotagroup_Name  Incarnation  Used_Quota_MB  Quota_Limit_MB  
5          1               GENERIC          1            10016          0               
5          3               QG_CDB           1            0              20480           

ASMCMD> lsfg
File Group         Disk Group  Quota Group  Used Quota MB  Client Name   Client Type  
DEFAULT_FILEGROUP  FLEX        GENERIC      0                                         
CDB_CDB$ROOT       FLEX        GENERIC      6704           CDB_CDB$ROOT  DATABASE     
CDB_PDB$SEED       FLEX        GENERIC      1656           CDB_PDB$SEED  DATABASE     
PDB1               FLEX        GENERIC      1656           PDB1          DATABASE     

ASMCMD> help mvfg
mvfg
        Moves a file group in a disk group to the specified Quota Group.

Synopsis
        mvfg -G  --filegroup  

Description
        The options for the mvfg command are described below.

        -G diskgroup     - Disk group name.
        --filegroup      - File group name.

Examples
        The following is an example of the mvfg command. The file group
        FG1 in the DATA disk group is moved to the Quota Group QG1.

        ASMCMD [+] > mvfg -G DATA --filegroup FG1 QG1

See Also
       mkqg rmqg chqg lsqg

ASMCMD> 
```
前兩個命令一看就明白了,lsqg就是list quota group的縮寫,lsfg也是一樣。mvfg雖然要帶個引數,但看起來也很直觀。現在我需要用mvfg來移動我的檔案組到我自定義的配額組中。
```
ASMCMD> mvfg -G flex --filegroup CDB_CDB$ROOT QG_CDB
Diskgroup altered.
ASMCMD> mvfg -G flex --filegroup CDB_PDB$SEED QG_CDB
Diskgroup altered.
ASMCMD> mvfg -G flex --filegroup PDB1 QG_CDB
Diskgroup altered.
ASMCMD> lsfg
File Group         Disk Group  Quota Group  Used Quota MB  Client Name   Client Type  
DEFAULT_FILEGROUP  FLEX        GENERIC      0                                         
CDB_CDB$ROOT       FLEX        QG_CDB       6704           CDB_CDB$ROOT  DATABASE     
CDB_PDB$SEED       FLEX        QG_CDB       1656           CDB_PDB$SEED  DATABASE     
PDB1               FLEX        QG_CDB       1656           PDB1          DATABASE     

ASMCMD> lsqg
Group_Num  Quotagroup_Num  Quotagroup_Name  Incarnation  Used_Quota_MB  Quota_Limit_MB  
5          1               GENERIC          1            0              0               
5          3               QG_CDB           1            10016          20480           
ASMCMD> 
```
命令完成的飛快,所以,這並不是真正的移動資料,僅僅是更新下後設資料的資訊。mvfg的命令會被翻譯成sql,ASM例項的警告日誌中可以看到如下資訊:
```
2017-07-04 11:01:53.492000 +01:00
SQL> /* ASMCMD */ALTER DISKGROUP FLEX MOVE FILEGROUP CDB_CDB$ROOT TO QG_CDB
SUCCESS: /* ASMCMD */ALTER DISKGROUP FLEX MOVE FILEGROUP CDB_CDB$ROOT TO QG_CDB
2017-07-04 11:02:08.645000 +01:00
SQL> /* ASMCMD */ALTER DISKGROUP FLEX MOVE FILEGROUP CDB_PDB$SEED TO QG_CDB
SUCCESS: /* ASMCMD */ALTER DISKGROUP FLEX MOVE FILEGROUP CDB_PDB$SEED TO QG_CDB
SQL> /* ASMCMD */ALTER DISKGROUP FLEX MOVE FILEGROUP PDB1 TO QG_CDB
SUCCESS: /* ASMCMD */ALTER DISKGROUP FLEX MOVE FILEGROUP PDB1 TO QG_CDB
```
### 小結
該部分講述了配額組和檔案組的相關概念與操作。理解這些概念對於理解Flex Diskgroup是很有必要的。下一部分我會研究下 改變檔案組的屬性會有什麼影響 和 配額組的儲存空間配額是不是強制的,還是超一點也沒關係。

**最後譯者附一張官方文件中的圖有助於大家更好的理解檔案組和配額組**
![image]()

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

相關文章