[+/-]
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.