mysql 写入慢_MySQL主从,你遇到过哪些问题?

dd5fc07b94bfd86135848688b7a3290c.png

    上篇文章介绍了单机环境下的MySQL主从异步复制和主从半同步复制的搭建过程。搭建过程很简单,但是在实际使用过程中,更多的是解决问题,本篇文章将介绍一下MySQL主从复制中常见的问题以及如何定位问题和如何解决问题。

1、可能的原因如下

(1)主从服务器处于不同的网络之中,由于网络延迟导致;

(2)主从服务器的硬件配置不同,从服务器的硬件配置(包括内存,CPU,网卡等)远低于主服务器;

(3)主库上有大量的写入操作,导致从库无法实时重放主库上的binlog;

(4)主库上存在着大事务操作或者慢SQL,导致从库在应用主库binlog的过程过慢,形成延迟;

(5)数据库实例的参数配置问题导致,如:从库开启了binlog,或者配置了每次事务都去做刷盘操作;

2、主从同步延迟问题判断

2.1、根据从库上的状态参数判断
mysql-server-3307> SHOW SLAVE STATUS \G

    在输出结果中找到Seconds_Behind_Master参数,这个参数表示的是从库上的IO线程和SQL线程相差的时间,然后根据该参数值判断,这个值只是初步判断,不能由这个值来下结论,有如下几种情况:

0:表示无延迟,理想状态;

NULL:表示从库上的IO线程和SQL线程中,有某一个线程出现问题,可以再次查看Slave_IO_Running和Slave_SQL_Running的值是否都为Yes;

大于0:表示主从已经出现延迟,这个值越大,表示从库和主库之间的延迟越严重;

小于0:这个值在官方文档中没有说明,通常不会出现。如果出现,那恭喜你中奖了,撞见MySQL的bug了;

2.2、根据主从库上面当前应用的二进制日志文件名称或者重放日志的位置来判断
2.2.1、同时打开两个MySQL的命令行窗口,分别打开主库和从库,在第一个窗口上执行查看主库当前状态的命令
mysql-server-3306> SHOW MASTER STATUS \G
*************************** 1. row ***************************
             File: mysql-bin.000017
         Position: 120
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

(1)在第二个从库的命令行窗口执行如下命令

mysql-server-3307> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
               ...
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000017
          Read_Master_Log_Pos: 120
               Relay_Log_File: relay-log.000016
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000017
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            ...
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 120
              Relay_Log_Space: 613
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
                ...
        Seconds_Behind_Master: 0
        ...
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 3
                  Master_UUID: 2dbbf79b-5d9f-11e8-8004-000c29e28409
             Master_Info_File: /mysql_data/3307/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL

(2)比较从库上的Master_Log_File和Relay_Master_Log_File文件之间是否有差异

有差异,则说明主从延迟很严重;

如果没有差异,则比较Read_Master_Log_Pos和Exec_Master_Log_Pos的差异,这俩参数分别表示从库当前读取到的主库的二进制日志文件位置点和已经执行到的位置点;

如果上述输出都没有差异,可以通过主库上"show master status"和从库上"show slave status"的结果作比较。主要比较主库的"File"和从库的"Master_Log_File",主库上的"Position"和从库上的"Read_Master_Log_Pos";

3、主从延迟解决办法

3.1、判断是否由于网络导致

    方法:测试主从库之间的网络延迟,比如测试ping延迟。同时可以检查主从同步的时候是否使用了主库的域名来同步,而域名解析速度可能会特别慢。或者使用其他测试工具;

3.2、判断是否由于硬件环境导致

    方法:确认主从库的硬件配置是否相差较大,如果配置参数相差较大,可以排查从库上的CPU,内存,IO使用率来判断是否因为硬件配置导致;

3.3、判断是否在主库上有大量的DML操作

    方法:可以在主库上通过"show full processlist"命令查看当前正在执行的sql,查看是否有大量正在执行的SQL,或者观察主库的CPU和内存使用率,判断是否有高并发操作;

3.4、判断是否有慢SQl,可以在主库上临时打开慢SQL记录,临时打开方法如下
#开启慢SQL功能并查看是否生效
mysql-server-3306> SET @@GLOBAL.slow_query_log = ON;
mysql-server-3306> SHOW VARIABLES LIKE 'slow_query_log';
#设置慢SQL的时间并查看是否生效,单位为s,表示大于多少秒的SQL会被记录
mysql-server-3306> SET @@GLOBAL.long_query_time = 5;
mysql-server-3306> SHOW VARIABLES LIKE 'long_query_time';
#设置慢SQL记录日志路径并查看是否生效。注意,这个目录必须对MySQL用户有读写权限
mysql-server-3306> SET @@GLOBAL.slow_query_log_file = '/mysql_data/mysql-slow.log';
mysql-server-3306> SHOW VARIABLES LIKE 'slow_query_log_file';
3.5、检查从服务器参数配置是否合理

(1)查看从库是否开启了binlog日志,从库上执行如下命令查看

