Logo Oracle Deutschland   DBA Community  -  Februar 2013
Zugriff auf Dateien in ASM
von Sebastian Solbach ORACLE Deutschland B.V. & Co.KG

Die Frage, welcher Speicherort am Besten für Oracle Datenbankdateien geeignet ist, ist leicht zu beantworten: Oracle Automatic Storage Management, kurz ASM. Dabei ist es vollkommen egal, ob es sich um eine Single Instanz Datenbank oder einen Real Application Cluster, eine Standard Edition oder eine Enterprise Edition handelt. ASM bietet für jede Datenbank viele Vorteile: Dazu gehört die Möglichkeit, über mehrere Platten bzw. Luns hinweg zu Stripen, ohne dafür teure Storage Systeme zu benötigen, und damit optimale Performance für die Datenbank zu liefern, sowie die Möglichkeit, die einzelnen Blöcke in ASM einfach oder sogar zweifach zu spiegeln. Dies funktioniert nicht nur innerhalb eines Storage Systems, sondern auch über verschiedene Storages hinweg.

Allerdings ist ASM kein Dateisystem, sondern ein Volume Manager, genauer gesagt Extent Verwalter. Dies hat definitiv den Vorteil, dass ASM niemals zu einem Flaschenhals für den I/O werden kann. Allerdings liegt darin auch die Herausforderung, da auf die Dateien in ASM nicht über die herkömmlichen Betriebssystembefehle zugegriffen werden kann.

Im Normalfall stellt dies auch kein Problem dar, da nur der Recovery Manager auf die Oracle Datenbankdateien direkten Zugriff braucht. Leider aber kann RMAN keine gute Übersicht über alle Dateien geben und RMAN kennt keine Dumpfiles. Deswegen gibt es auch noch andere Möglichkeiten, an die Dateien in ASM heranzukommen bzw. Dateien hineinzukopieren. Die unterschiedlichen Möglichkeiten sind:

Grundsätzlich lassen sich mit allen Tools sowohl Dateien von ASM auf ein Dateisystem als auch umgekehrt kopieren. Auch das Kopieren von ASM innerhalb einer ASM Instanz oder in eine andere ASM Instanz ist damit möglich.

Recovery Manager

Das bevorzugte Werkzeug zum Kopieren von Oracle Dateien setzt zum Kopieren von Dateien in ASM eine sogenannte Image Kopie ein. Eine Kopie einer Datendatei sähe dann wie folgt aus:

rman target sys/oracle@buvmrac
RMAN> BACKUP AS COPY
2> DATAFILE '+INFRA/buvmrac/datafile/users.271.806784279'
3> FORMAT '/tmp/test/users.dbf';
Der RMAN Befehl erstellt eine Kopie der Datendatei Users unter /tmp/test. Generell sinnvoll ist eine Kopie einer Datendatei dann, wenn auf die Datei nicht schreibend zugegriffen wird, d.h. diese nur ReadOnly geöffnet ist bzw. sich die Datenbank im Mount Status befindet oder heruntergefahren wurde. Im Gegensatz zu den anderen Zugriffsvarianten, die auf Dateien zugreifen können, wenn die Datenbank komplett heruntergefahren ist, benötigt RMAN aber zumindest den Mount Status. Dafür ist RMAN aber auch in der Lage, eine funktionierende Kopie während der Laufzeit anzulegen, da RMAN mit Hilfe der archivierten Redologs ein Recovery durchführen kann.

Man könnte anstatt des komplizierten Dateinamens in ASM einfach die Nummer der Datendatei angeben, die man der View v$datafile entnehmen kann. Üblicher ist aber die Kopie eines kompletten Tablespaces, welche recht einfach mit dem BACKUP TABLESPACE Befehl passiert. Allerdings sollte dann als Dateiname die Format Spezifikation %b verwendet werden, damit es zu keinen Konflikten kommt, falls der Tablespace aus mehreren Datendateien besteht.

Hier fällt auf, dass RMAN, je nachdem was kopiert werden soll, einen anderen Befehl benötigt. Ganz extrem ist das beim Parameterfile und Controlfile:
RMAN> BACKUP AS COPY CURRENT CONTROLFILE
2> FORMAT '/tmp/test/control.ctl';

