广告
返回顶部
首页 > 资讯 > 数据库 >如何解决mysql主从复制中产生了锁的问题
  • 948
分享到

如何解决mysql主从复制中产生了锁的问题

2024-04-02 19:04:59 948人浏览 安东尼
摘要

这篇文章给大家分享的是有关如何解决Mysql主从复制中产生了锁的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一套主主复制的mysql库产生了死锁,导致主从同步出现问题,

这篇文章给大家分享的是有关如何解决Mysql主从复制中产生了的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

一套主主复制的mysql库产生了死锁,导致主从同步出现问题,

解决办法:是先kill掉了产生锁等待的那个服务器的mysql的sql进程,然后start slave,就好了。

下面具体分析下相关知识点以及解决的过程:

一:mysql主从复制的流程,以及相关的进程。

1)关于复制的步骤:

整体上来说,复制有3个步骤:   

        (1)    master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);

        (2)    slave将master的binary log events拷贝到它的中继日志(relay log);

        (3)    slave重做中继日志中的事件,将改变反映它自己的数据。

下图描述了复制的过程:
如何解决mysql主从复制中产生了锁的问题

如何解决mysql主从复制中产生了锁的问题

          该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。

       下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。

       SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

        此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。

2)关于复制的进程:

MySQL 使用3个线程来执行复制功能,其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。

主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。

从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。   

第3个线程是SQL线程,是从服务器创建用于读取中继日志并执行日志中包含的更新。

有多个从服务器的主服务器创建为每个当前连接的从服务器创建一个线程;每个从服务器有自己的I/O和SQL线程。

3)如何找到具体的sql和io进程的id号。

system user对应着从库的sql和io进程,因为我们的是主主复制,所以既有主服务器Binlog Dump线程,还有从库的sql和io进程,具体如下:

1)我们看到Waiting for master to send event的字样,说明这个进程是从库的io进程,因为从服务器I/O线程就是读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件

2)我们看到Slave has read all relay log; waiting for the slave I/O thread to update it,说明这个进程是从库的sql进程,因为从库SQL线程,就是读取中继日志并执行日志中包含的更新。

3)我们看到Master has sent all binlog to slave; waiting for binlog to be updated,说明这个进程是主库的Binlog Dump,因为主库的Binlog Dump就是将二进制日志中的内容(binlog)发送到从服务器.并且主库的这个进程一般是由主库新建的特定的用户来完成的,我们这里是info_syncer  用户。

mysql> show processlist;  

| 13910311 | system user  |                     | NULL          | Connect     |   -1650 | Slave has read all relay log; waiting for the slave I/O thread to update it

| 13418520 | system user  |                     | NULL          | Connect     | 3638625 | Waiting for master to send event     

| 13409506 | info_syncer  | 192.168.0.243:36191 | NULL          | Binlog Dump | 3690795 | Master has sent all binlog to slave; waiting for binlog to be updated

二:关于mysql死锁的查询和解决办法:

1)查询相关的锁:

在5.5中,infORMation_schema 库中增加了三个关于锁的表(MEMORY引擎):

innodb_trx         ## 当前运行的所有事务

innodb_locks       ## 当前出现的锁

innodb_lock_waits  ## 锁等待的对应关系

看一下表结构:

root@127.0.0.1 : information_schema 13:28:38> desc innodb_locks;

+————-+———————+——+—–+———+——-+

| Field       | Type                | Null | Key | Default | Extra |

+————-+———————+——+—–+———+——-+

| lock_id     | varchar(81)         | NO   |     |         |       |#锁ID

| lock_trx_id | varchar(18)         | NO   |     |         |       |#拥有锁的事务ID

| lock_mode   | varchar(32)         | NO   |     |         |       |#锁模式

| lock_type   | varchar(32)         | NO   |     |         |       |#锁类型

| lock_table  | varchar(1024)       | NO   |     |         |       |#被锁的表

| lock_index  | varchar(1024)       | YES  |     | NULL    |       |#被锁的索引

| lock_space  | bigint(21) unsigned | YES  |     | NULL    |       |#被锁的表空间号

| lock_page   | bigint(21) unsigned | YES  |     | NULL    |       |#被锁的页号

| lock_rec    | bigint(21) unsigned | YES  |     | NULL    |       |#被锁的记录号

