原文链接:http://www.showerlee.com/archives/681

****经实践,该教程ok,特在此分享****

基本概念

定义:

二进制日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句。

作用:

1.二进制日志的主要目的是在恢复使能够最大可能地更新数据库,因为二进制日志包含备份后进行的所有更新。

2.二进制日志还用于在主复制服务器上记录所有将发送给从服务器的语句。

不良影响:

运行服务器时若启用二进制日志则性能大约慢1%。

MySQL默认二进制日志是关闭状态,先手动改动配置文件打开二进制日志

在my.cnf(windows下是my.ini)中的mysqld下 添加

log-bin=mysql-bin

binlog_format=mixed   //这行是来描述模式的,这两行直接复制到mysqld下即可

重启服务后便可以看到新增的日志文件了

日志位置

>>如果没有指定文件名,则Mysql使用hostname-bin文件.

>>如果指定了相对路径,则假定该路径相对于数据目录

>>Mysql在文件名后添加了数字索引.所以该文件最后的形式为filename.number如果你在日志名中提供了扩展名(例如,–log

bin=file_name.extension),则扩展名被悄悄除掉并忽略。

更换策略:

使用索引来循环文件,在以下条件将循环至下一个索引

1.服务器重启

2.服务器被更新

3.日志到达了最大日志长度 max_binlog_size

4.日志被刷新 mysql> flush logs;

工具介绍:

shell>>mysqlbinlog [option] binlogFile> newfile

如: D:\mysql\log>mysqlbinlog binlog.000001 > 1.txt

一个例子:

log-bin=”D:/mysql/log/binlog” 那么,在该文件夹下就会有文件D:/mysql/log/binlog.000001等

 

常见问题

1.如何清除binlog

>>>使用下面的两个命令

PURGE {MASTER | BINARY} LOGS TO ‘log_name' //log_name不会被清除

PURGE {MASTER | BINARY} LOGS BEFORE ‘date' //date不会被清除

实例如下:

mysql> purge master logs to ‘binlog.000004′;

Query OK, 0 rows affected (0.01 sec)

mysql> purge master logs before '2009-09-22 00:00:00′;

Query OK, 0 rows affected (0.05 sec)

>>>或使用命令

RESET MASTER

删除之前所有的binlog,并重新生成新的binlog

后缀从000001开始

注:如果您有一个活性的从属服务器,该服务器当前正在读取您正在试图删除的日志之一,

则本语句不会起作用,而是会失败,并伴随一个错误。

不过,如果从属服务器是休止的,并且您碰巧清理了其想要读取的日志之一,则从属服务器启动后不能复制。

当从属服务器正在复制时,本语句可以安全运行。您不需要停止它们。

 

2.记录到二进制日志知的内容配置

binlog-do-db=sales 只记录sales库

binlog-ignore-db=sales 除sales库不记录,其他都记录

但是如果在操作数据库之前,不使用use $dbname 那么所有的SQL都不会记录

如果使用了use $dbname,那么判断规则取决于这里的$dbname,而不是SQL中操作的库

 

3.二进制日志不准确的处理

默认情况下,并不是每次写入时都将二进制日志与硬盘同步。因此如果操作系统或机器(不仅仅是MySQL服务器)崩溃,有可能二进制日志中最后的

句丢失。

要想防止这种情况,你可以使用sync_binlog全局变量(1是最安全的值,但也是最慢的),使二进制日志在每N次二进制日志写入后与硬盘同步。

即使sync_binlog设置为1,出现崩溃时,也有可能表内容和二进制日志内容之间存在不一致性。

如果崩溃恢复时MySQL服务器发现二进制日志变短了(即至少缺少一个成功提交的InnoDB事务),

如果sync_binlog =1并且硬盘/文件系统的确能根据需要进行同步(有些不需要)则不会发生,则输出错误消息 (“二进制日志<名>比期望的要小”)。

在这种情况下,二进制日志不准确,复制应从主服务器的数据快照开始。

