日志管理(包括mysqlbinlog工具使用)
主从复制
author->xiaokai
一、日志管理
mysql日志种类(都是在my.cnf中配置)
错误日志
二进制日志(BINLOG日志)
查询日志
慢查询日志
1.错误日志
- 记录mysqld启动、停止、故障以及任何严重错误的相关信息
- log-error=[…] 指明错误日志打印路径和默认文件名
- 例: log-error=/var/log/mysqld.log
2.二进制日志(BINLOG日志)
- 以时间"事件"形式,描述数据的更改过程,包括所有的DDL和DML.不包括查询语句
- log-bin=[…] 指定路径和文件名,如果没有指定,默认日志打印路径为datadir路径,文件名为: 主机名-bin
-
BINLOG三种日志文件格式:
设置时: binlog-format=“xxx”(xxx是以下任意一种)
- STATEMENT
- 原理: 复制每一条完整的sql语句,保留在日志中,slave主从复制时执行每一句sql
- 优点: 日志记录清晰易读、日志量少、对I/O影响较小
- 缺点: 在某些情况下slave的日志会出错
- ROW
- 原理:将数据库中所有变更表中每一行发生的变化记录下来,而不是记录sql语句,slave主从复制时执行每一行的变化语句(不是sql语句,还没弄明白怎么执行)
- 优点:会记录每一行数据的变化细节,不会出现某些情况下无法复制的情况
- 缺点:日志量很大,对I/O影响较大
- 一般项目中为了保证数据的完整性使用此方式,之后再对BINLOG日志大小进行优化
- MIXED
- 混合了STATEMENT和ROW格式的日志打印(MySQL默认使用这种)
- 优缺点:尽可能利用前两种格式的优点,但是这种方式也不能保证数据的完整性综上所述,statement应该基本被遗弃,ROW优先级高于MIXED
- STATEMENT
-
二进制日志的读取
-
myslqbinlog日志管理工具(专用于二进制文件)
语法: mysqlbinlog [参数] logfile1 logfile2 …
参数 意义 -d (databaose) 指定数据库,只列出指定数据库相关操作 -o (offset=#) 忽略掉日志文件中的前n个语句操作 -r (result-file) 输出的文本格式日志输出到指定文件 -s (short-form) 显示简单格式,省略掉一些信息 –set-charset 输出文本格式时第一行加上set names char-name
装载数据时是十分有效的–start-datetime 指定日期间隔内的日志(开始时间) –stop-datetime 指定日期间隔内的日志(结束时间) –start-position 指定位置间隔内的所有日志(开始位置) –stop-position 指定位置间隔内的所有日志(结束位置) -vv --base64-output=DECODE-ROWS 有些是乱码,通过base64解码查看要清晰很多
举例:
mysqlbinlog mysql-bin.000009 -d ccs -->只显示对数据库ccs的操作
mysqlbinlog mysql-bin.000009 -o 3 -->忽略掉前三个语句操作 mysqlbinlog mysql-bin.000009 -o 3 -r /home/resultfile -->忽略掉前三个语句,输出到/home/下的resultfile中 mysqlbinlog mysql-bin.000009 -d ccs -s -->简单显示 ,会过滤掉一些内容 mysqlbinlog mysql-bin.000009 --start-datetime='2018/12/30 05:00:05' -- stop-datetime='2019/01/30 16:00:00' -->查这段时间内的日志(开始结束可以只写一个) mysqlbinlog mysql-bin.000009 --start-position=4 --stop-position=196 -->只显示第4行到第196行
-
-
二进制日志的删除
-
方式一: 执行"reset master"
删除所有BINLOG日志,新日志编号从"000001"开始.
-
方式二: 执行"purge master logs to '文件名.000000n"
删除00000n编号之前的所有BINLOG日志
-
方式三: 执行"purge master logs before 'yyyy-mm-dd hh:mm:ss"
删除日期为yyyy-mm-dd hh:mm:ss之前的所有BINLOG日志
-
方式四: my.cnf中设置参数explire_log_days=#
此参数的意义是设置日志的过期天数,过了指定的天数后日志将会被自动删除,这样有利于减少DBA管理日志的工作量.
- 演示步骤
- 查看删除前日志: system ls ltr localhost-bin.*
- 在my.cnf的[mysqld]中加入"explire_logs_day=3",之后重启服务
- 系统时间改为3天以后: date -s ‘20190127 14:00:00’
- 触发日志文件更新: mysqladmin flush-log
- 查看BINLOG日志符合定义的日期过期时间就都会被删除
同时my.cnf中还可以通过设置其他选项对BINLOG日志进行更小粒度的管理:
-
binlog-do-db=db_name
指定哪一些数据库更新需要被记录到BINLOG中,如果BINLOG需要记录多个库,则需要写多条,不能用逗号隔开,如:是binlog-do-db=db1换行binlog-do-db=db2而不是一行中binlog-do-db=db1,db2
-
binlog-ignore-db=db_name
指定哪一些数据库更新不需要被记录到BINLOG中,如果BINLOG不需要记录多个库,则需要写多条,不能用逗号隔开
-
innodb-safe-binlog
此选项经常和sync-binlog=N(每写N次日志同步磁盘)一起配合使用,使得事务在日志中的记录更加安全.(这个还不明白,需要看前面的sync-binlog=#是啥意思)
-
SET SQL_LOG_BIN=0
具有SUPER权限的客户端可以通过此语句禁止将自己的语句记入二进制记录.
这个选项在某些情况下是有用的,但是日志记录不完整可能导致主从同步数据不一致.
- 演示步骤
-
3.查询日志
查询日志记录了客户端的所有语句,而二进制日志不包含只查询的语句(二进制里边只有修改语句)
查询日志为纯文本,可以直接cat.vim.tail查看
-
输出形式,配置:log-output[=value…]
-
value值可以是TABLE、FILE、NONE的一个或多个组合,中间用逗号隔开,分别表示存储在表、文件、不保存在表和文件中,优先级none最高
-
如果不设置此参数,日志默认保存在文件中
-
mysql中,查询日志对应的表是general_log,慢查询日志对应的表是slow_log
-
但是,5.7版本之后,输出到表比输出到文件占用系统资源更多,所以建议使用文件记录
-
-
输出文件名路径,配置:general_log[={0|1}] 和 general_log_file=file_name
- 前者控制是否启用日志,后者控制日志文件的路径
- 前者1或者不带值表示启用查询日志;0代表不启用,这个配置要是没有,默认查询日志输出默认关闭
- 如果没有指定general_log_file,也没有显示设置log-output,日志默认将写入datadir指定路径下,默认文件名为 主机名.log
- 这两个参数都是global类型,可以在系统启动时或者系统运行时进行动态修改
- 如果想在session级别控制日志是否被记录,通过在session中设置参数sql_log_off为on或者off控制
4.慢查询日志
比较重要,可以 查看执行时间较长的语句,针对其语句进行优化
慢查询日志记录了所有执行时间超过参数long_query_time(单位:秒,默认为10秒)设置值并且扫描记录数不小于min_examined_row_limit的所有SQL语句的日志(注意: 获得表锁时间不算执行时间),这两个参数在mysql内部执行命令设置,具体看小标题2,也可以在mysql配置文件my.cnf中直接配置
默认有两种语句不会别记录: 管理语句和不适用索引的查询语句
管理语句: alter、table、analyze table、check table、create index、drop index、optimize table和repair table。
如果要监控这类语句,分别通过log-slow-admin-statements和log_queries_not_using_indexes进行控制
-
文件位置和格式
慢查询日志默认是关闭的.
-
文件位置
- slow_query_log[={0|1}] ,这儿跟查询日志是一样的,不指定值或指定为1都会打开慢查询日志
- slow_query_log_file[=file_name],指定慢查询日志路径,如果没有给定file_name的值,日志默认将写入datadir指定路径下,默认文件名为 主机名-slow.log
-
文件格式
-
log-output[=value…],这个配置和查询日志一样,看上面
注意: 如果输出到表,时间只能精确到秒;日志文件可以精确到毫秒
-
-
-
日志读取
-
查询和修改long_query_time值
查询: show variables like ‘long%’; 默认是10
修改成秒级: set long_query_time=2;
修改成微秒级: set global long_query_time=0.01;(这个命令好像不生效,得把global去掉)
-
查看日志输出方式
查询: show variables like ‘%output%’;
-
-
mysqldumpslow日志管理工具(专用于慢查询日志)
对于sql语句一致,只有变量不同的语句,mysqldumpslow会自动视为同一个语句进行统计,变量值用N代替
使用方式: mysqldumpslow 文件名
5.mysqlsla简介
mysqlsla是分析mysql日志的工具,可以分析查询日志、慢查询日志(包括微秒日志)、二进制日志和具有固定格式的自定义日志。虽然mysql本身自带了一些日志工具,比如mysqlbinlog分析二进制日志、mysqlslow分析慢查询日志等,但是这些工具工具比较单一,所以一般选用mysqlsla工具。
-
mysqlsla安装
-
如果没有git,需要先安装git:yum install git
-
安装命令:
说明: 在opt目录下创建一个mysqlMonitor文件夹对工具统一管理;git下载一个hackmysql.com文件夹;笔记的同级目录提供一个mysqlsla压缩包,需要把它解压放到mysalMonitor文件夹下.
cd /usr/local/src git clone https://github.com/daniel-nichter/hackmysql.com.git cp -Rf hackmysql.com /opt/mysqlMonitor cd /opt/mysqlMonitor/mysqlsla perl Makefile.PL make && make install #安装其他依赖包 yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-Time-HiRes perl-DBI
-
-
mysqlsla使用
-
解析查询日志和慢查询日志:
mysqlsla --log-type slow LOG
mysqlsla --log-type general LOG
-
解析二进制日志,需要先通过mysqlbinlog进行转换
mysqlbinlog LOG | mysqlsla --log-type binary -
-
解析微妙日志
mysqlsla --log-type msl LOG
-
解析用户自定义日志
mysqlsla --log-type udl --udl-format FILE
-
注意: --log-type可以省略,但解析二进制日志时不可以省,因为二进制日志需要mysqlbinlog先解析
-
-
mysqlsla其他使用参数
-
–statement-file(-sf) CONDITIONS 过滤语句类型
CONDITIONS 前面可以加"+“,”-",表示报表中"仅显示"和"仅去掉"后面 的语句类型
比如:statement-filter=+UPDATE,+INSERTE 表示结果中只显示update和insert语句
statement-filter=-UPDATE,-INSERTE 表示结果显示除了update和insert的语句
-
-ex 用来在报表中显示执行计划
-
–sort t_sum/c_sum 报表排序方式
慢查询日志和微秒日志默认是按照总执行事假t_sum排序,其他默认按照执行顺序c_sum排序.
-
–grep PATTERN 匹配sql语句中的特定字符串,比如: --grep ‘count’,则结果只显示sql语句中包含’count’的语句相关内容
-
-
mysqlsla输出格式说明
#mysqlsla输出格式说明: queries total: 总查询次数,unique: 去重后的sql数量 Sorted by: 输出报表的内容排序 Count : sql的执行次数及占总的slow log数量的百分比 Time : 执行时间, 包括总时间, 平均时间, 最小, 最大时间, 时间占到总慢sql时间的百分比 95% of Time : 去除最快和最慢的sql, 覆盖率占95%的sql的执行时间 Lock Time : 等待锁的时间 95% of Lock : 95%的慢sql等待锁时间 Rows sent : 结果行统计数量, 包括平均, 最小, 最大数量 Rows examined : 扫描的行数量 Database : 属于哪个数据库 Users : 哪个用户,IP,占到所有用户执行的sql百分比 Query abstract: 抽象后的sql语句 Query sample : sql样例语句
二、主从复制
slave会从master读取binlog来进行数据同步
1. mysql主从复制原理(过程)
- master将改变记录到二进制日志(binlog),这些记录过程叫做二进制日志事件,binary log events;
- slave将master的binary log events拷贝到他的中继日志(relay log);
- slave重做中继日志中的事件,将改变应用到自己的数据库中.mysql主从复制时异步且串行化的.
2.主从复制规则
- 每个slave只能有一个master;
- 每个slave只能有一个唯一的服务器ID;
- 每个master可以有多个slave.
3.主从复制的三种方式
- binlog_format=Statement 基于SQL语句的复制
- binlog_format=Row 基于行的复制
- binlog_format=Mixed 混合复制模式
3.复制的最大问题
延时,特别是多级复制时延迟更大
4.一主一从常见配置
-
mysql版本一致且以后台服务运行,两边ping得通
-
主从都配置在[mysqld]节点下,都是小写
-
主机的my.ini/my.cnf配置文件
-
主服务器唯一ID(必须)
server-id=1
-
启用二进制日志(必须)
log-bin=自己本地路径/mysqlbin
-
启用错误日志(可选)
log-err=自己本地路径/mysqlerr
-
根目录,道理相当于java的JAVA_HOME(可选)
basedir=“自己的本地路径”
-
临时目录(可选)
tmpdir=“自己的本地路径”
-
数据目录(可选)
datadir=“自己的本地路径/Data/”
-
主机读写都可以(可选)
read-only=0
-
设置不要复制的数据库(可选)
binlog-ignore-db=…,…,…
-
设置需要复制的数据库(可选)
binlog-do-db=…,…,…
-
-
从机的my.ini/my.cnf配置文件
-
从服务器唯一ID(必须)
server-id=2
-
启用二进制日志(可选)
log-bin=mysql-bin
-
-
因为修改过配置文件,需要主机和重启重启mysql服务
service mysqld restart
-
主机从机都关闭防火墙
-
在主机上建立账户并授权slave
-
GRANT REPLICATION SLAVE ON *.* TO ‘用户名’@‘从机ip地址’ IDENTIFIED BY ‘用户名对应的密码’;
-
flush privileges;
-
查询master状态
show master status;
记录下File和Position的值
-
执行完此步骤后不要再操作主服务器mysql,防止主服务器状态值变化
-
-
在从机上配置需要复制的主机
-
CHANGE MASTER TO MASTER_HOST=‘主机的IP地址’,
MASTER_USER=‘用户名’,
MASTER_PASSWORD=‘用户名的密码’,
MASTER_LOG_FILE=‘mysqlbin.具体数字’,MASTER_LOG_POS=主机上面保存的节点位置;
-
启动从服务器复制功能
start slave;
-
查看是否 配置成功
命令: show slave status\G
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
这两条要是都是yes就说明配置成功!
-
-
如何停止从服务复制功能
stop slave;
5.主从复制的恢复步骤
#案例-恢复的思想-以双主复制为例
1、主stop slave;>flush tables with read lock;
2、主dump数据库,清从的数据库,主数据库导入(保证主从数据一致)
3、主 reset slave;reset mstaer;show master status\G;
4、从 stop slave;reset slave;reset mstaer;show master status\G;
5、主:mysql>change master to
master_host='192.168.90.17',master_user='replicate',master_password='password',
master_log_file=' mysql-bin.000001 ',master_log_pos=154;
从:mysql>change master to
master_host='192.168.90.16',master_user='replicate',master_password='password',
master_log_file=' mysql-bin.000001 ',master_log_pos=154;
6、主 start slave;show slave status\G;
从 start slave;show slave status\G;
7、主>unlock tables;
6.主从复制的三种架构
- 一主多从复制架构
- 多级复制架构
- 双主复制架构