文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

这篇文章给大家分享的是有关如何解决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主从复制中产生了锁的问题”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