在上一部分中,我讲了一些基础知识和人们使用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
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
但坏消息是,文件组名称变得有点模棱两可了。但是,后来我发现可以用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是很有必要的。下一部分我会研究下 改变文件组的属性会有什么影响 和 配额组的存储空间配额是不是强制的,还是超一点也没关系。
最后附一张官方文档中的图有助于大家更好的理解文件组和配额组