mysql-server-3307> SHOW VARIABLES LIKE 'log_bin';

    如果开启了binlog日志,而且从库未充当其他库的主库时,可以将从库上的binlog关闭,否则会增加从库负担,每次重放完成主库的binlog还要记录到自身的binlog

(2)查看从库上的sync_binlog参数的值,这个参数表示的是事务提交多少次之后,由MySQL来将binlog_cache中的数据刷新到磁盘,有以下几种值:

0:表示事务提交之后,MySQL不做刷新binlog_cache到磁盘的操作,而是由操作系统来定时自动完成刷盘操作,这种操作对性能损耗最少,但是也最不安全;

n:表示提交n次事务之后,由MySQL将binlog_cache中的数据刷新到磁盘,如果开启,会对性能有一定程度的损耗。所以,从库上如果延迟很严重,可以考虑将该参数的值设为0;

mysql-server-3307> SET @@GLOBAL.sync_binlog = 0;
mysql-server-3307> SHOW VARIABLES LIKE 'sync_binlog';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 0     |
+---------------+-------+
1 row in set (0.00 sec)

(3)如果从库中要同步的数据库使用的是InnoDB存储引擎,可以查看innodb_flush_log_at_trx_commit参数。这个参数表示事务执行完成之后,多久的频率刷新一次日志到磁盘上,可用的值有如下几种:

0:表示MySQL会将日志缓冲区中的数据每秒一次地写入日志文件中,并且日志文件的刷盘操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作,效率最高,但是安全性也比较低,可能会丢失数据;

1:每一次事务提交都需要把日志写入磁盘,这个过程是特别耗时的操作;

2:每一次事务提交之后,不会自动触发日志刷盘的操作,而是由操作系统来决定什么时候来做刷新日志的操作,在操作系统挂了的情况下才会丢失数据;如果在主从延迟非常严重的情况下,可以将从库的该参数设置为0,以提高从库上重放主库二进制日志的效率。

mysql-server-3307> SET @@GLOBAL.innodb_flush_log_at_trx_commit = 0;
mysql-server-3307> SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 0     |
+--------------------------------+-------+
1 row in set (0.00 sec)

注意:上述涉及到修改MySQL数据库实例的操作中,修改之后会立刻生效,但是重启实例之后,会失效,如果要永久修改,则需要编辑mysql配置文件,然后重启。

近期精彩回顾:

《FactoryBean和BeanFactory是个啥?》

《聊聊Spring的自定义标签》

《Spring标签解析过程源码分析》

《Spring容器初始化可真不容易》

《SPI机制及使用场景》

《聊聊MySQL的索引》

《MySQL主从同步》

常驻内容:

源码搭建:《Spring5.1.x源码环境搭建》

注释版源码传送门:进入公众号点击底部"获取源码"资料即可获取

关注菜鸟封神记,定期分享技术干货!

e6aa41e97e0b56aab83591e579df767b.png

点赞和在看是最大的支持,感谢↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Girl Love Value

【原题链接】 【题意说明】 有一组共有N个正整数,每次只能取其中的一个数,每次没有被取到的数会减少相应的值,把每次取到数的值累加,问共要取K个数,在所有取法中,和最大是多少? 【问题分析】 快…

linux查找时间文件,Linux基础教程 linux下使用find命令根据系统时间查找文件用法(示例代码)...

LinuxFind兄弟连Linux培训总结这些时间戳包括复制代码代码如下:mtime 文件内容上次修改时间atime 文件被读取或访问的时间ctime 文件状态变化时间mtime 和 atime 的含义都是很容易理解的,而 ctime 则需要更多的解释。由于 inode 维护着每个文件上的元数据&#xff0…

如何清理 Weblogic Server 缓存

Weblogic中的项目重新编译、部署之后并不起作用&#xff0c;仍然运行原来的程序。这可能是 Weblogic缓存在作怪&#xff0c;需要手动删除。 Weblogic 8 SP6 的缓存位置&#xff1a; %BEA HOME%\user_projects\domains\<Your Domain>\<Your Server>\.wlnotdelete\ex…

python安装django模块_python中安装django模块的方法

网上搜一下对应的版本号&#xff0c;版本号相对应。安装django有两种方式&#xff1a;1.pip安装pip install django这个方法我用的时候已经报错。貌似访问被阻挡。我一般都用第二种2.下载压缩包手动安装在django官网下载tar.gz包&#xff0c;放在python对应目录中解压缩命令窗口…

linux对目录进行操作,Linux 基础:对文件和目录进行操作的 Linux 和 Unix 命令 笔记...

参考文章《Linux Basic – Linux and Unix Commands for File and Directory Manipulation》https://www.jianshu.com/writer#/notebooks/37377394/notes/66158656/preview◈ ls 列出目录的内容◈ cp 将文件和目录从一个位置复制到另一位置。◈ mv 将文件和目录从一个位置移动到…

