相关疑难解决方法(0)

无法破译 innodb 状态日志中的死锁

我们从 Microsoft ADO.NET 连接器访问 MySQL。

有时我们会在 innodb 状态中看到以下死锁,并且无法确定问题的原因。看起来事务(2)正在等待并持有相同的锁?

------------------------
LATEST DETECTED DEADLOCK
------------------------
110606  5:35:09
*** (1) TRANSACTION:
TRANSACTION 0 45321452, ACTIVE 0 sec, OS thread id 3804 starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 368, 1 row lock(s)
    MySQL thread id 84, query id 3265713 localhost 127.0.0.1 famdev Updating
    UPDATE people SET company_id = 1610, name = '<name>', password = '<hash>', temp_password = NULL, reset_password_hash = NULL, email = …
Run Code Online (Sandbox Code Playgroud)

mysql innodb deadlock ado.net

17
推荐指数
2
解决办法
6933
查看次数

偶尔查询缓慢的原因?

我们在 Windows Server 2008 R2 上运行 MySQL 5.1。

我们最近一直在对我们的数据库进行一些诊断,并发现了一些我们无法解释的令人不安的伪影。当我们有需要很长时间(> 2000 毫秒)的查询时,我们添加了一些代码来记录。结果令人惊讶(并且可能是对我们僵局的解释)。

有时,通常只需要很少时间(<10 毫秒)的查询需要 4 到 13 秒。需要明确的是,这些是持续运行(每秒数次)并且不会受到这些查询时间峰值影响的查询。

我们已经检查了我们的索引,寻找任何明显的错误,但运气不佳。

更新

人表:

| people | CREATE TABLE `people` (
`people_id` bigint(20) NOT NULL AUTO_INCREMENT,
`company_id` bigint(20) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`temp_password` varchar(10) DEFAULT NULL,
`reset_password_hash` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`phone` varchar(32) DEFAULT NULL,
`mobile` varchar(32) DEFAULT NULL,
`iphone_device_id` varchar(160) DEFAULT NULL,
`iphone_device_time` datetime DEFAULT NULL,
`last_checkin` datetime DEFAULT NULL, …
Run Code Online (Sandbox Code Playgroud)

mysql performance

16
推荐指数
1
解决办法
8900
查看次数

使用 InnoDB 引擎输入几场演出后,MySQL LOAD DATA INFILE 速度降低了 80%

我正在通过 LOAD DATA INFILE 加载一个 100GB 的文件。我在 MyISAM 上取得了很好的成功,几个小时就完成了。

我现在正在尝试使用 InnoDB。负载以超过 10MB/秒的速度快速启动(观察表文件增长,file_per_table已打开)。

但是在大约 5GB 的数据之后它会减慢到 2-4MB/秒的范围,当我超过 20GB 时它会下降大约 2MB/秒。

InnoDB 缓冲池大小为 8G。在运行 LOAD DATA INFILE 命令之前,我已经完成了以下操作:

SET @@session.sql_log_bin=0;
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
alter table item_load disable keys;
//Run LOAD DATA INFILE....
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它开始良好并随着时间的推移放缓。

此外,使用相同的设置,我使用 InnoDB 和 MyISAM 以及 5GB 测试数据集对表运行相同的 LOAD DATA INFILE 命令,MyISAM 速度提高了 20 倍:

InnoDB:

mysql> LOAD DATA CONCURRENT LOCAL INFILE '/tmp/item' REPLACE INTO TABLE item_load;
Query OK, 2630886 rows affected, 6 warnings (21 …
Run Code Online (Sandbox Code Playgroud)

mysql innodb myisam performance

14
推荐指数
3
解决办法
3万
查看次数

这两个查询如果依次执行会导致死锁吗?

这几乎可以肯定是我的另一个问题的原因,但我认为值得将两者分开,因为我有一个基于以下日志的假设,我很乐意伪造或验证该假设。

我的假设是另一个死锁实际上是以下查询的结果,根据我的理解隐藏了原始查询,innodb 状态仅显示最近的事务(这是正确的吗?)。

根据日志,我检查了我们的代码,发现依次执行了以下两个查询:

db.Execute("UPDATE people SET iphone_device_id=NULL WHERE iphone_device_id=@0 AND people_id<>@1", DeviceID, m_User.people_id);
// I have hard coded this query in this snippet to simplify things
db.Execute("UPDATE people SET company_id = 444, name = 'Dad', password = '<pass>', temp_password = NULL, reset_password_hash = NULL, email = '<redacted>@gmail.com', phone = NULL, mobile = NULL, iphone_device_id = 'iphone:<device_id_blah>', iphone_device_time = '2011-06-06 19:12:29', last_checkin = '2011-06-07 02:49:47', location_lat = <lat>, location_long = <lng>, gps_strength = 66, picture_blob_id = …
Run Code Online (Sandbox Code Playgroud)

mysql innodb deadlock ado.net

12
推荐指数
2
解决办法
6490
查看次数

mysqldump --single-transaction,但更新查询正在等待备份

如果我使用 mysqldump --single-transaction,根据文档,它应该使用读锁刷新表以获得一致的状态,然后启动事务,并且不应该等待写入者。

但是,我昨晚发现了以下情况:

摘自显示完整的进程列表:

数百个……

   Command: Query
   Time: 291
   State: Waiting for table flush
   Info: insert into db_external_notification.....
Run Code Online (Sandbox Code Playgroud)

那么这个:

Command: Query
Time: 1204
State: Sending data
Info: SELECT /*!40001 SQL_NO_CACHE */ * FROM `db_external_notification`
Run Code Online (Sandbox Code Playgroud)

其余线程处于睡眠状态

有谁知道这些插入物在等什么?我没有看到任何 FLUSH 表或 DDL 或手册中提到的任何可能导致查询等待的内容。

完整的 mysqldump 命令

mysqldump --quick --add-drop-table --single-transaction --master-data=2 -uxx -pxx dbname
Run Code Online (Sandbox Code Playgroud)

我猜 --quick 在这里是多余的,可能是早期的遗留物,这个脚本很旧,但不应该伤害任何东西

mysql innodb mysqldump backup mysql-5.6

11
推荐指数
2
解决办法
5万
查看次数

InnoDB 死锁是 INSERT/UPDATE/DELETE 独有的吗?

我正在解决 MySQL 错误“尝试获取锁定时发现死锁;尝试重新启动事务”

我将不得不更新程序以允许死锁。该SELECT语句是否可能会产生死锁错误?我知道它只是一个读锁,所以多重选择不会有问题,但是如果有一个INSERT, UPDATEorDELETE语句(可能有连接的子查询)和一个SELECT语句(可能有连接或子查询)怎么办?

是否有可能在SELECT而不是INSERT,UPDATE或上抛出错误DELETE

如果你好奇,故事就在这里。

mysql innodb deadlock

8
推荐指数
1
解决办法
7343
查看次数

标签 统计

mysql ×6

innodb ×5

deadlock ×3

ado.net ×2

performance ×2

backup ×1

myisam ×1

mysql-5.6 ×1

mysqldump ×1