如何配置MySQL Innodb每小时处理1000次插入?


10

我的网站访问量很高,每小时可能会插入数千条新记录。

这个错误使网站瘫痪:

PDOException: SQLSTATE[40001]: Serialization failure: 1213 
Deadlock found when trying to get lock; 
try restarting transaction: INSERT INTO {location_instance} 
(nid, vid, uid, genid, lid) VALUES (:db_insert_placeholder_0, 
:db_insert_placeholder_1, :db_insert_placeholder_2, 
:db_insert_placeholder_3, :db_insert_placeholder_4); 
Array ( [:db_insert_placeholder_0] => 1059 [:db_insert_placeholder_1] => 
1059 [:db_insert_placeholder_2] => 0 [:db_insert_placeholder_3] => 
cck:field_item_location:1059 [:db_insert_placeholder_4] => 1000 )

如果MySQL无法处理这种类型的负载,我将感到非常惊讶。那么,我的问题是,这是数据库问题吗?如何配置MySQL以处理这么大的流量?

我在开发服务器上设置了网站副本,脚本中的脚本模拟了添加到网站上的内容的负载。我正在运行带有16GB RAM的Ubuntu,LAMP堆栈。

诚然,我对数据库不是很了解。实际上,我从“ apt-get install”完成后附带的默认my.cnf开始。表都是Innodb。您将建议采用哪种初始配置设置和方法来开始解决此问题?

让我知道您可能需要更多的信息。

谢谢


您是从默认的my.cnf开始生产的?伙计,您必须进一步优化它。我的答案中将详细介绍您。:-)

Answers:


11

您正在处理僵局,而不是性能瓶颈问题。

如果您每小时有一千条新记录,那么您离达到MySQL限制还很远。MySQL可以处理至少50倍的负载。

死锁是由应用程序代码引起的,而不是数据库服务器的故障。除某些特定情况外,无法在MySQL服务器端修复死锁。

InnoDB可以通过SHOW ENGINE INNODB STATUS在MySQL提示符下运行或使用来向您显示详细的死锁信息mysql -uroot -p... -e "SHOW ENGINE INNODB STATUS"

但是,这仅显示最后发生的死锁,没有死锁日志。

幸运的是,有一个工具pt-deadlock-logger可以解决该问题,可以处理轮询InnoDB状态并保存所有详细的死锁信息,然后再用新的死锁刷新。


很高兴知道!我确实在show status命令中看到了有关锁以及相关查询和表的信息。鉴于这是我的代码中的内容,如何使用status命令中的信息来开始调试问题?PHP PDO查询非常简单-连接,准备,执行,重复。如果有帮助,我很乐意发布任何代码或状态消息。
user658182 '10 -10-6

@ user658182检查有关如何处理死锁的文章:关于如何处理死锁的方法:如何避免在尝试获取锁时发现mysql死锁
Valor 2012年

1
@ max-vernon感谢您对语法进行编辑,显然英语不是我的母语:-)。
Valor 2012年

1
-e“ SHOW ENGINE INNODB STATUS”
字形

8

这可能和运行事务的代码的一部分一样简单:

insert into t1...
insert into t2...
commit;

而代码的另一部分则以不同的顺序修改相同的表:

delete from t2 where...
delete from t1 where...
commit;

如果这两个事务同时运行,则会发生争用情况:第一个事务无法修改,t2因为它被第二个事务锁定;而第二笔交易由于t1被第一笔交易锁定而被类似地阻止。MySQL选择一个事务作为INSERT / UPDATE / DELETE失败的“受害者”。应用程序需要捕获该错误,然后重试该语句-可能是在暂停之后,以便其他事务有时间完成。与容量限制无关,只是不幸的时序可能会因代码的排列方式而加剧。切换事务2中的DELETE或事务1中的INSERT,然后就没有冲突-每个事务都将等待对所需表的访问。

在MySQL 5.6中,可以在启用innodb_print_all_deadlocks选项的情况下运行,以收集有关MySQL错误日志中所有死锁(而不仅仅是最新死锁)的信息。

[强制性免责声明:我是Oracle员工。以上是我的个人观点,并非官方声明。]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.