[html] 举例说明当我们在写布局时,都有哪些边界的情况需要关注的?

[html] 举例说明当我们在写布局时&#xff0c;都有哪些边界的情况需要关注的&#xff1f; margin 重叠在竖直方向&#xff0c;当两个元素的外边距连在一块时&#xff0c;两者的距离并不是两者的 margin 之和&#xff0c;而是取最大的 margin 值。个人简介 我是歌谣&#xff0…

(转)GDB 使用方法

感谢原创作者的辛勤劳动&#xff1b; 简述 一 列文件清单 二&#xff1a;执行程序 三&#xff1a;显示数据 四&#xff1a;断点(breakpoint) 五&#xff0e;断点的管理 六&#xff0e;变量的检查和赋值 七. 单步执行 八&#xff0e;函数的调用 九&#xff0e;机器语言工具 十&a…

[html] 如何去除标签<i>默认斜体?

[html] 如何去除标签默认斜体&#xff1f; font-style: normal;个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

vue根据不同权限显示图片_vue多级权限组件的实现

首先实现递归checkbox的组件假定&#xff0c;我们要实现的权限组件效果是这样的&#xff1a;要实现点击系统&#xff0c;下面的都全选&#xff0c;点击基础功能&#xff0c;用户管理半选&#xff0c;系统半选。点击新增组织&#xff0c;如果基础功能没有选中&#xff0c;则基础…

linux自带磁盘加密工具下载,TrueCrypt(磁盘加密工具)

TrueCrypt是一款功能强大的虚拟磁盘加密工具&#xff0c;它能够在硬盘上创建一个或多个虚拟磁盘&#xff0c;并且自动加密磁盘文件&#xff0c;提供AES-256、Blowfish、Serpent等多种加密算法&#xff0c;用户可以同时采取两个或多个来提高加密效果&#xff0c;软件体积小巧&am…

JS如何控制checkbox的全选反选

JS代码&#xff1a; 1 <script language"javascript" type"text/javascript">2 3 //转载请保留出处 http://www.dwww.cn 4 function unselectall() {5 if (document.getElementById("chkAll").checked) {6 …

[交互]交互的实战问题2

[交互]交互的实战问题2 axios升级导致的问题axios 设置请求 header 方式 多页签时&#xff0c;切换页签是否应该取消交互请求 axios升级导致的问题 axios 设置请求 header 方式 axios 早期设置请求 header 方式 config.headers.common.set(Pragma, no-cache)有一天发现该方式…

虚拟同步发电机_一种光储型虚拟同步机介绍

专利权人 广东电网有限责任公司摘要&#xff1a;本实用新型实施例公开了一种光储型虚拟同步机&#xff0c;包括逆变器、光伏列、储能装置、本地负荷、开关和电网&#xff0c;所述光伏阵列通过第一DC/DC转换器连接在所述逆变器的直流母线上&#xff0c;所述储能装置通过第二DC/D…

windows 和linux查看硬件信息,Linux下如何查看硬件信息?

我们在 Linux 下进行开发时&#xff0c;有时也需要知道当前的硬件信息&#xff0c;比如&#xff1a;CPU几核&#xff1f;使用情况&#xff1f;内存大小及使用情况&#xff1f;USB设备是否被识别&#xff1f;等等类似此类问题。下面良许介绍一些常用的硬件查看命令。lshw 这个命…

YUI3下widget的plugin开发

最近在尝试使用YUI3重建ExtFrame框架&#xff0c;使用YUI3做为更佳的UI和JS支持 和ExtJS比&#xff0c;YUI3的UI看起来缺少了足够的UI控件&#xff0c;但是&#xff0c;YUI3的widget开发更灵活&#xff08;也更难掌握&#xff09;&#xff0c;YUI3的widget操作更多的基于DOM封装…

雅可比行列式_夏七八写:关于“斜二测画法”与雅可比行列式的关系的想法

最开始思考这两种有没有关系的时候也是偶然&#xff0c;&#xff0c;受到启发&#xff1a;雅可比行列式有什么意义呢&#xff0c;为什么对于像 的式子为什么要其后乘上一个雅可比行列式的绝对值呢&#xff1f;在说我的想法之前&#xff0c;我想可能要先提一下一些预备知识&…

linux6.7能升级6.8吗,CentOS 六、7升级gcc至4.八、4.九、5.二、6.三、7.3等高版本

CentOS 7虽然已经出了不少年了&#xff0c;但依然会有不少人选择安装CentOS 6&#xff0c;CentOS 6有些依赖包和软件都比较老旧&#xff0c;现在天的主角gcc编译器&#xff0c;CentOS 6的gcc版本为4.4&#xff0c;CentOS 7为4.8。gcc 4.8最主要的一个特性就是全面支持C11&#…

JSP获取当前时间

JSP获取当前时间一、先看看如何取当前时间并显示的代码 ------------------------------------------------ <% java.text.SimpleDateFormat formatter new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); java.util.Date currentTime new java.util.Date…