查找原始的MySQL数据库死锁ID

标签: MySQL数据库错误 | 发表时间:2013-05-10 05:49 | 作者:
出处:http://pipes.yahoo.com/pipes/pipe.info?_id=3cc4794c339ceeddc915a3c3360ef524

  如果遇到死锁了,怎么解决呢?找到原始的锁ID,然后KILL掉一直持有的那个线程就可以了, 但是众多线程,可怎么找到引起死锁的线程ID呢? MySQL 发展到现在,已经非常强大了,这个问题很好解决。 直接从数据字典连查找。

  我们来演示下。

  线程A,我们用来锁定某些记录,假设这个线程一直没提交,或者忘掉提交了。 那么就一直存在,但是数据里面显示的只是SLEEP状态。

mysql> set @@autocommit=0; 
Query OK, 0 rows affected (0.00 sec) 
 
mysql> use test; 
Reading table information for completion of table and column names 
You can turn off this feature to get a quicker startup with -A 
 
Database changed 
mysql> show tables; 
+----------------+ 
| Tables_in_test | 
+----------------+ 
| demo_test      | 
| t3             | 
+----------------+ 
2 rows in set (0.00 sec) 
 
mysql> select * from t3; 
+----+--------+--------+------------+----+----+----+ 
| id | fname  | lname  | birthday   | c1 | c2 | c3 | 
+----+--------+--------+------------+----+----+----+ 
| 19 | lily19 | lucy19 | 2013-04-18 | 19 |  0 |  0 | 
| 20 | lily20 | lucy20 | 2013-03-13 | 20 |  0 |  0 | 
+----+--------+--------+------------+----+----+----+ 
2 rows in set (0.00 sec) 
 
mysql> update t3 set birthday = '2022-02-23' where id = 19; 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 1  Changed: 1  Warnings: 0 
 
mysql> select connection_id(); 
+-----------------+ 
| connection_id() | 
+-----------------+ 
|              16 | 
+-----------------+ 
1 row in set (0.00 sec) 
 
mysql>



  线程B, 我们用来进行普通的更新,但是遇到问题了,此时不知道是哪个线程把这行记录给锁定了?

mysql> use test; 
Reading table information for completion of table and column names 
You can turn off this feature to get a quicker startup with -A 
 
Database changed 
mysql> select @@autocommit; 
+--------------+ 
| @@autocommit | 
+--------------+ 
|            1 | 
+--------------+ 
1 row in set (0.00 sec) 
 
mysql> update t3 set birthday='2018-01-03' where id = 19; 
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 
mysql> select connection_id(); 
+-----------------+ 
| connection_id() | 
+-----------------+ 
|              17 | 
+-----------------+ 
1 row in set (0.00 sec) 
 
mysql> show processlist; 
+----+------+-----------+------+---------+------+-------+------------------+ 
| Id | User | Host      | db   | Command | Time | State | Info             | 
+----+------+-----------+------+---------+------+-------+------------------+ 
| 10 | root | localhost | NULL | Sleep   | 1540 |       | NULL             | 
| 11 | root | localhost | NULL | Sleep   |  722 |       | NULL             | 
| 16 | root | localhost | test | Sleep   |  424 |       | NULL             | 
| 17 | root | localhost | test | Query   |    0 | init  | show processlist | 
| 18 | root | localhost | NULL | Sleep   |    5 |       | NULL             | 
+----+------+-----------+------+---------+------+-------+------------------+ 
5 rows in set (0.00 sec) 
 
