mysql_tuning
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| mysql_tuning [2022-02-24 12:16:44] – [MySQL Tuning] manfred | mysql_tuning [2026-05-22 10:14:22] (aktuell) – [Beispiel MySQL 8.0 mit 16GB RAM] manfred | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ===== MySQL Tuning ===== | + | ====== MySQL Tuning |
| siehe auch: | siehe auch: | ||
| + | * [[https:// | ||
| + | * ''> | ||
| + | * ''> | ||
| + | * '' | ||
| * [[::MySQL - Benchmark]] | * [[::MySQL - Benchmark]] | ||
| * [[:: | * [[:: | ||
| * [[::MySQL Tuning]] | * [[::MySQL Tuning]] | ||
| - | * [[::MySQL Performance Tuning]] | ||
| - | ==== Ab MySQL 8.0 ==== | + | ===== Ab MySQL 8.0 ===== |
| * [[https:// | * [[https:// | ||
| Zeile 35: | Zeile 38: | ||
| Es sollten von der MySQL-DB nur max. 84% des RAM belegt werden. | Es sollten von der MySQL-DB nur max. 84% des RAM belegt werden. | ||
| - | innodb_buffer_pool_size + ( max_allowed_packet * max_connections ) <= 84% RAM | + | innodb_buffer_pool_size + ( max_allowed_packet * max_connections ) <= 70-84% RAM |
| beide Konfigurationen belegen so ziehmlich die gleiche Menge RAM: | beide Konfigurationen belegen so ziehmlich die gleiche Menge RAM: | ||
| Zeile 56: | Zeile 59: | ||
| - | ==== Bis MySQL 5.7 ==== | + | ==== I/ |
| + | |||
| + | <code bash> | ||
| + | iostat -x 1 / | ||
| + | IOPS = r/s + w/s | ||
| + | |||
| + | 2209-4900 wkB/s → Write throughput | ||
| + | | ||
| + | 2200-5200 IOPS | ||
| + | |||
| + | innodb_io_capacity -> durchschnittliche IOPS des Datenträgers | ||
| + | innodb_io_capacity_max -> maximale IOPS des Datenträgers | ||
| + | |||
| + | innodb_redo_log_capacity = Schreibrate * 10 Minuten (abhängig von innodb_flush_method) = innodb_redo_log_capacity -> ca.~ 5–15% vom innodb_buffer_pool_size | ||
| + | bei O_DSYNC und O_DIRECT sollte innodb_redo_log_capacity etwas größer sein (z.B.: 32G) | ||
| + | aber bei innodb_fast_shutdown=0 kann innodb_redo_log_capacity wieder deutlich kleiner sein (z.B.: 8G) | ||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | ### bei O_DSYNC und O_DIRECT sollte innodb_redo_log_capacity etwas größer sein => innodb_redo_log_capacity=32G | ||
| + | ### aber wenn innodb_fast_shutdown = 0, dann kann innodb_redo_log_capacity deutlich kleiner => innodb_redo_log_capacity=8G | ||
| + | ### SET GLOBAL innodb_io_capacity=3000; | ||
| + | innodb_io_capacity | ||
| + | innodb_io_capacity_max | ||
| + | innodb_redo_log_capacity | ||
| + | innodb_buffer_pool_instances | ||
| + | join_buffer_size | ||
| + | tmp_table_size | ||
| + | max_heap_table_size | ||
| + | |||
| + | ### LRU Scan Depth bestimmt, wie weit InnoDB vorausschaut, | ||
| + | ### Zu klein: Threads warten auf freie Pages, „buffer pool free list“ wird knapp, spontane Flush-Spikes | ||
| + | ### Zu groß: hohe CPU-Last im Hintergrund, | ||
| + | ### echo "SHOW GLOBAL VARIABLES WHERE VARIABLE_NAME IN (' | ||
| + | ### Innodb_buffer_pool_wait_free | ||
| + | ### Innodb_buffer_pool_pages_free ~ 0 (sollte mind. bei 1-5% vom Buffer Pool sein) # innodb_lru_scan_depth & innodb_io_capacity erhöhen | ||
| + | ### echo "SET GLOBAL innodb_lru_scan_depth=1024;" | ||
| + | ### Innodb_buffer_pool_pages_total = Innodb_buffer_pool_size / Innodb_page_size | ||
| + | ### max. Innodb_buffer_pool_pages_free = Innodb_buffer_pool_pages_total / 20 | ||
| + | ### min. Innodb_buffer_pool_pages_free = Innodb_buffer_pool_pages_total / 100 | ||
| + | ### max. Innodb_buffer_pool_pages_free = 4194304 / 20 = ca. 210000 freie Pages | ||
| + | ### min. Innodb_buffer_pool_pages_free = 4194304 / 100 = ca. 42000 freie Pages | ||
| + | # | ||
| + | # | ||
| + | innodb_lru_scan_depth | ||
| + | ################################################################################ | ||
| + | innodb_page_cleaners | ||
| + | innodb_flush_log_at_trx_commit | ||
| + | sync_binlog | ||
| + | innodb_doublewrite_batch_size | ||
| + | innodb_doublewrite_pages | ||
| + | ################################################################################ | ||
| + | </ | ||
| + | |||
| + | <file bash / | ||
| + | [mysqld] | ||
| + | ### https:// | ||
| + | ### 4. Configure InnoDB for Max Flushing. | ||
| + | ### SET GLOBAL innodb_fast_shutdown=0; | ||
| + | ### SHOW VARIABLES LIKE ' | ||
| + | innodb_fast_shutdown = 0 | ||
| + | # | ||
| + | innodb_max_dirty_pages_pct = 50 # damit sie schneller startet | ||
| + | # | ||
| + | innodb_max_dirty_pages_pct_lwm = 20 # damit sie schneller startet | ||
| + | innodb_change_buffering = ' | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Bis MySQL 5.7 ===== | ||
| * [[http:// | * [[http:// | ||
| Zeile 166: | Zeile 238: | ||
| query_cache_size= 512M | query_cache_size= 512M | ||
| query_cache_type= 1 | query_cache_type= 1 | ||
| + | |||
| Zeile 339: | Zeile 412: | ||
| [server] | [server] | ||
| sql-mode="" | sql-mode="" | ||
| + | |||
| + | |||
| + | ==== Performance Schema ==== | ||
| + | |||
| + | |||
| + | |||
| + | === getestet mit Ubuntu 14.04.5 LTS / mysqld 5.7.21 === | ||
| + | |||
| + | <file sql events_statements_history.sql> | ||
| + | SELECT * FROM performance_schema.setup_consumers; | ||
| + | |||
| + | SET GLOBAL show_compatibility_56 = ON; | ||
| + | |||
| + | SELECT left(digest_text, | ||
| + | , ROUND(SUM(timer_end-timer_start)/ | ||
| + | , ROUND(SUM(timer_wait)/ | ||
| + | , ROUND(SUM(lock_time)/ | ||
| + | , MIN(LEFT(DATE_SUB(NOW(), | ||
| + | , MAX(LEFT(DATE_SUB(NOW(), | ||
| + | , COUNT(*) as cnt | ||
| + | FROM performance_schema.events_statements_history | ||
| + | JOIN information_schema.global_status AS isgs | ||
| + | WHERE isgs.variable_name = ' | ||
| + | GROUP BY LEFT(digest_text, | ||
| + | ORDER BY tot_exec_ms DESC | ||
| + | LIMIT 10; | ||
| + | </ | ||
| + | |||
| + | <file sql events_statements_history_long.sql> | ||
| + | SELECT * FROM performance_schema.setup_consumers; | ||
| + | |||
| + | UPDATE performance_schema.setup_consumers SET enabled = 1 WHERE name = ' | ||
| + | SET GLOBAL show_compatibility_56 = ON; | ||
| + | |||
| + | SELECT left(digest_text, | ||
| + | , ROUND(SUM(timer_end-timer_start)/ | ||
| + | , ROUND(SUM(timer_wait)/ | ||
| + | , ROUND(SUM(lock_time)/ | ||
| + | , MIN(LEFT(DATE_SUB(NOW(), | ||
| + | , MAX(LEFT(DATE_SUB(NOW(), | ||
| + | , COUNT(*) as cnt | ||
| + | FROM performance_schema.events_statements_history_long | ||
| + | JOIN information_schema.global_status AS isgs | ||
| + | WHERE isgs.variable_name = ' | ||
| + | GROUP BY LEFT(digest_text, | ||
| + | ORDER BY tot_exec_ms DESC | ||
| + | LIMIT 10; | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== mysqltuner.pl ===== | ||
| + | |||
| + | * [[http:// | ||
| + | * '' | ||
| + | * [[https:// | ||
| + | |||
| + | > perl mysqltuner.pl --user root --pass geheim --host 192.168.1.1 --port 3306 | ||
| + | | ||
| + | oder | ||
| + | | ||
| + | > touch ~/.my.cnf | ||
| + | > chmod 0600 ~/.my.cnf | ||
| + | > vi ~/.my.cnf | ||
| + | > perl mysqltuner.pl --defaults-file ~/.my.cnf | ||
| + | |||
| + | für Zugriffe über das Netz, hier muß der Option '' | ||
| + | > perl mysqltuner.pl --forcemem 4096 --forceswap 4096 --user root --pass geheim --host 192.168.1.1 --port 3306 | ||
| + | |||
| + | > perl mysqltuner.pl --defaults-file ~/.my.cnf 2>&1 | tee mysqltuner_-_$(date +' | ||
| + | |||
| + | |||
| + | ==== mysqltuner.pl funktioniert nicht mit PXC ==== | ||
| + | |||
| + | <code c Der Fehler> | ||
| + | # wget http:// | ||
| + | # perl mysqltuner.pl --forcemem 8000000000 --forceswap 8000000000 --defaults-file / | ||
| + | >> | ||
| + | * Jean-Marie Renouard < | ||
| + | * Major Hayden < | ||
| + | >> | ||
| + | >> | ||
| + | |||
| + | [--] Skipped version check for MySQLTuner script | ||
| + | mysql: [ERROR] unknown option ' | ||
| + | mysql: [ERROR] unknown option ' | ||
| + | [--] Assuming 8000000000 MB of physical memory | ||
| + | [--] Assuming 8000000000 MB of swap space | ||
| + | [!!] Failed to execute: SELECT VERSION() | ||
| + | [!!] FAIL Execute SQL / return code: 1792 | ||
| + | [!!] You probably do not have enough privileges to run MySQLTuner ... | ||
| + | </ | ||
| + | |||
| + | <code c Fehler nachstellen> | ||
| + | # / | ||
| + | mysql: [ERROR] unknown option ' | ||
| + | </ | ||
| + | |||
| + | <code c Client-Ursprung ermitteln> | ||
| + | # dpkg -S mysql | grep -F bin | grep -E mysql$ | ||
| + | percona-xtradb-cluster-client-5.7: | ||
| + | </ | ||
| + | |||
| + | <code c Der Grund steht in der Hilfe> | ||
| + | # / | ||
| + | ... | ||
| + | The following options may be given as the first argument: | ||
| + | --print-defaults | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | <code c Test ist nicht befriedigend> | ||
| + | # / | ||
| + | / | ||
| + | --port=3306 --socket=/ | ||
| + | </ | ||
| Zeile 363: | Zeile 551: | ||
| | | ||
| replicate_wild_ignore_table | replicate_wild_ignore_table | ||
| + | |||
| + | |||
| + | ===== MyISAM-Tuning ===== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | prüfen, ob '' | ||
| + | > echo "SHOW STATUS LIKE ' | ||
| + | Wert ist sehr gut (12570.9) | ||
| + | | ||
| + | > echo "SHOW STATUS LIKE ' | ||
| + | +---------------+---------+ | ||
| + | | Variable_name | Value | | ||
| + | +---------------+---------+ | ||
| + | | Key_reads | ||
| + | +---------------+---------+ | ||
| + | +-------------------+-------------+ | ||
| + | | Variable_name | ||
| + | +-------------------+-------------+ | ||
| + | | Key_read_requests | 19943598300 | | ||
| + | +-------------------+-------------+ | ||
| + | |||
| + | // | ||
| + | |||
/home/http/wiki/data/attic/mysql_tuning.1645705004.txt · Zuletzt geändert: von manfred
