【oracle 12c asm专题】flex diskgroup相关概念
沃趣科技 周天鹏(译)
在上一部分中,我讲了一些基础知识和人们使用ASM Flex Diskgroup一般想达到的目的。这一部分我将介绍一些Flex Diskgroup的相关新概念。
### Flex ASM Diskgroup相关新概念
当Flex Diskgroup挂载之后,下一步就是创建一些新的实体(这里的实体指文件组和配额组等)了。首先,需要创建配额组(quota group),顾名思义,配额组可以给组内的实体设定配额(存储空间上限)。你可以选择自己根据自己的需求创建一个配额组,当然也可以不创建,因为Oracle会默认为你创建一个没有存储上限的默认配额组。稍后你将看到,默认配额组将被分配给这个Flex Diskgroup中所有新建的数据库。
配额组内部还存在文件组,服务于逻辑上的一组文件(例如属于同一个数据库的一组文件)。看下这篇官方文档(https://docs.oracle.com/database/122/SQLRF/ALTER-DISKGROUP.htm#GUID-22D73AB6-7063-4627-A2ED-18D521ED2557__ADD_FILEGROUP_CLAUSE-5AD3A8CA)
,就可以知道文件组可以创建给:
* 一个数据库(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](https://docs.oracle.com/database/122/OSTMG/img/GUID-8CE85484-CFEA-463B-8BA4-908BCE94AC03-default.png)
正文到此结束