首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL表在高负载下不断崩溃

问MySQL表在高负载下不断崩溃
EN

Server Fault用户
提问于 2020-12-17 22:51:59
回答 1查看 1.3K关注 0票数 1

我有一个大约6GB的数据库,一个表占据了几乎所有的空间,当服务器被高负载击中时,该表不断崩溃,所以我不得不停止MySQL服务器并修复它,然后重新启动它。有什么原因和原因吗?我怎样才能减轻这个问题?只有当服务器突然获得大量访问者时,才会发生这种情况。参见上一次崩溃是何时在高峰期间发生的示例图像:

我的托管服务提供商在我要求他们进行调查时说了以下几点:

在检查时,我们发现数据库的大小较高,所以当网站负载较高时,会存在大量的数据库查询,因此数据库崩溃的几率很高。

无

-M

代码语言:javascript
复制
              total        used        free      shared  buff/cache   available
Mem:           8342        1451         586         451        6304        6180

表信息

代码语言:javascript
复制
Table - Rows - Engine - encoding - Size 
Stats: 22 020 753   MyISAM  utf8_unicode_ci 6,0 GB  

服务器

代码语言:javascript
复制
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

代码语言:javascript
复制
[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
EN

回答 1

Server Fault用户

回答已采纳

发布于 2020-12-17 23:05:31

现在,将key_buffer_size提高到1G。

从长远来看,从MyISAM迁移到InnoDB (并更改缓存大小)。这至少可以消除“修理”的需要。

当问题发生时,运行的调皮查询是什么?还是你认为这是“太多的用户”绊倒对方?我见过这种情况。快速的解决方法是将max_connections减少到200,同时减少web服务器维护的“子”的数量--这将防止首先建立太多的连接。

如果这些没有帮助,请按照下面的说明提供更多信息:http://mysql.rjweb.org/doc.php/mysql_分析

在[mysqld]下进行更改(或添加)。这是重要的服务器的名称。myisamchk是一个单独的实用程序。

这将更改一个表:

代码语言:javascript
复制
ALTER TABLE t ENGINE=InnoDB;

有关调整key_buffer_size和innodb_buffer_pool_size:http://mysql.rjweb.org/doc.php/memory的帮助,请参阅以下内容

票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1046672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档