- A+
1.5 mysqlbinlog工具解析binlog日志实践.
2.2 普通查询日志(genera log)介绍与调整(工作中不用)
2.3 慢查询日志(slow query log)介绍与调整 *****
三种日志为:
1. 二进制日志文件(binlog)
2. 慢查询日志(slow.log) #<== 归类服务日志
3. 普通查询日志(db01.log) #<== 归类服务日志
1. MySQL日志之binlog日志
1.1 mysql工具mysqlbinlog
1.2 MySQL的·binlog日志是什么?
MySQL数据目录下的如下文件就是mysql的binlog日志
mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 mysql-bin.000004 mysql-bin.000005 mysql-bin.000006 mysql-bin.000007 mysql-bin.000008 ...... ...... ......
提示:要想生成binlog必须在配置文件中打开log-bin功能,如下:
[root@db01 3306]# grep log-bin /data/3306/my.cnf log-bin = /data/3306/mysql-bin
1.3 mysql binlog日志功能开启
[root@db01 3306]# vim /data/3306/my.cnf log-bin = /data/3306/mysql-bin #<== 在mysql数据库配置文件中将此行注释打开即可
1.4 mysql的binlog日志作用是什么?
mysql的binlog日志作用是用来记录mysql内部增删等对mysql数据库有更新的内容的记录(对数据的改动),对数据库查询的语句如show,select开头的语句,不会被binlog日志记录。用于数据库的主从复制,以及增量恢复。
选择题:
在MySQL数据库中,关于binlog日志,下列说法正确的是-----------(A)
A:依靠足够长度的binlog日志和定期的全备,我们可以恢复任何时间点的单表数据。
B:以mysql主从同步为例,binlog中会记录主数据库的所有操作。
C:以mysql主从同步为例,binlog中会记录主数据库的所有查询操作。
D:binlog通过cat和vi无法查看,但可以通过gedit查看。
1.5 mysqlbinlog工具解析binlog日志实践
默认情况binlog日志是二进制格式的,不能使用查看文本工具的命令查看,例如:cat、vi
[root@db01 3306]# file /data/3306/mysql-bin.000001 /data/3306/mysql-bin.000001: MySQL replication log #<== 文件类型
解析指定库的binlog日志
范例:利用mysqlbinlog -d参数解析指定库的binlog日志
[root@db01 3306]# mysqlbinlog -d oldboy /data/3306/mysql-bin.000001 -r oldboy.sql [root@db01 3306]# ll oldboy.sql #<== 查看导出的文件 -rw-r--r-- 1 root root 4731 Aug 31 04:36 oldboy.sql [root@db01 3306]# cat oldboy.sql #<== 现在就可以查看啦 说明:-d是指定库进行解析;-r:指定解析到那个文件,相当于重定向
结论:mysqlbinlog工具分库导出binlog,如果使用-d参数,那更新数据时,必须有use database,才能分出指定库的binlog,例如:
use oldboy; insert into test values(1,’oldboy’)
下面的写法就不行
nsert into oldboy.test values(1,’oldboy’)
按照位置截取:精确
mysqlbinlog mysql-bin.000003 --start-position=365 --stop-position=456 -r pos.sql
#说明:指定文件的第365到456结束,是binlog文件中的“# at 365”---“# at 456”;-r是指定文件,相当于重定向,如果命令中指定开始不指定结尾就是到文件的结尾,如果不指定开始则是从文件开头开始。
按照时间截取:模糊,不准
mysqlbinlog mysql-bin.000003 --stsrt-datetime='2016-10-8 12:12:12' --stop-deter=time='2016-10-8 12:20:20' -r time.sql #<== 注意格式
# 说明:时间在该binlog文件中的 # at 456 下面即使,只指定开始时间就是到文件结尾,只指定结尾,则是从开头开始;-r是指定文件
1.6 mysqlbinlog命令小结
mysqlbinlog命令:
1. 把binlog日志解析为SQL语句(包含位置和时间点)。
2. -d参数根据指定库拆分binlog(拆分单表binlog可通过SQL关键字过滤)。
3. 通过位置参数截取部分binlog:--syart-position=365 --stop-position=456,;精确定位取部分内容。
4. 通过时间参数截取部分binlog:-stsrt-datetime='2016-10-8 12:12:12' --stop-deter=time='2016-10-8 12:20:20',模糊截取部分内容,会丢数据。
5. -r指定文件名,相当于重定向。
6. 解析ROW级别binlog日志的方法
mysqlbinlog --base64-output=decode-rows-v mysql-bin.000016 mysqlbinlog --base64-output="decode-rows" --verbose mysql-bin.000004
2. MySQL数据库服务日志
2.1 错误日志(error.log)介绍与调整
1. 错误日志(error.log)介绍
MySQL的错误日志记录MySQL服务进程mysql在启动/关闭或运行过程中遇到的错误信息。
2. 错误日志(error.log)实践
法1:在配置文件中调整方法,当然可以在启动时加入启动参数
[mysqld_safe] #<== 放在该模块下 log-error=/data/3306/mysql_oldboy3306.err
法2:启动MySQL命令里加入:
mysql_safe --detaults-file=/data/3306/my.cnf --log-error=/data/3306/mysql_oldboy3306.err &
在数据库里也可以看到:
mysql> show variables like '%log_error%'; +-------------------+---------------------------------+ | Variable_name | Value | +-------------------+---------------------------------+ | log_error | /data/3306/mysql_oldboy3306.err | +-------------------+---------------------------------+ 1 row in set (0.00 sec)
如果mysql数据库起不起来排查步骤:
1. 把/data/3306/data目录删除后重新建立data目录并加属主属组
2. 把原有的my.cnf mysql这两个文件也重新还原过
3. 重新用mysqld_safe启动过
4. 改过my.cnf里面的server-id =2
5. 配置文件里面的端口路径
6. 将日志文件备份,然后清空日志文件,并重启数据库,查看报错。
7. 如果是多实例的话讲多实例目录下的目录权限chown -R mysql.....。
8. 查看是否有管理mysql数据库的用户。
2.2 普通查询日志(genera log)介绍与调整(工作中不用)
1. 普通查询日志(general query log)介绍
普通查询日志(general query log),记录客户端连接信息和执行的SQL语句信息(增删改查,全部记录)。工作中不用,会消耗IO性能,
2. 普通查询日志general
query log)调整
mysql> show variables like 'general_log%'; #<== 在数据库中查看 +------------------+---------------------------+ | Variable_name | Value | +------------------+---------------------------+ | general_log | ON | #<== 当前是关闭状态 | general_log_file | /data/3306/data/db01.log | +------------------+---------------------------+ 2 rows in set (0.00 sec)
临时生效:
mysql> set global general_log_file = '/data/3306/data/db01.log'; #<== 数据库中配置 Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'general_log%'; #<== 配置完后查看 +-------------------+---------------------------+ | Variable_name | Value | +-------------------+---------------------------+ | general_log | OFF | | general_log_file | /data/3306/data/db01.log | +-------------------+---------------------------+ 2 rows in set (0.00 sec)
永久生效(配置文件中配置):
[root@db01 3306]# grep gene /data/3306/my.cnf general_log = on #<== 普通日志开关 general_log_file = /data/3306/data/db01.log #<== 日志位置
2.3 慢查询日志(slow query log)介绍与调整*****
1. 慢查询日志介绍:
慢查询日志,记录执行时间超出指定值的SQL语句
2. 慢查询日志的调整配置
long_query_time = 1 #<== 属于慢查询的时间 log-slow-queries = /data/3306/slow.log #<== 慢查询的日志文件 log_queries_not_using_indexes #<== 记录没有使用索引的SQL语句
慢查询的设置,对于数据库SQL的优化非常重要:
[root@db01 /]# egrep "quer" /data/3306/my.cnf|tail -3 long_query_time = 1 log-slow-queries = /data/3306/slow.log log_queries_not_using_indexes
利用慢查询进行优化解决方案:
1. 开启慢查询参数
long_query_time = 1 log-slow-queries = /data/3306/slow.log log_queries_not_using_indexes
2. 慢查询日志切割
[root@db01 /]# vim /server/scripts/cut_slow_log.sh #!/bin/bash cd /data/3306 &&\ /bin/mv slow.log slow.log.$(date +%F) &&\ mysqladmin -uroot -poldboy123 -S /data/3306/mysql.sock flush-log [root@db01 scripts]# tail -2 /var/spool/cron/root # cut mysql slow log 00 00 * * * /bin/sh /server/scripts/cut_slow_log.sh >/dev/null 2>&1
使用explain优化SQL语句(select语句)的基本流程:
1. 抓慢查询SQL语句方法
a:如下
#登录数据库现场抓,连续执行2次,超过2秒) show full processlist; #在命令行进行抓取 mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show full processlist;"|egrep -vi "sleep"
b. 分析慢查询日志,配置参数记录慢查询语句
long_query_time = 2 #<== 属于慢查询的时间 log-slow-queries = /data/3306/slow.log #<== 慢查询的日志文件 log_queries_not_using_indexes #<== 记录没有使用索引的SQL语句
2. explain语句检查索引执行情况
explain select * from test where name='wordpress'\G explain select SQL_NO_CACHE * from test where name='wordpress'\G
3. 对需要建索引的条件列建立索引,大表不能高峰期建立索引,300万记录
4. 分析查询工具mysqlsla(每天早晨发邮件)
切割慢查询日志,去重分析后发给大家。
1)mv,relaod 进程
2)cp,>清空
mv /data/3306/slow.log /opt/$(date +%F)_slow.log mysqladmin -uroot -p123456 -S /data/3306/mysql.sock flush-logs
2.4 二进制日志(binary log)介绍与调整
1. 二进制日志介绍
二进制日志(binary log),记录数据备份修改的相关信息,用于主从复制和增量恢复
2. 二进制日志(binary
log)调整。
mysql> show variables like '%log_bin%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | log_bin | OFF | | log_bin_trust_function_creators | OFF | | sql_log_bin | ON | +---------------------------------+-------+ 3 rows in set (0.00 sec) g[root@zyl ~]# grep log-bin /etc/my.cnf log-bin=mysql-bin
二进制日志log-bin作用:
1. 以二进制形式记录更改数据库的SQL语句
2. 用于主从复制
3. 增量数据备份及恢复
临时不记录binlog(增量恢复)一般不这样做,要是有主从时更不能不记录binlog日志
mysql> set session sql_log_bin = OFF; #<== 临时不记录binlog Query OK, 0 rows affected (0.00 sec) mysql> show variables like "%log_bin%"; #<== 设置后查看 +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | log_bin | OFF | | log_bin_trust_function_creators | OFF | | sql_log_bin | OFF | +---------------------------------+-------+ 3 rows in set (0.00 sec)