
У меня есть база данных размером около 6 ГБ, и одна таблица занимает почти все это пространство, и когда сервер получает высокую нагрузку, таблица продолжает падать, так что мне приходится останавливать сервер MySQL и восстанавливать его, а затем запускать снова. Есть идеи, почему и что может быть причиной этого и как я могу это смягчить? Это происходит ТОЛЬКО тогда, когда сервер внезапно получает большой всплеск посетителей. Посмотрите на это изображение примера, когда последний сбой произошел во время всплеска:
Когда я попросил моего хостинг-провайдера провести расследование, он сказал следующее:
При проверке мы обнаружили, что размер базы данных больше, поэтому, когда веб-сайт подвергается высокой нагрузке, возникает множество запросов к базе данных, поэтому вероятность сбоя базы данных очень высока.
БЕСПЛАТНО -М
total used free shared buff/cache available
Mem: 8342 1451 586 451 6304 6180
ИНФОРМАЦИЯ О ТАБЛИЦЕ
Table - Rows - Engine - encoding - Size
Stats: 22 020 753 MyISAM utf8_unicode_ci 6,0 GB
СЕРВЕР
Server: Localhost via UNIX socket
Servertyp: MariaDB
Server connection: SSL is not being used Dokumentation
Serverversion: 10.3.27-MariaDB - MariaDB Server
Protokollversion: 10
МОЙ.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
решение1
На данный момент увеличьте key_buffer_size до 1G.
В долгосрочной перспективе мигрируйте с MyISAM на InnoDB (и измените размеры кэша). Это, по крайней мере, избавит от необходимости "ремонта".
Что за непослушный запрос выполняется, когда возникает проблема? Или вы думаете, что это "слишком много пользователей", спотыкающихся друг о друга? Я видел такое. Быстрое решение - этоснижаться max_connections
например, до 200, а также уменьшите количество «дочерних» элементов, поддерживаемых веб-сервером, — это позволит изначально избежать слишком большого количества подключений.
Если это не поможет, предоставьте дополнительную информацию, следуя инструкциям здесь: http://mysql.rjweb.org/doc.php/mysql_analysis
Внесите изменения (или дополнения) в [mysqld]
. Это имя сервера, где это имеет значение. myisamchk
— это отдельная утилита.
Это меняет одну таблицу:
ALTER TABLE t ENGINE=InnoDB;
Посмотрите это для получения справки по настройке key_buffer_size и innodb_buffer_pool_size: http://mysql.rjweb.org/doc.php/memory