Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

时间:2022-06-28 05:26:20

在12cR2版本中,我们可以在一个ASM Diskgroup提供不同的冗余级别和配额给不同的数据库使用。提到Quota会让人立即想到创建用户在表空间上的配额限制,其实有点类似。

Flex磁盘组中文件的冗余是灵活的,并允许在数据库级别进行存储管理。你可以以数据库为粒度在磁盘组内做配额限制,并且你可以给不同的文件组定义不同的冗余度(即不同的数据库、PDB可以有不同的冗余度)。

换句话说就是,你可以在同一个flex磁盘组里建两个库,数据库1是Normal冗余度,数据库2是High冗余度。如果数据库2是一个CDB,你甚至可以以PDB为粒度再去管理设置文件相关属性。

Flex Diskgroup要求最少需要3个故障组。前提数据库版本是12.2版本时,Flex Diskgroup一般可以容忍两个故障组丢失。但是,如果故障组少于5个,则只允许一个故障组丢失。

注1:下文中每个所提到的磁盘组都针对于Flex Diskgroup,并且磁盘组一般给数据库文件使用,给ASM Volume和Cluster使用的情况我们不做讨论。

注2:下文提到的磁盘组都是Flex或Extended属性的磁盘组。

下面是关于Flex Diskgroup、Quota Group、File Group 之间的关系。

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

1、一个文件组只能所属于一个配额组,一个配额组可以包含多个文件组。一个磁盘组可以拥有多个文件组,一个文件组只能所属于一个磁盘组。

2、一个文件组只能描述一个file实体(PDB, CDB, volume, or cluster),一个实体可以使用多个文件组。通常用磁盘组存储我们的数据库对象,也就是说每个数据库都至少有一个单独的文件组。

3、创建文件组时默认会指定到名字为generic的无上限的配额组。并且至少含有一个文件组,即默认名为DEFAULT_FILEGROUP。配额组不能跨多个磁盘组,只能所属于一个磁盘组。

4、默认磁盘组的au大小是4M。

5、配额是一个物理空间,每个配额组有两个参数描述使用情况,USED_QUOTA_MB、QUOTA_LIMIT_MB。

6、磁盘组的每个文件组都有自己的冗余属性设置。

7、创建新数据库时,client_name(db name)和Filegroup Name一样,如果已经有相同client_name存在时,Oracle自动取别名。

用到sql:

col group_name FOR a10
col quota_name FOR a20
col FILE_GROUP FOR a120
col NAME FOR a10
SELECT G.NAME AS GROUP_NAME,
Q.NAME AS QUOTA_NAME,
Q.USED_QUOTA_MB,
Q.QUOTA_LIMIT_MB,
F.FILE_GROUP
FROM V$ASM_DISKGROUP G
LEFT JOIN V$ASM_QUOTAGROUP Q
ON G.GROUP_NUMBER = Q.GROUP_NUMBER
LEFT JOIN (SELECT QUOTAGROUP_NUMBER,
LISTAGG(PROPERTY, '|') WITHIN GROUP(ORDER BY PROPERTY) AS FILE_GROUP
FROM (SELECT ('NAME=>' || NAME || ';' || 'DB_NAME=>' ||
NVL(CLIENT_NAME, 'no_db') || ';' ||
'USED_QUOTA_MB=>' || USED_QUOTA_MB) AS PROPERTY,
QUOTAGROUP_NUMBER
FROM V$ASM_FILEGROUP)
GROUP BY QUOTAGROUP_NUMBER) F
ON F.QUOTAGROUP_NUMBER = Q.QUOTAGROUP_NUMBER order by group_name;
col FILE_NAME for a20
col client_name for a30
col quota_name for a15
col GROUP_NAME for a20
set pages 100
col name for a30
SELECT G.NAME AS GROUP_NAME,
Q.QUOTAGROUP_NUMBER,
Q.NAME AS QUOTA_NAME,
Q.USED_QUOTA_MB,
Q.QUOTA_LIMIT_MB,
F.NAME AS FILE_NAME,
F.CLIENT_NAME,
F.USED_QUOTA_MB
FROM V$ASM_DISKGROUP G
LEFT JOIN V$ASM_QUOTAGROUP Q
ON G.GROUP_NUMBER = Q.GROUP_NUMBER
LEFT JOIN V$ASM_FILEGROUP F
ON F.QUOTAGROUP_NUMBER = Q.QUOTAGROUP_NUMBER
AND F.GROUP_NUMBER = Q.GROUP_NUMBER
ORDER BY GROUP_NAME, QUOTAGROUP_NUMBER;

