Multimedia Daten als BLOBs oder BFILEs in Oracle 10.1 Autor: Christof Kaiser, Logiball GmbH DOAGNews Q4_2005 Dieses Werk ist urheberrechtlich geschützt. Die dadurch begründeten Rechte, insbesondere die der Übersetzung, des Nachdrucks, des Vortrags, der Entnahme von Abbildungen und Tabellen, der Funksendung, der Mikroverfilmung oder der Vervielfältigung auf anderen Wegen und der Speicherung in Datenverarbeitungsanlagen, bleiben, bei auch nur auszugsweiser Verwertung, vorbehalten. Eine Vervielfältigung dieses Werkes oder von Teilen dieses Werkes ist auch im Einzelfall nur in den Grenzen der gesetzlichen Bestimmungen des Urheberrechtes der Bundesrepublik Deutschland vom 9. September 1965 in der jeweils geltenden Fassung zulässig. Sie ist grundsätzlich vergütungspflichtig. Zuwiderhandlungen unterliegen den Strafbestimmungen des Urheberrechtsgesetzes. ©2005 Oracle kann neben den üblicherweise in Datenbanken 4. Und schließlich der SQLLDR-Aufruf (angenommen abgelegten stark strukturierten Daten auch binäre Daten der User heißt blobs und hat reichlich Tablespaces) wie Fotos, Videos oder Musik speichern. Dieser Artikel abgesetzt: stellt zwei mögliche Arten der Speicherung als BLOB und BFILE gegenüber. ((Beginn Programmcode)) sqlldr userid=blobs/blobs Die Fotos, die früher unsortiert in Schuhkartons ihr control=files.ctl direct=y data=dir.txt Endlager fanden, sammeln sich heute ähnlich unsortiert ((Ende Programmcode)) auf der Festplatte oder in großen Multimedia-Dateien, die verwaltet werden wollen. In Oracle (hier: 10.1 unter Die Foto-Sammlung kann komplett in Oracle gehalten Novel/SuSe Linux) können diese mühelos mit werden. Bordmitteln abgelegt werden. 1. Zunächst ist eine Tabelle mit dem Datentyp BLOB Stellt sich die Frage, ob das eine gute Idee ist? (Binary Large Object) zu erstellen: Relationale Datenbanksysteme wie Oracle nutzt man, ((Beginn Programmcode)) und wieder finden können. Das erkauft man sich durch CREATE TABLE files( gewisse Performance-Einbußen, die durch den weil sie strukturierte Daten sicher und flexibel ablegen file_name VARCHAR2(255) PRIMARY KEY, file_data BLOB Overhead bedingt sind. Bei binären Daten, dessen Struktur die Datenbank nicht versteht, bleibt nur das ); byteweise Ablegen, bei dem die Datenbank jedoch ((Ende Programmcode)) keinen Vorteil durch optimierte datenspezifische Zugriffe bietet, aber trotzdem den Overhead erzeugt. 2. Dann ein entsprechendes File files.ctl für SQLLDR Man kann nicht erwarten, dass die Datenbank mehr von erzeugen: der Struktur der Binärdaten versteht und dies als Funktionalität bereitstellt. Intermedia-Audio und ((Beginn Programmcode)) Intermedia-Video können zwar einige Eigenschaften LOAD DATA (Bit-Rate, etc.) der Binärobjekte abfragen, werden dies INFILE * aber aufgrund der schnellen Entwicklung neuer Formate INTO TABLE files nie in dem Umfang können, wie spezialisierte REPLACE Multimedia-Bibliotheken. Auch einem zügigen Backup FIELDS TERMINATED BY ',' der Datenbank sind mit Binärdaten aufgeblähte ( Tablespaces nicht förderlich. file_name CHAR(255), file_data LOBFILE (file_name) TERMINATED Das Gegenteil ist eine Speicherung im Dateisystem BY EOF ganz ohne Datenbank. Der beobachtetet Zeitaufwand ) eines Kopierens unter Linux („cp“), der als untere ((Ende Programmcode)) Schranke für die Speicherung auf der Festplatte an sich gesehen werden kann, lag nur bei etwa der Hälfte des 3. Nun wird eine Liste der Files benötigt (hier alle mit oben beschriebenen SQLLDR-Aufrufs (mit Direct Path). Unterverzeichnissen): Der Mehrverbrauch von Speicher im Tablespace verglichen mit dem Dateisystem fiel mit nur 1 % sehr ((Beginn Programmcode)) find . | grep –i .jpg | >dir.txt ((Ende Programmcode)) ©2005 gering aus. Um trotzdem von Oracle aus auf die Files zuzugreifen, 4. Auf die Dateien, die als externe Blobs (BFILE) gibt es den Datentyp BFILE. BFILE ist ein Zeiger auf die abgelegt sind, wird erst zugegriffen, wenn sie gelesen Dateien, die im Filesystem bleiben. werden, oder wenn wie hier, ihre Länge bestimmt wird: 1. Zunächst muss ein Directory-Objekt angelegt ((Beginn Programmcode)) werden, das den Pfad enthält sowie die Tabelle selber: select dbms_lob.getlength( file_data ) from bfiles; ((Beginn Programmcode)) ((Ende Programmcode)) CREATE OR REPLACE DIRECTORY BILDER_DIR AS Erst dann merkt man, ob die Pfade und vor allem auch '/bilder'; die Datei-Rechte korrekt sind, wobei der Name des CREATE TABLE bfiles( Directorys BILDER_DIR case-sensitiv ist. Eine weitere file_name VARCHAR2(255) PRIMARY KEY, Einschränkung ist, dass BFILEs nur gelesen werden file_data BFILE können. Will man sie verändern, muss das File-System bemüht werden. ); ((Ende Programmcode)) Fazit 2. Auch das SQLLDR-File ist nur in Details anders: Man kann fast alle Arten von Daten in Oracle speichern, aber nicht immer ist das sinnvoll. Für große binäre ((Beginn Programmcode)) Daten ist das File-System meistens die bessere Wahl. LOAD DATA Wer unbedingt aus Oracle darauf zugreifen will, kann INFILE * das auch mit BFILE erreichen. INTO TABLE bfiles REPLACE Kontakt: FIELDS TERMINATED BY ',' Christof Kaiser ( [email protected] file_name CHAR(255), file_data BFILE(CONSTANT ‘BILDER_DIR’,FILE_NAME) ) ((Ende Programmcode)) 3. Nun ist der folgende SQLLDR-Aufruf sehr schnell, da die Binärdaten nicht kopiert werden müssen. Allerdings ist Direct-Path nicht möglich: ((Beginn Programmcode)) sqlldr userid=blobs/blobs control=bfiles.ctl data=dir.txt ((Ende Programmcode)) ©2005