一、设置二进制日志  
  进制日志记录了所有的DDL和DML,但不包括各种查询。通过二进制日志,可以实现什么效果呢?二进制日志文件可以【实现灾难数据恢复】,另外可以应用到【mysql复制数据同步】。二进制日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句。语句以“事件”的形式保存,它描述了数据更改。运行服务器时若启用二进制日志则性能大约慢1%。但是,二进制日志的好处,即用于恢复并允许设置复制超过了这个小小的性能损失。

  –log-bin[=file_name]  选项启动该日志类型,mysqld写入包含所有更新数据的SQL命令的日志文件。
  如果未给出file_name值,默认名为“HOSTNAME-bin.nnnnn”;如果给出了文件名,但没有包含路径,则文件被写入数据目录。如果在日志名中提供了扩展名(例如,–log-bin=file_name.extension),则扩展名被悄悄除掉并忽略。二进制日志文件名的.nnnn表示,mysqld在每个二进制日志名后面添加一个数字扩展名。每次启动服务器或刷新日志(flush logs)时该数字增加1。如果当前的日志大小达到设定的max_binlog_size,还会自动创建新的二进制日志。如果在该文件的末尾正使用大的事务,二进制日志可能会超过max_binlog_size:事务全写入一个二进制日志中,绝对不要写入不同的二进制日志中。

  –binlog-do-db=db_name  告诉主服务器,如果当前的数据库(即USE选定的数据库)是db_name,应将更新记录到二进制日志中。其它所有没有明显指定的数据库被忽略。
  如果数据库启动时使用选项–binlog-do-db=DB_A,使用语句“use DB_B”置DB_B为当前数据库,此时使用update语句修改DB_A的表数据时出现如下情况:
    数据库DB_B不在允许binlog的列表内,该语句不写入二进制日志文件
    数据库DB_B在允许binlog的列表内,该语句写入二进制日志文件

  –binlog-ignore-db=db_name  告诉主服务器,如果当前的数据库(即USE选定的数据库)是db_name,不将更新保存到二进制日志中。

综上所述,使用这个两个选项时决定是否将该语句写入日志文件还有参考当前数据库的属性,如果指定了这两个选项尽量使指定的数据库为当前数据库,才能按照逻辑来记录日志。但CREATE DATABASE、ALTER DATABASE和DROP DATABASE等语句,有一个例外,即通过操作的数据库来决定是否应记录语句。

#vi /etc/my.cnf
  log-bin[=/usr/local/mysql/var/mysql-bin]     //启用二进制日志功能;如果该设置没带路径,就放在datadir=/var/lib/mysql 下
  binlog-do-db[=数据库名]                      //指定记录二进制日志的数据库
  binlog-ingore-db[=数据库名]                  //指定不记录二进制日志的数据库

二、查看二进制日志文件
1、由于binlog以是binary方式存取,不能直接查看,需要用mysql提供的mysqlbinlog工具查看。
mysqlbinlog命令
格式:mysqlbinlog [选项]  日志文件
  选项: -d 数据库名          列出指定数据库的二进制日志
         -h 服务器地址        指定数据库服务器地址
         -u 用户名              指定连接服务器的用户名
         -p 口令                  指定用户口令
         -P 数字                  指定服务器端口号
         -R                     读取二进制日志
        --start-datetime=datetime  指定开始时间
        --stop-datetime=datetime   指定结束时间
         --start-position=数字          指定开始位置
         --stop-position=数字          指定结束位置

实例:-查看本机mysql服务器的binlog.001二进制日志文件内容
      [root@localhost ~]mysqlbinlog  binlog.001

2、基本操作
1.到数据库查看是否开启binary log 功能:
  mysql> show variables like 'log_bin';

2.查看当前工作的日志名及大小:
  mysql> show binary/master logs;

3.清除所有binary logs,新日志重新从000001开始编号:
  mysql> reset master;

4.清除指定部分logs:
  mysql>purge binary logs to 'log-bin.000012';         //将log-bin.000012之前的binary logs清掉;
  mysql>purge binary logs before '2011-05-28 12:05:38';   //将指定时间之前的binary logs清掉;

5.查看当前binary log的情况:
  mysql>show master status;

