binlog(归档日志)
一、介绍
binlog是server层的归档日志,所以没有crash-safe能力(redo log)
- binlog是mysql的逻辑日志,并由server层进行记录,任何存储引擎都可以开启并使用;
- binlog 记录数据库执行写入性操作信息,及语句的原始逻辑,还包括语句执行开始、结束时间,事务ID等信息;
- binlog 磁盘记录是顺序记录,但日志的最大值(默认1G,可以通过max_binlog_size来设置),则会新起一个文件继续记录(不同于redo log)
二、使用场景
- 数据恢复
- 主从同步
三、日志开启及查询
数据恢复,通过使用mysqlbinlog工具来恢复数据
-
查看binlog日志是否开启
show variables like "log_bin%"
log_bin:on 表示已开启
==log_bin_basename:==日志保存的位置和名称,(如mysql-bin.000001)
==log_bin_index:==指定索引文件位置
如果binlog没有开启,可以到mysql配置文件的【mysqld】下面添加:
log_bin=mysql-bin
重启mysql服务器,可以查看到日志已开启
会在datadir下创建mysql-bin.index和mysql-bin.000001 -
查看所有binlog日志
show master logs;
-
刷新日志,则会停止当前日志文件的记录,生成新的日志文件继续后续记录
flush logs;
可以看到生成了新的日志文件mysql-bin.000005 -
重置日志文件
reset master;
重置之后也会生成新的日志文件,不过是从头开始记录
可以看到日志文件被重置,从头开始记录
四、数据恢复
create table `t` (
`id` int(11) not null auto_increment,
`k` varchar(255) default null,
`c` varchar(255) default null,
`pad` varchar(255) default null,
primary key (`id`),
key `index_kc` (`k`,`c`)
) engine=innodb;
insert into t values(null,'k1','c1','p'),(null,'k2','c2','pp');
-- insert into t values(null,'k3','c3','pnew');
查询可看到数据已存在
可以使用mysqlbinlog
查看日志信息
查看日志文件已经有内容写入,使用mysqkbinlog查看
可以看到日志内记录写入数据库执行的语句及开始结束时间
之后我们删除表,然后再通过binlog做数据恢复
在数据恢复前我们要先找表呗删除前的记录点
./mysqlbinlog --no-defaults /www/server/data/mysql-bin.000001 |cat -n | grep -iw 'drop'
可以看到drop语句在82行,然后看drop语句的position
./mysqlbinlog --no-defaults /www/server/data/mysql-bin.000001 | cat -n |sed -n '60,85p'
找到drop是在985左右,所以我们数据恢复可以恢复到985这个位置
./mysqlbinlog --no-defaults --stop-position='985' /www/server/data/mysql-bin.000001 |mysql -uroot -proot
// --start-position 和 --stop-position 一起使用可以恢复某一段的数据
至此可以看到数据已经恢复了