„Snapshot Copies“ beschäftigen uns schon eine ganze Weile. Angefangen mit den Storage Herstellern, wie Oracle / SUN oder NetApp, die entsprechende Funktionen datenbankunabhängig anbieten über spezielle Lösungen, wie Delphix und Actifio, bis hin zur in Version 11.2.0.3 eingeführten Funktion „CloneDB“ gibt es diverse Möglichkeiten, „Copy On Write“ Kopien einer Oracle Daten herzustellen.
Durch die Multitenant Database Option von Oracle 12c gibt es jetzt zunächst einmal die Möglichkeit, sehr einfach eine Pluggable Database zu kopieren; „Push Button“ war ein geflügeltes Wort auf der diesjährigen Oracle OpenWorld. Auch Snapshot Copies von Pluggable Databases sind mit 12.1.0.1 möglich, allerdings nur für spezielle Storage Lösungen. Diese Limitierung wurde mit 12.1.0.2 aufgehoben. Jetzt ist es nur noch erforderlich, dass Direct NFS als Storage der Datenbank verwendet wird.
Direct NFS
Wie Direct NFS aufgesetzt wird, hat mein Kollege Sebastian Winkler bereits detailliert in dem Blog https://www.carajandb.com/de/blogs/blog-swinkler/177-oracle-direct-nfs-unter-linux-und-windows-konfigurieren beschrieben. Für weitere Details wird auf den Artikel verwiesen.
Keystore
Bevor man Snapshot Copies benutzen kann muss zunächst ein so genannter Keystore mit dem Passwort des NFS-Servers erstellt werden. Leider ist Advanced Security nicht meine Stärke, daher nehmen Sie bitte das Beispiel nicht als „Best Practice“, sondern lassen Sie den Keystore vor der Produktivschaltung von einem Experten überprüfen bzw. einrichten. Der Einfachheithalber habe ich den Keystore in das Verzeichnis /home/oracle gelegt. Dieses Verzeichnis muss in der sqlnet.ora als Wallet Location angegeben werden:
% cat sqlnet.ora ENCRYPTION_WALLET_LOCATION= (SOURCE= (METHOD=FILE) (METHOD_DATA= (DIRECTORY=/home/oracle)))
Jetzt kann der Keystore im Verzeichnis /home/oracle angelegt werden.
SQL> ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/home/oracle/' IDENTIFIED BY oracle;
Natürlich sollte das Passwort etwas komplexer sein.
Jetzt kann der Keystore geöffnet werden und das Passwort für den NFS Server wrid entsprechend abgespeichert.
SQL> ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY oracle CONTAINER=ALL; SQL> ADMINISTER KEY MANAGEMENT ADD SECRET 'manager' FOR CLIENT 'synology1' USING TAG 'oracle' IDENTIFIED BY oracle WITH BACKUP;
Auch hier sollten natürlich etwas komplexere Passworte verwendet werden.
Snapshot Copy
Jetzt muss nur noch der Datenbank erklärt werden, dass wir gerne Snapshot Clones erstellen möchten. Leider muss hierfür die Instanz einmal durchgestartet werden.
SQL> ALTER SYSTEM SET clonedb=true SCOPE=spfile; SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP;
Als erstes werden wir jetzt die Pluggable Database „SONATE1“ erstellen. Sie dient als Quelle für unser Cloning und muss auf dem gleichen Storage liegen, wie die späteren Snapshot Copies. In unserem Beispiel also auf einem NFS-Laufwerk. Die Pluggable Database muss Read-Only geöffnet werden und kann, solange sich irgendwelche Kopien hierauf beziehen, weder gelöscht noch heruntergefahren werden.
Bei der Version 12.1.0.1 war es noch notwendig, mit einem „On Startup Trigger“ dafür zu sorgen, dass beim Starten der Instanz die PDB auch wieder geöffnet wird. Mit der neuen Funktion „PDB State Management accross CDB Restart“ kann man seit 12.1.0.2 festlegen, welchen Status eine PDB nach dem Restart der Instanz bekommen soll.
Eine weitere nette Funktion ist die Möglichkeit, ab der Version 12.1.0.2 einer Pluggable Database bei Oracle Managed Files (OMF) einen individuellen Pfad mitzugeben. Bitte verwechseln Sie nicht die neue Kommandoption CREATE_FILE_DEST für die Pluggable Database mit dem Oracle Parameter DB_CREATE_FILE_DEST, die, wie bisher, das Verzeichnis für alle Datenbankdateien bei OMF angibt.
SQL> CREATE PLUGGABLE DATABASE sonate1 ADMIN USER pdb_admin IDENTIFIED BY manager CREATE_FILE_DEST='/u02/oranfs/JOSEPH/SONATE1'; SQL> ALTER PLUGGABLE DATABASE sonate1 OPEN; SQL> ALTER PLUGGABLE DATABASE sonate1 OPEN READ ONLY FORCE; SQL> ALTER PLUGGABLE DATABASE sonate1 SAVE STATE;
Das Verzeichnis “SONATE1” muss an dieser Stelle bereits vorhanden sein.
Und jetzt ist „Show Time“!
SQL> CREATE PLUGGABLE DATABASE sonatine FROM sonate1 CREATE_FILE_DEST='/u02/oranfs/JOSEPH/SONATINE' SNAPSHOT COPY; SQL> ALTER PLUGGABLE DATABASE sonatine OPEN;
Verification
Wenn man sich das Ergebnis ansieht, stellt man zunächst einmal keinen Unterschied zu einer „normalen“ PDB fest:
Die Größe der Datendateien der PDB 7 und 8 sind gleich. Auch auf dem Betriebssystem sieht das erst einmal genau so aus:
$ ls -l SONATE1/JOSEPH/00AB52D5EA461844E053191E10ACC948/datafile/ total 819276 -rwxrwxrwx 1 oracle oinstall 576724992 Aug 15 14:43 o1_mf_sysaux_9yvzxzcq_.dbf -rwxrwxrwx 1 oracle oinstall 262152192 Aug 15 14:43 o1_mf_system_9yvzxzc8_.dbf -rwxrwxrwx 1 oracle oinstall 20979712 Aug 15 14:40 o1_mf_temp_9yvzxzd1_.dbf $ ls -l SONATINE/JOSEPH/00AB52D5EA481844E053191E10ACC948/datafile/ total 196 -rwxrwxrwx 1 oracle oinstall 576724992 Aug 15 14:45 o1_mf_sysaux_9yw037m1_.dbf -rwxrwxrwx 1 oracle oinstall 262152192 Aug 15 14:45 o1_mf_system_9yw037k6_.dbf -rwxrwxrwx 1 oracle oinstall 20979712 Aug 15 14:43 o1_mf_temp_9yw037ns_.dbf
Haben wir einen Fehler gemacht?
Der UNIX Befehl “du” gibt uns die richtige Antwort:
du -sh * 801M SONATE1 952K SONATINE
Diese Ausgabe zeigt, dass die PDB SONATINE nur ca. 1 MB Speicherplatz beansprucht, während die PDB SONATE 800 MB groß ist.
Zusammenfassung
Multitenant Database mit Direct NFS ist der nächste Schritt in Richtung Database as a Server (DBaaS). Jetzt ist es wirklich einfach, zig Kopien einer Datenbank für Test und Entwicklung innerhalb von Sekunden zur Verfügung zu stellen und dafür kaum zusätzlichen Storage zu verwenden.