mysql trouble shooting---- 从库停止同步lock_wait_timeout_exceeded_try_restarting_transaction

问题描述:

数据库从库停止同步。

问题分析:

show slave status\G;(也可使用show full processlist)

显示 某个update语句出错,Lock wait timeout exceeded; try restarting transaction;

原因是这条语句提交的时候超时堵塞。原因在于另外的一个操作开启了事务,锁定了相应的数据,导致这条操作相同数据的sql出错。

示例,在sql中

(1)开启事务,锁定数据

终端A:

MySQL> begin; (开启事务,开启事务会锁定相关数据)
Query OK, 0 rows affected (0.00 sec)

mysql> update pet set sex="m" where name="Fluffy";(修改)
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from pet;
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Bowser | Diane  | dog     | m    | 1979-08-31 | 1995-07-29 |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Claws  | Gwen   | cat     | m    | 1994-03-17 | NULL       |
| Fang   | Benny  | dog     | m    | 2013-02-05 | NULL       |
| Fluffy | Harold | cat     | m    | 2012-09-30 | NULL       |
+--------+--------+---------+------+------------+------------+
5 rows in set (0.00 sec)

终端B:

mysql> select * from pet;
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Bowser | Diane  | dog     | m    | 1979-08-31 | 1995-07-29 |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Claws  | Gwen   | cat     | m    | 1994-03-17 | NULL       |
| Fang   | Benny  | dog     | m    | 2013-02-05 | NULL       |
| Fluffy | Harold | cat     | NULL | 2012-09-30 | NULL       |
+--------+--------+---------+------+------------+------------+
5 rows in set (0.01 sec)

因为没有提交,所以实际上没有改变。但是会锁定Fluffy这一条数据。导致如下的错误。

终端B:

mysql> update pet set sex="m" where name="Fluffy";

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

(2)提交事务,解锁数据

终端A:

mysql> commit;
Query OK, 0 rows affected (0.10 sec)

终端B:

mysql> select * from pet;
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Bowser | Diane  | dog     | m    | 1979-08-31 | 1995-07-29 |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Claws  | Gwen   | cat     | m    | 1994-03-17 | NULL       |
| Fang   | Benny  | dog     | m    | 2013-02-05 | NULL       |
| Fluffy | Harold | cat     | m    | 2012-09-30 | NULL       |
+--------+--------+---------+------+------------+------------+
5 rows in set (0.00 sec)
mysql> update pet set sex="f" where name="Fluffy";
Query OK, 1 row affected (0.08 sec)
Rows matched: 1  Changed: 1  Warnings: 0

(3)如果where中的条件是索引字段,那么只会锁定索引对应的条目;如果不是索引字段,那么会锁定整张表。

终端A:

mysql> update pet set sex="f" where death="1995-07-29";
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from pet;
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Bowser | Diane  | dog     | f    | 1979-08-31 | 1995-07-29 |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Claws  | Gwen   | cat     | m    | 1994-03-17 | NULL       |
| Fang   | Benny  | dog     | m    | 2013-02-05 | NULL       |
| Fluffy | Harold | cat     | f    | 2012-09-30 | NULL       |
+--------+--------+---------+------+------------+------------+
5 rows in set (0.00 sec)

终端B:

mysql> select * from pet;
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Bowser | Diane  | dog     | m    | 1979-08-31 | 1995-07-29 |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Claws  | Gwen   | cat     | m    | 1994-03-17 | NULL       |
| Fang   | Benny  | dog     | m    | 2013-02-05 | NULL       |
| Fluffy | Harold | cat     | f    | 2012-09-30 | NULL       |
+--------+--------+---------+------+------------+------------+
5 rows in set (0.00 sec)
mysql> update pet set death="2013-07-00" where birth="2013-02-05";

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

解决办法

(1) stop slave;      start slave

(2)网上分析说

Mysql ‘Lock wait timeout exceeded; try restarting transaction‘ 解决方案

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 
Temporary error: 266: Time-out in NDB, probably caused by deadlock 解决方法:在管理节点的[ndbd default] 
区加:
TransactionDeadLockDetectionTimeOut=10000(设置为10秒)默认是1200(1.2秒)按照顺序重新启动各个节点就不会出现问题了。

不过,本身貌似数据库的TransactionDeadLockDetectionTimeOut已经设置很大,而且即使设置很大,如果那边一直锁表,也是解决不了问题的。

