
Eu tenho um banco de dados de cerca de 6 GB e uma tabela ocupa quase todo esse espaço e quando o servidor é atingido por uma carga alta, a tabela continua travando, então eu tenho que parar o servidor MySQL e repará-lo, depois iniciá-lo novamente. Alguma idéia de por que e o que estaria causando isso e como eu poderia mitigar isso? Isso SÓ acontece quando o servidor recebe repentinamente um grande aumento de visitantes. Veja esta imagem de exemplo de quando ocorreu a última falha durante um pico:
Meu provedor de hospedagem disse o seguinte quando pedi que investigassem:
Na verificação, descobrimos que o tamanho do banco de dados é maior, então quando o site sofre uma carga alta, muitas consultas ao banco de dados existirão, então a chance de o banco de dados travar será muito alta.
GRÁTIS -M
total used free shared buff/cache available
Mem: 8342 1451 586 451 6304 6180
A INFORMAÇÃO DA TABELA
Table - Rows - Engine - encoding - Size
Stats: 22 020 753 MyISAM utf8_unicode_ci 6,0 GB
SERVIDOR
Server: Localhost via UNIX socket
Servertyp: MariaDB
Server connection: SSL is not being used Dokumentation
Serverversion: 10.3.27-MariaDB - MariaDB Server
Protokollversion: 10
MEU.CNF
[mysql]
# CLIENT #
port = 3306
socket = /var/lib/mysql/mysql.sock
[mysqld]
log-error=/var/lib/mysql/server.err
performance-schema=0
table_open_cache=2000
innodb_strict_mode="ON"
sql_mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
open_files_limit=40000
# GENERAL #
user = mysql
default-storage-engine = InnoDB
socket = /var/lib/mysql/mysql.sock
pid-file = /var/lib/mysql/mysql.pid
# MyISAM #
key-buffer-size = 64M
myisam-sort-buffer-size = 64M
myisam-recover-options = FORCE
# SAFETY #
skip-external-locking
max-allowed-packet = 128M
max-connect-errors = 1000000
innodb = FORCE
# DATA STORAGE #
datadir = /var/lib/mysql/
# CACHES AND LIMITS #
tmp-table-size = 32M
max-heap-table-size = 32M
query-cache-type = 0
query-cache-size = 32
max-connections = 500
thread-cache-size = 286
open-files-limit = 65535
table-definition-cache = 1024
table-open-cache = 512
group-concat-max-len = 1048576
# INNODB #
#innodb-flush-method = O_DIRECT
innodb-log-files-in-group = 2
innodb-log-file-size = 512M
innodb-log-buffer-size = 16M
innodb-flush-log-at-trx-commit = 2
innodb-file-per-table = 1
innodb-buffer-pool-size = 4G
# LOGGING #
# log-queries-not-using-indexes = 1
# slow-query-log = 1
# slow-query-log-file = /var/lib/mysql/mysql-slow.log
max_allowed_packet=268435456
innodb_file_per_table=1
[mysqldump]
quick
max_allowed_packet = 128M
[myisamchk]
key_buffer_size = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
Responder1
Por enquanto, aumente key_buffer_size para 1G.
No longo prazo, migre do MyISAM para o InnoDB (e altere os tamanhos do cache). Isso pelo menos eliminará a necessidade de "reparar".
Qual é a consulta maliciosa que está sendo executada quando o problema ocorre? Ou você acha que são "muitos usuários" tropeçando uns nos outros? Eu já vi isso. A solução rápida édiminuir max_connections
para, digamos, 200 e também diminuir o número de "filhos" que o servidor web mantém - isso evitará que muitas conexões sejam feitas em primeiro lugar.
Se isso não ajudar, forneça mais informações seguindo as instruções aqui: http://mysql.rjweb.org/doc.php/mysql_análise
Faça a alteração (ou adição) em [mysqld]
. Esse é o nome do servidor onde importa. myisamchk
é um utilitário separado.
Isso altera uma tabela:
ALTER TABLE t ENGINE=InnoDB;
Veja isto para obter ajuda no ajuste de key_buffer_size e innodb_buffer_pool_size: http://mysql.rjweb.org/doc.php/memory