mysqldump --databases repltest --flush-logs --opt repltest>q:/repltest_full_01.sql

上面这句话可以在备份的同时刷新日志,生成新的日志,这样新日志里面的内容相当于这次备份之后的增量部分,可以用这种方式来实现mysql的

量备份,即先恢复数据库到之前备份的某个数据备份节点上,然后执行之后的二进制日志,因为二进制日志实质上记录的是所有数据变更的操作,

以来实现增量备份或者对某个时间点的还原

清理日志

如果每天都会生成大量的二进制日志,这些日志长时间不清理的话,将会对磁盘空间带来很大的浪费,所以定期清理日志是DBA维护mysql的一个重

工作

1)RESET MASTER

在上面查看日志存放的文件夹中,二进制日志命名的格式是以mysql-bin.*,*代表日志的序号,序号是递增的,其中还有mysql-bin.index是日志的

引文件,记录了日志的最大序号

我们执行RESET MASTER命名删除全部日志,新的日志从头开始

2)PURGE MASTER LOGS TO & PURGE MASTER LOGS BEFORE

执行PURGE MASTER LOGS TO 'mysql-bin.******'命令,是将'******'编号之前的所有日志进行删除

执行PURGE MASTER LOGS BEFORE 'yyyy-mm-dd hh:mm:ss'命令,是将在'yyyy-mm-dd hh:mm:ss'时间之前的所有日志进行删除

3)-EXPIRE_LOGS_DAYS

此参数是设置日志的过期天数,过期的日志将会被自动删除,这有利于减少我们管理日志的工作量,需要修改my.cnf

EXPIRE_LOGS_DAYS = 3 //即为日志保存三天,三天之后过期的日志自动删除

恢复

bin-log是记录着mysql所有事件的操作,当mysql发生灾难性错误时,可以通过bin-log做完整恢复,基于时间点的恢复,和基于位置的恢复

完整恢复,假定我们每天凌晨2点都会使用mysqldump备份数据库,但在第二天早上9点由于数据库出现了故障,数据无法访问,需要恢复数据,先

用昨天凌晨备份的文件进行恢复到凌晨2点的状态,在使用mysqlbinlog恢复自mysqldump备份以来的binlog

/usr/local/mysql/bin/mysqlbinlog bin.000001 |mysql -u root -p

这样数据库就可以完全的恢复到崩溃前的完全状态

-----实例-------

小量的数据库我们可以每天进行完整备份,因为这也用不了多少时间,但当数据库很大时,我们就不太可能每天进行一次完整备份了,而且改成每

一次完整备份,每天一次增量备份类似这样的备份策略。增量备份的原理就是使用了mysql的二进制日志,所以我们必须启用二进制日志功能。

一、增量备份

1、比如我们在星期天下午11点做一次完整备份:

/usr/local/mysql/bin/mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > fullbackup_sunday_11_PM.sql

在sql文件中我们会看到两行:

– Position to start replication or point-in-time recovery from

– CHANGE MASTER TO MASTER_LOG_FILE=’bin-log.000002′, MASTER_LOG_POS=107;

第二行包含了我们需要的信息,是指备份后所有的更改将会保存到bin-log.000002二进制文件中。

2、然后在星期一下午11点我们来做一次增量备份:

mysqladmin flush-logs

这时将会产生一个新的二进制日志文件bin-log.000003,bin-log.000002则保存了自星期天下午11点到现在的所有更改,我们只需要把这个文件备

到安全的地方就行了。然后星期二我们又做增量备份,还是执行同样的命令,这时我们保存bin-log.000003文件。

二、恢复备份

比如星期三中午12点出现了故障,这时需要恢复,我们首先导入星期天的完整备份:

mysql -u root -p < fullbackup_sunday_3_AM.sql

接着我们导入星期一和星期二的增量备份:

/usr/local/mysql/bin/mysqlbinlog bin-log.000002 bin-log.000003 | mysql -u root -p