mysql> show engine innodb status\G 
 
 
------------ 
TRANSACTIONS 
------------ 
Trx id counter 189327 
Purge done for trx's n:o < 189323 undo n:o < 0 state: running but idle 
History list length 343 
LIST OF TRANSACTIONS FOR EACH SESSION: 
---TRANSACTION 0, not started 
MySQL thread id 11, OS thread handle 0x7f70a0c98700, query id 994 localhost root init 
show engine innodb status 
---TRANSACTION 189326, ACTIVE 2 sec starting index read 
mysql tables in use 1, locked 1 
LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s) 
MySQL thread id 17, OS thread handle 0x7f70a0bd5700, query id 993 localhost root updating 
update t3 set birthday='2018-01-03' where id = 19 
------- TRX HAS BEEN WAITING 2 SEC FOR THIS LOCK TO BE GRANTED: 
RECORD LOCKS space id 529 page no 3 n bits 72 index `PRIMARY` of table `test`.`t3` trx id 189326 lock_mode X waiting 
Record lock, heap no 2 PHYSICAL RECORD: n_fields 9; compact format; info bits 0 
 0: len 2; hex 3139; asc 19;; 
 1: len 6; hex 00000002e38c; asc       ;; 
 2: len 7; hex 7e00000d2827c9; asc ~   (' ;; 
 3: len 6; hex 6c696c793139; asc lily19;; 
 4: len 6; hex 6c7563793139; asc lucy19;; 
 5: len 3; hex 8fcc57; asc   W;; 
 6: len 4; hex 80000013; asc     ;; 
 7: len 4; hex 80000000; asc     ;; 
 8: len 4; hex 80000000; asc     ;; 
 
------------------ 
---TRANSACTION 189324, ACTIVE 641 sec 
2 lock struct(s), heap size 376, 3 row lock(s), undo log entries 1 
MySQL thread id 16, OS thread handle 0x7f70a0b94700, query id 985 localhost root cleaning up 
Trx read view will not see trx with id >= 189325, sees < 189325



  上面的信息很繁多,也看不清楚到底哪里是哪里。

  不过现在,我们只要从数据字典里面拿出来这部分信息就OK了。

mysql> SELECT * FROM information_schema.INNODB_TRX\G 
*************************** 1. row *************************** 
                    trx_id: 189324 
                 trx_state: RUNNING 
               trx_started: 2013-04-18 17:48:14 
     trx_requested_lock_id: NULL 
          trx_wait_started: NULL 
                trx_weight: 3 
       trx_mysql_thread_id: 16 
                 trx_query: NULL 
       trx_operation_state: NULL 
         trx_tables_in_use: 0 
         trx_tables_locked: 0 
          trx_lock_structs: 2 
     trx_lock_memory_bytes: 376 
           trx_rows_locked: 3 
         trx_rows_modified: 1 
   trx_concurrency_tickets: 0 
       trx_isolation_level: REPEATABLE READ 
         trx_unique_checks: 1 
    trx_foreign_key_checks: 1 
trx_last_foreign_key_error: NULL 
 trx_adaptive_hash_latched: 0 
 trx_adaptive_hash_timeout: 10000 
          trx_is_read_only: 0 
trx_autocommit_non_locking: 0 
1 row in set (0.01 sec) 
 
mysql>



  原来是线程16忘掉COMMIT了。

原文出处:http://yueliangdao0608.blog.51cto.com/397025/1180917

相关 [mysql 数据库 死锁] 推荐:

查找原始的MySQL数据库死锁ID

- - searchdatabase
  如果遇到死锁了,怎么解决呢?找到原始的锁ID,然后KILL掉一直持有的那个线程就可以了, 但是众多线程,可怎么找到引起死锁的线程ID呢. MySQL 发展到现在,已经非常强大了,这个问题很好解决.   线程A,我们用来锁定某些记录,假设这个线程一直没提交,或者忘掉提交了. 那么就一直存在,但是数据里面显示的只是SLEEP状态.

如何查看MySQL数据库的死锁日志

- - 数据库 - ITeye博客
如何查看MySQL数据库的死锁日志. 使用终端或命令提示符登录到MySQL,输入命令:mysql -h xxxx.xxx.xxx -P 3306 -u username -p. 解释:xxxx.xxx.xxx是数据库IP地址,username是数据库用户名,输入命令后,会让你输入username对应的密码,就可以登录了.

MySQL数据库的修复

- Xin - 博客园-首页原创精华区
找到mysql的安装目录的bin/myisamchk工具,在命令行中输入:. 然后myisamchk 工具会帮助你恢复数据表的索引. 好象也不用重新启动mysql,问题就解决了. 当你试图修复一个被破坏的表的问题时,有三种修复类型. 如果你得到一个错误信息指出一个临时文件不能建立,删除信息所指出的文件并再试一次--这通常是上一次修复操作遗留下来的.

MySQL数据库的IO操作

- - haohtml's blog
         淘宝丁奇分享的PPT:MySQL数据库的IO操作,详细分享了四块的内容,并且告诉大家如何调整MySQL数据库IO操作相关的参数,给出了详细的选择策略,现替其整理成文章分享与此. 4.影响io行为的一些参数和选择策略. 一个简单的查询 select * from t where id>=(  select id from t where k1=100 limit 100000,1) limit 2;.

MySQL数据库优化总结

- - CSDN博客推荐文章
        对于一个以数据为中心的应用,数据库的好坏直接影响到程序的性能,因此数据库性能至关重要. 一般来说,要保证数据库的效率,要做好以下四个方面的工作:数据库设计、sql语句优化、数据库参数配置、恰当的硬件资源和操作系统,这个顺序也表现了这四个工作对性能影响的大小.        一、数据库设计   适度的反范式,注意是适度的.

Google数据库产品LevelDB对决MySQL

- - HTML5研究小组
去年一月份,Google发布了LevelDB. LevelDB是Key-Value嵌入式数据库管理系统编程库,目前的版本能够支持Billion级别的数据量. LevelDB是一个C++库,可按照字符串键值顺序映射. 源于其本身的良好设计,特别是LSM算法,LevelDB性能非常之高. 在一台4个Q6600的CPU机器上,每秒钟写数据超过40w,而随机读的性能每秒钟超过10w.

excel数据导入mysql数据库

- - 互联网 - ITeye博客
1、excel另存为txt.       选中将要导出的数据列,然后另存为选择其它格式=>文本文件(制表符分割). E:\项目\fblike\game_code_san.txt. 2、txt导入到mysql数据库. load data infile 'E:\\项目\\fblike\\game_code_san.txt' into table game_code_san(code).

c/c++连接mysql数据库

- - CSDN博客数据库推荐文章
        由于项目需要,要用c/c++链接mysql数据库. 网上很多类似的解说,但是大部分都需要在本机器上安装完整版的msyql. 其实,有时候我们并不想在改变自己电脑上原有的环境,但是我们却希望通过我们的程序链接数据库. 比如:我在本机上已经安装了一个mysql,但并不是完整版的(比如appserv集成mysql或者wamp集成mysql),或者我的工作在局域网中,我只需要链接另外一台机器上的mysql.

理解MySQL数据库覆盖索引

- - haohtml's blog
看AUTO_INCREMENT就知道数据并不多,75万条. 很简单对不对?怪异的地方在于:. 如果换成MyISAM做存储引擎的时候,查询耗时只需要0.01s,用InnoDB却会是0.15s左右. 如果只是就这么点差距其实不是什么大不了的事,但是真实的业务需求比这个复杂,造成的差距也很大:MyISAM只需要0.12s,InnoDB则需要2.2s.,最终定位到问题症结是在这条SQL.

MySQL数据库设置主从同步

- - CSDN博客架构设计推荐文章
MYSQL主从同步是目前使用比较广泛的数据库架构,技术比较成熟,配置也不复杂,特别是对于负载比较大的网站,主从同步能够有效缓解数据库读写的压力. 1、可以作为一种备份机制,相当于热备份. 2、可以用来做读写分离,均衡数据库负载. 1、主从数据库版本一致,建议版本5.5以上. # 日志文件名 log-bin = mysql-bin # 日志格式,建议mixed binlog_format = mixed # 主数据库端ID号 server-id = 1.