[+/-]
Die Speicher-Engine InnoDB ist nach
Voreinstellung aktiv. Wenn Sie keine
InnoDB-Tabellen verwenden möchten, setzen Sie
die Option skip-innodb in Ihre
MySQL-Optionsdatei.
Hinweis: Mit
InnoDB verfügt MySQL über eine
transaktionssichere (ACID-konforme)
Speicher-Engine mit Commit-, Rollback- und
Datenwiederherstellungsfähigkeiten. Diese
Fähigkeiten stehen jedoch nur dann zur Verfügung, wenn auch das
zugrunde liegende Betriebssystem und die Hardware
vorschriftsgemäß arbeiten.. Viele Betriebssysteme
oder Festplatten-Subsysteme verzögern Schreiboperationen oder
ordnen sie anders an, um die Leistung zu verbessern. Auf manchen
Betriebssystemen kann sogar der Systemaufruf selbst, der
eigentlich warten sollte, bis alle noch ungespeicherten Daten
einer Datei auf die Platte zurückgeschrieben wurden —
fsync() — bereits zurückkehren, ehe die
Daten in einen dauerhaften Speicher geschrieben wurden. So kann
zum Beispiel ein Betriebssystemabsturz oder ein Stromausfall
Daten, die gerade erst committet wurden, zerstören, oder im
schlimmsten Fall sogar die Datenbank schädigen, indem
Schreiboperationen in die verkehrte Reihenfolge gestellt werden.
Wenn Ihnen an der Integrität Ihrer Daten etwas liegt, sollten Sie
das Verhalten bei Stromausfall testen, ehe Sie etwas in die
Produktionsumgebung einführen. Auf Mac OS X 10.3 und höher
verwendet InnoDB eine spezielle
fcntl()-Methode, um Dateien auf die Festplatte
zurückzuschreiben. Unter Linux empfiehlt es sich, den
Write-Back-Cache zu deaktivieren.
Auf ATAPI-Festplatten kann es funktionieren, mit einem Befehl wie
hdparm -W0 /dev/hda den Write-Back-Cache zu
deaktivieren. Vorsicht! Manche Treiber oder
Festplattencontroller sind nicht in der Lage, den Write-Back-Cache
zu deaktivieren.
Zwei wichtige, von InnoDB verwalteten
Festplattenressourcen sind die Tablespace-Datendateien und die
Logdateien.
Hinweis: Wenn Sie
Konfigurationsoptionen für InnoDB angeben,
erzeugt MySQL eine sich selbst erweiternde, 10MB große Datendatei
namens ibdata1 und zwei 5MB große Logdateien
namens ib_logfile0 und
ib_logfile1 im MySQL Data Directory. Um eine
gute Performance zu erzielen, sollten Sie explizit die in den
folgenden Beispielen erwähnten
InnoDB-Parameter setzen, allerdings natürlich
angepasst an Ihre Hardware und Systemanforderungen.
Die folgenden Beispiele haben nur repräsentativen Charakter. In
Abschnitt 14.2.4, „InnoDB: Startoptionen und Systemvariablen“ erfahren Sie mehr über die
Konfigurationsparameter für InnoDB.
Die InnoDB-Tablespace-Dateien richten Sie ein,
indem Sie die Option innodb_data_file_path im
[mysqld]-Abschnitt der Optionsdatei
my.cnf einstellen. Auf Windows verwenden Sie
stattdessen my.ini. Der
innodb_data_file_path sollte eine Liste mit
einer oder mehreren Datendatei-Spezifikationen sein. Mehrere
Datendateien werden durch Semikola
(‘;’) getrennt:
innodb_data_file_path=datafile_spec1[;datafile_spec2]...
Eine Einstellung, die explizit einen Tablespace mit den Standardmerkmalen anlegt, wäre beispielsweise:
[mysqld] innodb_data_file_path=ibdata1:10M:autoextend
Diese Einstellung konfiguriert eine einzige 10MB große Datendatei
namens ibdata1, die sich selbsttätig
erweitert. Da kein Verzeichnis vorgegeben ist, legt
InnoDB sie im MySQL Data Directory an.
Größen geben Sie an, indem Sie das Suffix M
für MB oder G für GB verwenden.
Ein Tablespace mit einer 50MB großen Datendatei fester Größe
namens ibdata1 und einer 50MB großen,
selbsterweiternden Datei namens ibdata2 im
Data Directory kann folgendermaßen konfiguriert werden:
[mysqld] innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
Zur vollständigen Syntax einer Datendateispezifikation gehören Dateiname, Größe und mehrere optionale Attribute:
file_name:file_size[:autoextend[:max:max_file_size]]
autoextend und die folgenden Attribute können
nur für die letzte Datendatei auf der Zeile
innodb_data_file_path verwendet werden.
Wenn Sie die Option autoextend für die letzte
Datendatei angeben, erweitert InnoDB diese
Datei, sobald sie im Tablespace nicht mehr genug freien Platz hat,
in Inkrementierungsschritten, die auf 8MB voreingestellt sind.
Diese Einstellung kann in der Systemvariablen
innodb_autoextend_increment geändert werden.
Wenn die Platte vollläuft, müssen Sie eine andere Datendatei oder Festplatte hinzufügen. Eine Anleitung zur Rekonfiguration vorhandener Tablespaces finden Sie in Abschnitt 14.2.7, „Hinzufügen und Entfernen von InnoDB-Daten- und -Logdateien“.
Da InnoDB die maximale Dateigröße des
Dateisystems nicht kennt, müssen Sie aufpassen, wenn Ihr
Dateisystem nur einen relativ kleinen Wert wie etwa 2GB zulässt.
Eine Maximalgröße für eine selbsterweiternde Datendatei geben
Sie mit dem Attribut max an. In der folgenden
Konfiguration kann ibdata1 auf bis zu 500MB
anwachsen:
[mysqld] innodb_data_file_path=ibdata1:10M:autoextend:max:500M
InnoDB legt Ttablespace-Dateien standardmäßig
im MySQL Data Directory an. Um ein anderes Verzeichnis anzugeben,
verwenden Sie die Option innodb_data_home_dir.
Wenn sie zum Beispiel zwei Dateien namens
ibdata1 und ibdata2 im
Verzeichnis /ibdata anlegen möchten, müssen
Sie InnoDB wie folgt konfigurieren:
[mysqld] innodb_data_home_dir = /ibdata innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
Hinweis: Da
InnoDB keine Verzeichnisse erstellt, müssen
Sie dafür sorgen, dass /ibdata existiert,
ehe Sie den Server starten. Das gilt auch für
Logdateiverzeichnisse, die Sie konfigurieren. Mit dem Unix- oder
DOS-Befehl mkdir können Sie alle
erforderlichen Verzeichnisse anlegen.
InnoDB bildet Verzeichnispfade für
Datendateien, indem es den Wert von
innodb_data_home_dir mit dem Namen der
Datendatei verkettet, und wenn nötig ein Pfadtrennzeichen
(Schrägstrich oder Backslash) zwischen die Werte setzt. Wenn die
Option innodb_data_home_dir in
my.cnf gar nicht auftaucht, ist der
Standardwert das „Punkt“-Verzeichnis
./, also das MySQL Data Directory. (Der
MySQL-Server macht das Data Directory zum aktuellen
Arbeitsverzeichnis, wenn er seine Arbeit aufnimmt.)
Wenn Sie innodb_data_home_dir als leeren String
angeben, können Sie absolute Pfade für die Datendateien angeben,
die im Wert von innodb_data_file_path
aufgeführt sind. Das folgende Beispiel ist äquivalent zu dem
vorherigen:
[mysqld] innodb_data_home_dir = innodb_data_file_path=/ibdata/ibdata1:50M;/ibdata/ibdata2:50M:autoextend
Ein einfaches
my.cnf-Beispiel. Angenommen, Sie
haben einen Computer mit 128MB Arbeitsspeicher und einer
Festplatte. Das folgende Beispiel zeigt mögliche
Konfigurationsparameter in my.cnf oder
my.ini für InnoDB,
einschließlich des autoextend-Attributs. Das
Beispiel passt zu den meisten Unix- und Windows-Benutzern, die
ihre InnoDB-Datendateien und -Logdateien nicht
auf mehrere Festplatten verteilen möchten. Es legt eine
selbsterweiternde Datendatei namens ibdata1
und zwei InnoDB-Logdateien namens
ib_logfile0 und
ib_logfile1 im MySQL Data Directory an.
Außerdem wird die kleine, archivierte
InnoDB-Logdatei
ib_arch_log_0000000000, die
InnoDB automatisch erstellt, ins Data Directory
gespeichert.
[mysqld] # Hier können Sie Ihre übrigen MySQL-Server-Optionen angeben # ... # Datendateien müssen Daten und Indizes speichern können. # Achten Sie auf ausreichend freien Plattenplatz. innodb_data_file_path = ibdata1:10M:autoextend # # Bufferpool-Größe wird auf 50-80% vom Arbeitsspeicher eingestellt innodb_buffer_pool_size=70M innodb_additional_mem_pool_size=10M # # Logdateigröße wird auf 25% der Bufferpool-Größe eingestellt innodb_log_file_size=20M innodb_log_buffer_size=8M # innodb_flush_log_at_trx_commit=1
Achten Sie darauf, dass der MySQL-Server die richtigen Berechtigungen hat, um Dateien im Data Directory anlegen zu können. Generell benötigt der Server Zugriffsrecht auf jedes Verzeichnis, in dem er Daten- oder Logdateien anlegen soll.
Beachten Sie, dass Datendateien in manchen Dateisystemen höchstens 2GB groß sein dürfen. Die kombinierte Größe aller Logdateien muss unter 4GB liegen und die kombinierte Größe der Datendateien mindestens 10MB betragen.
Wenn Sie zum ersten Mal einen InnoDB-Tablespace
anlegen, starten Sie den MySQL-Server am besten von der
Kommandozeile. Da InnoDB dann Informationen
über die Datenbankerstellung auf dem Bildschirm ausgibt, können
Sie sehen, was geschieht. Wenn beispielsweise auf Windows
mysqld-max im Verzeichnis C:\Program
Files\MySQL\MySQL Server 5.1\bin liegt,
können Sie folgendermaßen starten:
C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld-max" --console
Wenn sie keine Serverausgabe an den Bildschirm schicken, müssen
Sie im Fehlerlog nachschauen, welche Meldungen
InnoDB beim Hochfahren ausgibt.
Unter Abschnitt 14.2.5, „InnoDB-Tablespace erzeugen“ sehen Sie ein Beispiel dafür,
welche Informationen InnoDB anzeigt.
Die InnoDB-Optionen können Sie in die
[mysqld]-Gruppe einer beliebigen Optionsdatei
legen, die Ihr Server beim Hochfahren liest. Speicherorte für
Optionsdateien werden in Abschnitt 4.3.2, „my.cnf-Optionsdateien“
beschrieben.
Wenn Sie MySQL auf Windows mit dem Installations- und
Konfigurationsassistenten installiert haben, liegen die Optionen
in der my.ini-Datei in Ihrem
MySQL-Installationsverzeichnis. Siehe
Abschnitt 2.3.5.14, „Speicherort der Datei my.ini“.
Wenn Ihr PC einen Bootloader nutzt und C:
nicht das Bootverzeichnis ist, haben Sie keine andere
Möglichkeit, als die my.ini-Datei in Ihrem
Windows-Verzeichnis zu benutzen (in der Regel
C:\WINDOWS oder
C:\WINNT). Verwenden Sie den Befehl
SET auf der Kommandozeile eines
Konsolenfensters, um den Wert von WINDIR
auszugeben:
C:\> SET WINDIR
windir=C:\WINDOWS
Wenn Sie sicherstellen möchten, dass
mysqld-Optionen nur aus einer bestimmten Datei
liest, verwenden Sie --defaults-option beim
Serverstart als erste Option auf der Kommandozeile:
mysqld --defaults-file=your_path_to_my_cnf
Ein
fortgeschrittenesmy.cnf-Beispiel.
Angenommen, Sie haben einen Linux-Computer mit 2GB RAM und drei
60GB-Festplatten mit den Verzeichnispfaden /,
/dr2 und /dr3. Das
folgende Beispiel zeigt, welche Konfigurationsparameter man in
my.cnf für InnoDB setzen
könnte.
[mysqld] # Hier können Sie Ihre übrigen MySQL-Server-Optionen angeben # ... innodb_data_home_dir = # # Datendateien müssen Daten und Indizes speichern können. innodb_data_file_path = /ibdata/ibdata1:2000M;/dr2/ibdata/ibdata2:2000M:autoextend # # Setzen Sie die Bufferpool-Größe auf 50-80% des Arbeitsspeichers, # aber achten Sie darauf, dass für Linux x86 die gesamte Speichernutzung < 2GB ist. innodb_buffer_pool_size=1G innodb_additional_mem_pool_size=20M innodb_log_group_home_dir = /dr3/iblogs # innodb_log_files_in_group = 2 # # Setzen Sie die Logdateigröße auf circa 25% der Bufferpool-Größe innodb_log_file_size=250M innodb_log_buffer_size=8M # innodb_flush_log_at_trx_commit=1 innodb_lock_wait_timeout=50 # # Kommentieren Sie die nächsten Zeilen aus, wenn Sie sie nutzen möchten #innodb_thread_concurrency=5
In manchen Fällen steigt die Datenbank-Performance, wenn nicht
alle Daten auf derselben physikalischen Platte liegen. Oft ist es
gut für die Performance, wenn die Logdateien auf einer anderen
Festplatte liegen. Das Beispiel zeigt, wie das geht: Es speichert
zwei Dateien auf verschiedenen Festplatten und legt die Logdateien
auf eine dritte Platte. InnoDB füllt den
Tablespace beginnend mit der ersten Datendatei. Für einen
schnelleren Zugriff können Sie auch rohe Festplattenpartitionen
(Raw Devices) als InnoDB-Datendateien
verwenden. Siehe Abschnitt 14.2.3.2, „Verwendung von Raw Devices für den Shared Tablespace“.
Warnung: Auf 32-Bit GNU/Linux x86
dürfen Sie die Arbeitsspeichernutzung nicht zu hoch einstellen.
Wenn glibc den Prozess-Heap über die
Thread-Stacks hinauswachsen lässt, stürzt der Server ab. Wenn
der Wert des folgenden Ausdrucks 2GB erreicht oder übersteigt,
ist Gefahr in Verzug:
innodb_buffer_pool_size + key_buffer_size + max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size) + max_connections*2MB
Jeder Thread benutzt einen Stack (oft 2MB, aber in den Binaries
von MySQL AB nur 256KB) und im schlimmsten Fall auch
sort_buffer_size + read_buffer_size
zusätzlichen Arbeitsspeicher.
Indem Sie MySQL selbst kompilieren, können Sie bis zu 64GB
physikalischen Speicher in 32-Bit Windows verwenden. Siehe
Beschreibung von innodb_buffer_pool_awe_mem_mb
in Abschnitt 14.2.4, „InnoDB: Startoptionen und Systemvariablen“.
Wie werden die anderen mysqld-Serverparameter eingestellt? Die folgenden Werte sind typisch und eignen sich für die meisten Nutzer:
[mysqld]
skip-external-locking
max_connections=200
read_buffer_size=1M
sort_buffer_size=1M
#
# Setzen Sie key_buffer auf 5 - 50% Ihres Arbeitsspeichers, je nachdem, wie
# oft Sie MyISAM-Tabellen benutzen, aber behalten Sie key_buffer_size + InnoDB
# buffer pool size < 80% Ihres Arbeitsspeichers
key_buffer_size=value
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.