6.查看binary logs的内容:
  mysql>show binlog events\G;    //或指定日志文件查看show binlog events in 'mysql-bin.000001';

7.在my.cnf/my.ini中设定binary logs回滚天数:
  expire_logs_days = 7    //此参数设置了binlog日志的过期天数

注:删除所有二进制日志
a.如果没有主从复制,可以通过reset master的方式,重置数据库日志,清除之前的日志文件:
     mysql>reset master;   #重新开始

b.但是如果存在复制关系,应当通过PURGE的方式来清理bin日志:
语法如下:
    PURGE {MASTER | BINARY} LOGS TO 'log_name'      //基于位置的恢复
    PURGE {MASTER | BINARY} LOGS BEFORE 'date'      //基于时间点的恢复      MASTER和BINARY是同义词。

由于删除指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为第一个。
例如:
    PURGE MASTER LOGS TO 'mysql-bin.010';               //删除 mysql-bin.001--mysql-bin.009之间文件,mysql-bin.010会成为日志的第一个
    PURGE MASTER LOGS BEFORE '2008-06-23 15:00:00';    //清除3天前的 binlog,BEFORE变量的date自变量可以为'YYYY-MM-DD hh:mm:ss'格式。
 
注:如果您有一个活性的从属服务器,该服务器当前正在读取您正在试图删除的日志之一,则本语句不会起作用,而是会失败,并伴随一个错误。
    不过,如果从属服务器是休止的,并且您碰巧清理了其想要读取的日志之一,则从属服务器启动后不能复制。

要清理日志,需按照以下步骤:
    1. 在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
    2. 使用SHOW MASTER LOGS获得主服务器上的一系列日志。
    3. 在所有的从属服务器中判定最早的日志。这个是目标日志。如果所有的从属服务器是更新的,这是清单上的最后一个日志。
    4. 制作您将要删除的所有日志的备份。(这个步骤是自选的,但是建议采用。)
    5. 清理所有的日志,但是不包括目标日志,因为从服务器还要跟它同步

三、mysql二进制日志灾难恢复
 bin-log是记录着mysql所有事件的操作,可以通过bin-log做完整恢复,基于时间点的恢复,和基于位置的恢复。

1.完整恢复,先执行上次完整备份恢复,再执行自上次备份后产生的二进制日志文件恢复
  # mysql -h localhost mysql-bin.000001 | mysql -uroot -p
这样数据库就可以完全的恢复到崩溃前的完全状态

2.基于时间点的恢复
a.如果确认误操作时间点为2015-06-04 10:00:00执行如下
  # mysqlbinlog --stop-date='2015-06-04 9:59:59' mysql-bin.000001 | mysql -uroot -p
  然后跳过误操作的时间点,继续执行后面的binlog
  # mysqlbinlog --start-date='2015-06-04 10:01:00' mysql-bin.000001 | mysql -uroot -p
  其中--stop-date='2015-06-04 9:59:59' 和 --start-date='2015-06-04 10:01:00'
b.取两时间点
  # mysqlbinlog --start-datetime="2015-07-02 11:25:56" --stop-datetime="2015-07-02 14:20:10" mysql-bin.000001 | mysql -u root -p
    #注:其中的时间是你误操作的时间,而且这个时间点还可能涉及到的不只是误操作,也有可能有正确的操作也被跳过去了。那么执行位置恢复。

3.基于位置恢复,通过查看日志文件信息,确认6259-6362为误操作点
  # mysqlbinlog --stop-position=6259 mysql-bin.000001 | mysql -uroot -p     #从1开始至6259的事件读,不包括6259事件
  # mysqlbinlog --start-position=6363 mysql-bin.000001 | mysql -uroot -p     #从6259的事件开始读
  # 取两事件点
  mysqlbinlog --start-position=5786 --stop-position=6254 mysql-bin.000001 | mysql -uroot -p

