优质博文:IT-BLOG-CN
一、binlog
binlog
记录数据库表结构和表数据变更,比如update/delete/insert/truncate/create
,它不会记录select
。存储着每条变更的SQL
语句和XID
事务Id
等等。binlog
日志文件如下:
[[email protected]]# mysqlbinlog mysql-binlog.0000012
..........
# at 523
# 168654 20:22:43 server id 1 end_log_pos 843 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=156521934/*!*/;
INSERT INTO student('name','age','sex') VALUES('ZZX',20,'1'); # 执行的SQL语句
/*!*/;
# at 669
#168654 20:22:45 server id 1 end_log_pos 876 Xid = 12 #执行的时间和事务ID
主要有两个作用:复制和恢复数据
【1】MySQL
架构为了高可用性都是一主多从,从服务器需要与主服务器保持数据一致,这就是通过binlog
进行复制;
【2】数据库的数据如果被误删,可以通过binlog
数据进行恢复。
因为
binlog
记录了数据库表的逻辑变更,所以可以用binlog
进行主从复制和恢复数据。
二、redo log
MySQL
执行SQL
修改语句时,肯定是先把这条记录查出来,然后再将这条进行进行修改。因为Mysql
的基本存储结构是页,记录都存在页里边,所以MySQL
是先把这条记录所在的页找到,然后把该页加载到内存中,将对应记录进行修改。现在就可能存在一个问题:如果在内存中把数据改了,还没来得及落磁盘,而此时的数据库挂了,导致这次修改丢失了怎么办?
如果每个请求都需要将数据立马同步到磁盘,那速度会很慢,MySQL
可能也顶不住。所以MySQL
引入了redo log
,内存写完了,然后会写一份redo log
,这份