mysql
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| mysql [2025-06-24 15:30:05] – [VIEWs zeigen] manfred | mysql [2025-09-12 12:37:11] (aktuell) – [auf Platte] manfred | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== MySQL ====== | ||
| + | |||
| + | Aussprache des Namens: Die offizielle Aussprache ist **Mei-es-kju-ell**. | ||
| + | |||
| + | Seit '' | ||
| + | Seit '' | ||
| + | |||
| + | Welche MySQL-Variante ist installiert? | ||
| + | > dpkg -l | grep -Ei ' | ||
| + | |||
| + | * [[:: | ||
| + | * **__[[https:// | ||
| + | * '' | ||
| + | * __Die MySQL-Versionen haben einen Lebenszyklus von 8 Jahren__ | ||
| + | * [[https:// | ||
| + | * **[[https:// | ||
| + | * '' | ||
| + | * '' | ||
| + | * //MySQL 5.6: 05. Februar 2021// | ||
| + | * //MySQL 5.5: 03. December 2018// | ||
| + | * //MySQL 5.1: 31. December 2013// | ||
| + | * //MySQL 5.0: 09. January 2012// | ||
| + | * **__[[https:// | ||
| + | * **[[:: | ||
| + | * [[::Percona xtrabackup]] | ||
| + | * **__[[https:// | ||
| + | * [[:: | ||
| + | * // | ||
| + | |||
| + | __Ab Version 8.0 ist MySQL nicht mehr abwärtskompatibel – weder zu älteren MySQL-Versionen noch zu MariaDB.__ //MariaDB möchte sich von MySQL zukünftig vor allem durch Flexibilität abgrenzen. Anwendern steht neben den von MySQL unterstützten Standard-Engines eine stetig wachsende Anzahl alternativer Datenbank-Engines für spezielle Anwendungsfälle zur Verfügung.// | ||
| + | |||
| + | > echo "SHOW VARIABLES WHERE Variable_name LIKE (' | ||
| + | +-------------------------+-------------------------------------------------------------------------------------+ | ||
| + | | Variable_name | ||
| + | +-------------------------+-------------------------------------------------------------------------------------+ | ||
| + | | version | ||
| + | | version_comment | ||
| + | | version_compile_machine | x86_64 | ||
| + | | version_compile_os | ||
| + | | version_compile_zlib | ||
| + | | version_suffix | ||
| + | +-------------------------+-------------------------------------------------------------------------------------+ | ||
| + | |||
| + | ignore-db-dir | ||
| + | |||
| + | * [[http:// | ||
| + | * [[https:// | ||
| + | |||
| + | * [[Cluster-Eigenschaften der verschiedenen MySQL-Derivate]] | ||
| + | * // | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | - '' | ||
| + | - '' | ||
| + | - '' | ||
| + | - '' | ||
| + | - '' | ||
| + | * [[Installation von MySQL 5.6.13 auf Ubuntu 13.10]] | ||
| + | * [[Installation von MySQL 5.7 auf Ubuntu 16.04.5 LTS]] | ||
| + | * [[MySQL-Repository für Ubuntu einbinden]] | ||
| + | * Cluster-Verwaltung | ||
| + | * [[MySQL-MMM]] - wird nicht mehr gepflegt | ||
| + | * [[KeepaliveD]] | ||
| + | * [[Percona XtraDB Cluster (PXC)]] - eine von Percona verbesserte Version von MySQL | ||
| + | * [[MySQL mit SSL verschlüsselten Verbindungen]] | ||
| + | |||
| + | |||
| + | ==== Maximale Anzahl der bisher gleichzeitigen Verbindungen (Galera/ | ||
| + | |||
| + | <hidden ~/ | ||
| + | <file bash ~/ | ||
| + | #!/bin/bash | ||
| + | |||
| + | for S in $(ls / | ||
| + | do | ||
| + | echo "SHOW STATUS;" | ||
| + | echo | ||
| + | done | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <code lua> | ||
| + | # / | ||
| + | 4 db01: | ||
| + | 1084 db01: | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== RAM-Verbrauch abschätzen ==== | ||
| + | |||
| + | <code lua> | ||
| + | > touch ~/ | ||
| + | > chmod 0755 ~/ | ||
| + | > vim ~/ | ||
| + | </ | ||
| + | |||
| + | <hidden ~/ | ||
| + | <file bash ~/ | ||
| + | #!/bin/bash | ||
| + | |||
| + | # | ||
| + | VERSION=" | ||
| + | |||
| + | if [ x = " | ||
| + | STECKER=" | ||
| + | else | ||
| + | STECKER=" | ||
| + | fi | ||
| + | |||
| + | # mysqlshow --defaults-file=~/ | ||
| + | MYSQL_AUSGABE=" | ||
| + | echo " | ||
| + | echo "# key_buffer_size + (read_buffer_size + sort_buffer_size) * max_connections = K bytes of memory" | ||
| + | KEY_BUFFER_SIZE=" | ||
| + | READ_BUFFER_SIZE=" | ||
| + | SORT_BUFFER_SIZE=" | ||
| + | MAX_CONNECTIONS=" | ||
| + | echo " | ||
| + | SHOW STATUS; | ||
| + | SHOW VARIABLES; | ||
| + | " | mysql -N ${STECKER} | grep -Ei ' | ||
| + | echo | ||
| + | echo " | ||
| + | echo " | ||
| + | echo | ||
| + | free -m | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <code lua> | ||
| + | > ~/ | ||
| + | key_buffer_size 4194304 | ||
| + | max_connections 50 | ||
| + | read_buffer_size 65536 | ||
| + | sort_buffer_size 131072 | ||
| + | # key_buffer_size + (read_buffer_size + sort_buffer_size) * max_connections = K bytes of memory | ||
| + | Max_used_connections 31 | ||
| + | Max_used_connections_time 2024-06-12 00:25:12 | ||
| + | max_allowed_packet 33554432 | ||
| + | |||
| + | MySQL-RAM-Bedarf: | ||
| + | |||
| + | total used free shared | ||
| + | Mem: 15997 9797 | ||
| + | Swap: | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== verschiedene MySQL-Cluster-Varianten ===== | ||
| + | |||
| + | * //Die [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * //Im [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | |||
| + | ==== Asynchrone MySQL-Replikation ==== | ||
| + | |||
| + | * [[:: | ||
| + | |||
| + | |||
| + | ==== Synchrone MySQL-Replikation ==== | ||
| + | |||
| + | * [[::Percona XtraDB Cluster (PXC)]] | ||
| + | * [[::Percona XtraDB Cluster + Galera]] | ||
| + | * [[:: | ||
| + | |||
| + | |||
| + | ===== verschiedenes ===== | ||
| + | |||
| + | __Kurtzübersicht SQL:__ | ||
| + | * (Lese-)Rechte auf alle Tabellen einer DB erteilen: '' | ||
| + | * Tabelle umbenennen bzw. verschieben: | ||
| + | * alle Tabellenpartitionen anzeigen: '' | ||
| + | * Inhalt einer Partition zählen: '' | ||
| + | * [[https:// | ||
| + | * Datensatz ändern: '' | ||
| + | * Datensatz löschen //(einzelne Datensätze, | ||
| + | * Datensatz löschen //(alles, schnell)//: '' | ||
| + | * Root-Passwort ändern (vor MySQL 8.0): '' | ||
| + | * Root-Passwort ändern (ab MySQL 8.0): '' | ||
| + | |||
| + | //'' | ||
| + | |||
| + | einen Benutzer mit Passwort in einer anderen DB eintragen, ohne das Passwort kennen zu müssen: | ||
| + | # echo " | ||
| + | ... | ||
| + | CREATE USER fritz; | ||
| + | CREATE USER fritz IDENTIFIED BY ' | ||
| + | CREATE USER fritz IDENTIFIED WITH mysql_native_password AS ' | ||
| + | | ||
| + | ALTER USER fritz IDENTIFIED BY ' | ||
| + | UPDATE mysql.user SET authentication_string=" | ||
| + | FLUSH PRIVILEGES; | ||
| + | ... | ||
| + | |||
| + | Aus diesen '' | ||
| + | |||
| + | > echo "SHOW DATABASES LIKE ' | ||
| + | +------------------+ | ||
| + | | Database (mysql) | | ||
| + | +------------------+ | ||
| + | | mysql | | ||
| + | +------------------+ | ||
| + | |||
| + | > echo "USE mysql; SHOW TABLES LIKE ' | ||
| + | +------------------------+ | ||
| + | | Tables_in_mysql (user) | | ||
| + | +------------------------+ | ||
| + | | user | | ||
| + | +------------------------+ | ||
| + | |||
| + | |||
| + | MySQL mit Replikation | ||
| + | * '' | ||
| + | |||
| + | |||
| + | ==== Variablen ausgeben ==== | ||
| + | |||
| + | '' | ||
| + | |||
| + | '' | ||
| + | |||
| + | SELECT @@server_id | ||
| + | SELECT CONCAT(@@server_id, | ||
| + | SHOW VARIABLES LIKE ' | ||
| + | SHOW VARIABLES WHERE Variable_name IN (' | ||
| + | SHOW STATUS WHERE Variable_name IN (' | ||
| + | |||
| + | |||
| + | ==== nach Datum selektiert ausgeben ==== | ||
| + | |||
| + | * aktueller Zeitstempel: | ||
| + | * aktuelles/ | ||
| + | * heutiges Datum: '' | ||
| + | * gestriges Datum: '' | ||
| + | * Datum von Vorgestern: '' | ||
| + | |||
| + | die 10 ältesten Einträge von Gestern, absteigend sortiert: | ||
| + | SELECT zeitstempel | ||
| + | FROM datenbank.tabelle | ||
| + | WHERE zeitstempel < DATE(NOW() - INTERVAL 0 DAY) | ||
| + | AND zeitstempel > DATE(NOW() - INTERVAL 1 DAY) | ||
| + | ORDER BY zeitstempel | ||
| + | ASC | ||
| + | LIMIT 10; | ||
| + | |||
| + | die 10 jüngsten Einträge von Gestern, aufsteigend sortiert: | ||
| + | SELECT zeitstempel | ||
| + | FROM datenbank.tabelle | ||
| + | WHERE zeitstempel < DATE(NOW() - INTERVAL 0 DAY) | ||
| + | AND zeitstempel > DATE(NOW() - INTERVAL 1 DAY) | ||
| + | ORDER BY zeitstempel | ||
| + | DESC | ||
| + | LIMIT 10; | ||
| + | |||
| + | die 10 ältesten Einträge von Vorgestern, absteigend sortiert: | ||
| + | SELECT zeitstempel | ||
| + | FROM datenbank.tabelle | ||
| + | WHERE zeitstempel < DATE(NOW() - INTERVAL 1 DAY) | ||
| + | AND zeitstempel > DATE(NOW() - INTERVAL 2 DAY) | ||
| + | ORDER BY zeitstempel | ||
| + | ASC | ||
| + | LIMIT 10; | ||
| + | |||
| + | |||
| + | ==== VIEWs zeigen ==== | ||
| + | |||
| + | > echo "SHOW STATUS WHERE variable_name LIKE ' | ||
| + | +---------------------------+---------------------+ | ||
| + | | Variable_name | ||
| + | +---------------------------+---------------------+ | ||
| + | | Max_used_connections | ||
| + | | Max_used_connections_time | 2025-06-24 10:19:25 | | ||
| + | | Uptime | ||
| + | +---------------------------+---------------------+ | ||
| + | |||
| + | |||
| + | ==== VIEWs zeigen ==== | ||
| + | |||
| + | alle VIEWs in der DB zeigen: | ||
| + | > echo " | ||
| + | |||
| + | alle VIEWs in einer bestimmten DB zeigen: | ||
| + | > echo "SHOW FULL TABLES IN DatenBankName WHERE table_type = ' | ||
| + | |||
| + | nur eine mit Details anzeigen (die Platzhalter in den eckigen Klammern, werden bei der Ausgabe von "'' | ||
| + | > echo "SHOW CREATE VIEW [TABLE_NAME] \G;" | mysql -t [TABLE_SCHEMA] | ||
| + | > echo "SHOW CREATE VIEW viewname \G;" | mysql -t datenbankname | ||
| + | |||
| + | |||
| + | ==== Dirty Pages ==== | ||
| + | |||
| + | > echo "SHOW VARIABLES LIKE ' | ||
| + | +----------------------------+-----------+ | ||
| + | | Variable_name | ||
| + | +----------------------------+-----------+ | ||
| + | | innodb_max_dirty_pages_pct | 75.000000 | | ||
| + | +----------------------------+-----------+ | ||
| + | +--------------------------------+---------+ | ||
| + | | Variable_name | ||
| + | +--------------------------------+---------+ | ||
| + | | Innodb_buffer_pool_pages_dirty | 115 | | ||
| + | | Innodb_buffer_pool_bytes_dirty | 1884160 | | ||
| + | +--------------------------------+---------+ | ||
| + | |||
| + | Stellt man "'' | ||
| + | |||
| + | |||
| + | ==== Eine Tabelle stückchenweise durchlaufen ==== | ||
| + | |||
| + | <file bash / | ||
| + | #!/bin/bash | ||
| + | |||
| + | DB=" | ||
| + | TAB=" | ||
| + | |||
| + | VON=" | ||
| + | ANZAHL=" | ||
| + | # | ||
| + | NR=" | ||
| + | while (( " | ||
| + | do | ||
| + | # hier wird die Größe der Datensätze aus einer Spalte gemessen und in eine andere Tabelle geschrieben | ||
| + | echo " | ||
| + | VON=" | ||
| + | done | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Überwachung ==== | ||
| + | |||
| + | <file bash / | ||
| + | #!/bin/bash | ||
| + | |||
| + | # | ||
| + | # | ||
| + | # DB-Check | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # / | ||
| + | # | ||
| + | # mysqladmin --defaults-file=/ | ||
| + | # mysqld is alive | ||
| + | # | ||
| + | # | ||
| + | |||
| + | DB_STATUS=$(mysqladmin --defaults-file=/ | ||
| + | |||
| + | #echo " | ||
| + | # | ||
| + | #" | ||
| + | |||
| + | if [ " | ||
| + | then | ||
| + | # An | ||
| + | exit 0; | ||
| + | else | ||
| + | # Aus | ||
| + | exit 1; | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Benchmark ==== | ||
| + | |||
| + | * [[MySQL - Benchmark]] | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | |||
| + | === Tabelle per SQL in eine andere Datenbank kopieren === | ||
| + | |||
| + | [[http:// | ||
| + | |||
| + | > CREATE TABLE db2.newTable LIKE db1.oldTable | ||
| + | > ALTER TABLE db2.newTable DISABLE KEYS | ||
| + | |||
| + | alle Tabellen: | ||
| + | > INSERT INTO db2.newTable SELECT * FROM db1.oldTable | ||
| + | |||
| + | ausgewählte Spalten: | ||
| + | > INSERT INTO db2.newTable (sp3, | ||
| + | |||
| + | > ALTER TABLE db2.newTable ENABLE KEYS | ||
| + | |||
| + | aus einer Tabelle ('' | ||
| + | > for id in 1 2 3 4 5 6 7 8 9 ; do echo " | ||
| + | |||
| + | |||
| + | === InnoDB Status === | ||
| + | |||
| + | > SHOW ENGINE INNODB STATUS; | ||
| + | |||
| + | Aus dieser Ausgabe kann man folgende Informationen gewinnen: | ||
| + | * BACKGROUND THREAD | ||
| + | * SEMAPHORES | ||
| + | * //LATEST DETECTED DEADLOCK// | ||
| + | * TRANSACTIONS | ||
| + | * FILE I/O | ||
| + | * INSERT BUFFER AND ADAPTIVE HASH INDEX | ||
| + | * LOG | ||
| + | * BUFFER POOL AND MEMORY | ||
| + | * INDIVIDUAL BUFFER POOL INFO | ||
| + | * ROW OPERATIONS | ||
| + | |||
| + | === MySQL-Sicherungsmethoden === | ||
| + | |||
| + | Für dieses Beispiel wurde eine VM mit zwei CPU-Kernen und einem MySQL-Volumen (LVM) von ca. 280GiB größe verwendet. | ||
| + | Die MySQL-Daten in dem Verzeichnis bzw. auf dem Volumen belegen, inklusive BIN-LOGs, ca. 99 GiB. | ||
| + | Alle folgenden Angaben beziehen sich auf diese Werte. | ||
| + | |||
| + | Im ersten anlauf wurde ein Verzeichnis per SSHFS eingebunden und dort ein (mit gzip gepackter) Dump abgelegt. | ||
| + | |||
| + | Es wurde dieses Kommando dafür eingesetzt (mit Bandbreitenbegrenzung auf 3 MiB/s: mit "'' | ||
| + | * '' | ||
| + | * unkomprimierte Dump-Größe: | ||
| + | * komprimierte Dump-Größe: | ||
| + | |||
| + | Weiterhin gibt es die Möglichkeit ein LVM-SnapShot als Sicherung zu verwendet, dabei wären dann auch die BIN-LOG' | ||
| + | |||
| + | Ein experimenteller Sicherungstest hat folgende Messwerte ergeben: | ||
| + | * '' | ||
| + | * unkomprimierte Daten-Größe: | ||
| + | * Archiv-Größe: | ||
| + | * '' | ||
| + | * unkomprimierte Daten-Größe: | ||
| + | * Archiv-Größe: | ||
| + | |||
| + | Daraus geht eindeutig hervor, dass in diesem Beispiel das packen mit 7-Zip deutlich effizienter ist als das packen Einsatz von BZip2. | ||
| + | |||
| + | |||
| + | |||
| + | ===== passwortlosen Login ===== | ||
| + | |||
| + | |||
| + | == ~/.my.cnf == | ||
| + | |||
| + | [client] | ||
| + | host = localhost | ||
| + | user = root | ||
| + | password = geheim | ||
| + | socket | ||
| + | |||
| + | speziell bei Debian kann man das (als " | ||
| + | # ln -s / | ||
| + | |||
| + | |||
| + | == meine_zugangsdaten.cnf == | ||
| + | |||
| + | [client] | ||
| + | user = root | ||
| + | password = ganzgeheim | ||
| + | socket | ||
| + | |||
| + | Das kann man so machen, __zu beachten ist__, dass die Option //'' | ||
| + | > mysqlshow --defaults-file=/ | ||
| + | > mysqlshow --defaults-file=/ | ||
| + | > mysqlshow --defaults-file=/ | ||
| + | |||
| + | |||
| + | ===== Allgemeines ===== | ||
| + | |||
| + | sonst liest MySQL die vorgesehene Konfiguration mein Start nicht ein: | ||
| + | # chmod 0644 / | ||
| + | |||
| + | Ein __klassischer MySQL_5-Cluster__ orientiert sich an der Variablen ''" | ||
| + | > echo " | ||
| + | +-------------+ | ||
| + | | @@server_id | | ||
| + | +-------------+ | ||
| + | | 1002 | | ||
| + | +-------------+ | ||
| + | |||
| + | oder so | ||
| + | > echo "SHOW VARIABLES LIKE ' | ||
| + | +---------------+-------+ | ||
| + | | Variable_name | Value | | ||
| + | +---------------+-------+ | ||
| + | | server_id | ||
| + | +---------------+-------+ | ||
| + | |||
| + | Ein __Galera-Cluster__ orientiert sich an der Variablen ''" | ||
| + | > echo "SHOW VARIABLES WHERE Variable_name IN (' | ||
| + | +--------------------+-------------+ | ||
| + | | Variable_name | ||
| + | +--------------------+-------------+ | ||
| + | | wsrep_cluster_name | meincluster | | ||
| + | +--------------------+-------------+ | ||
| + | |||
| + | __Hinweis für die Nutzung von Galera__ => **Es dürfen in den Datenbanken nur InnoDB-Tabellen und keine MyISAM-Tabelle verwendet werden! Überprüfen kann man das mit diesem Kommando**: | ||
| + | mysqlshow | grep -E ' | ||
| + | |||
| + | |||
| + | === eine Tabelle in eine Datei speichern und aus einer Datei wiederherstellen === | ||
| + | |||
| + | aus Sicherheitsgründen darf MySQL nur in ein bestimmtes Verzeichnis schreiben und aus ihm lesen: | ||
| + | > echo "SHOW VARIABLES LIKE ' | ||
| + | |||
| + | so wird der Inhalt einer Tabelle in eine Datei geschrieben: | ||
| + | > echo " | ||
| + | |||
| + | so wird der Inhalt aus einer Datei in eine Tabelle geschrieben: | ||
| + | > echo "LOAD DATA INFILE '/ | ||
| + | |||
| + | Hierbei muss man auf die Feldtrennzeichen (in diesem Beispiel ' | ||
| + | |||
| + | |||
| + | === LOAD DATA INFILE === | ||
| + | |||
| + | <code bash> | ||
| + | echo " | ||
| + | echo "GRANT SELECT, INSERT, UPDATE, DELETE ON * TO ' | ||
| + | echo "GRANT FILE, SUPER ON *.* TO ' | ||
| + | echo "SHOW GRANTS FOR superuser;" | ||
| + | </ | ||
| + | |||
| + | <file sql Tabellen_anlegen.sql> | ||
| + | DROP TABLE IF EXISTS `dbname`.`tabname`; | ||
| + | |||
| + | CREATE TABLE `dbname`.`tabname` ( | ||
| + | `id` int NOT NULL AUTO_INCREMENT, | ||
| + | `pwhash` varchar(768) NOT NULL, | ||
| + | `count` varchar(2) NOT NULL, | ||
| + | PRIMARY KEY (`id`), | ||
| + | KEY `pwhash_INDEX` (`pwhash`) | ||
| + | ) ENGINE=InnoDB | ||
| + | /*!50100 PARTITION BY HASH (`id`) | ||
| + | PARTITIONS 128 */ | ||
| + | ; | ||
| + | |||
| + | SHOW CREATE TABLE `dbname`.`tabname`; | ||
| + | </ | ||
| + | |||
| + | <code text Beispiel aus Doku> | ||
| + | SET GLOBAL local_infile=1; | ||
| + | |||
| + | LOAD DATA LOCAL INFILE ' | ||
| + | FIELDS TERMINATED BY ',' | ||
| + | ENCLOSED BY '"' | ||
| + | LINES TERMINATED BY ' | ||
| + | IGNORE 1 LINES | ||
| + | (col1, col2, col3, col4, col5...); | ||
| + | </ | ||
| + | |||
| + | <code c test.sql> | ||
| + | SET GLOBAL local_infile=1; | ||
| + | |||
| + | START TRANSACTION; | ||
| + | LOAD DATA LOCAL INFILE ' | ||
| + | FIELDS TERMINATED BY ':' | ||
| + | LINES TERMINATED BY ' | ||
| + | (pwhash, count); | ||
| + | COMMIT; | ||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | cat test.sql | mysql --local-infile=1 -usuperuser -p... | ||
| + | echo " | ||
| + | +----+-------------------------------------+-------+ | ||
| + | | id | pwhash | ||
| + | +----+-------------------------------------+-------+ | ||
| + | | 1 | 001C6CE64AFA01E95015ABAE848E45F6E01 | 4 | | ||
| + | | 2 | 001C6CE64AFA01E95015ABAE848E45F6E02 | 4 | | ||
| + | | 3 | 001C6CE64AFA01E95015ABAE848E45F6E03 | 4 | | ||
| + | | 4 | 001C6CE64AFA01E95015ABAE848E45F6E04 | 4 | | ||
| + | | 5 | 001C6CE64AFA01E95015ABAE848E45F6E05 | 4 | | ||
| + | | 6 | 001C6CE64AFA01E95015ABAE848E45F6E06 | 4 | | ||
| + | | 7 | 001C6CE64AFA01E95015ABAE848E45F6E07 | 4 | | ||
| + | | 8 | 001C6CE64AFA01E95015ABAE848E45F6E08 | 4 | | ||
| + | | 9 | 001C6CE64AFA01E95015ABAE848E45F6E09 | 4 | | ||
| + | | 10 | 001C6CE64AFA01E95015ABAE848E45F6E10 | 4 | | ||
| + | +----+-------------------------------------+-------+ | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== bekannte Fehler und ihre Lösungen ==== | ||
| + | |||
| + | === Too many connections === | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | |||
| + | === zuviele relay log's === | ||
| + | |||
| + | damit die Relay-Logs abgearbeitet werden, muss der SLAVE-Prozess (mindestens der '' | ||
| + | > echo "STOP SLAVE;" | ||
| + | > echo "START SLAVE SQL_THREAD;" | ||
| + | > echo "FLUSH RELAY LOGS;" | mysql | ||
| + | |||
| + | danach: | ||
| + | > echo "START SLAVE;" | ||
| + | |||
| + | |||
| + | === Repairing The Replication: | ||
| + | |||
| + | > echo "STOP SLAVE;" | ||
| + | > echo "SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;" | mysql | ||
| + | > echo "START SLAVE;" | ||
| + | |||
| + | |||
| + | ==== SQL Error (2027): Malformed packet ==== | ||
| + | |||
| + | This error only occurs if the result set is more than a certain number of rows (using LIMIT 14561 rows works, 14562 gives this error). | ||
| + | |||
| + | Oft tritt dieser Fehler auf, wenn CSV-Dateien importiert werden, die unsauber formatiert sind. | ||
| + | |||
| + | |||
| + | ==== arbeiten mit TEMPORARY TABLE ==== | ||
| + | |||
| + | In diesem Beispiel haben wir in einer Datenbank ('' | ||
| + | Die Bedingung lautet, dass die Datensätze von vor dem 2021-01-29 sein sollen, keinen Datumseintrag haben sollen, der Status ' | ||
| + | |||
| + | Zuerst wird mit '' | ||
| + | Im mittleren Block werden die benötigten IDs ausgelesen und in die " | ||
| + | Und im letzten Block werden innerhalb einer Transaktion alle Datensätze aus beiden Tabellen gelöscht, die einer der IDs aus der " | ||
| + | |||
| + | <file sql beispiel_mit_temporary_table.sql> | ||
| + | USE testdatenbank; | ||
| + | |||
| + | CREATE TEMPORARY TABLE temp_tabelle( | ||
| + | id INT PRIMARY KEY | ||
| + | ); | ||
| + | |||
| + | INSERT INTO temp_tabelle | ||
| + | SELECT id | ||
| + | FROM test_tabelle_1 | ||
| + | WHERE (startDate < ' | ||
| + | AND state IN (' | ||
| + | AND kategorie IN (73, | ||
| + | ; | ||
| + | |||
| + | START TRANSACTION; | ||
| + | DELETE FROM test_tabelle_1 WHERE id IN (SELECT id FROM temp_tabelle); | ||
| + | DELETE FROM test_tabelle_2 WHERE id IN (SELECT id FROM temp_tabelle); | ||
| + | COMMIT; | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Start mit MySQL ===== | ||
| + | |||
| + | sollte es Fehlermeldungen beim Start geben, dann kann oft eines dieser Kommandos helfen: | ||
| + | > mysqlcheck -Ag --auto-repair | ||
| + | > mysql_upgrade --force | ||
| + | |||
| + | Ab **MySQL 8.0**: | ||
| + | > mysql_upgrade | ||
| + | The mysql_upgrade client is now deprecated. The actions executed by the upgrade client are now done by the server. | ||
| + | To upgrade, please start the new MySQL binary with the older data directory. Repairing user tables is done automatically. | ||
| + | Restart is not required after upgrade. | ||
| + | The upgrade process automatically starts on running a new MySQL binary with an older data directory. | ||
| + | To avoid accidental upgrades, please use the --upgrade=NONE option with the MySQL binary. | ||
| + | The option --upgrade=FORCE is also provided to run the server upgrade sequence on demand. | ||
| + | It may be possible that the server upgrade fails due to a number of reasons. | ||
| + | In that case, the upgrade sequence will run again during the next MySQL server start. | ||
| + | If the server upgrade fails repeatedly, the server can be started with the --upgrade=MINIMAL option | ||
| + | to start the server without executing the upgrade sequence, thus allowing users to manually rectify the problem. | ||
| + | |||
| + | __die Strucktur (das Schema) aller Datenbanken schreibt man so raus:__ | ||
| + | # mysqldump -Ad | ||
| + | # mysqldump --opt -AEcd | ||
| + | |||
| + | den Typ und die DB-Engine aller Tabellen in dem DBMS ausgeben: | ||
| + | # echo " | ||
| + | +--------------------------+---------------------------------------+-------------+--------+ | ||
| + | | table_schema | ||
| + | +--------------------------+---------------------------------------+-------------+--------+ | ||
| + | ... | ||
| + | | information_schema | ||
| + | | kontakt | ||
| + | ... | ||
| + | |||
| + | MySQL commands: | ||
| + | Note that all text commands must be first on line and end with ';' | ||
| + | help (\h) | ||
| + | ? | ||
| + | clear | ||
| + | connect (\r) | ||
| + | edit (\e) Edit command with $EDITOR. | ||
| + | ego | ||
| + | exit (\q) Exit mysql. Same as quit. | ||
| + | go (\g) Send command to mysql server. | ||
| + | nopager (\n) | ||
| + | notee | ||
| + | pager | ||
| + | print | ||
| + | quit (\q) Quit mysql. | ||
| + | rehash | ||
| + | source | ||
| + | status | ||
| + | tee | ||
| + | use | ||
| + | |||
| + | |||
| + | ==== ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository ==== | ||
| + | |||
| + | will man eine Replikation aufbauen, dann kommt es gelegentlich zu dieser Fehlermeldung: | ||
| + | < | ||
| + | *************************** 2. row *************************** | ||
| + | | ||
| + | Master_Host: | ||
| + | Master_User: | ||
| + | Master_Port: | ||
| + | Connect_Retry: | ||
| + | Master_Log_File: | ||
| + | Read_Master_Log_Pos: | ||
| + | | ||
| + | Relay_Log_Pos: | ||
| + | Relay_Master_Log_File: | ||
| + | | ||
| + | Slave_SQL_Running: | ||
| + | Replicate_Do_DB: | ||
| + | Replicate_Ignore_DB: | ||
| + | | ||
| + | | ||
| + | Replicate_Wild_Do_Table: | ||
| + | Replicate_Wild_Ignore_Table: | ||
| + | | ||
| + | | ||
| + | | ||
| + | Exec_Master_Log_Pos: | ||
| + | Relay_Log_Space: | ||
| + | Until_Condition: | ||
| + | | ||
| + | Until_Log_Pos: | ||
| + | | ||
| + | | ||
| + | | ||
| + | Master_SSL_Cert: | ||
| + | Master_SSL_Cipher: | ||
| + | | ||
| + | Seconds_Behind_Master: | ||
| + | Master_SSL_Verify_Server_Cert: | ||
| + | Last_IO_Errno: | ||
| + | Last_IO_Error: | ||
| + | | ||
| + | | ||
| + | Replicate_Ignore_Server_Ids: | ||
| + | | ||
| + | Master_UUID: | ||
| + | | ||
| + | SQL_Delay: 0 | ||
| + | SQL_Remaining_Delay: | ||
| + | Slave_SQL_Running_State: | ||
| + | | ||
| + | Master_Bind: | ||
| + | Last_IO_Error_Timestamp: | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | Executed_Gtid_Set: | ||
| + | dcd4eaf5-2411-11e6-b91b-842b2b6265d0: | ||
| + | e9c12dc7-3d36-11e6-ae3f-842b2b626ca2: | ||
| + | Auto_Position: | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Dann kann es oft schon helfen, wenn man einfach nur das macht: | ||
| + | > echo "STOP SLAVE ; START SLAVE ;" | mysql -S / | ||
| + | |||
| + | ...sollte es dann weiterhin zu dieser Fehlermeldung kommen, zusätzlich einen Restart des DBMS: | ||
| + | > / | ||
| + | > echo "STOP SLAVE ; START SLAVE ;" | mysql -S / | ||
| + | |||
| + | ...sollte jetzt immer noch dieser Fehlermeldung ausgegeben werden, dann müssen wir einen '' | ||
| + | |||
| + | **Dabei ist aber Vorsicht geboten! Besonders, wenn man mit '' | ||
| + | |||
| + | In diesem Beispiel hat der **Channel '' | ||
| + | Also dürfen wir auch nur den betroffenen Channel reseten: | ||
| + | > echo "RESET SLAVE FOR CHANNEL ' | ||
| + | |||
| + | dann sieht die Statusausgabe so aus: | ||
| + | < | ||
| + | *************************** 2. row *************************** | ||
| + | | ||
| + | Master_Host: | ||
| + | Master_User: | ||
| + | Master_Port: | ||
| + | Connect_Retry: | ||
| + | Master_Log_File: | ||
| + | Read_Master_Log_Pos: | ||
| + | | ||
| + | Relay_Log_Pos: | ||
| + | Relay_Master_Log_File: | ||
| + | | ||
| + | Slave_SQL_Running: | ||
| + | Replicate_Do_DB: | ||
| + | Replicate_Ignore_DB: | ||
| + | | ||
| + | | ||
| + | Replicate_Wild_Do_Table: | ||
| + | Replicate_Wild_Ignore_Table: | ||
| + | | ||
| + | | ||
| + | | ||
| + | Exec_Master_Log_Pos: | ||
| + | Relay_Log_Space: | ||
| + | Until_Condition: | ||
| + | | ||
| + | Until_Log_Pos: | ||
| + | | ||
| + | | ||
| + | | ||
| + | Master_SSL_Cert: | ||
| + | Master_SSL_Cipher: | ||
| + | | ||
| + | Seconds_Behind_Master: | ||
| + | Master_SSL_Verify_Server_Cert: | ||
| + | Last_IO_Errno: | ||
| + | Last_IO_Error: | ||
| + | | ||
| + | | ||
| + | Replicate_Ignore_Server_Ids: | ||
| + | | ||
| + | Master_UUID: | ||
| + | | ||
| + | SQL_Delay: 0 | ||
| + | SQL_Remaining_Delay: | ||
| + | Slave_SQL_Running_State: | ||
| + | | ||
| + | Master_Bind: | ||
| + | Last_IO_Error_Timestamp: | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | Executed_Gtid_Set: | ||
| + | dcd4eaf5-2411-11e6-b91b-842b2b6265d0: | ||
| + | e9c12dc7-3d36-11e6-ae3f-842b2b626ca2: | ||
| + | Auto_Position: | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Jetzt müssen die Replikations-Daten erneut eingegeben werden: | ||
| + | > echo " | ||
| + | > echo "START SLAVE;" | ||
| + | |||
| + | Nun sollte alles prima laufen: | ||
| + | < | ||
| + | *************************** 2. row *************************** | ||
| + | | ||
| + | Master_Host: | ||
| + | Master_User: | ||
| + | Master_Port: | ||
| + | Connect_Retry: | ||
| + | Master_Log_File: | ||
| + | Read_Master_Log_Pos: | ||
| + | | ||
| + | Relay_Log_Pos: | ||
| + | Relay_Master_Log_File: | ||
| + | | ||
| + | Slave_SQL_Running: | ||
| + | Replicate_Do_DB: | ||
| + | Replicate_Ignore_DB: | ||
| + | | ||
| + | | ||
| + | Replicate_Wild_Do_Table: | ||
| + | Replicate_Wild_Ignore_Table: | ||
| + | | ||
| + | | ||
| + | | ||
| + | Exec_Master_Log_Pos: | ||
| + | Relay_Log_Space: | ||
| + | Until_Condition: | ||
| + | | ||
| + | Until_Log_Pos: | ||
| + | | ||
| + | | ||
| + | | ||
| + | Master_SSL_Cert: | ||
| + | Master_SSL_Cipher: | ||
| + | | ||
| + | Seconds_Behind_Master: | ||
| + | Master_SSL_Verify_Server_Cert: | ||
| + | Last_IO_Errno: | ||
| + | Last_IO_Error: | ||
| + | | ||
| + | | ||
| + | Replicate_Ignore_Server_Ids: | ||
| + | | ||
| + | Master_UUID: | ||
| + | | ||
| + | SQL_Delay: 0 | ||
| + | SQL_Remaining_Delay: | ||
| + | Slave_SQL_Running_State: | ||
| + | | ||
| + | Master_Bind: | ||
| + | Last_IO_Error_Timestamp: | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | Executed_Gtid_Set: | ||
| + | dcd4eaf5-2411-11e6-b91b-842b2b6265d0: | ||
| + | e9c12dc7-3d36-11e6-ae3f-842b2b626ca2: | ||
| + | Auto_Position: | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | |||
| + | === DB fest auf UTF-8 einstellen === | ||
| + | |||
| + | * [[http:// | ||
| + | |||
| + | > vi my.cnf | ||
| + | < | ||
| + | [client] | ||
| + | default-character-set=utf8 | ||
| + | |||
| + | [mysql] | ||
| + | default-character-set=utf8 | ||
| + | |||
| + | [mysqld] | ||
| + | character-set-server = utf8 | ||
| + | collation-server = utf8_unicode_ci | ||
| + | init-connect=' | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Error ‚You cannot ‚ALTER‘ a log table if logging is enabled‘ on query. ==== | ||
| + | |||
| + | * [[http:// | ||
| + | |||
| + | STOP SLAVE; | ||
| + | SET GLOBAL slow_query_log = ‚OFF‘; | ||
| + | START SLAVE; | ||
| + | SHOW SLAVE STATUS\G; | ||
| + | SET GLOBAL slow_query_log = ‚ON‘; | ||
| + | |||
| + | |||
| + | ===== DB-Benutzer löschen ===== | ||
| + | |||
| + | # echo "DROP USER fritz" | mysql -uroot -p mysql | ||
| + | |||
| + | |||
| + | ===== DB-Benutzer anlegen ===== | ||
| + | |||
| + | |||
| + | === / | ||
| + | |||
| + | #!/bin/bash | ||
| + | | ||
| + | # Mit diesem Script wird ein unpreveligierter User angelegt, | ||
| + | # der nur die Rechte SELECT, INSERT und UPDATE für genau eine | ||
| + | # DB bekommt. | ||
| + | | ||
| + | while [ " | ||
| + | case " | ||
| + | -dbh) | ||
| + | DBHOST=" | ||
| + | shift | ||
| + | ;; | ||
| + | -dbn) | ||
| + | DBNAME=" | ||
| + | shift | ||
| + | ;; | ||
| + | -dbu) | ||
| + | DBUSER=" | ||
| + | shift | ||
| + | ;; | ||
| + | -dbp) | ||
| + | DBPASS=" | ||
| + | shift | ||
| + | ;; | ||
| + | -rp) | ||
| + | RTPASS=" | ||
| + | shift | ||
| + | ;; | ||
| + | -h) | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | exit 1 | ||
| + | ;; | ||
| + | *) | ||
| + | if [ " | ||
| + | echo "Der Parameter ' | ||
| + | fi | ||
| + | shift | ||
| + | ;; | ||
| + | esac | ||
| + | done | ||
| + | | ||
| + | if [ -z " | ||
| + | echo " | ||
| + | DBHOST=' | ||
| + | DBNAME=' | ||
| + | DBUSER=' | ||
| + | DBPASS=' | ||
| + | RTPASS=' | ||
| + | " | ||
| + | ${0} -h | ||
| + | exit 2 | ||
| + | fi | ||
| + | | ||
| + | ping -c3 ${DBHOST} | ||
| + | if [ " | ||
| + | echo " | ||
| + | ${DBHOST} ist nicht erreichbar... | ||
| + | " | ||
| + | exit 3 | ||
| + | fi | ||
| + | | ||
| + | | ||
| + | # Benutzer anlegen | ||
| + | echo " | ||
| + | | ||
| + | # Blle Rechte weg | ||
| + | echo " | ||
| + | | ||
| + | # bekommt nur die Rechte: SELECT, INSERT und UPDATE | ||
| + | echo "GRANT SELECT ON * TO ${DBUSER}; FLUSH PRIVILEGES;" | ||
| + | echo "GRANT INSERT ON * TO ${DBUSER}; FLUSH PRIVILEGES;" | ||
| + | echo "GRANT UPDATE ON * TO ${DBUSER}; FLUSH PRIVILEGES;" | ||
| + | | ||
| + | # Test | ||
| + | mysqlshow -t -h${DBHOST} -u${DBUSER} -p${DBPASS} | ||
| + | mysqlshow -t -h${DBHOST} -u${DBUSER} -p${DBPASS} ${DBNAME} | ||
| + | |||
| + | |||
| + | ===== Backup / Dump ===== | ||
| + | |||
| + | * [[MySQL-Dump]] | ||
| + | |||
| + | |||
| + | ===== BINLOG/ | ||
| + | |||
| + | bis zu einem bestimmten BINLOG alles löschen was älter ist: | ||
| + | > echo "PURGE MASTER LOGS TO ' | ||
| + | |||
| + | nur die letzten 10 BINLOG liegen lassen, alle älteren löschen: | ||
| + | > echo "PURGE MASTER LOGS TO '$(cd / | ||
| + | |||
| + | BINLOG bis zu einem bestimmten Zeitpunkt löschen: | ||
| + | > echo "PURGE MASTER LOGS BEFORE ' | ||
| + | |||
| + | nur die BINLOG-Daten aus den letzten 24 Stunen liegen lassen, alle älteren löschen: | ||
| + | > echo "PURGE MASTER LOGS BEFORE ' | ||
| + | |||
| + | nur die BINLOG-Daten aus den letzten 3 Stunen liegen lassen, alle älteren löschen: | ||
| + | > echo "PURGE MASTER LOGS BEFORE ' | ||
| + | |||
| + | nur die BINLOG-Daten aus den letzten 30 Minuten liegen lassen, alle älteren löschen: | ||
| + | > echo "PURGE MASTER LOGS BEFORE ' | ||
| + | |||
| + | <file bash / | ||
| + | #!/bin/bash | ||
| + | |||
| + | # wenn mal die Platte vollgelaufen ist, | ||
| + | # dann hilft nur noch dieses Skript | ||
| + | |||
| + | VERSION=" | ||
| + | |||
| + | ### die aelteste BIN-LOG-Datei loeschen | ||
| + | ### aber die juengste nie | ||
| + | ### egal wieviele oder wenige dort sind | ||
| + | rm $(ls / | ||
| + | |||
| + | ### per SQL alle BIN-LOGs loeschen, die nicht von heute sind | ||
| + | echo "PURGE MASTER LOGS BEFORE ' | ||
| + | |||
| + | echo "SHOW VARIABLES LIKE ' | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Speicherbelegung von MySQL-DB ===== | ||
| + | |||
| + | > watch -n1 'df -h; | ||
| + | mapped: 13289100K | ||
| + | |||
| + | [[https:// | ||
| + | <file bash MAX_MEMORY_GB.sh> | ||
| + | #!/bin/bash | ||
| + | |||
| + | #+ @@innodb_additional_mem_pool_size | ||
| + | |||
| + | echo " | ||
| + | for v in key_buffer_size query_cache_size innodb_buffer_pool_size innodb_log_buffer_size read_buffer_size read_rnd_buffer_size sort_buffer_size join_buffer_size binlog_cache_size thread_stack tmp_table_size | ||
| + | do | ||
| + | #echo "echo \" | ||
| + | echo " | ||
| + | done | ||
| + | |||
| + | echo '################################################################################' | ||
| + | |||
| + | echo ' | ||
| + | + @@query_cache_size | ||
| + | + @@innodb_buffer_pool_size | ||
| + | + @@innodb_log_buffer_size | ||
| + | + @@max_connections * ( @@read_buffer_size | ||
| + | + @@read_rnd_buffer_size | ||
| + | + @@sort_buffer_size | ||
| + | + @@join_buffer_size | ||
| + | + @@binlog_cache_size | ||
| + | + @@thread_stack | ||
| + | + @@tmp_table_size ) | ||
| + | ) / (1024 * 1024 * 1024) AS MAX_MEMORY_GB;' | ||
| + | </ | ||
| + | |||
| + | > bash MAX_MEMORY_GB.sh | ||
| + | +-----------------+ | ||
| + | | max_connections | | ||
| + | +-----------------+ | ||
| + | | 600 | | ||
| + | +-----------------+ | ||
| + | +-----------------------+ | ||
| + | | key_buffer_size in kB | | ||
| + | +-----------------------+ | ||
| + | | | ||
| + | +-----------------------+ | ||
| + | +------------------------+ | ||
| + | | query_cache_size in kB | | ||
| + | +------------------------+ | ||
| + | | | ||
| + | +------------------------+ | ||
| + | +-------------------------------+ | ||
| + | | innodb_buffer_pool_size in kB | | ||
| + | +-------------------------------+ | ||
| + | | 8388608.0000 | | ||
| + | +-------------------------------+ | ||
| + | +------------------------------+ | ||
| + | | innodb_log_buffer_size in kB | | ||
| + | +------------------------------+ | ||
| + | | | ||
| + | +------------------------------+ | ||
| + | +------------------------+ | ||
| + | | read_buffer_size in kB | | ||
| + | +------------------------+ | ||
| + | | | ||
| + | +------------------------+ | ||
| + | +----------------------------+ | ||
| + | | read_rnd_buffer_size in kB | | ||
| + | +----------------------------+ | ||
| + | | | ||
| + | +----------------------------+ | ||
| + | +------------------------+ | ||
| + | | sort_buffer_size in kB | | ||
| + | +------------------------+ | ||
| + | | | ||
| + | +------------------------+ | ||
| + | +------------------------+ | ||
| + | | join_buffer_size in kB | | ||
| + | +------------------------+ | ||
| + | | | ||
| + | +------------------------+ | ||
| + | +-------------------------+ | ||
| + | | binlog_cache_size in kB | | ||
| + | +-------------------------+ | ||
| + | | | ||
| + | +-------------------------+ | ||
| + | +--------------------+ | ||
| + | | thread_stack in kB | | ||
| + | +--------------------+ | ||
| + | | | ||
| + | +--------------------+ | ||
| + | +----------------------+ | ||
| + | | tmp_table_size in kB | | ||
| + | +----------------------+ | ||
| + | | | ||
| + | +----------------------+ | ||
| + | ################################################################################ | ||
| + | +---------------+ | ||
| + | | MAX_MEMORY_GB | | ||
| + | +---------------+ | ||
| + | | 8.6811 | | ||
| + | +---------------+ | ||
| + | |||
| + | |||
| + | <file bash / | ||
| + | #!/bin/sh | ||
| + | |||
| + | mysql -e "show variables; show status" | ||
| + | { | ||
| + | VAR[$1]=$2 | ||
| + | } | ||
| + | END { | ||
| + | MAX_CONN = VAR[" | ||
| + | MAX_USED_CONN = VAR[" | ||
| + | BASE_MEM=VAR[" | ||
| + | MEM_PER_CONN=VAR[" | ||
| + | MEM_TOTAL_MIN=BASE_MEM + MEM_PER_CONN*MAX_USED_CONN | ||
| + | MEM_TOTAL_MAX=BASE_MEM + MEM_PER_CONN*MAX_CONN | ||
| + | |||
| + | printf " | ||
| + | printf "| %40s | %15.3f MB |\n", " | ||
| + | printf "| %40s | %15.3f MB |\n", " | ||
| + | printf "| %40s | %15.3f MB |\n", " | ||
| + | printf "| %40s | %15.3f MB |\n", " | ||
| + | printf "| %40s | %15.3f MB |\n", " | ||
| + | printf " | ||
| + | printf "| %40s | %15.3f MB |\n", "BASE MEMORY", | ||
| + | printf " | ||
| + | printf "| %40s | %15.3f MB |\n", " | ||
| + | printf "| %40s | %15.3f MB |\n", " | ||
| + | printf "| %40s | %15.3f MB |\n", " | ||
| + | printf "| %40s | %15.3f MB |\n", " | ||
| + | printf "| %40s | %15.3f MB |\n", " | ||
| + | printf "| %40s | %15.3f MB |\n", " | ||
| + | printf "| %40s | %15.3f MB |\n", " | ||
| + | printf " | ||
| + | printf "| %40s | %15.3f MB |\n", " | ||
| + | printf " | ||
| + | printf "| %40s | %18d |\n", " | ||
| + | printf "| %40s | %18d |\n", " | ||
| + | printf " | ||
| + | printf "| %40s | %15.3f MB |\n", "TOTAL (MIN)", | ||
| + | printf "| %40s | %15.3f MB |\n", "TOTAL (MAX)", | ||
| + | printf " | ||
| + | }' | ||
| + | </ | ||
| + | |||
| + | > / | ||
| + | +------------------------------------------+--------------------+ | ||
| + | | key_buffer_size | 8.000 MB | | ||
| + | | | ||
| + | | innodb_buffer_pool_size | 8192.000 MB | | ||
| + | | innodb_additional_mem_pool_size | 0.000 MB | | ||
| + | | | ||
| + | +------------------------------------------+--------------------+ | ||
| + | | BASE MEMORY | 8232.000 MB | | ||
| + | +------------------------------------------+--------------------+ | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | binlog_cache_size | 0.031 MB | | ||
| + | | | ||
| + | +------------------------------------------+--------------------+ | ||
| + | | MEMORY PER CONNECTION | 1.096 MB | | ||
| + | +------------------------------------------+--------------------+ | ||
| + | | | ||
| + | | max_connections | 600 | | ||
| + | +------------------------------------------+--------------------+ | ||
| + | | TOTAL (MIN) | 8361.293 MB | | ||
| + | | TOTAL (MAX) | 8889.422 MB | | ||
| + | +------------------------------------------+--------------------+ | ||
| + | |||
| + | |||
| + | === im RAM === | ||
| + | |||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | |||
| + | > echo " | ||
| + | +-------------------------------+ | ||
| + | | innodb_buffer_pool_size in MB | | ||
| + | +-------------------------------+ | ||
| + | | | ||
| + | +-------------------------------+ | ||
| + | |||
| + | Weil InnoDB auch noch andere Puffer benutzt, muss der hier angegebene Wert mind. verdoppelt werden, um den (unter Last) tatsächlich verwendeten RAM abzuschätzen. | ||
| + | |||
| + | der aktuell tatsächlich verwendete RAM, kann so ermittelt werden: | ||
| + | > pmap -d $(ps ax | fgrep -v grep | fgrep "/ | ||
| + | |||
| + | <file c / | ||
| + | #!/bin/bash | ||
| + | |||
| + | # | ||
| + | # Dieses Skript zeigt, wieviel Arbeitsspeicher | ||
| + | # von welchem (laufenden) DBMS verwendet wird. | ||
| + | # | ||
| + | |||
| + | ### damit "sort -n" das Dezimaltrennzeichen richtig deutet | ||
| + | LANG=C | ||
| + | |||
| + | ### PIDs der MySQL-Instanzen finden | ||
| + | PIDS=" | ||
| + | |||
| + | ### Schleife über jede PID einzeln | ||
| + | for EINE_PID in ${PIDS} | ||
| + | do | ||
| + | ### zur PID zugehörige MySQL-Konfigurationsdatei finden | ||
| + | for CNF in $(ps ax | fgrep -v 'grep ' | fgrep -v 'awk ' | egrep "^[ \t]*${EINE_PID} " | tr -s ' ' ' | ||
| + | do | ||
| + | ### aus der Konfiguration die IP+Port holen | ||
| + | ADRESSE_PORT=" | ||
| + | #echo " | ||
| + | |||
| + | ### Speicherbelegung der PID errechnen | ||
| + | SPEICHER=" | ||
| + | echo " | ||
| + | done | ||
| + | done | sort -n | ||
| + | </ | ||
| + | |||
| + | |||
| + | === auf Platte === | ||
| + | |||
| + | * [[https:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | |||
| + | <file bash / | ||
| + | #!/bin/bash | ||
| + | |||
| + | # | ||
| + | # tatsaechlicher Speicherplatzbedarf von diesem DBMS | ||
| + | # | ||
| + | |||
| + | VERSION=" | ||
| + | # | ||
| + | MYSQL_PROG=" | ||
| + | |||
| + | |||
| + | ### Übersicht | ||
| + | echo " | ||
| + | SELECT | ||
| + | table_schema, | ||
| + | table_name, | ||
| + | data_length, | ||
| + | index_length, | ||
| + | data_length, | ||
| + | index_length, | ||
| + | data_free | ||
| + | FROM | ||
| + | information_schema.tables | ||
| + | WHERE | ||
| + | data_length IS NOT NULL | ||
| + | AND data_length<>' | ||
| + | AND data_length<>' | ||
| + | AND data_length<>' | ||
| + | ORDER BY data_length DESC | ||
| + | ;" | ${MYSQL_PROG} | ||
| + | |||
| + | |||
| + | ### Summen | ||
| + | echo " | ||
| + | SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,' | ||
| + | SELECT | ||
| + | table_schema AS ' | ||
| + | table_name, | ||
| + | ROUND( SUM( data_length ) / 1024 / 1024, 3 ) AS 'Daten (MB)', | ||
| + | ROUND( SUM( index_length ) / 1024 / 1024, 3 ) AS 'Index (MB)', | ||
| + | ROUND( SUM( data_length + index_length ) / 1024 / 1024, 3 ) AS ' | ||
| + | ROUND( SUM( data_free ) / 1024 / 1024, 3 ) AS ' | ||
| + | FROM | ||
| + | information_schema.tables | ||
| + | GROUP BY table_schema | ||
| + | ORDER BY 5 DESC | ||
| + | ;" | ${MYSQL_PROG} | ||
| + | </ | ||
| + | |||
| + | Mit [[http:// | ||
| + | |||
| + | [[Tabellen defragmentieren - leeren InnoDB-Speicherplatz wieder frei geben]] -> '' | ||
| + | |||
| + | |||
| + | ===== MySQL-Tabellen reparieren ===== | ||
| + | |||
| + | REPAIR TABLE `datenbankname`.`tabellenname` USE_FRM; | ||
| + | |||
| + | |||
| + | ===== alle MySQL-DB-Back-Ends reparieren ===== | ||
| + | |||
| + | # mysqlcheck --repair -uBENUTZER -pPASSWORT meine_datenbank meine_tabelle | ||
| + | # mysqlcheck --analyze -uBENUTZER -pPASSWORT meine_datenbank meine_tabelle | ||
| + | # mysqlcheck --optimize -uBENUTZER -pPASSWORT meine_datenbank meine_tabelle | ||
| + | |||
| + | |||
| + | ===== nur MyISAM reparieren ===== | ||
| + | |||
| + | |||
| + | ==== Fehlerüberprüfung ==== | ||
| + | |||
| + | Überprüfung: | ||
| + | # myisamchk -c / | ||
| + | |||
| + | |||
| + | === Reparatur möglichkeiten === | ||
| + | |||
| + | Wenn bei der obigen Überprüfung Fehler aufgetreten sind, | ||
| + | dann wie folgt weiter. | ||
| + | |||
| + | alte Reparaturreste entfernen: | ||
| + | # rm -f / | ||
| + | |||
| + | |||
| + | == schnelle Reparatur == | ||
| + | |||
| + | # myisamchk -r / | ||
| + | |||
| + | |||
| + | == genaue Reparatur == | ||
| + | |||
| + | Wenn bei der Schnellreparatur mir " | ||
| + | |||
| + | # myisamchk -r / | ||
| + | myisamchk: error: myisam_sort_buffer_size is too small | ||
| + | |||
| + | dann hilft nur noch die Option " | ||
| + | # myisamchk -o / | ||
| + | |||
| + | |||
| + | ===== SQL ===== | ||
| + | |||
| + | |||
| + | ==== Den Inhalt einer Tabelle in eine andere Tabelle kopieren ==== | ||
| + | |||
| + | Hier wird eine neue Tabelle ('' | ||
| + | echo " | ||
| + | |||
| + | Hier werden die Daten aus der alten Tabelle ('' | ||
| + | echo " | ||
| + | |||
| + | |||
| + | ==== Nur bestimmte Spalten einer Tabelle in eine andere Tabelle kopieren ==== | ||
| + | |||
| + | Es sollen die inhalte bestimmter Spalten ('' | ||
| + | echo " | ||
| + | |||
| + | |||
| + | ==== MySQL mit partitionierten Tabellen ==== | ||
| + | |||
| + | * [[partitionierte Tabellen mit MySQL]] | ||
| + | |||
| + | |||
| + | ==== SQL-Aufrufe (Query) ==== | ||
| + | |||
| + | Datenbank anlegen: | ||
| + | > echo " | ||
| + | > mysqlshow testdb | ||
| + | |||
| + | Tabelle in der Datenbank anlegen: | ||
| + | > echo " | ||
| + | > mysqlshow testdb benutzer | ||
| + | > echo " | ||
| + | |||
| + | einen Datensatz in die Tabelle einspielen: | ||
| + | > echo " | ||
| + | > echo " | ||
| + | > echo " | ||
| + | > echo " | ||
| + | |||
| + | einen Datensatz in der Tabelle ändern: | ||
| + | > echo " | ||
| + | > echo " | ||
| + | |||
| + | einen Datensatz aus der Tabelle löschen: | ||
| + | > echo " | ||
| + | > echo " | ||
| + | |||
| + | die vorhandene Tabelle um drei Spalten erweitern: | ||
| + | > echo "ALTER TABLE benutzer ADD vorname VARCHAR(64) AFTER name" | mysql testdb | ||
| + | > echo "ALTER TABLE benutzer ADD eingetragen TIMESTAMP DEFAULT CURRENT_TIMESTAMP AFTER vorname" | ||
| + | > echo "ALTER TABLE benutzer ADD aktualisiert TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP AFTER eingetragen;" | ||
| + | > echo " | ||
| + | |||
| + | die ganze Datenbank, mit allen Tabellen darin, löschen: | ||
| + | > echo "DROP DATABASE IF EXISTS testdb;" | ||
| + | |||
| + | siehe auch: [[MySQL Subquery / MySQL SubSELECT]] | ||
| + | |||
| + | |||
| + | ==== Benutzer anlegen und löschen ==== | ||
| + | |||
| + | > echo " | ||
| + | > echo "DROP USER fritz;" | ||
| + | |||
| + | |||
| + | ==== Passwort ändern ==== | ||
| + | |||
| + | seit die Passwortspalte nicht mehr " | ||
| + | > echo " | ||
| + | > mysqladmin reload | ||
| + | |||
| + | Root-Passwort ändern (vor MySQL 8.0): | ||
| + | > echo " | ||
| + | | ||
| + | > echo " | ||
| + | > echo " | ||
| + | |||
| + | |||
| + | === root-Passwort ist bekannt === | ||
| + | |||
| + | Passwort ändern: | ||
| + | # echo " | ||
| + | # mysqladmin reload | ||
| + | |||
| + | Jetzt sollte ein: | ||
| + | # mysql -uroot -pgeheim | ||
| + | |||
| + | funktionieren. | ||
| + | |||
| + | ODER | ||
| + | |||
| + | # mysql -uroot -e " | ||
| + | # mysqladmin reload | ||
| + | |||
| + | ODER | ||
| + | |||
| + | # mysqladmin -uroot -p' | ||
| + | # mysqladmin reload | ||
| + | |||
| + | |||
| + | === root-Passwort ist unbekannt === | ||
| + | |||
| + | [[http:// | ||
| + | |||
| + | > service mysql stop | ||
| + | > screen -d -m -S mysql mysqld_safe --skip-grant-tables | ||
| + | > echo " | ||
| + | > ps wwaux|fgrep -v grep|fgrep -v awk|awk '/ | ||
| + | 10259 | ||
| + | > kill -9 10259 | ||
| + | |||
| + | |||
| + | ==== dem Benutzer-Rechte erteilen und entziehen ==== | ||
| + | |||
| + | alle Rechte entziehen: | ||
| + | # echo " | ||
| + | |||
| + | alle Rechte erteilen: | ||
| + | # echo "GRANT ALL PRIVILEGES ON *.* TO ' | ||
| + | |||
| + | ALTER-Rechte erteilen: | ||
| + | # echo "GRANT ALTER ON *.* TO fritz;FLUSH PRIVILEGES;" | ||
| + | |||
| + | ALTER-Rechte entziehen: | ||
| + | # echo " | ||
| + | |||
| + | |||
| + | == Grant-Beispiel == | ||
| + | |||
| + | Als erstes legen wir uns die MySQL-Passwort-Datei an, damit wir nicht bei jedem Kommando das Passwort mit eingeben müssen: | ||
| + | > vi ~/.my.cnf | ||
| + | [client] | ||
| + | host = localhost | ||
| + | user = root | ||
| + | password = " | ||
| + | socket | ||
| + | |||
| + | [[http:// | ||
| + | |||
| + | > ssh root@DatenbankHostname | ||
| + | > echo "GRANT ALL PRIVILEGES ON *.* TO ' | ||
| + | > exit | ||
| + | |||
| + | > echo "DROP USER fritz;" | ||
| + | > echo " | ||
| + | > echo " | ||
| + | > echo "GRANT SHOW DATABASES ON * TO ' | ||
| + | |||
| + | > echo "GRANT SELECT ON * TO ' | ||
| + | > echo "GRANT INSERT ON * TO ' | ||
| + | > echo "GRANT UPDATE ON * TO ' | ||
| + | > echo "GRANT DELETE ON * TO ' | ||
| + | > echo "GRANT CREATE ON * TO ' | ||
| + | > echo "GRANT DROP ON * TO ' | ||
| + | > echo "GRANT INDEX ON * TO ' | ||
| + | > echo "GRANT ALTER ON * TO ' | ||
| + | > echo "GRANT CREATE TEMPORARY TABLES ON * TO ' | ||
| + | > echo "GRANT CREATE VIEW ON * TO ' | ||
| + | > echo "GRANT SHOW VIEW ON * TO ' | ||
| + | > echo "GRANT TRIGGER ON * TO ' | ||
| + | |||
| + | |||
| + | ==== dem Benutzer nur bestimmte Rechte geben ==== | ||
| + | |||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | |||
| + | als erstes nehmen wir dem neuen User ALLE Rechte: | ||
| + | # echo " | ||
| + | |||
| + | * [[http:// | ||
| + | |||
| + | jetzt bekommt er nur Leserechte auf seine Datenbanken: | ||
| + | # echo "GRANT SELECT ON * TO fritz;FLUSH PRIVILEGES;" | ||
| + | |||
| + | zum Schluss bekommt er noch etwas Schreibrechte auf einzelne Tabellen: | ||
| + | # echo "GRANT INSERT ON tabelle01 TO fritz;FLUSH PRIVILEGES;" | ||
| + | |||
| + | **Es kann immer nur eine einzige Tabelle angegeben werden!** | ||
| + | |||
| + | jetzt lassen wir uns seine aktuellen Rechte noch einmal anzeigen, | ||
| + | damit wir sicher sind, dass alles nach unserem Wunsch ausgeführt wurde: | ||
| + | # echo "SHOW GRANTS FOR ' | ||
| + | |||
| + | oder | ||
| + | # echo "SHOW GRANTS FOR ' | ||
| + | |||
| + | |||
| + | == DB-User mit eingeschränkten Rechten anlegen == | ||
| + | |||
| + | # echo "GRANT SELECT, | ||
| + | |||
| + | Hier ist ein Beispiel, in dem der User __'' | ||
| + | |||
| + | # echo "DROP USER fritz; | ||
| + | |||
| + | |||
| + | ==== DB-Backup ==== | ||
| + | |||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | |||
| + | MySQLDump benötigt mindestens diese Berechtigungen: | ||
| + | > echo "GRANT SELECT, RELOAD, SUPER, LOCK TABLES, REPLICATION CLIENT, EVENT, TRIGGER ON *.* TO ' | ||
| + | > echo "GRANT CREATE, INSERT, DROP ON mysql.ibbackup_binlog_marker TO ' | ||
| + | > echo "GRANT CREATE, INSERT, DROP ON mysql.backup_progress TO ' | ||
| + | > echo "GRANT CREATE, INSERT, SELECT, DROP ON mysql.backup_history TO ' | ||
| + | > echo "GRANT CREATE TEMPORARY TABLES ON mysql.* TO ' | ||
| + | > echo "FLUSH PRIVILEGES;" | ||
| + | |||
| + | |||
| + | ==== Datenbank anlegen und löschen ==== | ||
| + | |||
| + | > echo " | ||
| + | > echo "DROP DATABASE IF EXISTS meinedb;" | ||
| + | |||
| + | |||
| + | ==== Tabelle anlegen und löschen ==== | ||
| + | |||
| + | eine neue Tabelle anlegen: | ||
| + | # echo " | ||
| + | |||
| + | die ganze Tabelle wird komplett gelöscht: | ||
| + | # echo "DROP TABLE IF EXISTS tabelle01;" | ||
| + | |||
| + | |||
| + | ==== Spalte in einer Tabelle ändern ==== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | Tabelle anlegen: | ||
| + | > echo " | ||
| + | > echo "SHOW CREATE TABLE test;" | mysql -t datenbank | ||
| + | |||
| + | Spaltentyp von '' | ||
| + | > echo "ALTER TABLE test MODIFY COLUMN info VARCHAR(64);" | ||
| + | > echo "SHOW CREATE TABLE test;" | mysql -t datenbank | ||
| + | |||
| + | |||
| + | ==== AUTO_INCREMENT übernehmen ==== | ||
| + | |||
| + | so wird der '' | ||
| + | echo 'SHOW CREATE TABLE `testdb`;' | ||
| + | |||
| + | so wird der '' | ||
| + | echo ' | ||
| + | |||
| + | |||
| + | ==== Datensätze anlegen, ändern und löschen ==== | ||
| + | |||
| + | einen Datensatz anlegen bzw. in die Tabelle schreiben: | ||
| + | # echo " | ||
| + | |||
| + | einen Datensatz ändern: | ||
| + | # echo " | ||
| + | |||
| + | alle Datensätze mit "alte Daten" in der Spalte " | ||
| + | # echo " | ||
| + | |||
| + | alle Datensätze, | ||
| + | der Rest wird gelöscht: | ||
| + | # echo " | ||
| + | |||
| + | **Die " | ||
| + | |||
| + | |||
| + | ==== sonstiges ==== | ||
| + | |||
| + | Einen passwortlosen User mit **sehr** eingeschränkten Rechten anlegen: | ||
| + | # echo "DROP USER fritz;DROP DATABASE IF EXISTS meinedb;" | ||
| + | # echo " | ||
| + | # echo " | ||
| + | # echo "FLUSH PRIVILEGES;" | ||
| + | # echo " | ||
| + | # echo "GRANT SELECT ON * TO fritz;" | ||
| + | # echo "FLUSH PRIVILEGES;" | ||
| + | |||
| + | " | ||
| + | |||
| + | einen Benutzer anlegen: | ||
| + | # CREATE USER fritz IDENTIFIED BY ' | ||
| + | |||
| + | ihm alle Rechte nehmen: | ||
| + | # REVOKE ALL PRIVILEGES ON *.* FROM webteam; | ||
| + | |||
| + | ihm Leserechte für die DB " | ||
| + | # GRANT SELECT ON meinedb.* TO ' | ||
| + | |||
| + | |||
| + | Datenbanken und Tabellen anzeigen: | ||
| + | |||
| + | zeigt alle Datenbanken: | ||
| + | # mysqlshow -uroot -pgeheim | ||
| + | |||
| + | zeigt alle Tabellen von [DATENBANK]: | ||
| + | # mysqlshow -uroot -pgeheim [DATENBANK] | ||
| + | |||
| + | ODER | ||
| + | |||
| + | in die " | ||
| + | > use mysql; | ||
| + | |||
| + | zeigt alle Datenbanken: | ||
| + | > show databases; | ||
| + | |||
| + | zeigt alle Tabellen von mysql: | ||
| + | > show tables; | ||
| + | |||
| + | den Inhalt der Tabelle " | ||
| + | > SELECT * FROM [tabelle]; | ||
| + | |||
| + | User anlegen, DB anlegen und dem User die Zugriffsrechte auf die DB geben: | ||
| + | # echo " | ||
| + | CREATE DATABASE IF NOT EXISTS [Datenbankname]; | ||
| + | GRANT ALL ON [Datenbankname].* TO dbuser@localhost;" | ||
| + | |||
| + | MySQL starten, ohne das Passwörter abgefragt werden: | ||
| + | # / | ||
| + | |||
| + | oder | ||
| + | # / | ||
| + | |||
| + | Passwort ändern: | ||
| + | # echo "SET PASSWORD FOR dbuser = PASSWORD(' | ||
| + | |||
| + | User löschen: | ||
| + | |||
| + | # echo "DROP USER [böserjunge];" | ||
| + | |||
| + | Tabellenstruktur anzeigen: | ||
| + | |||
| + | # echo "SHOW CREATE TABLE [Tabellenname]" | ||
| + | |||
| + | Datenbank anlegen: | ||
| + | |||
| + | # echo " | ||
| + | # echo " | ||
| + | |||
| + | Datenbank löschen: | ||
| + | |||
| + | # echo "DROP DATABASE [Datenbankname];" | ||
| + | # echo "DROP DATABASE IF EXISTS [Datenbankname];" | ||
| + | |||
| + | Tabelle anlegen: | ||
| + | |||
| + | # echo " | ||
| + | |||
| + | In der Praxis sieht eine Tabelle eher etwas komplexer aus: | ||
| + | |||
| + | # echo " | ||
| + | USE [Datenbankname]; | ||
| + | | ||
| + | CREATE TABLE IF NOT EXISTS [Tabellenname] ( | ||
| + | timestamp DATETIME, | ||
| + | resource_id SMALLINT, | ||
| + | hostname VARCHAR(254) default NULL, | ||
| + | ip4 VARCHAR(4096) default NULL, | ||
| + | mac VARCHAR(2048) default NULL, | ||
| + | bios_release_date VARCHAR(256) default NULL, | ||
| + | bios_manufacturer VARCHAR(256) default NULL, | ||
| + | bios_product_name VARCHAR(256) default NULL, | ||
| + | bios_serial_number VARCHAR(256) default NULL, | ||
| + | cpu_anzahl SMALLINT, | ||
| + | bus VARCHAR(8) default NULL, | ||
| + | vm VARCHAR(8) default NULL, | ||
| + | htt SMALLINT, | ||
| + | cpu_family VARCHAR(256) default NULL, | ||
| + | cpu_manufacturer VARCHAR(256) default NULL, | ||
| + | cpu_id VARCHAR(256) default NULL, | ||
| + | cpu_signature VARCHAR(256) default NULL, | ||
| + | cpu_core_count SMALLINT, | ||
| + | cpu_core_enabled SMALLINT, | ||
| + | memtotal VARCHAR(256) default NULL, | ||
| + | hdd VARCHAR(256) default NULL, | ||
| + | PRIMARY KEY (resource_id), | ||
| + | KEY (bios_serial_number), | ||
| + | KEY mac (mac) | ||
| + | ) TYPE=MyISAM;" | ||
| + | |||
| + | Tabelle löschen: | ||
| + | |||
| + | # echo "DROP TABLE [Tabellenname];" | ||
| + | |||
| + | Alle Datensätze löschen: | ||
| + | |||
| + | # echo " | ||
| + | |||
| + | Einen Datensatz löschen: | ||
| + | |||
| + | # echo " | ||
| + | |||
| + | Weitere Beispiele: | ||
| + | |||
| + | DB-Client-Programm: | ||
| + | DB-Server | ||
| + | DB-Namen | ||
| + | TAB-Namen | ||
| + | |||
| + | Tabelle als Datei exportieren, | ||
| + | # echo " | ||
| + | INTO OUTFILE '/ | ||
| + | FROM [DBTabelle] LIMIT 10;" | mysql -h myserver -u${DATABASE_USER} -p${DATABASE_PASSWORD} [DatenBank] | ||
| + | |||
| + | Tabelle als CSV-Datei exportieren: | ||
| + | # echo " | ||
| + | INTO OUTFILE '/ | ||
| + | FIELDS TERMINATED BY ',' | ||
| + | LINES TERMINATED BY ' | ||
| + | FROM [DBTabelle] LIMIT 10;" | mysql -h myserver -u${DATABASE_USER} -p${DATABASE_PASSWORD} [DatenBank] | ||
| + | |||
| + | Tabelle als CSV-Datei (Semikolon getrennt) exportieren: | ||
| + | # echo " | ||
| + | INTO OUTFILE '/ | ||
| + | FIELDS TERMINATED BY ';' | ||
| + | LINES TERMINATED BY ' | ||
| + | FROM [DBTabelle] LIMIT 10;" | mysql -h myserver -u${DATABASE_USER} -p${DATABASE_PASSWORD} [DatenBank] | ||
| + | |||
| + | Die Tabelle als CSV-Datei (Semikolon getrennt) wieder importieren (das ist sauschnell, weil hierbei keine Indizes aktuallisiert werden): | ||
| + | # echo "LOAD DATA LOCAL INFILE '/ | ||
| + | |||
| + | [[MySQL - LOAD DATA INFILE]] | ||
| + | |||
| + | < | ||
| + | #!/bin/bash | ||
| + | |||
| + | # | ||
| + | # Dieses Skript schreibt von der angegebenen Datenbank | ||
| + | # jede Tabelle in eine eigene CSV-Datei. | ||
| + | # | ||
| + | |||
| + | DATENBANK=" | ||
| + | |||
| + | if [ -z " | ||
| + | echo "${0} Datenbank" | ||
| + | exit 1 | ||
| + | else | ||
| + | mkdir " | ||
| + | chmod 0777 " | ||
| + | cd " | ||
| + | VERZEICHNIS=" | ||
| + | fi | ||
| + | |||
| + | mysqlshow " | ||
| + | do | ||
| + | echo " | ||
| + | #echo "echo \" | ||
| + | echo " | ||
| + | done | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | #!/bin/bash | ||
| + | |||
| + | # | ||
| + | # Dieses Skript liest die CSV-Dateien aus dem aktuellen Verzeichnis in die angegebene Datenbank. | ||
| + | # | ||
| + | |||
| + | DATENBANK=" | ||
| + | |||
| + | if [ -z " | ||
| + | echo "${0} Datenbank" | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | ls *.csv | sed ' | ||
| + | do | ||
| + | echo " | ||
| + | echo "LOAD DATA LOCAL INFILE ' | ||
| + | done | ||
| + | </ | ||
| + | |||
| + | Datenbanken zeigen: | ||
| + | # echo "SHOW DATABASES" | ||
| + | # mysqlshow -h myserver -u fritz -p | ||
| + | # mysqlshow -t -h myserver -u fritz -p | ||
| + | |||
| + | Tabellen zeigen: | ||
| + | # echo "SHOW TABLES" | ||
| + | # mysqlshow -h myserver -u fritz [DatenBank] -p | ||
| + | # mysqlshow -t -h myserver -u fritz [DatenBank] -p | ||
| + | |||
| + | Tabelleninhalt zeigen: | ||
| + | # echo " | ||
| + | # echo " | ||
| + | |||
| + | SUBSTRING: | ||
| + | # echo " | ||
| + | rechnername.domain.de | ||
| + | | ||
| + | # echo " | ||
| + | rechnername | ||
| + | | ||
| + | # echo " | ||
| + | rechnername.domain | ||
| + | | ||
| + | # echo " | ||
| + | domain.de | ||
| + | |||
| + | IP-Adressen in numerischer Reihenfolge anzeigen: | ||
| + | # echo " | ||
| + | |||
| + | Tabelleninhalt nach der 3. Spalte sortieren (nur die ersten 10 Zeilen: | ||
| + | # echo " | ||
| + | |||
| + | Tabelleninhalt in umgekehrtsortierter Reihenfolge zeigen (nur die letzten 10 Zeilen): | ||
| + | # echo " | ||
| + | |||
| + | eine Liste aller unterschiedlichen Einträge aus der Spalte 3 zeigen (nur die letzten 10 Zeilen): | ||
| + | # echo " | ||
| + | |||
| + | Wichtig ist hierbei, dass **" | ||
| + | |||
| + | MySQL kann auch mit RegEx umgehgen, hier mal zwei Beispiele: | ||
| + | |||
| + | die letzten 50 Einträge anzeigen, die älter als 7 Tage sind (Spalte " | ||
| + | # echo " | ||
| + | |||
| + | Alle Datensätze löschen, die älter als 180 Tage sind (Spalte " | ||
| + | # echo " | ||
| + | |||
| + | Weitere Beispiele gibt es hier: [[http:// | ||
| + | |||
| + | Anzeige der Anzahl der Einträge pro // | ||
| + | |||
| + | # echo " | ||
| + | |||
| + | Will man den Wert in der " | ||
| + | |||
| + | # echo " | ||
| + | |||
| + | Infos zu den Tabellen abrufen: | ||
| + | # echo " | ||
| + | +---------------------------------------+-------------+--------+ | ||
| + | | table_name | ||
| + | +---------------------------------------+-------------+--------+ | ||
| + | | CHARACTER_SETS | ||
| + | | COLLATIONS | ||
| + | | COLLATION_CHARACTER_SET_APPLICABILITY | SYSTEM VIEW | MEMORY | | ||
| + | | COLUMNS | ||
| + | | COLUMN_PRIVILEGES | ||
| + | | KEY_COLUMN_USAGE | ||
| + | | PROFILING | ||
| + | | ROUTINES | ||
| + | | SCHEMATA | ||
| + | | SCHEMA_PRIVILEGES | ||
| + | | STATISTICS | ||
| + | | TABLES | ||
| + | ... | ||
| + | | appliance_info | ||
| + | | cloud_appliance | ||
| + | | cloud_config | ||
| + | | cloud_image | ||
| + | | cloud_ipgroups | ||
| + | | cloud_iplc | ||
| + | | cloud_iptables | ||
| + | | cloud_irlc | ||
| + | | cloud_nat | ||
| + | | cloud_private_image | ||
| + | | cloud_requests | ||
| + | | cloud_selector | ||
| + | | cloud_transaction | ||
| + | | cloud_users | ||
| + | | cloud_users_limits | ||
| + | | deployment_info | ||
| + | ... | ||
| + | |||
| + | Schema einer Tabelle anzeigen: | ||
| + | # echo "desc cloud_ipgroups;" | ||
| + | +--------------+-------------+------+-----+---------+-------+ | ||
| + | | Field | Type | Null | Key | Default | Extra | | ||
| + | +--------------+-------------+------+-----+---------+-------+ | ||
| + | | ig_id | int(5) | ||
| + | | ig_name | ||
| + | | ig_network | ||
| + | | ig_subnet | ||
| + | | ig_gateway | ||
| + | | ig_dns1 | ||
| + | | ig_dns2 | ||
| + | | ig_domain | ||
| + | | ig_activeips | int(5) | ||
| + | +--------------+-------------+------+-----+---------+-------+ | ||
| + | |||
| + | # echo "desc cloud_iptables;" | ||
| + | +-----------------+-------------+------+-----+---------+-------+ | ||
| + | | Field | Type | Null | Key | Default | Extra | | ||
| + | +-----------------+-------------+------+-----+---------+-------+ | ||
| + | | ip_id | int(5) | ||
| + | | ip_ig_id | ||
| + | | ip_appliance_id | int(5) | ||
| + | | ip_cr_id | ||
| + | | ip_active | ||
| + | | ip_address | ||
| + | | ip_subnet | ||
| + | | ip_gateway | ||
| + | | ip_dns1 | ||
| + | | ip_dns2 | ||
| + | | ip_domain | ||
| + | +-----------------+-------------+------+-----+---------+-------+ | ||
| + | |||
| + | |||
| + | === Zeitangaben in SQL === | ||
| + | |||
| + | # echo " | ||
| + | +---------------------------+ | ||
| + | | (NOW() + INTERVAL 2 HOUR) | | ||
| + | +---------------------------+ | ||
| + | | 2012-02-15 23: | ||
| + | +---------------------------+ | ||
| + | | ||
| + | # echo " | ||
| + | +----------------------------------+ | ||
| + | | DATE_SUB(NOW(), | ||
| + | +----------------------------------+ | ||
| + | | 2012-02-15 19: | ||
| + | +----------------------------------+ | ||
| + | |||
| + | Heute: | ||
| + | # echo " | ||
| + | +-------------+ | ||
| + | | DATE(NOW()) | | ||
| + | +-------------+ | ||
| + | | 2012-03-12 | ||
| + | +-------------+ | ||
| + | |||
| + | # echo " | ||
| + | +------------+ | ||
| + | | CURDATE() | ||
| + | +------------+ | ||
| + | | 2012-03-12 | | ||
| + | +------------+ | ||
| + | |||
| + | Gestern: | ||
| + | # echo " | ||
| + | +-----------------------------------------+ | ||
| + | | DATE(DATE_SUB(NOW(), | ||
| + | +-----------------------------------------+ | ||
| + | | 2012-03-11 | ||
| + | +-----------------------------------------+ | ||
| + | |||
| + | # echo " | ||
| + | +----------------------------+ | ||
| + | | CURDATE() - interval 1 day | | ||
| + | +----------------------------+ | ||
| + | | 2012-03-11 | ||
| + | +----------------------------+ | ||
| + | |||
| + | |||
| + | === Datenmenge bzw. Größe einer DB ausgeben === | ||
| + | |||
| + | > echo " | ||
| + | +--------------------+-----------------+ | ||
| + | | Datenbankname | ||
| + | +--------------------+-----------------+ | ||
| + | | information_schema | 0.15625000 | | ||
| + | | mysql | 2.41331005 | | ||
| + | | performance_schema | 0.00000000 | | ||
| + | | sys | 0.01562500 | | ||
| + | | Syslog | ||
| + | +--------------------+-----------------+ | ||
| + | |||
| + | > echo " | ||
| + | +--------------------+-----------------+--------------+-------------+ | ||
| + | | Datenbankname | ||
| + | +--------------------+-----------------+--------------+-------------+ | ||
| + | | information_schema | 0.15625000 | | ||
| + | | mysql | 2.41331005 | | ||
| + | | performance_schema | 0.00000000 | | ||
| + | | sys | 0.01562500 | NULL | NULL | | ||
| + | | Syslog | ||
| + | +--------------------+-----------------+--------------+-------------+ | ||
| + | |||
| + | gibt nur die komplette Summe (in MB) von allen Datenbanken aus: | ||
| + | > echo " | ||
| + | 204.101 MB | ||
| + | |||
| + | Datenmenge bzw. __Größe einer **Tabelle**__ ausgeben | ||
| + | > echo " | ||
| + | +-----------+--------------+---------------------+--------------+-------------+ | ||
| + | | Datenbank | Tabelle | ||
| + | +-----------+--------------+---------------------+--------------+-------------+ | ||
| + | | Syslog | ||
| + | +-----------+--------------+---------------------+--------------+-------------+ | ||
| + | |||
| + | <code bash> | ||
| + | #!/bin/bash | ||
| + | |||
| + | # | ||
| + | # | ||
| + | # Zeigt die Größe jeder einzelnen Tabelle einer Datenbank an. | ||
| + | # getestet mit MySQL Version 8.0.31 | ||
| + | # | ||
| + | # | ||
| + | |||
| + | if [ " | ||
| + | echo "${0} [Datenbankname]" | ||
| + | echo "${0} simsysnetwork" | ||
| + | echo "${0} simsysnetwork -N" | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | if [ " | ||
| + | OPT=" | ||
| + | SQL=" | ||
| + | sum( data_length + index_length ) / 1024 / 1024 ' | ||
| + | data_length / 1024 / 1024 'Daten in MB', | ||
| + | index_length / 1024 / 1024 'Index in MB', | ||
| + | table_schema ' | ||
| + | table_name ' | ||
| + | FROM information_schema.tables WHERE table_schema=' | ||
| + | else | ||
| + | OPT=" | ||
| + | SQL=" | ||
| + | table_schema ' | ||
| + | table_name ' | ||
| + | data_length / 1024 / 1024 'Daten in MB', | ||
| + | index_length / 1024 / 1024 'Index in MB' | ||
| + | FROM information_schema.tables WHERE table_schema=' | ||
| + | fi | ||
| + | |||
| + | for TAB in $(echo "SHOW TABLES;" | ||
| + | do | ||
| + | echo " | ||
| + | done | ||
| + | </ | ||
| + | |||
| + | |||
| + | <code bash / | ||
| + | #!/bin/bash | ||
| + | |||
| + | # | ||
| + | |||
| + | echo " | ||
| + | SELECT | ||
| + | table_schema ' | ||
| + | sum( data_length + index_length ) / 1024 / 1024 ' | ||
| + | data_length / 1024 / 1024 'Daten in MB', | ||
| + | index_length / 1024 / 1024 'Index in MB' | ||
| + | FROM | ||
| + | information_schema.tables | ||
| + | GROUP BY table_schema | ||
| + | ;" | mysql -t | ||
| + | |||
| + | # | ||
| + | </ | ||
| + | |||
| + | <code bash / | ||
| + | #!/bin/bash | ||
| + | |||
| + | # | ||
| + | echo " | ||
| + | SELECT | ||
| + | table_schema AS ' | ||
| + | table_name, | ||
| + | ROUND( DATA_LENGTH / 1024 / 1024, 3 ) AS 'Daten (MB)', | ||
| + | ROUND( INDEX_LENGTH / 1024 / 1024, 3 ) AS 'Index (MB)', | ||
| + | ROUND( DATA_FREE / 1024 / 1024, 3 ) AS ' | ||
| + | FROM | ||
| + | information_schema.tables | ||
| + | WHERE | ||
| + | TABLE_TYPE=' | ||
| + | AND | ||
| + | ENGINE=' | ||
| + | AND | ||
| + | TABLE_SCHEMA<>' | ||
| + | AND | ||
| + | TABLE_SCHEMA<>' | ||
| + | ORDER BY 3 | ||
| + | ;" | mysql -t | ||
| + | |||
| + | # | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Index ==== | ||
| + | |||
| + | Die Regel sagt, dass man einen Index auf einer Tabelle dort braucht, | ||
| + | wo man eine WHERE-Bedingung im Statement verwende. | ||
| + | |||
| + | Das heißt, das folgende SQL-Statement: | ||
| + | # SELECT * FROM Syslog.SystemEvents WHERE FromHost = ' | ||
| + | |||
| + | benötigt einen Index auf den spalten " | ||
| + | |||
| + | Um die Tabelle entsprechend zu ändern, muss folgendes SQL-Statement abgesetzt werden: | ||
| + | # ALTER TABLE Syslog.SystemEvents ADD INDEX SearchIdx(Facility, | ||
| + | |||
| + | damit wird ein einzener Index über die drei betreffenden spalten gelegt. | ||
| + | Dann sollte man bei einer Abfrage immer alle drei Spalten als WHERE-Bedingung angeben! | ||
| + | |||
| + | Alternativ kann man auch jeweils einen einzelnen index pro spalte verwenden: | ||
| + | # ALTER TABLE Syslog.SystemEvents ADD INDEX facilityIdx(Facility), | ||
| + | |||
| + | Das ist besser, wenn man nicht immer alle drei Spalten als WHERE-Bedingung angeben möchte. | ||
| + | |||
| + | Ein Index kann aber auch Nachteile haben: INSERT-Statements werden, mit steigender anzahl von Indizies, langsamer. | ||
| + | |||
| + | Man sollte es also nicht übertreiben und nur dort einen Index setzen, wo es wirklich nötig ist. | ||
| + | |||
| + | |||
| + | ===== verweiste (orphan) Tabellen finden und beseitigen ===== | ||
| + | |||
| + | verweiste Tabellen anzeigen: | ||
| + | > echo ' | ||
| + | |||
| + | Aus der Ausgabe kann man den Datenbanknamen erkennen. | ||
| + | |||
| + | Da wir oftmals diese verweiste Tabelle nicht direkt löschen können, werden wir die Datenbank löschen. | ||
| + | Vorher ist es aber ratsam, die heilen Tabellen vorübergehend woanders zwischen zu lagern. | ||
| + | |||
| + | Wen die Datenbank, in der die verweiste Tabelle erwartet wird " | ||
| + | > echo ' | ||
| + | +----------+ | ||
| + | | COUNT(*) | | ||
| + | +----------+ | ||
| + | | | ||
| + | +----------+ | ||
| + | | ||
| + | > echo 'USE Syslog; SHOW TABLES;' | ||
| + | +------------------------+ | ||
| + | | Tables_in_Syslog | ||
| + | +------------------------+ | ||
| + | | SystemEvents | ||
| + | | SystemEventsProperties | | ||
| + | +------------------------+ | ||
| + | | ||
| + | > echo ' | ||
| + | > echo ' | ||
| + | > echo ' | ||
| + | > echo 'USE Syslog; SHOW TABLES;' | ||
| + | > echo 'USE temp; SHOW TABLES;' | ||
| + | +------------------------+ | ||
| + | | Tables_in_Syslog | ||
| + | +------------------------+ | ||
| + | | SystemEvents | ||
| + | | SystemEventsProperties | | ||
| + | +------------------------+ | ||
| + | | ||
| + | > echo 'DROP DATABASE Syslog;' | ||
| + | > echo ' | ||
| + | > echo ' | ||
| + | > echo ' | ||
| + | > echo ' | ||
| + | > echo 'USE temp; SHOW TABLES;' | ||
| + | > echo 'USE Syslog; SHOW TABLES;' | ||
| + | +------------------------+ | ||
| + | | Tables_in_Syslog | ||
| + | +------------------------+ | ||
| + | | SystemEvents | ||
| + | | SystemEventsProperties | | ||
| + | +------------------------+ | ||
| + | | ||
| + | > echo ' | ||
| + | > echo 'DROP DATABASE temp;' | mysql | ||
| + | > echo ' | ||
| + | +----------+ | ||
| + | | COUNT(*) | | ||
| + | +----------+ | ||
| + | | | ||
| + | +----------+ | ||
| + | |||
| + | |||
| + | ===== MySQL Tuning ===== | ||
| + | |||
| + | [[MySQL Tuning]] | ||
| + | |||
| + | Variablen/ | ||
| + | SELECT * FROM sys.metrics; | ||
| + | |||
| + | Speicherplatzverbrauch: | ||
| + | SELECT * FROM sys.memory_global_total; | ||
| + | +-----------------+ | ||
| + | | total_allocated | | ||
| + | +-----------------+ | ||
| + | | 1.59 GiB | | ||
| + | +-----------------+ | ||
| + | |||
| + | wieviel Speicherplatz eine bestehende Verbindung verbraucht/ | ||
| + | SELECT * FROM sys.host_summary; | ||
| + | |||
| + | wieviel Speicherplatz eine bestehende Verbindung für die einzelnen Tabellendateien verbraucht/ | ||
| + | SELECT * FROM sys.host_summary_by_file_io_type; | ||
| + | |||
| + | hier kann man sogar Infos über einzelne Statements sehen: | ||
| + | SELECT * FROM sys.host_summary_by_statement_type; | ||
| + | |||
| + | hier, wieviele Daten gerade von einer Tabelle im RAM liegen: | ||
| + | SELECT * FROM sys.innodb_buffer_stats_by_schema; | ||
| + | |||
| + | ...und diese ist bei Fehlersuche ganz wichtig, die sollte immer leer sein: | ||
| + | SELECT * FROM sys.innodb_lock_waits; | ||
| + | |||
| + | IO der einzelnen Tabellendateien im FS: | ||
| + | SELECT * FROM sys.io_global_by_file_by_bytes; | ||
| + | |||
| + | Zugriffswartezeiten je Tabellendatei: | ||
| + | SELECT * FROM sys.io_global_by_file_by_latency; | ||
| + | |||
| + | die Autoincrement-Werte für jede Tabelle: | ||
| + | SELECT * FROM sys.schema_auto_increment_columns; | ||
| + | |||
| + | |||
| + | ==== Beispiel MySQL 8.0 mit 16 GiB RAM ==== | ||
| + | |||
| + | Es sollten von der MySQL-DB nur max. 84% des RAM belegt werden. | ||
| + | innodb_buffer_pool_size + ( max_allowed_packet * max_connections ) <= 84% RAM | ||
| + | |||
| + | beide Konfigurationen belegen so ziehmlich die gleiche Menge RAM: | ||
| + | max_allowed_packet | ||
| + | max_connections | ||
| + | innodb_buffer_pool_size | ||
| + | | ||
| + | max_allowed_packet | ||
| + | max_connections | ||
| + | innodb_buffer_pool_size | ||
| + | |||
| + | - Als erstes sollte man ermitteln, wie groß das benötigte "'' | ||
| + | * Hier gilt die Regel, nur so groß wie nötig aber so klein wie möglich. | ||
| + | - Als zweites sollte man ermitteln, wieviele Verbindungen maximal zur Datenbank gleichzeitig gehalten werden sollen ('' | ||
| + | * Hier gilt die Regel, nur soviele wie nötig aber sowenig wie möglich. | ||
| + | - Als letztes kann man dann damit errechnen, wieviel Speicher noch für den "'' | ||
| + | * ''" | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | max_allowed_packet auf 128 MB setzen: | ||
| + | > echo "SET GLOBAL max_connections=300; | ||
| + | > echo "SHOW VARIABLES LIKE ' | ||
| + | +-------------------------+-------------+ | ||
| + | | Variable_name | ||
| + | +-------------------------+-------------+ | ||
| + | | innodb_buffer_pool_size | 16106127360 | | ||
| + | +-------------------------+-------------+ | ||
| + | +--------------------+-----------+ | ||
| + | | Variable_name | ||
| + | +--------------------+-----------+ | ||
| + | | max_allowed_packet | 134217728 | | ||
| + | +--------------------+-----------+ | ||
| + | +-----------------+-------+ | ||
| + | | Variable_name | ||
| + | +-----------------+-------+ | ||
| + | | max_connections | 300 | | ||
| + | +-----------------+-------+ | ||
| + | |||
| + | alle Infos von jeder einzelnen Tabelle aus dem gesamten DBMS anzeigen: | ||
| + | > for A in $(echo "USE information_schema; | ||
| + | | ||
| + | alle Einstellungen von jeder einzelnen Tabelle aus dem gesamten DBMS anzeigen: | ||
| + | > for A in $(echo "USE performance_schema; | ||
| + | | ||
| + | Speicherplatz (und weitere Infos) von jeder einzelnen Tabelle aus dem gesamten DBMS anzeigen: | ||
| + | > for A in $(echo "USE sys; SHOW TABLES;" | ||
| + | |||
| + | |||
| + | ==== Beispiel MySQL 8.0 mit 32 GiB RAM ==== | ||
| + | |||
| + | < | ||
| + | # echo "SHOW VARIABLES LIKE ' | ||
| + | +-------------------------+------------+ | ||
| + | | Variable_name | ||
| + | +-------------------------+------------+ | ||
| + | | innodb_buffer_pool_size | 1073741824 | | ||
| + | +-------------------------+------------+ | ||
| + | +--------------------+-----------+ | ||
| + | | Variable_name | ||
| + | +--------------------+-----------+ | ||
| + | | max_allowed_packet | 268435456 | | ||
| + | +--------------------+-----------+ | ||
| + | +-----------------+-------+ | ||
| + | | Variable_name | ||
| + | +-----------------+-------+ | ||
| + | | max_connections | 100 | | ||
| + | +-----------------+-------+ | ||
| + | |||
| + | # echo "SHOW VARIABLES LIKE ' | ||
| + | 26 GiB / 30.9524 GiB | ||
| + | |||
| + | # echo "1024 256 100" | awk ' | ||
| + | 26 GiB / 30.9524 GiB | ||
| + | |||
| + | oder auch so möglich: | ||
| + | |||
| + | # echo "1024 128 200" | awk ' | ||
| + | 26 GiB / 30.9524 GiB | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Fehlermeldungen ===== | ||
| + | |||
| + | ==== ERROR 2006 (HY000) at line 13135: MySQL server has gone away ==== | ||
| + | |||
| + | Diesen Fehler bekommt man gelegentlich, | ||
| + | Im Internet findet man verschiedenen Lösungsvorschläge, | ||
| + | Hier alle Anpassungen, | ||
| + | |||
| + | <file bash / | ||
| + | [mysqld] | ||
| + | ### mehr als 1G gehen nicht | ||
| + | max_allowed_packet | ||
| + | ### mehr als 1G gehen nicht | ||
| + | net_buffer_length | ||
| + | net_read_timeout | ||
| + | innodb_lock_wait_timeout | ||
| + | delayed_insert_timeout | ||
| + | connect_timeout | ||
| + | wait_timeout | ||
| + | </ | ||
| + | |||
| + | Allerdings funktioniert es nicht immer. | ||
| + | |||
| + | |||
| + | ===== Start eines 2. MySQL-DBMS ====== | ||
| + | |||
| + | |||
| + | ===== Dirty Start ===== | ||
| + | |||
| + | <code bash> | ||
| + | #!/bin/bash | ||
| + | |||
| + | (/bin/sh / | ||
| + | |||
| + | sleep 3 | ||
| + | set -x | ||
| + | ps alxwww | grep -Fi mysql | grep -F port=3307 | ||
| + | netstat -antpwww | grep -F :3307 | ||
| + | mysqlshow -S / | ||
| + | wc -l / | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== EVENTS + ROUTINES ===== | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | alle Proceduren anzeigen: | ||
| + | SELECT SPECIFIC_NAME, | ||
| + | |||
| + | alle Events anzeigen: | ||
| + | USE Datenbankname; | ||
| + | SHOW EVENTS; | ||
| + | |||
| + | einen Event auf einem Knoten aktivieren: | ||
| + | ALTER EVENT Eventname ON SCHEDULE EVERY 1 MINUTE ON COMPLETION PRESERVE ENABLE; | ||
| + | |||
