【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 ROOTCDBPDB 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 ROOTPDB 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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值