News zu Oracle

Quotas auf Oracle ASM Diskgroups

Das Anlegen je einer Diskgroup pro Oracle Datenbank kann auf Systemen mit vielen Da­ten­ban­ken leicht aufwändig, un­über­sicht­lich und feh­ler­an­fäl­lig werden. Eine perfekte Lösung für dieses Problem, stellen wir dir in diesem Beitrag vor:  FLEX-Diskgroups mit Quotagroups.

Die seit jeher im Automated Storage Ma­nage­ment (ASM) bekannten EXTERNAL‑, NORMAL- oder HIGH-Red­un­dan­cy-Diskgroups haben ein Problem gemeinsam: Da­ten­ban­ken in diesen Diskgroups können sich mehr oder weniger beliebig des Platzes bedienen. Laufen mehr als eine Datenbank im ASM, kon­kur­rie­ren diese also um Platz und können sich im Ex­trem­fall durch Ausreizen des Frei­plat­zes ge­gen­sei­tig zum Still­stand bringen. Bei den genannten Diskgroup-Typen behilft man sich daher gern damit, für jede Datenbank eine eigene Diskgroup be­reit­zu­stel­len. Das kann auf Systemen mit vielen Da­ten­ban­ken sehr schnell un­über­sicht­lich werden. Und es schützt letztlich noch nicht davor, dass sich ein DBA mit man­geln­der Selbst­dis­zi­plin „mal schnell“ aus einer anderen Diskgroup bedient, weil er gerade dringend Platz benötigt.

Diesem Problem begegnet Oracle mit einem Quo­ta­kon­zept, das eines der Features von FLEX-Diskgroups ist. Die Umsetzung erfolgt dabei über zwei Kon­struk­te, die Filegroup und die Quo­ta­group, auf die wir im Folgenden genauer eingehen.

Filegroup

Das Konstrukt Filegroup beruht darauf, dass alle Files einer be­stimm­ten Datenbank innerhalb einer be­stimm­ten Diskgroup zu einer Filegroup zu­sam­men­ge­fasst werden. Das geschieht au­to­ma­tisch für alle Da­ten­ban­ken, die Files in FLEX-Diskgroups ablegen. Man kann dem aber auch vor­grei­fen und eine Filegroup für eine noch nicht exis­tie­ren­de Datenbank anlegen. So würde man auch si­cher­stel­len, dass bereits beim Anlegen das vor­ge­se­he­ne Limit ein­ge­hal­ten wird.
Fi­le­groups können diverse Attribute zu­ge­wie­sen werden. Erwähnt sei hier nur die Tatsache, dass das Red­un­danz­le­vel der Filegroup insgesamt oder auch einzelner Filetypen innerhalb der Filegroup kon­fi­gu­rier­bar ist. Denkbar wäre also z.B.:

  • Datafiles zu spiegeln
  • Re­do­log­files un­ge­spie­gelt zu betreiben (wenn sie innerhalb der Datenbank bereits mul­ti­ple­xed sind)
  • typische write-once-File, wie Ar­chi­velogs oder Backups mit dem neuen PARITY-Level ab­zu­si­chern und damit den Red­un­dan­zo­ver­head deutlich zu senken

Quo­ta­group

Die Quo­ta­group ist das Mittel zum Festlegen einer Quota innerhalb der Diskgroup. Die innerhalb einer Diskgroup de­fi­nier­ten Fi­le­groups werden jeweils genau einer Quo­ta­group zu­ge­ord­net, womit die ent­spre­chen­den Da­ten­ban­ken ihre Quota erhalten. Man kann innerhalb einer Diskgroup mehrere Quo­ta­groups de­fi­nie­ren und eine oder mehrere Fi­le­groups einer Quo­ta­group zuordnen. Ist es das Ziel, den Platz jeder einzelnen Datenbank hart zu begrenzen, würde man für jede Datenbank (= Filegroup) eine eigene Quo­ta­group definieren.

Will man hingegen nur si­cher­stel­len, dass eine Menge von Da­ten­ban­ken in Summe nicht mehr als einen fest­ge­leg­ten Platz verwenden, würde man dafür eine ge­mein­sa­me Quo­ta­group de­fi­nie­ren und dieser mehrere Fi­le­groups (= Da­ten­ban­ken) zuweisen. Diese Da­ten­ban­ken würden dann zwar un­ter­ein­an­der wieder um den Platz kon­kur­rie­ren, aber keine Da­ten­ban­ken außerhalb der Gruppe be­ein­flus­sen. Für Test­da­ten­ban­ken mag das z.B. ein Kom­pro­miss zwischen Aufwand und Ver­füg­bar­keits­an­for­de­rung sein.

Re­qui­re­ments