| lock_data   | varchar(8192)       | YES  |     | NULL    |       |#被锁的数据

+————-+———————+——+—–+———+——-+

10 rows in set (0.00 sec)

root@127.0.0.1 : information_schema 13:28:56> desc innodb_lock_waits;

+——————-+————-+——+—–+———+——-+

| Field             | Type        | Null | Key | Default | Extra |

+——————-+————-+——+—–+———+——-+

| requesting_trx_id | varchar(18) | NO   |     |         |       |#请求锁的事务ID(也就是等待锁的id)

| requested_lock_id | varchar(81) | NO   |     |         |       |#请求锁的锁ID

| blocking_trx_id   | varchar(18) | NO   |     |         |       |#当前拥有锁的事务ID

| blocking_lock_id  | varchar(81) | NO   |     |         |       |#当前拥有锁的锁ID

+——————-+————-+——+—–+———+——-+

4 rows in set (0.00 sec)

root@127.0.0.1 : information_schema 13:29:05> desc innodb_trx ;

+—————————-+———————+——+—–+———————+——-+

| Field                      | Type                | Null | Key | Default             | Extra |

+—————————-+———————+——+—–+———————+——-+

| trx_id                     | varchar(18)         | NO   |     |                     |       |#事务ID

| trx_state                  | varchar(13)         | NO   |     |                     |       |#事务状态:

| trx_started                | datetime            | NO   |     | 0000-00-00 00:00:00 |       |#事务开始时间;

| trx_requested_lock_id      | varchar(81)         | YES  |     | NULL                |       |#innodb_locks.lock_id

| trx_wait_started           | datetime            | YES  |     | NULL                |       |#事务开始等待的时间

| trx_weight                 | bigint(21) unsigned | NO   |     | 0                   |       |#

| trx_mysql_thread_id        | bigint(21) unsigned | NO   |     | 0                   |       |#事务线程ID

| trx_query                  | varchar(1024)       | YES  |     | NULL                |       |#具体SQL语句

| trx_operation_state        | varchar(64)         | YES  |     | NULL                |       |#事务当前操作状态

| trx_tables_in_use          | bigint(21) unsigned | NO   |     | 0                   |       |#事务中有多少个表被使用

| trx_tables_locked          | bigint(21) unsigned | NO   |     | 0                   |       |#事务拥有多少个锁

| trx_lock_structs           | bigint(21) unsigned | NO   |     | 0                   |       |#

| trx_lock_memory_bytes      | bigint(21) unsigned | NO   |     | 0                   |       |#事务锁住的内存大小(B)

| trx_rows_locked            | bigint(21) unsigned | NO   |     | 0                   |       |#事务锁住的行数

| trx_rows_modified          | bigint(21) unsigned | NO   |     | 0                   |       |#事务更改的行数

| trx_concurrency_tickets    | bigint(21) unsigned | NO   |     | 0                   |       |#事务并发票数

| trx_isolation_level        | varchar(16)         | NO   |     |                     |       |#事务隔离级别

| trx_unique_checks          | int(1)              | NO   |     | 0                   |       |#是否唯一性检查

| trx_foreign_key_checks     | int(1)              | NO   |     | 0                   |       |#是否外键检查

| trx_last_foreign_key_error | varchar(256)        | YES  |     | NULL                |       |#最后的外键错误

| trx_adaptive_hash_latched  | int(1)              | NO   |     | 0                   |       |#

| trx_adaptive_hash_timeout  | bigint(21) unsigned | NO   |     | 0                   |       |#

+—————————-+———————+——+—–+———————+——-+

22 rows in set (0.01 sec)

mysql> show processlist;    ##可以看出来,

或者:

mysql> select concat('KILL ',id,';') from information_schema.processlist where user='root';

+------------------------+

| concat('KILL ',id,';') |

+------------------------+

| KILL 3101;             |

| KILL 2946;             |

+------------------------+

2 rows in set (0.00 sec)

 批量kill多个进程。

mysql>select concat('KILL ',id,';') from information_schema.processlist where user='root' into outfile '/tmp/a.txt';

Query OK, 2 rows affected (0.00 sec)

感谢各位的阅读!关于“如何解决mysql主从复制中产生了锁的问题”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