时间: 2024-10-06 11:18:54

mysql trouble shooting---- 从库停止同步lock_wait_timeout_exceeded_try_restarting_transaction的相关文章

MySQL主从复制指定不同库表同步参数说明

replication 中通过以下参数减少binlog数据量 master端: --binlog-do-db 二进制日志记录的数据库(多数据库用逗号,隔开) --binlog-ignore-db 二进制日志中忽略数据库 (多数据库用逗号,隔开) 以下是mysql主从忽略授权表的方法案例: in master: binlog-do-db=YYY 需要同步的数据库.不添加这行表示同步所有 binlog-ignore-db = mysql   这是不记录binlog,来达到从库不同步mysql库,以确

利用脚本实现mysql主库到备库数据同步(每五分钟同步一次增量)

目标: 将主库数据(IP1)每五分钟一次同步到备库(IP2) 服务器备库上,只同步增加量 思路: 利用crontab 每五分钟一次定时执行脚本进行数据同步 在脚本中编译实现查询五分钟内的数据增加量,并将增加量导入到备库 实现过程及代码(以record 表为例): bash脚本中内容 vi transaction.sh----建立transaction脚本实现同步 #!/bin/bash source.bash_profile (由于定时执行的功能使用crontab实现,需要在bash中添加使环境

Mysql数据库添加从库,主从同步

环境准备 更改my.cnf 开启slave服务 查看已有mysql的版本 mysql -uroot -p >select version(); 下载相对应的mysql版本: 下载地址:http://dev.mysql.com/downloads/mysql 1)解压 #解压 tar-zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz #复制解压后的mysql目录 cp-r mysql-5.6.35-linux-glibc2.5-x86_64 /usr/l

不停止MySQL服务增加从库的两种方式

转载自:http://lizhenliang.blog.51cto.com/7876557/1669829 现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. 一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长.另一种是通过xtrabackup工具

不停止 MySQL 服务增加从库的两种方式

不停止 MySQL 服务增加从库的两种方式 提交 我的评论 加载中 已评论 不停止 MySQL 服务增加从库的两种方式 2015-07-12 数据库开发 数据库开发 数据库开发 微信号 DBDevs 功能介绍 分享数据库相关技术文章.教程和工具,另外还包括数据库相关的工作.偶尔也谈谈程序员人生 :) (点击上方蓝字,快速关注我们) 作者:李振良 网址:http://lizhenliang.blog.51cto.com/7876557/1669829 现在生产环境MySQL数据库是一主一从,由于业

不停止MySQL服务增加从库的两种方式【转载】

现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. 一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长.另一种是通过xtrabackup工具备份主库,恢复到从库,xtrabackup是物理备份,备份速度快,不锁表.为什么不锁表?因为自身会监控主库日

mysql(五)------针对主从同步的情况两个库进行数据校对及恢复

两台MySQL,发生了种种种种,导致了两个表的数据不一致,但是同步还在正常进行,后来意识到这种问题(可能之前skip啊,或者一开始搭建的时候就是不一致的状态),该如何修复呢?如果数据量小的情况可以考虑从新导数据,如果数据量很大的话,那就太要命了于是可以用percona-toolkit这个工具修复并并检查这种情况的再主备同步的时候在进行如下操作:在主库上安装pt-table-checksum安装: 1.安装软件包: # yum install perl perl-devel perl-Time-H

mysql主库 备份库怎么同步

在两台服务器上安装mysql#apt-get install mysql-server -y 创建同步帐户我这里就直接使用的数据库默认用户root在ubuntu4上: mysql> grant replication slave on *.* to 'root'@'192.168.2.5' identified by '12345678'; mysql> flush privileges; 在ubuntu5上: mysql> grant replication slave on *.*

趁一切还来得及【六】数据库MySQL读写分离与主主同步

相思相见知何日?此时此夜难为情.                                                      --[唐]李白 第一章 数据库MySQL主从复制读写分离授权 1.1 主从复制读写分离方案简单分析 ①数据库主从复制搭建之后,因为数据是单向的,因此默认规则就是所有的数据(主从相关收据)写入和更新都在主库上进行操作,避免主从同步的时候造成冲突. ②严格上来讲,从库上的非同步的库写入数据,只要和主库没有关系,也是可以写入的(或者作为主库),但是如果主从都想其中