높은 부하에서 MySQL 테이블이 계속 충돌함

높은 부하에서 MySQL 테이블이 계속 충돌함

약 6GB의 데이터베이스가 있고 하나의 테이블이 거의 모든 공간을 차지하며 서버에 높은 부하가 걸리면 테이블이 계속 충돌하므로 MySQL 서버를 중지하고 복구한 다음 다시 시작해야 합니다. 이 문제의 원인과 원인, 그리고 이를 완화할 수 있는 방법에 대한 아이디어가 있습니까? 이는 서버에 방문자가 갑자기 급증할 때만 발생합니다. 급증 중에 마지막 충돌이 발생한 경우의 예시 이미지를 참조하세요.지난번 충돌 이미지

호스팅 제공업체에 조사를 요청했을 때 다음과 같이 말했습니다.

확인 결과, 데이터베이스 크기가 더 크기 때문에 웹 사이트의 로드가 높을 때 많은 데이터베이스 쿼리가 존재하므로 데이터베이스 충돌 가능성이 매우 높다는 것을 발견했습니다.

무료 -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

답변1

지금은 key_buffer_size를 1G로 늘립니다.

장기적으로는 MyISAM에서 InnoDB로 마이그레이션하고 캐시 크기를 변경하세요. 그러면 적어도 "수리"의 필요성이 사라질 것입니다.

문제가 발생할 때 실행 중인 잘못된 쿼리는 무엇입니까? 아니면 "너무 많은 사용자"가 서로 걸려 넘어지고 있다고 생각하십니까? 나는 그런 것을 본 적이 있다. 빠른 수정은감소하다 max_connections예를 들어 200개로 늘리고 웹 서버가 유지하는 "하위" 수를 줄입니다. 이렇게 하면 애초에 너무 많은 연결이 이루어지는 것을 방지할 수 있습니다.

그래도 도움이 되지 않으면 다음 지침에 따라 추가 정보를 제공하세요. http://mysql.rjweb.org/doc.php/mysql_analytic

에서 변경(또는 추가)을 수행합니다 [mysqld]. 이것이 중요한 서버의 이름입니다. myisamchk별도의 유틸리티입니다.

그러면 테이블 하나가 변경됩니다.

ALTER TABLE t ENGINE=InnoDB;

key_buffer_size 및 innodb_buffer_pool_size 조정에 대한 도움말은 다음을 참조하세요. http://mysql.rjweb.org/doc.php/memory

관련 정보