Mysql Database downtimes
Ik heb een dedicated server
64GB RAM
Nu heb ik een grote database met 70GB aan indexen.
Als ik de waarde van innodb_buffer_pool_size in /etc/my.cnf wil berekenen gebruiki ik:
Quote:
SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM (SELECT SUM(data_length+index_length) Total_InnoDB_Bytes FROM information_schema.tables WHERE engine='InnoDB') A;
Komt uit op 104
Dus dit is min my.cnf
Quote:
[mysqld]
performance_schema = ON
local-infile=1
skip-name-resolve
#join_buffer_size=2M
read_buffer_size=2M
tmp_table_size=1G
max_heap_table_size=1G
#sort_buffer_size = 2M
read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
innodb_buffer_pool_size=104G
innodb_log_file_size=512M
innodb_buffer_pool_instances=4
innodb_flush_log_at_trx_commit = 2
innodb_flush_method= O_DIRECT
max_allowed_packet=100M
open_files_limit=40000
default-storage-engine=InnoDB
innodb_file_per_table=1
#innodb-thread-concurrency=8
#innodb_lock_wait_timeout = 100
max_connections=200
query_cache_type=1
query_cache_size=50M
query_cache_limit=1G
# thread_concurrency= 32
thread_cache_size= 8
key_buffer_size=156M
#Slow Query Log
slow_query_log = ON
slow-query_log_file = /var/log/mysql-slow.log
long_query_time = 2
table_open_cache=3000
[mysqldump]
max_allowed_packet=4G
performance_schema = ON
local-infile=1
skip-name-resolve
#join_buffer_size=2M
read_buffer_size=2M
tmp_table_size=1G
max_heap_table_size=1G
#sort_buffer_size = 2M
read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
innodb_buffer_pool_size=104G
innodb_log_file_size=512M
innodb_buffer_pool_instances=4
innodb_flush_log_at_trx_commit = 2
innodb_flush_method= O_DIRECT
max_allowed_packet=100M
open_files_limit=40000
default-storage-engine=InnoDB
innodb_file_per_table=1
#innodb-thread-concurrency=8
#innodb_lock_wait_timeout = 100
max_connections=200
query_cache_type=1
query_cache_size=50M
query_cache_limit=1G
# thread_concurrency= 32
thread_cache_size= 8
key_buffer_size=156M
#Slow Query Log
slow_query_log = ON
slow-query_log_file = /var/log/mysql-slow.log
long_query_time = 2
table_open_cache=3000
[mysqldump]
max_allowed_packet=4G
Ik krijg downtimes wanneer de cronjob word uitgevoerd die datafeeds van affiliate sites binnenhaalt.
Weet iemand wat er mis is met deze configuratie?
Staat die niet aan, omdat ik hem niet tegenkom in je configuratie?
/var/log/mysql/mysql.log
Innodb poolsize moet maximaal 80% van het beschikbare geheugen zijn (swapspace niet meegeteld):
Quote:
On a dedicated database server, you might set the buffer pool size to 80% of the machine's physical memory size. Be aware of the following potential issues when configuring buffer pool size, and be prepared to scale back the size of the buffer pool if necessary.
https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_buffer_pool_size
Quote:
slow_query_log = ON
slow-query_log_file = /var/log/mysql-slow.log
slow-query_log_file = /var/log/mysql-slow.log
Ik lees dus uit andere bronnen dat deze size 1.6 x hde totale indexwaarde moet zijn.
En elders idd 80% van het RAM.
Ik denk idd dat ik het laatste zal instellen en weer eens proberen.
Maar waarom zie ik niks in de logs?
Slow log is wat anders dan de normale log.
Ik denk dat in je /var/log/syslog (of /var/log/messages of journalctl -xe, afhankelijk van je distro en versie) of in /var/log/dmesg wel e.e.a. staat over het crashen/killen van de database engine.
Als het over het tweaken van dit soort parameters gaat moet je altijd eerst de x% (in dit geval 80%) van RAM aanhouden, dan pas de andere min/max waarden.
RAM is, ander dan CPU, een uitputbare resource. Er is niet meer te krijgen dan dat er is. Ga je meer claimen dan grijpt het OS in uit zelfbescherming en killt het proces wat zich misdraagt.
(n.b.: CPU kan natuurlijk ook "op" raken alleen gedraagt en manifesteert zich dat heel anders dan met RAM)
Dus dit erbij zal de normale log moeten werken.
general_log_file = /var/log/mysql/mysql.log
general_log = 1
Zorg er wel voor dat de folder /var/log/mysql bestaat en dat daar de juiste group/owner en permissions op staan ingesteld (te vinden in de MySQL documentatie)