Eine grund­le­gen­de Vor­aus­set­zung für FLEX-Diskgroups ist, dass sie mit min­des­tens zwei Fail­groups plus einer quorum-Failgroup angelegt werden müssen. Das leuchtet insofern ein, als das Files innerhalb einer FLEX-Diskgroup wahlweise mit erhöhter Redundanz (MIRROR, HIGH) ab­ge­si­chert werden können. Dafür sind ja auch in den her­kömm­li­chen NORMAL- oder HIGH-Red­un­dan­cy-Diskgroups min­des­tens zwei bzw. drei Fail­groups er­for­der­lich. Werden die ASM-Devices vom Storage bereits redundant gehalten, hat man daher keine wirkliche Ver­an­las­sung, das MIRROR-Feature der FLEX-Diskgroup zu nutzen. Hier behilft man sich mit einem einfachen Work­around. Bei einem netto-Platz­be­darf von 100 GB lässt man sich dann eben zwei 50 GB-Devices be­reit­stel­len. Zu­sätz­lich ist je FLEX-Diskgroup ein quorum-Device er­for­der­lich. Dafür sind aber nach meiner Be­ob­ach­tung in ASM 19c 100 MB voll­kom­men aus­rei­chend. Das ist aus Sto­rage­sicht sicher ein ver­tret­ba­rer Overhead.

Anlegen einer FLEX-Diskgroup

Für Anhänger des asmca an der Stelle gleich eine schlechte Nachricht: Das Anlegen von FLEX-Diskgroups mit zwei Fail­groups (plus Quorum) ist mit ihm nicht möglich. Er ver­wei­gert sich mit folgender, nicht zu­tref­fen­der, Fehlermeldung:

Fehlermeldung beim Anlegen einer Flex-Diskgroup mit zwei Failgroups plus Quorum
Feh­ler­mel­dung beim Anlegen einer Flex-Diskgroup mit zwei Fail­groups plus Quorum

Bleibt also nur das Anlegen mit dem ent­spre­chen­den SQL-Befehl:

SQL>   create diskgroup DG_DATA
2      flex redundancy disk '/mnt/nfs/db-flex-0*'
3      quorum disk '/mnt/nfs/db-flex-quorum';

Diskgroup created.

NOTE: FLEX-Diskgroups werden übrigens bereits mit der nötigen DB- und ASM-Mi­ni­mal­kom­pa­ti­bi­li­tät von 12.2.0.0.0 angelegt. Sie können daher fol­ge­rich­tig auch nicht für Da­ten­ban­ken der Version 12.1 oder älter verwendet werden.

Anlegen einer Filegroup

Grund­sätz­lich ist es uns frei­ge­stellt, eine Filegroup vorab anzulegen. Spä­tes­tens wenn man Datenbank Files in einer FLEX-Diskgroup ablegt, wird implizit eine zu­ge­hö­ri­ge Filegroup erzeugt. In ersterem Fall ist darauf zu achten, dass als database-Name (im asmca etwas un­glück­lich „File Group Usage Id“ genannt) der db_unique_name der Datenbank verwendet wird.
Zu De­mons­tra­ti­ons­zwe­cken legen wir die Filegroup vorab an. Das kann wahlweise mit dem ASM Con­fi­gu­ra­ti­on Assistant, SQL oder mit asmcmd erfolgen.…

Die Filegroup wird mit dem ASM Con­fi­gu­ra­ti­on Assistant angelegt:

Anlegen einer Filegroup mit asmca
Anlegen einer Filegroup mit asmca

Die Filegroup wird mit SQL angelegt:

SQL>   alter diskgroup dg_data 
2      add filegroup orcl_files
3      database orcl01 ;

Diskgroup altered.

Die Filegroup kann auch mit asmcmd angelegt werden, wenn man gern XML schreibt. Nachdem wir dann eine Datenbank in die +DG_DATA-Diskgroup gelegt haben, sehen wir auch eine ent­spre­chen­de Aus­las­tung der Filegroup:

$ asmcmd lsfg -G DG_DATA
File Group          Disk Group  Quota Group   Used Quota MB   Client Name   Client Type
DEFAULT_FILEGROUP   DG_DATA      GENERIC       8
ORCL_FILES          DG_DATA      GENERIC      8000            ORCL01        DATABASE

Da wir beim Anlegen der Filegroup keine Redundanz explizit angegeben haben, werden die Files jetzt in MIRROR-Redundanz vor­ge­hal­ten. Un­ter­stellt, dass wir bereits im Storage Redundanz haben, stellen wir den Mode unserer Filegroup auf UN­PRO­TEC­TED um, was der her­kömm­li­chen EXTERNAL-Red­un­dan­cy entspricht:

SQL>   alter diskgroup dg_data
2      modify filegroup orcl_files
3      set 'redundancy'='unprotected';

Diskgroup altered.