您可能感兴趣的文档:

--结束END--

本文标题: 如何解决mysql主从复制中产生了锁的问题

本文链接: https://www.lsjlt.com/news/63415.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解决mysql主从复制中产生了锁的问题
    这篇文章给大家分享的是有关如何解决mysql主从复制中产生了锁的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一套主主复制的mysql库产生了死锁,导致主从同步出现问题, ...
    99+
    2022-10-18
  • 实例解读:MySQL并行复制如何解决特定的主从问题?
    并行复制存世已多年,但是在实际应用场景中的使用并不常见。这次很幸运,我们刚好遇到一个客户,主的写入工作量非常大,但是从难以跟上,在这种情况下,我建议它使用并行从属线程。 那么,如何衡量并行复制是否在客...
    99+
    2022-10-18
  • 解决MySQL主从复制不一致问题的主要几个方法
    下面讲讲关于解决MySQL主从复制不一致问题的主要几个方法,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完解决MySQL主从复制不一致问题的主要几个方法这篇文章你一定会有所受益。...
    99+
    2022-10-18
  • MySQL主从复制的常见问题和有效解决方案
    下面讲讲关于MySQL主从复制的常见问题和有效解决方案,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完MySQL主从复制的常见问题和有效解决方案这篇文章你一定会有所受益。 一...
    99+
    2022-10-18
  • 如何理解MySQL主从复制中关于AUTO_INCREMENT的奇怪问题
    今天就跟大家聊聊有关如何理解MySQL主从复制中关于AUTO_INCREMENT的奇怪问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 ...
    99+
    2022-10-19
  • 教你彻底解决MySQL 5.7 主从复制的延迟问题方法
    本文主要给大家简单讲讲彻底解决MySQL 5.7 主从复制的延迟问题方法,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望彻底解决MySQL 5.7 主从复制的...
    99+
    2022-10-18
  • 如何解决实际的MySQL复制问题
    这篇文章主要为大家展示了“如何解决实际的MySQL复制问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决实际的MySQL复制问题”这篇文章吧。MySQL...
    99+
    2022-10-18
  • 如何解决MySQL中主从延迟与读写分离的问题
    小编给大家分享一下如何解决MySQL中主从延迟与读写分离的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言:我们都知道互联网数据有个特性,大部分场景都是 读...
    99+
    2023-06-29
  • 如何解决MySQL中主库跑太快从库追不上的问题
    这篇文章主要介绍“如何解决MySQL中主库跑太快从库追不上的问题”,在日常操作中,相信很多人在如何解决MySQL中主库跑太快从库追不上的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2022-10-18
  • 如何理解MySQL复制技术中的一主多从
    这期内容当中小编将会给大家带来有关如何理解MySQL复制技术中的一主多从,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。MySQL复制技术之一主多从   ...
    99+
    2022-10-19
  • 在js中如何解决ng-repeat产生的ng-model中取不到值的问题
    小编给大家分享一下在js中如何解决ng-repeat产生的ng-model中取不到值的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解...
    99+
    2022-10-19
  • 如何解决MySql控制台中文显示的问题
    这篇文章主要为大家展示了“如何解决MySql控制台中文显示的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决MySql控制台中文显示的问题”这篇文章吧...
    99+
    2022-10-19
  • 如何解决磁盘写满导致MySQL复制失败的问题
    小编给大家分享一下如何解决磁盘写满导致MySQL复制失败的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!案例场景     &nb...
    99+
    2023-06-14
  • MySQL子查询中order by不生效问题的如何解决
    这篇文章主要介绍“MySQL子查询中order by不生效问题的如何解决”,在日常操作中,相信很多人在MySQL子查询中order by不生效问题的如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MyS...
    99+
    2023-06-20
  • 如何解决Linux中二进制包安装MySQL的问题
    这篇文章将为大家详细讲解有关如何解决Linux中二进制包安装MySQL的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。第一步:安装相关的依赖yum install perl-Data-Dumper第二...
    99+
    2023-06-09
  • 如何解决phpmyadmin显示MySQL数据表“使用中” 修复后依然无效的问题
    小编给大家分享一下如何解决phpmyadmin显示MySQL数据表“使用中” 修复后依然无效的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作