
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:
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_connections
a, 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. myisamchk
es 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