Damit halbiert sich fol­ge­rich­tig auch die An­rech­nung auf die (aktuell noch nicht fest­ge­leg­te) Quota:

$ asmcmd lsfg -G DG_DATA
File Group Disk Group  Quota Group Used Quota MB Client Name Client Type
DEFAULT_FILEGROUP   DG_DATA    GENERIC       8
ORCL_FILES          DG_DATA    GENERIC       3968            ORCL01        DATABASE

Anlegen einer Quotagroup

Solange Fi­le­groups keiner Quo­ta­group zu­ge­ord­net sind, un­ter­lie­gen sie der GENERIC-Quo­ta­group und sind in ihrer Größe nicht limitiert. Jedoch könnte auch die GENERIC-Quo­ta­group mit einem Limit versehen werden. Nur Löschen lässt sie sich nicht. Wir wollen jedoch si­cher­stel­len, dass unsere Datenbank in der +DG_DATA-Diskgroup einen maximalen Platz einnimmt, z.B. 10 GB. Dazu legen wir eine neue Quo­ta­group mit einer 10 GB-Quota an und weisen ihr die Filegroup orcl_files zu, in der die Files der orcl-Datenbank liegen.
NOTE: Die Quota der Quo­ta­group ist als brutto-Wert zu verstehen. Mehr­be­darf durch MIRROR- oder HIGH-Redundanz wird direkt auf die Quota an­ge­rech­net. Eine 10 GB-Quota lässt also 10 GB UN­PRO­TEC­TED Files, aber nur 5 GB MIRRORed Files zu. Dazu nutzen wir entweder den asmca oder SQL.

Im Oracle ASM Con­fi­gu­ra­ti­on Assistant sieht das so aus:

Anlegen einer Quotagroup im asmca
Anlegen einer Quo­ta­group im asmca
Anlegen einer Quotagroup im asmca
Anlegen einer Quo­ta­group im asmca

In SQL muss folgender Befehl ge­schrie­ben werden:

SQL>  alter diskgroup dg_data
2     add quotagroup orcl_quota
3     set 'quota'=10G;

Diskgroup altered.

SQL>  alter diskgroup dg_data
2     modify filegroup orcl_files
3     set 'quota_group'='orcl_quota';

Diskgroup altered.

Wir sehen nun, dass unsere Datenbank der Quo­ta­group ORCL_QUOTA zu­ge­ord­net ist:

$ asmcmd lsfg -G DG_DATA
File Group Disk Group Quota Group Used Quota MB Client Name Client Type
DEFAULT_FILEGROUP DG_DATA GENERIC 8
ORCL_FILES DG_DATA ORCL_QUOTA 5432 ORCL01 DATABASE

… und ca. 5.5 GB einer 10 GB-Quota in dieser Quo­ta­group aus­ge­schöpft sind:

$ asmcmd lsqg -G DG_DATA
Quotagroup_Num Quotagroup_Name Incarnation Used_Quota_MB Quota_Limit_MB
1 GENERIC 1 8 0
2 ORCL_QUOTA 3 5432 10240

Vor­aus­ge­setzt, dass keine weiteren Da­ten­ban­ken der OR­CL_­QUO­TA-Gruppe zu­ge­wie­sen werden, kann die ORCL-Datenbank nun also in der +DG_DATA-Diskgroup maximal 10 GB belegen. Die rest­li­chen 20 GB, die in der 30 GB-Diskgroup verfügbar sind, bleiben dieser Datenbank vor­ent­hal­ten. Testen wir es:

SQL> create table just_eat_disk (foo number) tablespace users;

Table created.

SQL> alter table just_eat_disk allocate extent (size 4G);

Table altered.

$ asmcmd lsqg -G DG_DATA
Quotagroup_Num   Quotagroup_Name   Incarnation   Used_Quota_MB   Quota_Limit_MB
1             GENERIC          1             0         0
2                ORCL_QUOTA        3             9840            10240

Nachdem wir weitere ca. 4 GB der Quota auf­ge­braucht haben, dürften wir jetzt nur noch ca. 150 MB in Anspruch nehmen. Fol­ge­rich­tig schlägt die An­for­de­rung eines weiteren 4 GB-Extents fehl.

SQL> alter table just_eat_disk allocate extent (size 4G);
alter table just_eat_disk allocate extent (size 4G)
*
ERROR at line 1:
ORA-01653: unable to extend table SYS.JUST_EAT_DISK by 8192 in tablespace USERS

150 MB werden uns aber noch zugestanden.

SQL>  alter table just_eat_disk allocate extent (size 150M);

Table altered.

Andere Diskgroups „schützen“

