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_namequery_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 = valueSUPER.
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_nameglobal. 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.