mysql--二进制日志(bin-log)的更多相关文章

  1. MySQL 二进制日志(Binary Log)

    同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分. MySQL有几种不同的日志文件.通常包括错误日志文件,二进制日志,通用日志,慢查询日志,等等.这些日志能够帮助我们定位mysqld ...

  2. mysql 二进制日志binary log操作简单命令

    show master status \G; #查看当前正在记录的二进制日志 show binary logs; #查看binary log 所有文件列表 show binlog events; #查 ...

  3. MySQL二进制日志(binary log)总结

    本文出处:http://www.cnblogs.com/wy123/p/7182356.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

  4. MySQL二进制日志总结

    二进制日志简单介绍 MySQL的二进制日志(binary log)是一个二进制文件,主要用于记录修改数据或有可能引起数据变更的MySQL语句.二进制日志(binary log)中记录了对MySQL数据 ...

  5. 查看mysql二进制日志报错问题

    在排查网站被黑时想通过Mysql二进制日志找出修改字段时间,但是使用mysqlbinlog报错: [root@zfszsw1 bin]# ./mysqlbinlog /opt/mysql-bin.00 ...

  6. MySQl Study学习之--MySQl二进制日志管理

    MySQl Study学习之--MySQl二进制日志管理 MySQL二进制日志(Binary Log)   a.它包括的内容及作用例如以下:     包括了全部更新了数据或者已经潜在更新了数据(比方没 ...

  7. mysql 二进制日志后缀数字最大为多少

    之前看到mysql二进制日志后面会加一个以数字递增为结尾的后缀,一直在想当尾数到达999999后会发生什么情况,先查了一下官网,对后缀有这样一句介绍:The server creates binary ...

  8. MySQL二进制日志功能介绍

    二进制日志记录所有更新数据的SQL语句,其中也包含可能更新数据的SQL语句,例如DELETE语句执行过程中无匹配的行.二进制日志中还包含了与执行SQL语句相关的内容,例如SQL语句执行的时间.错误代码 ...

  9. MySQL二进制日志的备份和恢复

    二进制日志:记录数据库修改的相关操作,作用是即时点回复,主从复制 可以按时间滚动,也可以按大小滚动 server-id:服务器身份标识 一.二进制文件的删除方法,千万不要手动删除 PURGE BINA ...

  10. 删除MySQL二进制日志

    服务器上的120G SSD硬盘空间用了92%,检查后发现,原来是 MySQL的二进制日志没有及时清除,占用了大量的空间, 于是直接用命令:reset master 一把删干净了. 1 reset ma ...

随机推荐

  1. 选股公式blog+节选

    <大智慧软件选股_大智慧软件如何选股>——一般性操作 http://jingyan.baidu.com/article/fa4125acb2028d28ac70923e.html < ...

  2. iOS 8以后 定位手动授权问题

    ios8以后 都是手动授权定位权限 不过不处理这块 在ios8以后的系统就会默认永不授权 即关闭了定位权限 处理办法如下 .导入框架头文件 #import <CoreLocation/CoreL ...

  3. ARM NEON 64bit 查找表替换

    没啥效果,如果表的长度在 64个uint8_t之类,应该可以提高查表速度,否则还是C来的快 #ifdef HAVE_NEON_AARCH64 void table_lookup_AArch64_neo ...

  4. 本地储存(localStorage)记录

    - 本地存储 + localStorage.getItem("search_history") 获取本地存储 + localStorage.setItem("a" ...

  5. python ddt 重写

    对此方法重写 def mk_test_name(name, value, index=0): 重写前 index = "{0:0{1}}".format(index + 1, in ...

  6. 一個在WCF學習中的小教訓(本人非科班菜鳥,此經驗無參考價值,衹是自己的經驗記錄)

    1.关于“ServiceHost 仅支持类服务类型”的解决:   Service属性必须执行,不是接口. 改为下图所示: 解决! (注:按朱哥的方法WCF已经可以通信---截至今天的11:11(例子在 ...

  7. JVM的性能跳优

    首先需要找到需要进行调优的进程. 通过jps -v -l -m 找到我需要调优的进程 其中, -m表示输出传入main方法的参数, -l表示输出的main类或jar包的名字, -v表示传入JVM的参数 ...

  8. 【遍历二叉树】11把二叉树转换成前序遍历的链表【Flatten Binary Tree to Linked List】

    本质上是二叉树的root->right->left遍历. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  9. FFmpeg 'scale' filter not present, cannot convert pixel formats.

    /*************************************************************************** * FFmpeg 'scale' filter ...

  10. BZOJ2286 [Sdoi2011]消耗战 和 BZOJ3611 [Heoi2014]大工程

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6371  Solved: 2496[Submit][Statu ...