Wir haben gesehen, dass wir die Platz­an­for­de­rung einer Oracle Datenbank innerhalb einer Diskgroup wir­kungs­voll be­schrän­ken können. Wie können wir nun aber vermeiden, dass sich die Datenbank Platz von einer anderen Diskgroup „stiehlt“? Ohne spezielle Vor­keh­rung wäre es uns ja pro­blem­los möglich, zum Beispiel weitere 1 GB einfach aus einer anderen Diskgroups zu beziehen:

SQL> alter tablespace users add datafile '+DG_MORE_DATA';

Tablespace altered.

SQL> select file_name from dba_data_files where tablespace_name='USERS'

FILE_NAME
--------------------------------------------------
+DG_DATA/ORCL01/DATAFILE/users.262.1098474727
+DG_MORE_DATA/ORCL01/DATAFILE/users.256.1098480509

SQL> alter table just_eat_disk allocate extent
2    (datafile '+DG_MORE_DATA/ORCL01/DATAFILE/users.256.1098480509' size 1g);

Table altered.

Das lässt sich un­ter­bin­den, indem man

  • eine 1 MB-Quo­ta­group auf dieser Diskgroup anlegt (kleiner ist nicht möglich und 0 steht für unlimited)
  • eine Filegroup für die orcl-Datenbank auf dieser Diskgroup anlegt und
  • die Filegroup der Quo­ta­group zuordnet:
SQL> alter diskgroup DG_MORE_DATA add quotagroup no_space set 'quota'=1M;

Diskgroup altered.

SQL> alter diskgroup DG_MORE_DATA add filegroup ORCL_FILES database orcl01
2    set 'quota_group'='no_space';

Diskgroup altered.

So ab­ge­si­chert würde die +DG_MORE_DATA nun bereits den Versuch der orcl01 un­ter­bin­den, ein Datafile in dieser Diskgroup anzulegen:

SQL> alter tablespace users add datafile '+DG_MORE_DATA';
alter tablespace users add datafile '+DG_MORE_DATA'
*
ERROR at line 1:
ORA-01119:   error in creating database file '+DG_MORE_DATA'
ORA-17502:   ksfdcre:4 Failed to create file +DG_MORE_DATA
ORA-15437:   Not enough quota available in quota group NO_SPACE.

Fast Recovery Area Diskgroup

Da über den db_­re­co­ver­y_­file_­de­s­t_­si­ze-Parameter bereits eine quasi-Quota für jede Datenbank auf der Diskgroup für die Fast Recovery Area fest­ge­legt ist, könnte man den Einsatz einer Quo­ta­group in diesem Fall für über­flüs­sig halten. Das ist aus zwei Gründen leider nicht der Fall:

  1. db_recovery_file_dest_size ist ein Wert, der vom DBA verändert werden kann. Quo­ta­groups hingegen fallen in die Hoheit des ASM-Admins. Das können durchaus zwei ver­schie­de­ne Personen sein.
  2. Die db_recovery_file_dest_size be­schränkt nur den Platz für reguläre Re­co­ver­y­files. Sie ver­hin­dert nicht das explizite Anfordern von Platz zum Beispiel für ein Datafile, wie es im Beispiel oben gezeigt wurde. Umgekehrt ist aber im Falle der FRA-Diskgroup auch der Einsatz der oben genannten 1MB-Quota nicht möglich, denn die be­tref­fen­de Datenbank muss ja in der Lage sein, Con­trol­files, Redologs, Ar­chi­velogs, Backups usw teilweise un­be­kann­ter Größe in diese Diskgroup zu schreiben.

Also sollte auch die Diskgroup, die die Fast Recovery Area hält, je Datenbank eine Quota in Höhe der Fast Recovery Area Size erhalten.

Fazit

Quotas auf ASM-FLEX-Diskgroups bieten einen sicheren und flexiblen Weg die Platz­be­le­gung von Oracle Da­ten­ban­ken effektiv zu begrenzen. Es ist somit nicht mehr er­for­der­lich, je Datenbank eine eigene Diskgroup zu erstellen. Das spart Aufwand und schafft mehr Über­sicht­lich­keit beim Storage-Admin, beim Be­triebs­sys­tem-Admin und beim ASM-Admin. Letzterer bekommt zu­sätz­lich wieder die volle Hoheit über die Platz­ver­ga­be an die Da­ten­ban­ken. Sie kann vom Datenbank-Admin nicht länger aus­ge­he­belt werden. Die Ver­füg­bar­keit kon­kur­rie­ren­der Da­ten­ban­ken bleibt weiterhin gewahrt, da auch beim Einsatz von Quotas die Kon­kur­renz um Plat­ten­platz wirksam ver­hin­dert werden kann.

Hier findest du weitere in­ter­es­san­te Posts zu den Themen Oracle Datenbank  oder auch Backup and Recovery aus unserem News und Insights Bereich.

icon-arrow_right_medium-violet-blue.svg

Share this article

Facebook 
Twitter 
LinkedIn 
XING 
WhatsApp 
Email