ib_logfile 文件原理
ib_logfile0 是innodb中事务日志,记录系统的回滚,重做日志,记录的是文件的物理更改,存放位置my.ini 中的 datadir="D:\phpStudy\MySQL\data",目录下。
事务日志或称redo日志,在mysql中默认以ib_logfile0,ib_logfile1名称存在,可以手工修改参数,调节
开启几组日志来服务于当前mysql数据库,mysql采用顺序,循环写方式,每开启一个事务时,
会把一些相关信息记录事务日志中(记录对数据文件数据修改的物理位置或叫做偏移量)
作用:在系统崩溃重启时,作事务重做;在系统正常时,每次checkpoint时间点,会将之前写入事务
应用到数据文件中。
redo日志写入方式:
- ib_logfile写入当前事务更新数据,并标上事务准备trx_prepare
- 写入bin-log
- ib_logfile当前事务提交提交trx_commit
恢复方式:
如果ib_logfile已经写入事务准备,那么在恢复过程中,会依据bin-log中该事务是否存在恢复数据。
相关参数:
innodb_log_buffer_size
事务日志缓存区,可设置1M~8M,默认8M,延迟事务日志写入磁盘,把事务日志缓存区想象形如"漏斗"状,会不停向磁盘记录缓存的日志记录,而何时写入通过参数
innodb_log_file_size
控制事务日志ib_logfile的大小,范围5MB~4G;所有事务日志ib_logfile0+ib_logfile1+..累加大小不能超过4G,事务日志大,checkpoint会少,节省磁盘IO,但是大的事务日
志意味着数据库crash时,恢复起来较慢。
引入问题:修改该参数大小,导致ib_logfile文件的大小和之前存在的文件大小不匹配
解决方式:在干净关闭数据库情况下,删除ib_logfile,而后重启数据库,会自行创建该文件;
innodb_log_files_in_group
设置几组事务日志,默认是2
innodb_log_group_home_dir
事务日志存放目录,不设置,ib_logfile0存在在数据文件目录下
innodb_flush_log_at_trx_commit
控制事务日志何时写盘和刷盘,安全递增:0,2,1;启用大的事务日志缓存,可以将完整运行大事务日志,暂时存放在事务缓存区中,不必(事务提交前)写入磁盘保存,同时也起到节约磁盘空间占用
0:每秒一次事务缓存区刷新到文件系统,同时文件系统到磁盘同步,但是事务提交时,不会触发log_buffer到文件系统同步;
2:每次事务提交时,会把事务缓存区日志刷新到文件系统中去,且每秒文件系统到磁盘同步;
1:每次事务提交时刷新到磁盘,最安全;
适用环境:
0:磁盘IO能力有限,安全方便较差,无复制或复制延迟可以接受,如日志性业务,mysql损坏丢失1s事务数据;
2:数据安全性有要求,可以丢失一点事务日志,复制延迟也可以接受,OS损坏时才可能丢失数据;
1:数据安全性要求非常高,且磁盘IO能力足够支持业务,如充值消费,敏感业务;
文件大小设置
配置文件中配置: innodb_log_file_size=24M
删除mysql-bin日志(mysql-bin.00001)导致mysql无法启动的解决方法
MYSQL数据库目录日志文件mysql-bin.000**很大,没有多想就直接删除,但竟然导致mysql无法启动。网上很多资料,皆是把my.cnf里的log-bin=mysql-bin注释掉即可。但是,还是无法启动。再细查了很长时间才发现还需要注释掉binlog_format=mixed,不知是mysql版本原因还是由于lnmp安装包的问题,需要多注释一行。写出来,希望能帮助碰到同样的问题的,以免花费更多时间。
解决办法:
编辑my.cnf(一般在etc目录下)WINDOWS为(MY.INI)
将log-bin=mysql-bin 注释掉就OK。(前面加#号)
再把binlog_format=mixed这行也注释掉!
启动mysql:/etc/init.d/mysql start
再解除刚才的注释,重新启动mysql即可:/etc/init.d/mysql restart