Der Server mysqld arbeitet mit einer ganzen
Reihe von Systemvariablen, die angeben, wie er konfiguriert
ist. Für alle diese Variablen gibt es Vorgabewerte. Diese
können beim Serverstart über Optionen auf der Befehlszeile
oder in Optionsdateien eingestellt werden. Die meisten
Variablen lassen sich zur Laufzeit des Servers dynamisch
mithilfe der SET
-Anweisung ändern; auf
diese Weise können Sie den Betrieb des Servers beeinflussen,
ohne ihn beenden und neu starten zu müssen. Ferner können
Sie die Werte auch in Ausdrücken verwenden.
Hinweis: Verschiedene Systemvariablen lassen sich mit der
Anweisung SET
aktivieren, indem sie auf
ON
bzw. 1
gesetzt
werden. Ähnlich können Sie sie mit SET
deaktivieren, indem Sie sie auf OFF
bzw.
0
setzen. Um solche Variablen über die
Befehlszeile oder in Optionsdateien einstellen zu können,
müssen Sie sie auf 1
oder
0
setzen (d. h. die Einstellungen
ON
und OFF
funktionieren
nicht). So führt beispielsweise auf der Befehlszeile die
Option --delay_key_write=1
zum gewünschten
Ergebnis – anders als --delay_key_write=ON
.
Der Server verwendet zwei Arten von Systemvariablen. Globale Variablen beeinflussen den Gesamtbetrieb des Servers. Sitzungsvariablen hingegen wirken sich auf seinen Betrieb bezogen auf jeweils individuelle Clientverbindungen aus. Eine gegebene Systemvariable kann sowohl einen globalen als auch einen sitzungsbezogenen Wert haben.
Wenn der Server startet, setzt er alle globalen Variablen auf ihr jeweiligen Standardwerte. Diese Vorgaben können mithilfe von Optionen geändert werden, die in Optionsdateien oder über die Befehlszeile angegeben werden.
Wenn Sie eine Variable, die einen numerischen Wert annimmt,
über eine Startoption konfigurieren, dann kann dieser Wert
mit den Suffixen K
, M
oder G
(in Groß- oder Kleinschreibung)
angegeben werden, um einen Multiplikator von 1.024,
1.0242 oder
1.0243 anzuzeigen. Bei der
Einstellung von key_buffer_size
etwa
würden hiermit die Werte als Kbyte, Mbyte oder Gbyte
angegeben. Der folgende Befehl startet den Server also mit
einem Abfrage-Cache, der eine Größe von 16 Mbyte hat.
mysqld --query_cache_size=16M
Die Groß-/Kleinschreibung der Suffixbuchstaben ist
irrelevant: 16M
und 16m
sind gleichwertig.
Wenn Sie den Maximalwert, auf den eine Systemvariable zur
Laufzeit mit der SET
-Anweisung gesetzt
werden kann, beschränken wollen, können Sie das gewünschte
Maximum mithilfe einer Option des Typs
--maximum-
beim Serverstart festlegen. Um beispielsweise eine Erhöhung
des Wertes von var_name
query_cache_size
auf mehr
als 32 Mbyte zu verhindern, benutzen Sie die Option
--maximum-query_cache_size=32M
.
Wenn der Server gestartet wurde, können diejenigen Variablen,
die dynamisch sind, geändert werden, indem Sie eine
Verbindung mit dem Server herstellen und eine SET
GLOBAL
-Anweisung absetzen.
Um eine globale Variable ändern zu können, benötigen Sie
die Berechtigung var_name
=
value
SUPER
.
Der Server verwendet zudem einen Satz von Sitzungsvariablen
für jeden Client, der eine Verbindung herstellt. Die
Sitzungsvariablen des Clients werden zum Zeitpunkt der
Verbindungsherstellung unter Verwendung der aktuellen Werte
der entsprechenden globalen Variablen initialisiert. So wird
z. B. der SQL-Modus des Clients von der Sitzungsvariable
sql_mode
gesteuert, die, wenn der Client
die Verbindung herstellt, mit dem Wert der globalen Variable
sql_mode
initialisiert wird.
Sitzungsvariablen, die dynamisch sind, kann der Client durch
Absetzen einer SET SESSION
-Anweisung ändern.
Das Einstellen einer Sitzungsvariable erfordert keine
speziellen Berechtigungen, aber ein Client kann nur seine
eigenen Sitzungsvariablen einstellen, nicht jedoch die anderer
Clients.
var_name
=
value
Eine Änderung einer globalen Variable ist für alle Clients
sichtbar, die auf diese globale Variable zugreifen. Allerdings
wirkt sich diese Änderung nur auf die entsprechenden
Sitzungsvariablen derjenigen Clients aus, die nach ihrer
Durchführung eine Verbindung herstellen. Änderungen an
globalen Variablen haben hingegen keinen Einfluss auf die
betreffende Sitzungsvariable derjenigen Clients, die bereits
eine Verbindung hergestellt haben (dies gilt sogar für
Clients, die die SET GLOBAL
-Anweisung
absetzen).
Es gibt unterschiedliche Möglichkeiten, globale und
Sitzungsvariablen zur Laufzeit einzustellen. Die folgenden
Beispiele verwenden sort_buffer_size
als
Beispiel für einen Variablennamen.
Um den Wert einer GLOBAL
-Variable
einzustellen, verwenden Sie eine der folgenden Syntaxen:
SET GLOBAL sort_buffer_size =value
; SET @@global.sort_buffer_size =value
;
Um den Wert einer SESSION
-Variable
einzustellen, verwenden Sie eine der folgenden Syntaxen:
SET SESSION sort_buffer_size =value
; SET @@session.sort_buffer_size =value
; SET sort_buffer_size =value
;
LOCAL
ist ein Synonym für
SESSION
, und @@local.
ist ein Synonym für @@session.
.
Wenn Sie beim Einstellen einer Variable keinen
GLOBAL
- oder
SESSION
-Modifikator angeben, stellt die
Anweisung den Sitzungswert ein.
Um eine falsche Verwendung zu verhindern, erzeugt MySQL einen
Fehler, wenn Sie SET GLOBAL
für eine
Variable verwenden, für die nur SET
SESSION
zulässig ist, oder
GLOBAL
(bzw. @@global.
)
beim Einstellen einer globalen Variable nicht angeben.
Wenn Sie einer Systemvariablen mit SET
einen Wert zuweisen, dann können Sie in diesem Wert keine
Suffixbuchstaben verwenden. Allerdings kann der Wert die Form
eines Ausdrucks annehmen:
SET sort_buffer_size = 10 * 1024 * 1024;
Um explizit anzugeben, ob Sie die globale oder die
Sitzungsvariable einstellen wollen, verwenden Sie die
Modifikatoren GLOBAL
oder
SESSION
:
SET GLOBAL sort_buffer_size = 10 * 1024 * 1024; SET SESSION sort_buffer_size = 10 * 1024 * 1024;
Systemvariablen und ihre Werte zeigen Sie mit der
SHOW VARIABLES
-Anweisung an.
mysql> SHOW VARIABLES;
+---------------------------------+--------------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
| automatic_sp_privileges | ON |
| back_log | 50 |
| basedir | /home/jon/bin/mysql/ |
| binlog_cache_size | 32768 |
| bulk_insert_buffer_size | 8388608 |
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/bin/mysql/share/mysql/charsets/ |
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
...
| innodb_additional_mem_pool_size | 1048576 |
| innodb_autoextend_increment | 8 |
| innodb_buffer_pool_awe_mem_mb | 0 |
| innodb_buffer_pool_size | 8388608 |
| innodb_checksums | ON |
| innodb_commit_concurrency | 0 |
| innodb_concurrency_tickets | 500 |
| innodb_data_file_path | ibdata1:10M:autoextend |
| innodb_data_home_dir | |
...
| version | 5.1.6-alpha-log |
| version_comment | Source distribution |
| version_compile_machine | i686 |
| version_compile_os | suse-linux |
| wait_timeout | 28800 |
+---------------------------------+--------------------------------------+
Um den Wert einer bestimmten
GLOBAL
-Variable abzurufen, geben Sie eine
der folgenden Anweisungen ein:
SELECT @@global.sort_buffer_size; SHOW GLOBAL VARIABLES like 'sort_buffer_size';
Um den Wert einer SESSION
-Variable
abzurufen, geben Sie eine der folgenden Anweisungen ein:
SELECT @@sort_buffer_size; SELECT @@session.sort_buffer_size; SHOW SESSION VARIABLES like 'sort_buffer_size';
Wenn Sie eine Variable mit SELECT
@@
abrufen
(d. h. var_name
global.
oder
session.
nicht angeben), gibt MySQL den
SESSION
-Wert zurück, sofern dieser
vorhanden ist, ansonsten den GLOBAL
-Wert.
Wenn Sie bei SHOW VARIABLES
weder
GLOBAL
noch SESSION
angeben, gibt MySQL die SESSION
-Werte
zurück.
Der Grund dafür, warum das Schlüsselwort
GLOBAL
bei der Einstellung von Variablen
angegeben werden muss, die ohnehin nur global verfügbar sind,
nicht jedoch bei deren Abrufen, besteht darin, zukünftige
Probleme von vornherein auszuschließen. Wenn wir in Zukunft
eine SESSION
-Variable entfernen müssten,
die denselben Namen wie eine
GLOBAL
-Variable hat, würde ein Client mit
der Berechtigung SUPER
möglicherweise
ungewollt die GLOBAL
-Variable ändern –
und nicht die SESSION
-Variable für die
eigene Verbindung. Würden wir ein
SESSION
-Variable mit demselben Namen
hinzufügen, den auch eine GLOBAL
-Variable
hat, dann könnte ein Client, der eigentlich die
GLOBAL
-Variable ändern sollte, am Ende
seine eigene SESSION
-Variable modifizieren.
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.