1.1 Flex磁盘组管理

1.1.1 创建一个Flex磁盘组

首先我们创建一个Flex Diskgroup

/*create a flex diskgroup*/
CREATE DISKGROUP flexc01 FLEX REDUNDANCY
failgroup flexc01 disk
'/dev/qdata/mpath-1s01.3261.01.dfb1',
'/dev/qdata/mpath-1s01.3261.01.dfb2'
failgroup flexc02 disk
'/dev/qdata/mpath-1s02.3261.01.dfb1',
'/dev/qdata/mpath-1s02.3261.01.dfb2'
failgroup flexc03 disk
'/dev/qdata/mpath-1s03.3261.01.dfb1',
'/dev/qdata/mpath-1s03.3261.01.dfb2'
ATTRIBUTE
'compatible.asm'='12.2.0.1',
'compatible.rdbms'='12.2.0.1',
'compatible.advm'='12.2.0.1',
'au_size'='1M';

alter diskgroup flexc01 set attribute 'compatible.asm' = '12.2.0.1';
alter diskgroup flexc01 set attribute 'compatible.rdbms' = '12.2.0.1';
alter diskgroup flexc01 set attribute 'disk_repair_time' = '36h';

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

创建完磁盘组之后默认,有一个默认的名字为GENERIC 的配额组和一个默认名字为DEFAULT_FILEGROUP的文件组。

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

Flex磁盘组中required_mirror_free_mb和 useable_file_mb值为0并不是bug,因为Flex冗余度的磁盘组就应该是这样。后面我们会使用其他查询方法来确定你的数据库的空间使用情况。

1.1.2 normal冗余磁盘组转换成Flex Diskgroup

我们可以使用Alter Diskgroup 语句来完成Normal Redundancy或High Redundancy冗余级别的磁盘组向Flex冗余级别的磁盘组转换成,当然External冗余级别是不能和Flex相互转换的。当转换磁盘组属性时,前提是磁盘组至少有三个故障组,并且必须Mount到受限模式(RESTRICTE)。

查看当前Diskgroup情况:

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

SQL>ALTER DISKGROUP normaldg dismount;

SQL>ALTER DISKGROUP normaldg MOUNT RESTRICTED;

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

SQL>ALTER DISKGROUP normaldg CONVERT REDUNDANCY TO FLEX;

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

SQL>ALTER DISKGROUP normaldg dismount;

SQL>ALTER DISKGROUP normaldg mount;

至此一个Normal冗余级别的磁盘组向Flex磁盘组转换完成。

1.2 配额组与文件组之间管理

1.2.1 创建一个配额组

alter diskgroup flexc01 add quotagroup qg_cdb set quota = 20g;

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

1.2.2 将文件组从一个配额组移动到另一个配额组

首先我们将Flexc01磁盘组中的File_test文件组移动到Mornaldg磁盘组中的qua_normal01 quotagroup中。

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

看来跨磁盘组是不行的,(后面也证明了,Move Filegroup并不是物理移动,仅仅是更新下元数据的信息而跨磁盘组肯定要物理移动)。

下面我们尝试将ORCL_PDB$SEED file group移动到QG_CDB中。

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

alter diskgroup FLEXC01 move filegroup ORCL_PDB$SEED to QG_CDB;

命令执行成功,看到了ORCL_PDB$SEED已经所属于QG_CDB了。并且可以看到GENERIC的USED_QUOTA_MB使用量减少,减少的部分正是ORCL_PDB$SEED的大小。

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

然后我又将ORA_PDB$SEED移动到QUO_TEST中,可以看到奇怪的现象,当前配额限制是10M,居然能将1496M的文件组移动到其中,难道这不是硬限制或者是12.2.0.1中的Bug,到这里从官方文档中查找了如下一句话,A file group can be moved from one quota group to another, regardless whether or not the target quota group has enough space for the file group.

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

