MySQL日志
日志用来做什么?
1.用来排错
2.用来做数据分析
3.了解程序的运行情况,是否健康
日志放在哪里?
日志一般放在数据目录
日志分类
错误日志、通用日志、慢日志、二进制日志
一、错误日志
错误日志的名字:主机名.err
错误日志默认是开启的
错误日志会记录什么?
登录失败会记录到错误日志
配置文件出错也会记录
启动过程出问题也会记录
二、通用日志
通用日志的名字:主机名.log
默认不开启
怎么开启?
临时开启:set global general_log = 1;
永久开启:修改配置文件加入一行 general_log
缺点:消耗大量的磁盘空间,消耗cpu、内存、磁盘资源
优点:审计 会记录所有的SQL操作
三、慢日志
慢日志的名字:主机名-slow.log
默认不开启
怎么开启?
临时开启:set global slow_query_log = 1;
永久开启:修改配置文件加入一行 slow_query_log=1
多慢算慢?
默认是10秒 ,使用 show variables like ‘%long_query%’; 可以查看
怎么修改?
临时修改:set long_query_time = 你想要的值
永久修改:修改配置文件 long_query_time = 你想要的值
作用:记录消耗时间比较长的SQL语句,为数据库性能提升提供了线索
四、二进制日志
二进制日志的名字:主机名-bin.xxx,如:xixi-bin.000001
默认不开启
主机名-bin.index 这个文件是什么?
二进制日志文件的索引,记录一共有多少个二进制日志文件了
怎么开启?
修改配置文件,写入以下两行
log_bin
server_id = 1
二进制日志会记录什么?
binlog 是记录所有数据库表结构变更(例如create、alter table…)以及表数据修改(insert、delete、update…)的二进制日志。多说一句,如果update操作没有造成数据变化,也是会记入 binlog。
binlog 不会记录 select 和 show 这类操作,因为这类操作对数据本身并没有修改,但你可以通过查询通用日志来查看MySQL执行过的所有语句。
怎么查看二进制日志?
二进制日志不能用 cat 查看,使用 mysqlbinlog 命令可以查看二进制日志
什么时候会删除二进制日志?
当日志到达最大值1G的时候
或者使用 reset master;
怎么查看当前的二进制日志?
show master status;
怎么产生新的二进制日志?
flush logs
怎么修改刷新日志的频率?
如:修改为15天刷新日志,编辑配置文件
expire_logs_days = 15
二进制的格式
row level:默认
记录操作的每一行数据,更能保证数据的一致性
row 不止记录SQL语句还记录数据的变化
statement level
记录用户输入的SQL语句
弊端:如果有的数据插入时使用了now()函数,比如create_time字段的value,那么就有时间差这个概念,就有可能会出现数据不一致的情况
mixed level
row和statement 的混合版,有的情况使用row,有的情况使用statement
二进制日志的落盘
调用fsync(),刷新binlog写入到磁盘
sync_binlog=0: 表示刷新binlog时间点由操作系统自身来决定,操作系统自身每隔一段时间就会刷新缓存数据到磁盘,这个性能最好。
弊端:容易丢失数据,万一停电数据没落盘,就会丢失
sync_binlog=1: 表示每次事务提交都要调用fsync(),刷新binlog写入到磁盘。
能快速的存储数据,不容易丢数据
sync_binlog=N: 表示 N个事务提交,才会调用 fsync()进行一次binlog刷新,写入磁盘。
这个
五、redo log
解决事务commit不成功,重新redo
对应的物理文件:ib_logfile0、ib_logfile1
作用
确保事务的持久性。
防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。
内容
物理格式的日志,记录的是物理数据页面的修改的信息,其redo log是顺序写入redo log file的物理文件中去的。
什么时候产生
事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo log文件中。
什么时候释放
当对应事务的脏页写入到磁盘之后,redo log的使命也就完成了,重做日志占用的空间就可以重用(被覆盖)
六、undo log
解决事务rollback,撤销
对应的物理文件:ibdata1
redo和undo的关系
先redo 再 undo