我有一个大约 6GB 的数据库,一个表几乎占用了所有空间,当服务器负载过高时,表不断崩溃,因此我不得不停止 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
马来西亚中国金融信息网
[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,同时减少 Web 服务器维护的“子”数量——这将首先防止建立过多的连接。
如果这些没有帮助,请按照此处的说明提供更多信息: 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