同样我们可以用asmcmd命令完成move操作:

ASMCMD> mvfg -G flexc01 --filegroup ORCL_PDB$SEED QG_CDB;

1.2.3 修改文件组属性

更改到配额组

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

ALTER DISKGROUP flexc01 MODIFY FILEGROUP CDB1PDB SET 'quota_group' = 'QUO_TEST';

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

修改文件组中数据文件冗余级别

select f.name as filegroup,f.CLIENT_NAME,p.file_type,p.name,p.value from v$asm_filegroup f , v$asm_filegroup_property p where p.GROUP_NUMBER = f.GROUP_NUMBER and p.FILEGROUP_NUMBER = f.FILEGROUP_NUMBER and f.name = 'CDB1PDB' and p.name='REDUNDANCY';

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

alter diskgroup flexc01 modify filegroup CDB1PDB set 'datafile.redundancy'='high';

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

1.3 数据库与文件组之间的管理

1.3.1 将数据库添加到另一个文件组

我创建的PDB名字CDB1PDB,现在将其添加到FILE_TEST中。

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

ALTER DISKGROUP flexc01 ADD FILEGROUP FILE_CDB1PDB DATABASE CDB1PDB SET 'quota_group' = 'QUO_TEST';

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

1.3.2 删除一个文件组

alter diskgroup flexc01 drop filegroup CDB1PDB cascade;

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

因为配额空间不足,或许现在还不太友好。

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

当然,文件组并没有变。下面我们删除另一个文件组。

alter diskgroup flexc01 drop filegroup FILE_CDB1PDB cascade;

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

OK,被删除的文件组不在了

我们也可以用ASMcmd命令管理Flex Diskgroup,命令如下:

ASMCMD> help chqg chfg lsqg lsfg mkqg mkfg rmqg rmfg mvfg;

可以看到并不能mv一个qg。

相关视图:

V$ASM_QUOTAGROUP
V$ASM_FILEGROUP
V$ASM_FILEGROUP_PROPERTY
V$ASM_FILEGROUP_FILE

1.4 Extended DiskGroups

Oracle扩展磁盘组具有Flex磁盘组的所有特性,其专门为扩展集群环境设计使用,其中包含跨越多个物理分离站点的节点。

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

下面是扩展磁盘组的一些属性:

1、其冗余级别是EXTENDED REDUNDANCY,且每个磁盘组中的文件组都有他自己的属性。

2、一个扩展的磁盘组可以容忍整个站点的丢失,以及另一个站点中最多两个故障组的丢失(high)。这就意味着extended diskgroup不仅容忍故障组级别的数据故障,而且还允许站点级别的故障。

3、所有的数据站点(data sites)创建时,必须有相同数量故障组。配额组是针对于每个磁盘组而不是站点。配额组限制是所有站点所有副本所需的物理空间。比如有两个数据站点。一个6M的文件以normal级别存储,那么所需要的配额空间是24M。

4、必须有三个站点、两个数据站点和一个仲裁站点,以创建一个扩展磁盘组。每个数据站点应该有三个故障组,仲裁站点应该有一个故障组。

5、COMPATIBLE.ASM和COMPATIBLE.RDBMS参数必须设置12.2以上。

6、AU最小是4M。

7、和flex diskgroup不同,extended disk不允许其他任何形式的磁盘组向其转换。

/*CREATE AN EXTENDED DISKGROUP*/
SQL> CREATE DISKGROUP extended_site_data EXTENDED REDUNDANCY
SITE HZ FAILGROUP fg1 DISK '/devices/disks/disk01'
FAILGROUP fg2 DISK '/devices/disks/disk02'
FAILGROUP fg3 DISK '/devices/disks/disk03'
SITE BJ FAILGROUP fg4 DISK '/devices/disks/disk04'
FAILGROUP fg5 DISK '/devices/disks/disk05'
FAILGROUP fg6 DISK '/devices/disks/disk06'
SITE VT QUORUM
FAILGROUP fg7 DISK '/devices/disks/disk07';

作者:姚崇
出品:沃趣技术

相关阅读: