Multimedia Daten als BLOBs oder BFILEs in Oracle 10.1

Werbung
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
Herunterladen