阻止mariadb锁定进程

bvjveswy  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(322)

我们使用mariadb 10.2.14运行centos directadmin安装,其中安装了magento。
目前,当一个进程运行时,我们的db经常会锁定,因此所有其他进程都在等待当前进程完成。这是一个相当大的问题,因为例如,在这种情况下,添加到购物车的过程也在等待,人们无法订购。
我们如何防止数据库被锁定这么长时间并解决这个问题?
服务器:

6x Intel Xeon
32GB RAM
500GB SSD

我的.cnf:

[mysqld]

bind-address = 127.0.0.1
local-infile=0
innodb_file_per_table=1
innodb_file_format=barracuda

slow_query_log = 1
slow_query_log_file=/var/log/mysql-log-slow-queries.log

key_buffer = 250M
key_buffer_size = 250M
max_allowed_packet = 128M
table_cache = 512
sort_buffer_size = 7M
read_buffer_size = 7M
read_rnd_buffer_size = 7M
myisam_sort_buffer_size = 64M
tmp_table_size = 190M
query_cache_type = 1
query_cache_size = 220M
query_cache_limit = 512M
thread_cache_size = 150
max_connections = 225
wait_timeout = 300
innodb_buffer_pool_size = 7G
max_heap_table_size =180M
innodb_log_buffer_size = 36M
join_buffer_size = 32M
innodb_buffer_pool_instances = 7

long_query_time = 15
table_definition_cache = 4K
open_files_limit = 60K
table_open_cache = 50767
innodb_log_file_size= 128M
innodb_lock_wait_timeout = 700
qmelpv7a

qmelpv7a1#

mysql会等待一定的时间来移除锁,然后才会放弃并抛出错误。如果您能够跟踪在一天中任何一致的时间看到这些错误消息的时间,那么您应该查看服务器当时在做什么—例如,数据库备份正在运行。通过这样做,您应该能够缩小创建锁的进程的可能性,尽管这样做并不总是那么直截了当——可能是一点尝试和错误。
有时会在数据库上造成死锁问题。此问题背后的原因是,如果您正在运行大量自定义脚本,并在数据库连接有机会关闭之前终止这些脚本。
如果您可以从cli登录mysql并运行以下命令
显示进程列表;
您将得到以下输出

+———+—————–+——————-+—————–+———+——+——-+——————+———–+—————+———–+
|      Id        |   User     |             Host             |       db       | Command | Time | State | Info | Rows_sent | Rows_examined | Rows_read |
+———+—————–+——————-+—————–+———+——+——-+——————+———–+—————+———–+
| 6794372 | db_user| 111.11.0.65:21532 | db_name| Sleep          | 3800 |          | NULL |          0       |          0                   |          0             |
| 6794475 | db_user| 111.11.0.65:27488 | db_name| Sleep         | 3757 |          | NULL |          0        |          0                   |          0             |
| 6794550 | db_user| 111.11.0.65:32670 | db_name| Sleep         | 3731 |          | NULL |          0        |          0                   |          0             |
| 6794797 | db_user| 111.11.0.65:47424 | db_name | Sleep         | 3639 |          | NULL |          0       |          0                   |          0             |
| 6794909 | db_user| 111.11.0.65:56029 | db_name| Sleep         | 3591 |          | NULL |          0       |          0                   |          0              |
| 6794981 | db_user| 111.11.0.65:59201 | db_name| Sleep         | 3567 |          | NULL |          0        |          0                   |          0             |
| 6795096 | db_user| 111.11.0.65:2390 | db_name| Sleep           | 3529 |          | NULL |          0        |          0                   |          0             |
| 6795270 | db_user| 111.11.0.65:10125 | db_name | Sleep         | 3473 |          | NULL |          0       |          0                   |          0             |
| 6795402 | db_user| 111.11.0.65:18407 | db_name| Sleep         | 3424 |          | NULL |         0         |          0                   |          0             |
| 6795701 | db_user| 111.11.0.65:35679 | db_name| Sleep         | 3330 |          | NULL |          0        |          0                   |          0             |
| 6800436 | db_user| 111.11.0.65:57815 | db_name| Sleep         | 1860 |          | NULL |          0       |          0                   |          0             |
| 6806227 | db_user| 111.11.0.67:20650 | db_name| Sleep         |  188 |          | NULL |          1        |          0                   |          0             |
| 6806589 | db_user| 111.11.0.65:36618 | db_name| Query        |   0    | NULL | SHOW PROCESSLIST |       0         |       0                 |       0       |
| 6806742 | db_user| 111.11.0.75:38717 | db_name| Sleep          |   0    |          | NULL |         0         |          0                    |          0            |
| 6806744 | db_user| 111.11.0.75:38819 | db_name| Sleep         |    0    |          | NULL |          61       |          61                  |          61         |
+———+—————–+——————-+—————–+———+——+——-+——————+———–+—————+———–+
15 rows in set (0.00 sec)

例如6794372,命令是sleep,时间是3800。这妨碍了其他行动。
这些进程应该使用命令逐个终止。
杀死6794372人;
一旦你杀死了所有的睡眠连接,事情就应该恢复正常了

abithluo

abithluo2#

这些是不赞成的;他们的名字变了。删除它们:

key_buffer = 250M
table_cache = 512

这些值高于其应值:

key_buffer_size = 250M
query_cache_size = 220M
thread_cache_size = 150
long_query_time = 15
table_definition_cache = 4K
table_open_cache = 50767
innodb_lock_wait_timeout = 700

最后一个可能是恶棍。这意味着你有一些looong交易。这是代码中的设计缺陷。想办法缩短交易时间。如果你需要帮助,描述一下你对我们做了什么。
我感觉到了 5 对于一笔交易来说是足够长的。
你有时会这样吗?

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
lawou6xi

lawou6xi3#

为您的my.cnf[mysqld]部分考虑的建议
下面是#to disable or remove to allow defaults to service your requirements,rick james在前面的评论中已经提到了其中一些。
. 密钥缓冲区。密钥缓冲区大小。表\u缓存。排序缓冲区大小。读取缓冲区大小。读取缓冲区大小。myisam\排序\缓冲区\大小。加入缓冲区大小。查询时间长。innodb\锁定\等待\超时
进行这些更改或在my.cnf中添加行

query_cache_type=0  # from 1  to turn OFF QC and conserve CPU cycles
query_cache_size=0  # from 220M to conserve RAM for more useful work
query_cache_limit=0  # from 512M to conserve RAM for more useful work
thread_cache_size=100  # from 150  V8 refman suggested CAP to avoid OOM
innodb_lru_scan_depth=100  # from 1024 to minimum to conserve CPU every SECOND
innodb_flush_neighbors=0  # from 1 no need to waste CPU cycles when using SSD
innodb_io_capacity_max=10000  # from 2000 since you have SSD
innodb_io_capacity=5000  # from 200 to use more of your SSD capability

如需其他帮助,请查看我的个人资料,clk网络个人资料的联系信息。

相关问题