RMAN> BACKUP AS COPY SPFILE
2> FORMAT '/tmp/test/spfile.ora';
Daneben ist es gar nicht möglich, Dateien zu kopieren, die die Datenbank nicht kennt, wie zum Beispiel Export Dumpfiles. "Fremde" Dateien, die nicht zur Datenbank gehören, sind hingegen möglich, wenn man diese vorher der Datenbank bekannt gibt, d.h. im Controlfile registriert. Dasselbe muss auch gemacht werden, um Dateien zurück nach ASM zu kopieren:
RMAN> CATALOG DATAFILECOPY '/tmp/test/user2.dbf';

RMAN> BACKUP AS COPY DATAFILECOPY '/tmp/test/user2.dbf'
2> format '+INFRA/userss.dbf';
Anzumerken sei noch, dass in diesem Falle an der angegeben Stelle nur ein symbolischer Link erzeugt wird. Die eigentliche Datei wird im für die einzelnen Dateitypen vorgesehen Pfad (in diesem Falle <DBName>/<DATAFILE> abgelegt:
ASMCMD> ls -l +INFRA
Type Redund  Striped  Time Sys  Name
                           Y    BUVMRAC/
                           Y    bumucsvm/
                           N    dumpdir/
                           N    snapcf_buvmrac.f => +INFRA/BUVMRAC/CONTROLFILE/Backup.276.764329931
                           N    snapcf_buvmrac_2.f => +INFRA/BUVMRAC/CONTROLFILE/Backup.281.762946047
                           N    userss.dbf => +INFRA/BUVMRAC/DATAFILE/USERSS.313.806785931
Daher reicht die Spezifikation der Diskgruppe im Format meistens aus, wenn man auf den symbolischen Link verzichtet. Ein Zurückkopieren der Dateien an dieselbe Stelle erfordert hingegen einen RESTORE Befehl, da es sich hierbei für RMAN um ein Recovery handelt.

Das Kopieren innerhalb einer ASM Instanz von einer Diskgruppe zu einer anderen ist analog. Möchte man aber auch den Datenbanknamen im festgelegten Pfad ändern, so geht dies nur unter Zuhilfenahme einer Auxiliary Datenbank. Dies unterscheidet sich nicht von der Kopieraktion in eine andere ASM Instanz, weshalb im weiteren Verlauf gleich auf dies eingegangen wird:
RMAN> CONNECT AUXILIARY sys/oracle@orclaux
RMAN> backup as copy
2> tablespace users
3> auxiliary format '+DATA';
Damit wird die Datendatei über das Netz kopiert. Hierbei dürfen die Datenbankversionen durchaus unterschiedlich sein. Die Datei wird als DATAFILECOPY im Controlfile der Zieldatenbank registriert und erhält in der Datei Struktur in ASM auch deren Pfad: "+DATA/ORCLAUX/DATAFILE/USERS.XXX.XXXXXXXXX"

DBMS_FILE_TRANSFER

Das Kopieren mit DBMS_FILE_TRANSFER benötigt eine laufende und geöffnete Datenbank. Dafür erlaubt es aber das Kopieren beliebiger Files innerhalb ASM. Allerdings müssen bei Datenbank fremden Dateien die entsprechenden Dateinamen erst über v$asm_file und v$asm_alias ermittelt werden. (Alternativ hilft auch der Einsatz des ASMCMD Utilities, der die Dateien schön übersichtlich mit dem Befehl 'ls' auflistet).

Da DBMS_FILE_TRANSFER schon einmal in einem früheren Tipp behandelt wurde, hier nur zwei kurzes Beispiel, mit den Besonderheiten von ASM:

SQL> BEGIN
  2    DBMS_FILE_TRANSFER.COPY_FILE (
  3      source_directory_object      => 'FILEDIR',
  4      source_file_name             => 'usersft.dbf',
  5      destination_directory_object => 'ASMDIR',
  6      destination_file_name        => 'usersft.dbf' );
  7  END;
  8  /

ASMCMD> cd newfile
ASMCMD> ls -s
Block_Size  Blocks    Bytes     Space  Name
                                       usersft.dbf => +INFRA/BUVMRAC/DATAFILE/COPY_FILE.314.806792095
Auch hier gilt, dass der Parameter "destination_file_name" lediglich einen symbolischen Link darstellt und die Datei anhand ihres Typs an die entsprechende Stelle kopiert wird. Den DBNamen im Pfad bestimmt dabei die Datenbank mit Hilfe derer das DBMS_FILE_TRANSFER ausgeführt wird.

Versuche, Dateien nach ASM zu kopieren, die ASM nicht unterstützt oder nicht identifizieren kann, quittiert der Befehl mit einem "ORA-19505: failed to identify file "/tmp/test/test.txt""

Das Kopieren von Dateien in andere ASM Instanzen (oder andere Verzeichnisstrukturen) funktioniert ebenfalls über eine laufende zweite Datenbank Instanz. Allerdings werden hierfür die Prozedur PUT_FILE und GET_FILE verwendet, je nachdem in welche Richtung kopiert werden soll. Zuvor muss aber auf der Remote Datenbank das entsprechende Directory Objekt erzeugt worden sein.
SQL> create database link asmorcl using 'asmorcl';
SQL> BEGIN
  2    DBMS_FILE_TRANSFER.PUT_FILE(
  3      source_directory_object      => 'ASM2DIR',   
  4      source_file_name             => 'usersft.dbf',
  5      destination_directory_object => 'ASMREMOTE',
  6      destination_file_name        => 'usersft.dbf',
  7      destination_database         => 'asmorcl');
  8  END;
  9  /
Der Fortschritt kann dabei über V$SESSION_LONGOPS überprüft werden. Anzumerken sei noch, dass der Kopiervorgang blockweise passiert und nicht transaktionskonsistent ist. Sollte eine der Datenbanken während des Kopierens gestoppt werden ist das File unvollständig. Außerdem darf die Größe der Datei im Moment 2TB nicht überschreiten.

HTTP/FTP

Der Zugriff auf die ASM Dateistruktur und auf die einzelnen Dateien in ASM kann auch über WebDAV (HTTP/HTTPS) oder FTP passieren. Hierfür wird auf dem Rechner mit der ASM Instanz eine laufende Datenbank mit XMLDB Funktionalität benötigt. Zusätzlich muss noch der XMLDB Listener konfiguriert werden, damit auf den HTTP/HTTPS bzw. FTP Port zugegriffen werden kann. Aus Sicherheitsgründen ist der FTP Port nämlich nicht aktiviert.
SQL> execute dbms_xbd.sethttpport(8080);
SQL> execute dbms_xbd.setftpport(2121);     
Die XDB Funktionalität werden wir in einem künftigen Tipp noch genauer beschreiben. Weitere Informationen zur Installations- und Konfiguration von XMLDB.

Nun kann mittels Webbrowser oder einem WebDAV Client über http://<servername>:8080/sys/asm auf die Dateien in ASM Zugegriffen werden.



Ein Upload via WebDAV wäre ebenfalls möglich, genau wie über FTP:
$ ftp localhost 2121
Connected to localhost (127.0.0.1).
220- bumucsvm1.de.oracle.com
Unauthorised use of this FTP server is prohibited and may be subject to civil and criminal prosecution.
220 bumucsvm1.de.oracle.com FTP Server (Oracle XML DB/Oracle Database) ready.
Name (localhost:oracle): system
331 pass required for SYSTEM
Password:
230 SYSTEM logged in
Remote system type is Unix.
ftp> bi
200  Type set to I.
ftp> put users.dbf sys/asm/INFRA/usersftp.dbf
local: users.dbf remote: sys/asm/INFRA/usersftp.dbf
227 Entering Passive Mode (10,165,244,112,192,1)
150 BIN Data Connection
226 BIN Transfer Complete
5251072 bytes sent in 1.21 secs (4.2e+03 Kbytes/sec)
Überprüft man dies wieder, stellt man fest, dass auch hier wieder mit symbolischen Links gearbeitet wird und das File tatsächlich unter "+INFRA/<DBName>/<FILETYPE>/NAME.XXX.XXXXXXXX" abgelegt wird. DBName ist der Name der Datenbank, die die FTP bzw. HTTP Verbindung ermöglicht.

Eine Kopie zwischen ASM Instanzen wäre zum Beispiel sowohl über einen FTP Client, der 2 FTP Server ansprechen kann, als auch über einen WebDAV Client möglich. Voraussetzung ist, dass sowohl auf dem Source System als auch auf dem Zielsystem eine Datenbank Instanz mit XMLDB konfiguriert wurde.

ASM Command Line Interface (ASMCMD)

Die oben genannten Zugriffe funktionierten auch schon in 10gR1 und 10gR2. Die folgende Variante über den Copy Befehl "cp" im ASM Command Line Interface (ASMCMD) wurde erst mit 11gR1 eingeführt. Kopieren mit ASMCMD ist vergleichbar mit Kommandos auf der Betriebssystemumgebung, nur eben unter ASMCMD:
$ asmcmd
ASMCMD> cd +INFRA/buvmrac/datafile
ASMCMD> ls
SYSAUX.260.711977195
SYSTEM.259.711977169
UNDOTBS.261.711977213
USERS.265.711977245
USERSS.271.806784279
ASMCMD> cp USERSS.271.806784279 /tmp/test/usersasmcmd.dbf
copying +INFRA/buvmrac/datafile/USERSS.271.806784279 -> /tmp/test/usersasmcmd.dbf
In Windows gibt es noch den einen oder anderen Stolperstein. Verwendet man ältere Versionen (vor 11.1.0.7.4 bzw. 11.2.0.2), so funktioniert der Kopiervorgang nur mit relativen Pfaden. Des weiteren sollte man bei der Verwendung von absoluten Pfaden bei neueren Versionen darauf achten, kleine Buchstaben für die Laufwerksbuchstaben zu verwenden: Also "c:" Anstelle von "C:".

Im Moment gibt es beim Kopieren nach ASM noch das Phänomen, dass als Datenbank "ASM" angenommen wird:
ASMCMD> cp /tmp/test/usersasmcmd.dbf +FRA/userasmcmd.dbf
copying /tmp/test/usersasmcmd.dbf -> +FRA/userasmcmd.dbf
ASMCMD> ls -l +FRA
Type      Redund  Striped  Time             Sys  Name
                                            N    userasmcmd.dbf => +FRA/ASM/DATAFILE/userasmcmd.dbf.1058.806848367
MOS Note 1488934.1 "ASMCMD Cp Creates Files In +DATA/ASM Instead Of Destination Specified" erklärt dieses Verhalten. Möchte man dieses Verhalten nicht, bleibt im Moment nur das Ausweichen auf die anderen beschriebenen Möglichkeiten.

Das Kopieren zwischen mehreren ASM Instanzen funktioniert über die Easy Connect Syntax direkt in die Remote ASM Instanz.
ASMCMD> cp +FRA/dumpsets/scott.dmp sys/oracle@bumucsvm6.1521.+ASM1:+DATA/scott.dmp
copying +FRA/dumpsets/scott.dmp -> bumucsvm6:+DATA/scott.dmp
Dies ist in der MOS Note 785580.1 "How to Copy asm files between remote ASM instances using ASMCMD command" näher beschrieben. Auch hier landet das File unter "ASM":
scott.dmp => +DATA/ASM/DUMPSET/scott.dmp.275.806848887
Dies gilt natürlich sowohl für Data Pump Exports, Datenfiles, Controlfiles, Redologfiles, Backups usw.

Einzige Ausnahme zum generellen Kopieren von Dateien stellt das SPFile einer Datenbank Instanz dar. Dieses kann als einzige Datei nicht mit dem herkömmlichen Befehl "cp" kopiert werden, sondern benötigt die besonderen Befehle "spcopy" (SPFile Kopie wird vom Server erstellt) bzw. "spbackup" (Kopie wird auf dem Client erzeugt).

Leider sind 2 Funktionen herkömmlicher "cp" Befehle noch nicht implementiert: Das Verwenden von Wildcards (z.B. '*') und das das rekursive Kopieren (cp -r) ganzer Verzeichnisse. Nähere Informationen hierzu finden sich in MOS Note 829040.1 "Unable To Copy Directory Using ASMCMD Cp -r Command".

Für das Einbetten in Shell Skripte eignet sich auch folgende MOS Information, die die Passwortabfrage von ASMCMD beim Kopieren unterdrückt: "How To Pass A Password Into The ASMCMD CP Command?" (Doc ID 1206884.1).

Weitere Anmerkungen und Fazit

Nützliche Links und Referenzen

  • Backup and Recovery User's Guide
  • Backup - Backup and Recovery Reference
  • DBMS_FILE_TRANSFER Tipp
  • 68 DBMS_FILE_TRANSFER - PL/SQL Packages and Types Reference
  • 34 Administering Oracle XML DB - XML DB Developer's Guide
  • ASMCMD File Management Commands - Automatic Storage Management Administrator's Guide
  • 7 Administering Oracle ASM Files, Directories, and Templates
  • Zurück zur Community-Seite