这时我们已经恢复了所有备份数据,我们还可以找到bin-log.000004,进一步恢复最新的数据。

mysqlbinlog 后加 --database "具体库" 可恢复具体库的增量信息

加 --stop-date="2010-12-20 13:15:00" 可恢复到该日志的具体时间点

MySQL二进制日志备份和恢复详解的更多相关文章

  1. Mysql 二进制日志备份还原

    Mysql 二进制日志备份还原 一.开启二进制日志 1.进入配置文件[mysqld]下添加配置 方案一 vim /etc/my.cnf log-bin = /usr/local/mysql/logs/ ...

  2. MySQL完全备份脚本:数据+二进制日志+备份日志

    一. 脚本须知 1.mysql数据文件和二进制日志文件最好保存在不同的分区或存储设备上 2.备份完成后注意修改数据的权限以防止泄露重要信息,哪些主机哪些用户可以用来恢复 3. 查看导出的2进制日志文件 ...

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

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

  4. MySQL 备份与还原详解

    相关阅读: MySQL备份和恢复具体实施 http://www.linuxidc.com/Linux/2012-12/76257.htm MySQL备份与恢复的三种方法总结 http://www.li ...

  5. binlog之四:mysql中binlog_format模式与配置详解,binlog的日志格式详解

    mysql复制主要有三种方式:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复 ...

  6. MySQL数据库使用mysqldump导出数据详解

    mysqldump是mysql用于转存储数据库的实用程序.它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等.接下来通过本文给大家介绍MySQL数 ...

  7. 【转】MySQL用户管理及SQL语句详解

    [转]MySQL用户管理及SQL语句详解 1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysq ...

  8. MySQL数据库的各种存储引擎详解

    原文来自:MySQL数据库的各种存储引擎详解   MySQL有多种存储引擎,每种存储引擎有各自的优缺点,大家可以择优选择使用: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB ...

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

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

随机推荐

  1. js实现分页

    <html> <head> <meta charset='utf-8'> <script type="text/javascript" s ...

  2. cuda学习3-共享内存和同步

    为什么要使用共享内存呢,因为共享内存的访问速度快.这是首先要明确的,下面详细研究. cuda程序中的内存使用分为主机内存(host memory) 和 设备内存(device memory),我们在这 ...

  3. OpenGL教程(2)——第一个窗口

    OpenGL环境终于配置好了,现在我们可以开始学习OpenGL了. 首先,创建一个.cpp文件,然后打上几行#include指令: #include <iostream> using st ...

  4. Java泛型学习

    1.泛型的概念 泛型即"参数化类型",就比如我们定义方法的时候,定义一个变量,称为形参,变量值根据传进去的实参的值不同而改变.而泛型的出现,就是为了解决类型也能根据传进去的类型改变 ...

  5. Java IO流--练习

    1)将若干个Student对象,若干个Teacher对象,写出到d:/0404/a.txt中 2)将该文件中所有Student对象反序列化回来装入List, 所有的Teacher对象反序列化回来转入另 ...

  6. js 玩一玩

    闲着没事学了学js,做了一个下页面玩玩. 下面是html代码: <!DOCTYPE html><html> <head> <meta charset=&quo ...

  7. 3.Node.js 自定义微信菜单

    文章目录:         1.Node.js 接入微信公众平台开发         2.Node.js access_token的获取.存储及更新         3.Node.js 自定义微信菜单 ...

  8. NLTK学习笔记(一):语言处理和Python

    目录 [TOC] nltk资料下载 import nltk nltk.download() 其中,download() 参数默认是all,可以在脚本里面加上nltk.download(需要的资料库) ...

  9. css代码初始化

    @charset "utf-8";/* 页面元素初始化和常用样式定义-start *//*======== 全局 ========*/body, div, dl, dt, dd, ...

  10. [Leetcode] Binary search -- 475. Heaters

    Winter is coming! Your first job during the contest is to design a standard heater with fixed warm r ...