一、MySQL服务日志介绍
MySQL日志有下面几种:
- 错误日志(Error Log)
- 查询日志(Query Log)
- 二进制日志(Binary Log)
(一)错误日志
记录MySQL服务进程在启动、关闭或运行过程中遇到的错误信息。它的调整在/data/3306/my.cnf文件中:
... [mysqld_safe] log-error=/data/3306/mysql_3306.err #错误日志路径 ...
(二)查询日志
查询日志分为:
- 普通查询日志(general query log)
- 慢查询日志(slow query log)
1、普通查询日志
记录客户端连接信息和执行的SQL语句信息。对于普通查询日志参数调整查看:
mysql> show variables like 'general_log%'; +------------------+-----------------------------------+ | Variable_name | Value | +------------------+-----------------------------------+ | general_log | OFF | | general_log_file | /data/3306/data/hadoop-slave1.log | +------------------+-----------------------------------+ 2 rows in set (0.03 sec)
可以看到普通查询日志处于关闭状态,并且存储的位置,当然你可以通过 set global general_log = ON 进行开启。
2、慢查询日志
记录查询时间超过指定值(long_query_time)的SQL语句。对于普通查询日志参数调整查看:
-- vim /data/3306/my.cnf [mysqld] ... long_query_time = 1 log-slow-queries = /data/3306/slow.log ...
(三)二进制日志
记录数据被修改的相关信息。参数调整查看:
-- 查看相关参数 mysql> show variables like '%log_bin%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | log_bin | ON | --记录binlog | sql_log_bin | ON | --临时不记录binlog +---------------------------------+-------+ 3 rows in set (0.00 sec)
-- 开启binlog vim /data/3306/my.cnf ... [mysqld] ... log-bin = /data/3306/mysql-bin ...
二、二进制日志的三种模式
(一)三种模式介绍
binlog日志有三种模式分别为:
- Statement Level模式
- Row Level模式
- Mixed模式
1、Statement Level模式
将每一条修改数据的sql都会记录到master的binlog中。slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行。
优点:解决了Row Level下的缺点,不需要记录每一行的数据变化,从而减少bin-log日志量,节约IO,提高性能。
缺点:由于记录的是执行语句,所以随着新功能的不断增加,MySQL的复制在某些情况下(如:存储过程、trigger调用)会遇到失败。
2、Row Level模式
记录每一行数据的修改形式,然后slave端再对相同的数据进行修改。
优点:bin-log中不记录执行sql语句的上下文相关信息,仅仅记录哪一条数据被修改了以及修改成什么样了,所以Row Level日志清楚的记录数据修改的细节。而且不会出现上面Statement Level模式复制出现问题的情况(如:存储过程、trigger调用)。
缺点:由于记录的日志比较详细,所以会产生大量的日志文件。
3、Mixed模式
该模式是上面两种模式的结合,在Mixed模式下,MySQL会根据执行的sql来区分对待记录日志的形式。
(二)调整binlog日志模式
1、查看binlog日志模式
mysql> show variables like '%binlog_format%'; +---------------+-----------+ | Variable_name | Value | +---------------+-----------+ | binlog_format | STATEMENT | +---------------+-----------+ 1 row in set (0.01 sec)
2、调整binlog日志模式方法
- 配置文件修改
-- vim /data/3306/my.cnf [mysqld] ... binlog_format = ROW ...
- 在线修改立即生效
-- 设置 mysql> set global binlog_format=ROW; Query OK, 0 rows affected (0.00 sec) -- 退出 mysql> quit Bye -- 重新登录查看 mysql> show variables like '%binlog_format%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | binlog_format | ROW | +---------------+-------+ 1 row in set (0.00 sec)
- 不重启修改永久生效
将上面的配置全部设置,配置文件设置和全局变量设置都要设置。
(三)binlog日志模式实践
1、刷新binlog
-- 出现一个新的binlog文件 mysql-bin.000009 [root@hadoop-slave1 3306]# mysqladmin -uroot -p123456 -S /data/3306/mysql.sock flush-logs
2、操作数据库
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | crm | | mysql | | performance_schema | | reptest | | test | +--------------------+ 6 rows in set (0.02 sec) mysql> use crm; Database changed mysql> show tables; +---------------+ | Tables_in_crm | +---------------+ | userinfo | +---------------+ 1 row in set (0.00 sec) mysql> delete from userinfo; Query OK, 4 rows affected (0.04 sec)
3、查看binlog日志
-- 查看Row Level下的binlog文件 [root@hadoop-slave1 3306]# mysqlbinlog --base64-output=decode-rows -v mysql-bin.000009 -- 具体日志文件 .. D_F ### DELETE FROM `crm`.`userinfo` ### WHERE ### @1=1 ### @2='张三' ### DELETE FROM `crm`.`userinfo` ### WHERE ### @1=2 ### @2='李四' ### DELETE FROM `crm`.`userinfo` ### WHERE ### @1=3 ### @2='王五' ### DELETE FROM `crm`.`userinfo` ### WHERE ### @1=4 ### @2='赵六' # at 300 ...
可以看到,数据库的更改语句会详细的被记录。