Таблица MySQL продолжает давать сбой при высокой нагрузке

У меня есть база данных примерно на 6 ГБ, и одна таблица занимает почти все пространство, и когда сервер получает высокую нагрузку, таблица продолжает сбой, так что мне приходится останавливать сервер MySQL и восстанавливать его, а затем запускать его снова. Есть идеи, почему и что могло бы вызвать это и как я мог бы это смягчить? Это происходит ТОЛЬКО, когда сервер внезапно получает большой всплеск посетителей. См. Этот пример изображения, когда последний сбой произошел во время всплеска: image of last crash

Мой хостинг-провайдер сказал следующее, когда я попросил их изучить:

При проверке мы обнаружили, что размер базы данных больше, поэтому когда сайт подвергается большой нагрузке, много запросов к базе данных будет существует, поэтому вероятность сбоя базы данных будет очень высокой.

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
0
задан 18 December 2020 в 11:13
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

1
ответ дан 17 December 2020 в 22:05

Теги

Похожие вопросы