У меня есть база данных примерно на 6 ГБ, и одна таблица занимает почти все пространство, и когда сервер получает высокую нагрузку, таблица продолжает сбой, так что мне приходится останавливать сервер MySQL и восстанавливать его, а затем запускать его снова. Есть идеи, почему и что могло бы вызвать это и как я мог бы это смягчить? Это происходит ТОЛЬКО, когда сервер внезапно получает большой всплеск посетителей. См. Этот пример изображения, когда последний сбой произошел во время всплеска:
Мой хостинг-провайдер сказал следующее, когда я попросил их изучить:
При проверке мы обнаружили, что размер базы данных больше, поэтому когда сайт подвергается большой нагрузке, много запросов к базе данных будет существует, поэтому вероятность сбоя базы данных будет очень высокой.
FREE -M
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
MY.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
На данный момент увеличьте 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