mysql 架构篇系列 3 复制运行状态监控与选项参数说明
一. 概述
在上一篇中,搭建了一主一从的复制架构,这篇通过一些诊断方法来了解复制的运行状态和一些选项参数说明。上次mysql主从服务关机,今天在打开mysql服务,出现了错误信息。
1.首先 启动主从mysql服务
2.在从库上执行START SLAVE, 开始复制。
3.在从库上执行SHOW PROCESSLIST; slave已经连接上master, 并开始接受并执行日志。
4.在从库上执行SHOW SLAVE STATUS,查看复制状态
错误信息: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
5. 解决方法
-- 在主库上执行,记录日志文件号和位置,如下图所示:
flush logs;
show master status;
-- 在从库上执行
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000072',MASTER_LOG_POS=154; SLAVE START;
从库上再执行SHOW PROCESSLIST,显示了二个复制进程:一个是 I/O线程,连接master,id为7。 一个是SQL线程,id为8。如下图所示:
二 .复制中的各类文件
myql复制中涉及了两类非常重要的日志文件:二进制日志文件(binlog), 中继日志文件(relay log)。 binlog文件会把mysql中所有数据修改操作以二进制形式记录,包括create,drop,insert,update,delete操作等,但不记录查询select操作。对于二进制binlog文件格式,三种支持类型包括:Statement,Row,Mixed ( 在mysql 架构篇第一篇中有讲到)。
2.1 从库relay log 中继日志文件
从库中继日志文件relay log的文件格式,内容和主库二进制日志文件binlog一样,唯一的区别在于从库上的sql线程在执行完当前中继日志文件relay log中的事件之后,sql 线程会自动删除当前中继日志文件realy log,避免从库上的中继日志文件relay log占用过多的磁盘空间。
2.2 从库 master.info和realy-log.info文件
为了保证从库crash重启后,从库的I/O线程仍然能够知道从哪里开始复制,从库上默认还会创建二个日志文件master.info 和realy-log.info 用来保存复制的进度。 这两个文件在磁盘上以文件形式记录,位置在data目录下。I/O线程维护master.info 中主库二进制日志binlog的进度。sql线程维护realy-log.info 应用中继日志relay log 的进度。 总结是: I/O线程关联master.info,sql线程关联realy-log.info。再来看下复制原理图:
2.3 复制状态信息
在从库上通过SHOW SLAVE STATUS,能了解复制的状态, 里面的信息包含了master.info和realy-log.info的信息。
(1) master.info对应的信息如下:
Master_Host |
172.168.18.201 |
主库IP |
Master_User |
rep1 |
主库上用于复制的账号 |
Master_Port |
3306 |
主库mysql 端口 |
Master_Log_File |
mysql-bin.000072 |
从库I/O线程当前读取主库binlog的文件名 |
Read_Master_Log_Pos |
514 |
从库I/O线程读取主库binlog的位置 |
(2) realy-log.info对应的信息如下:
Relay_Log_File |
xuegod64-relay-bin.000005 |
SQL线程正在应用的relay log |
Relay_Log_Pos |
680 |
SQL线程正在应用的relay log的位置 |
Relay_Master_Log_File |
mysql-bin.000072 |
SQL线程正在应用的relay log对应的binlog |
Exec_Master_Log_Pos |
514 |
SQL线程正在应用的relay log的位置对应的主库binlog的位置 |
(3) 其它信息
Connect_Retry |
60 |
连接中断后,重新尝试连接的时间间隔。默认值是60秒 |
Slave_IO_Running |
Yes |
I/O线程是否被启动并成功地连接到主服务器上 |
Slave_SQL_Running |
Yes |
SQL线程是否被启动 |
Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table |
指明哪些库或表在复制的时候不要同步到从库 |
|
Last_Error |
0 |
SQL线程读取日志参数的的错误数量和错误消息 |
Skip_Counter |
0 |
设置跳过sql执行步数 |
Relay_Log_Space |
890 |
原有的中继日志结合起来的总大小 |
Master_SSL_Allowed |
No |
1) 如果允许对主服务器进行SSL连接,则值为Yes 2) 如果不允许对主服务器进行SSL连接,则值为No 3) 如果允许SSL连接,但是从属服务器没有让SSL支持被启用,则值为Ignored。 |
SQL_Delay |
0 |
一个非负整数,表示秒数,Slave滞后多少秒于master |
Master_Retry_Count |
86400 |
连接主库失败最多的重试次数 |
2.4 主库 binlog 格式
-- 查看当前binlog格式
SHOW VARIABLES LIKE '%binlog_format%'
-- 全部更新
UPDATE testbackup SET `name`=CONCAT(`name`,'hello')
--通过mysqlbinlog检查,可以发现记录是按row 每行记录的。
[root@hsr ~]# mysqlbinlog --base64-output=decode-row -v /var/lib/mysql/mysql-bin.000072
#181029 14:33:20 server id 1 end_log_pos 1539 CRC32 0xde0ceeff Update_rows: table id 221 flags: STMT_END_F
### UPDATE `test`.`testbackup`
### WHERE
### @1=1
### @2='张三2'
### SET
### @1=1
### @2='张三2hello'
### UPDATE `test`.`testbackup`
### WHERE
### @1=2
### @2='李四'
### SET
### @1=2
### @2='李四hello'
### UPDATE `test`.`testbackup`
### WHERE
### @1=3
### @2='五五'
### SET
### @1=3
### @2='五五hello'
### UPDATE `test`.`testbackup`
### WHERE
### @1=4
### @2='赵六'
### SET
### @1=4
### @2='赵六hello'
### UPDATE `test`.`testbackup`
### WHERE
### @1=5
### @2='小红'
### SET
### @1=5
### @2='小红hello'
### UPDATE `test`.`testbackup`
### WHERE
### @1=6
### @2='小明'
### SET
### @1=6
### @2='小明hello'
### UPDATE `test`.`testbackup`
### WHERE
### @1=7
### @2='田七'
### SET
### @1=7
### @2='田七hello'
### UPDATE `test`.`testbackup`
### WHERE
### @1=8
### @2='小康'
### SET
### @1=8
### @2='小康hello'
### UPDATE `test`.`testbackup`
### WHERE
### @1=9
### @2='小王'
### SET
### @1=9
### @2='小王hello'
### UPDATE `test`.`testbackup`
### WHERE
### @1=10
### @2='小李'
### SET
### @1=10
### @2='小李hello'
### UPDATE `test`.`testbackup`
### WHERE
### @1=11
### @2='小王'
### SET
### @1=11
### @2='小王hello'
### UPDATE `test`.`testbackup`
### WHERE
### @1=12
### @2='小李子1'
### SET
### @1=12
### @2='小李子1hello'
-- 现在将binlog格式从row 改为 statement 格式
-- 当前会话
SET binlog_format='statement'
-- 全部更新
UPDATE testbackup SET `name`=CONCAT(`name`,'hello123')
再通过mysqlbinlog检查,可以发现记录是按statement语句级记录的。
BEGIN
/*!*/;
# at 1714
#181029 14:41:21 server id 1 end_log_pos 1860 CRC32 0x9fdf71e9 Query thread_id=2 exec_time=0 error_code=0
use `test`/*!*/;
SET TIMESTAMP=1540795281/*!*/;
-- 全部更新
update testbackup set `name`=concat(`name`,'hello123')
/*!*/;
# at 1860
#181029 14:41:21 server id 1 end_log_pos 1891 CRC32 0x4b7199d3 Xid = 579
COMMIT/*!*/;
总结:在binlog_format格式为row时,mysql实际上在binlog是一行行记录数据的变更。当格式为statement时是按语句级记录。 row格式比statement格式更能保证从库数据的一致性(复制是记录,而不是单纯操作sql),但row格式下的binlog的日志量很可能会增大好几倍,在设置时需要考虑磁盘空间问题。
三. 刷新磁盘频率
对于支持事务引擎(如innodb)来说, 每个事务提交时都需要写binlog,对于不支持事务的引擎(例myisam)来说,每个sql语句执行完成时,都需要写binlog。 为了保证binlog安全,mysql引入了 sync_binlog 参数来控制binlog刷新到磁盘的频率。
关于sync_binlog在: mysql 开发进阶篇系列 19 MySQL Server(innodb_flush_log_at_trx_commit与sync_binlog)中有介绍。
-- 查看binlog格式
SHOW VARIABLES LIKE '%sync_binlog%'
当sync_binlog=1时,是最安全的,当主机突然断点,系统最多损失最近的一条事务的数据。但是在多个事务并发提交时,mysql不得不按顺序处理请求,同时高频率的刷新binlog对I/O影响明显,很大程度影响了mysql的性能。
所以一般线上系统mysql的sync_binlog不会设置为1, 而是2或0,在数据安全性和更高的并发之间获取一个平衡。
mysql 架构篇系列 3 复制运行状态监控与选项参数说明的更多相关文章
- mysql 架构篇系列 2 复制架构一主一从搭建(异步复制)
一. 环境准备 1.1 主库环境(172.168.18.201) 环境 说明 查看脚本 操作系统版本 CentOS Linux release 7.4.1708 (Core) cat /etc/red ...
- mysql 架构篇系列 1 复制原理和复制架构
一. 复制概述 mysql 从3.23版本开始提供复制功能,复制是指将主数据库的ddl和dml操作通过二进制日志传到复制服务器(也叫从服务器)上,然后在从服务器上对这些日志重新执行(也叫重做),从而使 ...
- mysql 架构篇系列 4 复制架构一主一从搭建(半同步复制)
一.概述 在mysql 5.5之前,mysql 的复制是异步操作,主库和从库的数据之间存在一定的延时,这样存在一个隐患:当主库上写入一个事务并提交成功,而从库尚未得到主库推送的Binlog日志时,主库 ...
- 【目录】mysql 架构篇系列
随笔分类 - mysql 架构篇系列 mysql 架构篇系列 4 复制架构一主一从搭建(半同步复制) 摘要: 一.概述 在mysql 5.5之前,mysql 的复制是异步操作,主库和从库的数据之间存在 ...
- MySQL优化篇系列文章(二)——MyISAM表锁与InnoDB锁问题
我可以和面试官多聊几句吗?只是想... MySQL优化篇系列文章(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. 面试官:咦,小伙子,又来啦 ...
- 【目录】sql server 架构篇系列
随笔分类 - sql server 架构篇系列 sql server 高可用镜像 摘要: 一.什么是数据库镜像 基本软件的高可用性解决方案 快速的故障转移恢复(3秒转移),低硬件成本 基于数据库级别的 ...
- 【目录】mysql 进阶篇系列
随笔分类 - mysql 进阶篇系列 mysql 开发进阶篇系列 55 权限与安全(安全事项 ) 摘要: 一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysq ...
- 【目录】mysql 基础篇系列
随笔分类 - mysql 基础篇系列 mysql 开发基础系列22 SQL Model(带迁移事项) 摘要: 一.概述 与其它数据库不同,mysql 可以运行不同的sql model 下, sql m ...
- mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)
一. xtrabackup 选项说明 在操作xtrabackup备份与恢复之前,先看下该工具的选项,下面记录了xtrabackup二进制文件的部分命令行选项,后期把常用的选项在补上.点击查看xtrab ...
随机推荐
- 实验十五 GUI编程练习与应用程序部署
实验十五 GUI编程练习与应用程序部署 实验时间 2018-12-6 一:理论部分 1.Java 程序的打包:编译完成后,程序员将.class 文件压缩打包为 .jar 文件后,GUI 界面序就可以 ...
- MongoDB + Express 环境搭建记
最近项目需要使用 MongoDB,所以不得不搭建 MongoDB 环境,此文记录搭建过程及使用过程中需要了解的问题. Linux + Windows 混合搭建调试 MongoDB 记录 版本介绍 : ...
- gulp使用详解
前面整理了 gulp使用入门,本节介绍相关的压缩 1.压缩js文件 步骤同基础步骤,相关可以看入门篇 npm install gulp-uglify --save-dev 引入js压缩库 gulpfi ...
- Codeforces Codeforces Round #484 (Div. 2) E. Billiard
Codeforces Codeforces Round #484 (Div. 2) E. Billiard 题目连接: http://codeforces.com/contest/982/proble ...
- Exp2后门原理与实践_20154305 _ 齐 帅
Exp2后门原理与实践 20154305 _ 齐 帅 2.1简单后门 一.后门工具介绍 1.netcat(nc.ncat) 是一个底层工具,进行基本的TCP UDP数据收发.常被与其他工具结合使用,起 ...
- C++ STL常用知识
模板(各种类型通用): template<class 模板名> 注意:若要使用模板,在每个自定义函数前都必须加上此定义. 排序(algorithm头文件): sort(头指针l,尾指针r) ...
- h5的改进:
新元素画布canvas: HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成音频audio视频video语义性: article, nav ...
- C++ boost.python折腾笔记
为了让当年研究生时写的图像处理系统重出江湖起到更大的作用,应研究生导师的意见,对原有的c++框架做了python扩展处理,为了避免遗忘,备注如下: 一.boost 编译 下载boost源码,这里使用b ...
- 解决Eclipse中无法直接使用Base64Encoder的问题(转载)
资源出处:https://blog.csdn.net/u011514810/article/details/72725398 Base64的加密解密都是使用sun.misc包下的BASE64Encod ...
- Linux上搭建Hadoop集群
本文将为初学者的搭建简单的伪分布式集群,将搭建一台虚拟机,用于学习Hadoop 工具:vm虚拟机,centOS7,jdk-8,Hadoop2.7,xftp,xshell 用户:在虚拟机中创建一个had ...