1.启动和设置二进制日志         默认情况下,二进制日志是关闭的,可以通过修改MySQL的配置文件来启动和设置二进制日志         mysql二进制日志 Mysql 第1张mysql二进制日志 Mysql 第2张
  • log-bin 定义开启二进制日志;后面参数为path[/filename],如果不指定path ,默认为datadir,如果不指定filename,默认为主机名称会生成filename.0000001,filename.000002等,还有一个filename.index文件,文件内容为所有日志的清单
  • expire_logs_days 定义了MySQL清除过期日志的时间,即二进制日志自动删除的天数。默认值为0,表示不自动删除,当MySQL启动或刷新二进制日志时可能删除该文件。
  • max_binlog_size 定义了单个文件的大小限制,如果二进制日志写入的内容大小超出给定值,日志就会发生回滚(关闭当前文件,重新打开一个新的日志文件)。默认1GB, 不能大于1GB或小于4096B
        添加完毕后,重启MySQL,即可打开二进制日志              使用show master status 查看当前的二进制文件名称             mysql二进制日志 Mysql 第3张mysql二进制日志 Mysql 第4张             使用show binary logs;查看二进制日志文件个数即文件名             mysql二进制日志 Mysql 第5张mysql二进制日志 Mysql 第6张             使用show variables like 'log_bin%';查看二进制日志配置信息             mysql二进制日志 Mysql 第7张mysql二进制日志 Mysql 第8张        到这里启动算是完了,但是我同样的配置,在linux环境下却一直启动不了报错,             Starting MySQL...The server quit without updating PID file (/usr/local/lnmp/mysql/data/ljstu.pid).[失败]        最后查mysql错误日志,发现了这行错误           You have enabled the binary log, but you haven't provided the mandatory server-id. Please refer to the proper server start-up parameters documentatio        在MySQL官方文档下找到了server-id的说明,MySQL5.7如果开启了二进制日志,则server-id必须指定,否则会不允许服务启动,而8.0只会有个提示。server-id是干什么用的以后再说,这里不做讨论          5.7:mysql二进制日志 Mysql 第9张mysql二进制日志 Mysql 第10张          8.0:mysql二进制日志 Mysql 第11张mysql二进制日志 Mysql 第12张       本地mysql是8.0,linux服务器mysql是5.7,所以才出了这个问题。       解决办法修改配置文件 vim /etc/my.cnf  添加server-id=100 (随便一个唯一值)   2.查看二进制日志            使用mysqlbinlog查看二进制日志(先使用show master status查看当前正在使用二进制文件)。
    mysqlbinlog /var/log/mysql/mybinlog.000001
    mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8'    # 使用已下命令即可,
    mysqlbinlog --no-defaults /var/log/mysql/mybinlog.000001
         举个例子,先进数据库对任意一张表添加一行数据 ,然后使用上面说到的命令查看日志          mysql二进制日志 Mysql 第13张mysql二进制日志 Mysql 第14张           mysql二进制日志 Mysql 第15张mysql二进制日志 Mysql 第16张            通过日志可以看到15:53的时候操作了`ljstu`.`user`,但具体干了啥,还是很难看懂,这时候就要谈到二进制的记录格式了            MySQL有三种日志记录格式:
      • 基于语句的日志记录:MySQL中的复制功能最初基于SQL语句主服务器到从服务器的传播,配置binlog-format=STATEMENT
      • 基于行的日志记录,主服务器将事件写入二进制日志日志,该事件指示如何影响各个表行,因此,表始终使用主键以确保行可以有效的标识,配置binlog-format=ROW
      • 混合日志记录:默认情况下使用基于语句的日志记录,但在某些情况下,日志记录模式会基于行,配置binlog-format=MIXED
            修改配置文件 vim /etc/my.cnf ,添加配置 binlog-format=statement ,重启mysql。我们再在`ljstu`.`user`里面插入一行数据,然后查看当前使用的日志文件是哪一个,     最后在使用mysqlbinlog查看,现在就可以看到执行的sql语句了         mysql二进制日志 Mysql 第17张  mysql二进制日志 Mysql 第18张           mysql二进制日志 Mysql 第19张mysql二进制日志 Mysql 第20张         mysql二进制日志 Mysql 第21张  mysql二进制日志 Mysql 第22张     3.删除二进制日志        MySQL的二进制文件可以配置自动删除,同时MySQL也提供了安全的手动删除方法
     RESET MASTER:删除所有二进制日志文件。并重新创建二进制文件,扩展名从000001开始
       PURGE MASTER LOGS:删除指定二进制文件
     purge {master | binary} logs to 'log_name'     删除文件名编号比指定文件名编号小所有日志文件
     purge {master | binary} logs before 'date'     删除指定日期以前的所有日志文件
         例子:先查看当前的日志(因为linux上都是今天的,所以拿本地的做测试)          删除今天之前的日志文件     purge master logs before '2019-12-18';          删除指定的日志文件     purge master logs to 'mybinlog.000010'           mysql二进制日志 Mysql 第23张mysql二进制日志 Mysql 第24张           mysql二进制日志 Mysql 第25张mysql二进制日志 Mysql 第26张          mysql二进制日志 Mysql 第27张mysql二进制日志 Mysql 第28张     4.使用二进制日志恢复数据       如果开启了二进制日志,在数据库出现意外丢失数据时,可以使用mysqlbinlog工具从指定的时间点(例如最后一次备份)到现在,或另一个指定的时间点的日志中恢复数据,(使用二进制日志是进行时间点增量恢复)    mysqlbinlog [option] filename | mysql -uuser -ppass    option为可选参数,filename是日志文件名。常用的option参数有 --start-date(开始时间),--stop-date(结束时间),--start-position(开始位置),--stop-position(结束位置)       先在数据库表中添加3行记录,更新其中一行     mysql二进制日志 Mysql 第29张  mysql二进制日志 Mysql 第30张       然后查看日志文件,可以看到刚刚的update语句       mysql二进制日志 Mysql 第31张mysql二进制日志 Mysql 第32张        最后使用mysqlbinlog工具恢复数据,发现报错了,而且是主键冲突,为什么会出现这个问题     mysql二进制日志 Mysql 第33张  mysql二进制日志 Mysql 第34张            MySQL官方文档指出,时间点恢复将服务器从完全备份时逐步更新到最近的时间,如果没有指定开始时间的话,mysql会把日志文件的sql都执行一遍,所以执行到前面的insert的时候就报错了。这里,我们需要指定一个开始时间。     mysql二进制日志 Mysql 第35张mysql二进制日志 Mysql 第36张            找到插入数据的时间,然后执行命令,因为我这里是一次性添加的3行数据,所以我把三行数据都删除了,然后使用mysqlbinlog工具恢复         mysql二进制日志 Mysql 第37张   mysql二进制日志 Mysql 第38张                      mysql二进制日志 Mysql 第39张 mysql二进制日志 Mysql 第40张       mysql二进制日志 Mysql 第41张   5.暂停二进制日志功能      暂停:set sql_log_bin = 0;
      启动:set sql_log_bin = 1;
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