La tabla MySQL sigue fallando con carga alta

La tabla MySQL sigue fallando con carga alta

Tengo una base de datos de aproximadamente 6 GB y una tabla ocupa casi todo ese espacio y cuando el servidor sufre una carga alta, la tabla sigue fallando, por lo que tengo que detener el servidor MySQL, repararlo y luego iniciarlo nuevamente. ¿Alguna idea de por qué y qué estaría causando esto y cómo podría mitigarlo? Esto SÓLO sucede cuando el servidor de repente recibe un gran aumento de visitantes. Vea esta imagen de ejemplo de cuándo ocurrió el último bloqueo durante un pico:imagen del último accidente

Mi proveedor de hosting dijo lo siguiente cuando les pedí que investigaran:

Al verificar, descubrimos que el tamaño de la base de datos es mayor, por lo que cuando el sitio web sufre una carga elevada, existirán muchas consultas a la base de datos, por lo que la posibilidad de que la base de datos falle será muy alta.

GRATIS -M

              total        used        free      shared  buff/cache   available
Mem:           8342        1451         586         451        6304        6180

LA INFORMACIÓN DE LA MESA

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

MI.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

Respuesta1

Por ahora, aumente key_buffer_size a 1G.

A largo plazo, migre de MyISAM a InnoDB (y cambie los tamaños de caché). Esto al menos eliminará la necesidad de "reparar".

¿Cuál es la consulta traviesa que se ejecuta cuando ocurre el problema? ¿O crees que "demasiados usuarios" se tropiezan entre sí? He visto tal. La solución rápida esdisminuir max_connectionsa, digamos, 200 y también disminuir el número de "hijos" que mantiene el servidor web; en primer lugar, esto evitará que se realicen demasiadas conexiones.

Si eso no ayuda, proporcione más información siguiendo las instrucciones aquí: http://mysql.rjweb.org/doc.php/mysql_analysis

Realice el cambio (o adición) en [mysqld]. Ese es el nombre del servidor donde importa. myisamchkes una utilidad separada.

Esto cambia una tabla:

ALTER TABLE t ENGINE=InnoDB;

Consulte esto para obtener ayuda sobre cómo ajustar key_buffer_size e innodb_buffer_pool_size: http://mysql.rjweb.org/doc.php/memory

información relacionada