相关疑难解决方法(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 状态仅显示最近的事务(这是正确的吗?)。

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

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
查看次数

即使在 READ COMMITTED 中,MySQL InnoDB 也会在删除时锁定主键

前言

我们的应用程序运行多个DELETE并行执行查询的线程。查询影响孤立的数据,即不应该存在并发DELETE发生在来自不同线程的相同行上的可能性。但是,根据文档,MySQL 对DELETE语句使用所谓的“next-key”锁,它同时锁定匹配的键和一些间隙。这会导致死锁,我们找到的唯一解决方案是使用READ COMMITTED隔离级别。

问题

DELETE使用JOIN大表执行复杂语句时会出现问题。在特定情况下,我们有一个带有警告的表,只有两行,但查询需要从两个单独的INNER JOINed 表中删除属于某些特定实体的所有警告。查询如下:

DELETE pw 
FROM proc_warnings pw 
INNER JOIN day_position dp 
   ON dp.transaction_id = pw.transaction_id 
INNER JOIN ivehicle_days vd 
   ON vd.id = dp.ivehicle_day_id 
WHERE vd.ivehicle_id=? AND dp.dirty_data=1
Run Code Online (Sandbox Code Playgroud)

当 day_position 表足够大时(在我的测试用例中有 1448 行),那么即使使用READ COMMITTED隔离模式,任何事务也会阻塞整个 proc_warnings表。

该问题始终在此示例数据上重现 - http://yadi.sk/d/QDuwBtpW1BxB9在 MySQL 5.1(在 5.1.59 上检查)和 MySQL 5.5(在 MySQL 5.5.24 上检查)中。

编辑:链接的示例数据还包含查询表的架构和索引,为方便起见,在此处复制:

CREATE TABLE  `proc_warnings` (
    `id` int(11) NOT NULL AUTO_INCREMENT, …
Run Code Online (Sandbox Code Playgroud)

mysql innodb mysql-5.5 locking isolation-level

12
推荐指数
1
解决办法
6876
查看次数

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万
查看次数

如何选择受更新影响的行

执行update查询时(以下只是示例;update可以使用任何查询)例如:

update t1 
inner join t2 on t1.id=t2.id
set t1.name="foo" where t2.name="bar";
Query OK, 324 rows affected (1.82 sec)
Run Code Online (Sandbox Code Playgroud)

您如何查看哪些行受到影响(324 rows affected响应中的)?我尝试将表达式转换为 a select,例如

select * from t1 
inner join t2 on t1.id=t2.id
where t1.name="foo";
Run Code Online (Sandbox Code Playgroud)

但这也会返回 之前的name="foo"update。从概念上讲,我想做类似的事情

select * from rows_affected;
Run Code Online (Sandbox Code Playgroud)

但这当然行不通。是否有一种方法可以允许检查/选择受查询影响的行updateselect 或者是在之前执行此操作update以查看哪些行将受到影响的唯一解决方案?

mysql

7
推荐指数
1
解决办法
1万
查看次数

您如何读取 MySQL InnoDB Monitor 输出?

我是数据库管理的新手。我试图找出死锁异常的原因,但我无法理解日志。

日志显示“事务 1 已回滚”。为什么会这样?赌注表与帐户表有外键关系,但它(运行插入的反式)无法获得 S 锁并因此因死锁而死亡是否“正常”?我的意思是,考虑到它只是验证参照完整性的读取,这似乎很糟糕。

第二笔交易也在写入赌注表,但没有更新。那么是用于创建 auto-inc 键的“机制”还是索引机制或两者都导致死锁?为什么它们不会以连续的方式发生?或者可能是他们,但某种等待时间太短了。

任何帮助,指针,进一步阅读如何使用下面的日志来解决死锁问题表示赞赏。

111031 17:39:26
*** (1) TRANSACTION:
TRANSACTION 0 984899905, ACTIVE 180 sec, process no 10882, OS thread id 1104619856 inserting
mysql tables in use 1, locked 1
LOCK WAIT 13 lock struct(s), heap size 3024, undo log entries 86
MySQL thread id 122, query id 28932942 localhost 127.0.0.1 bt update

INSERT INTO wager (amount_won, confirmation, created_by_partner, creation_date, description, fantasy_league, 
     first_game_start, image_thumb, image_wide, kind, last_game_start, last_update_version, locked, name, 
     num_future, num_past, num_present, partner, …
Run Code Online (Sandbox Code Playgroud)

mysql innodb monitoring deadlock insert

5
推荐指数
1
解决办法
4570
查看次数

正在选择查询时无法写入 mysql 数据库

在 InnoDB 上运行 Mysql 5.1.57,并且存在数据库锁定问题。

我有两个单独的会话连接到单个数据库 MySQL。在第一个会话中,我在表 A 上运行了一个很长的 SELECT 查询(技术上是一个慢速查询)。然后在另一个连接上,我在表 B 上运行了一个小的 UPDATE 查询。

编辑:如本主题底部所述,当表/查询完全位于不同的数据库中时也会出现此问题,并且不限于表/查询位于同一数据库中。

由于某种原因,在长选择查询完成之前,表 B 上的更新不会完成,就好像它们在同一个连接上一样。此外,“PROCESS LIST”将第二个查询显示为“正在释放项目”,同时它正在等待执行。

是否有任何设置或配置问题会导致这些查询按顺序运行而不是同时运行?

在此先感谢您的帮助。

表A

CREATE TABLE `history` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `log` text NOT NULL,
  `created_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `user_id_idx` (`user_id`),
  CONSTRAINT `history_user_id_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=364398 DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)

表B

CREATE TABLE `client` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `root_id` int(11) DEFAULT …
Run Code Online (Sandbox Code Playgroud)

mysql innodb locking amazon-rds

5
推荐指数
1
解决办法
6896
查看次数

如何使 select 语句被阻止?

您好,为了学习,我试图故意使 SQL select 语句被另一个简单的 SQL 删除或更新语句阻塞。我只喜欢 InnoDB 表。

为了准备测试,我创建了一个表

CREATE TABLE `test`.`client` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

并在表中插入了 1,000,000 行。


现在我要开始测试了。

在 MySQL 客户端 #1 中,我删除了所有行:

mysql #1> delete from client;
Run Code Online (Sandbox Code Playgroud)

当删除仍在执行时,在另一个 MySQL 客户端 #2 中,我尝试选择一行。

mysql #2> select * from client where id=1;
+---------+------+
| id      | name |
+---------+------+
| 1       | joe  |
+---------+------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

结果立即显示,选择没有被阻止。


接下来我将尝试另一个测试。我在表中插入了 1,000,000 行。

在 MySQL 客户端 …

mysql innodb deadlock select locking

5
推荐指数
1
解决办法
7074
查看次数

如何提高 MySQL 服务器性能..?

作为 MySQL DBA,大多数时候我们应该优化性能不佳的 MySQL 服务器。

现在我的问题是从哪里开始,就像我们需要找出很多事情一样

1.Find the duplicate indexes.
2.Find unused indexes on the basis of selectivity.
3.Monitor the Server Parameters(What should be important parameters).
4.Execute MySQL Server performance tuning script.
5.Slow logs
Run Code Online (Sandbox Code Playgroud)

那么检查服务器的顺序应该是什么,应该监视/分析的确切内容应该是什么,以提高性能。

mysql performance index optimization mysql-5.5

4
推荐指数
1
解决办法
4924
查看次数

AWS Aurora 中的表锁过时?

我们有一个 AWS Aurora(MySQL 引擎,r3.large)用于测试迁移。

我们注意到几个查询似乎根本无法运行。当我跑

show engine innodb status;
Run Code Online (Sandbox Code Playgroud)

它报告有一个表被锁定:

2017-06-21 18:20:49 2aea8928a700 Transaction:
TRANSACTION 6093969, ACTIVE 0 sec updating or deleting
mysql tables in use 1, locked 1
16 lock struct(s), heap size 376, 6164 row lock(s), undo log entries 1
MySQL thread id 12219, OS thread handle 0x2aea8928a700, query id 8842803 10.127.0.24 root updating
delete from <tablename> where id=<id>
Foreign key constraint fails for table `mydb`.`<otherTable>`:
Run Code Online (Sandbox Code Playgroud)

这是一个java应用程序。我已经停止了 tomcat 实例,并验证了没有活动连接,但锁没有清除。

我查看了 information_schema(INNODB_LOCKS、INNODB_LOCK_WAITS 和 INNODB_TRX)中的几个表,但有 0 条记录。

这是极光问题吗?除了 AWS Support …

mysql innodb transaction aws aurora

4
推荐指数
1
解决办法
5394
查看次数