169it科技资讯


当前位置:  数据库>mysql

mysql二进制日志文件恢复数据库

    来源: 互联网  发布时间:2014-10-17

二进制日志的文件的作用

    mysql二进制日志文件用来记录所有用户对数据库操作,即记录用户对数据库操作的sql语句。如果有此文件,当数据库发生意外时,可以通过此文件查看到用户在此文件记录的时间段内用户所做的操作,再和数据库备份配合使用,即可再现用户操作,使数据库恢复。

二进制日志文件的弊端

二进制日志文件开启后,所有对数据库操作的记录均会被记录到此文件,

所以,当长时间开启之后,日志文件会变得很大,占用磁盘空间。

使用二进制日志文件恢复数据库

开启日志文件

mysql默认是不开启日志文件的功能的,需要我们手动开启。操作如下:

1、  打开mysql安装目录\my.ini(windows系统是my.ini文件,linux是my.cnf文件)。

2、  找到[mysqld]这个标签,在此标签下面一行,添加语句:log-bin=binary-log。上面语句中,log-bin说明要开启二进制日志文件,binary-log是二进制日志文件的名字。

(测试的时候我设置的:log-bin=d:/mysql_log/logbin_ouyang.log)

3、  重启mysql服务。可以在mysql安装目录\data 文件夹下看到“binary-log.数字编号”文件,

   如binary-log.000001。以后每重启一次mysql服务,都会重新生成二进制日志文件,

   文件名中的数字编号依次递增。

(你的上一步给出的文件名,加了个序号 还有一个总的文件 index文件 如图1:)

 

恢复数据库

使用日志文件恢复数据库必须要有一个数据库备份(只要是在二进制日志文件功能开启之后备份的就行)。恢复数据库时,可以通过时间恢复,也可以通过操作点恢复。

1、通过时间恢复方法如下:

如果我在2011-04-02 00:00:00时刻开启了二进制日志文件功能,并备份了数据库文件。且在2011-04-02 12:00:00数据库发生异常,需要恢复到2011-04-02 10:00:00。则操作如下:

l         用备份将数据库回复到2011-04-02 00:00:00时候的状态。

l         在命令行输入如下命令:

 

mysqlbinlog --stop-date="你想要恢复的时间"  日志文件的目录\binary-log.000001 | mysql -u root –p

(D:\mysql_log>mysqlbinlog logbin_ouyang.000007 --stop-date="2011-10-23 15:05:00"|mysql -uroot -proot)

这样,系统会自动执行从二进制日志有记录开始截止到2011-04-02 10:00:00,用户所做过的所有操作。与stop-date对应的,还有start-date属性,可以设定执行记录的开始时间。也可以两个属性都设置。

2、通过操作点恢复方法如下:

在命令行中输入mysqlbinlog D:\binary-log.000003 > D:\log.txt,执行后打开log.txt,

查看里面语句,可以发现:在每个操作之前,都会有一个独特的编号,如下红字显示:

/*!*/;

# at 450 /*编号450*/

#110402 15:31:50 server id 1 end_log_pos 529     Query    thread_id=2   exec_time=0  error_code=0

SET TIMESTAMP=1301729510/*!*/;

DROP TABLE `jwc`

此编号随着操作数增多而变大。和时间一样是一个标记,通过操作点恢复的语句如下:

mysqlbinlog --stop-position="450" mysql安装目录\data\binary-log.000001  | mysql -u root –p

这样,系统会自动执行二进制日志中编号最低的语句到编号450语句。

与stop-position对应的,还有start-position属性,可以设定执行记录的开始编号。

附:(你应该看看)

1.0       mysqlbinlog 是mysql自带的一个日志操作工具!

2.0       如果直接打开log文件 可能会是乱码,所以我们一般会:

      D:\mysql_log>mysqlbinlog logbin_ouyang.000003 >log_3.txt  复制下 然后用记事本打开!

   就可以清楚的看到 操作的编号了 或者说(行号)

3.0       如果发生了错误的操作!如果可以的话!你应该立马停止数据库!然后恢复数据!

4.0       如果只是去掉某一个语句,你可以选择恢复两次 ,如图:

  

D:\mysql_log>mysqlbinlog logbin_ouyang.000009 --stop-position=10625|mysql -uroot
     -proot

   D:\mysql_log>mysqlbinlog logbin_ouyang.000009 --start-position=10843|mysql -uroo

     t –proot

5.0 如果发生 Could not read entry at offset 1478: Error in log format or read error. 类似的错误!

   请检查你的编号是否正确!注意这个编号 不是一些编辑器显示的那个行号哦,# at 450 /

经常delete 、update错了!所有给自己个文档!当然我也希望你永远的用不上这个文档 ! 周末愉快! (排版有的乱哈!多多包涵!)


    
相关技术文章:
    ▪SqlServer2012中LEAD函数简单分析

     LEAD函数简单点说,就是把下一行的某列数据提取到当前行来显示,看示例更能解释清楚,先看测试用脚本 DECLARE @TestData TABLE( ID INT IDENTITY(1,1), Department VARCHAR(20), LastName VARCHAR(20), Rate FLOAT ) INSERT INTO @TestData(Department,LastName,Rate) SELECT 'Document Control','Arifin',17.7885 UNION ALL SELECT 'Document Control','Norred',16.8269 UNION ALL SELECT 'Document Control','Kharatishvili',16.8269 UNION ALL SELECT 'Information Services','Chai',10.25 UNION ALL SELECT 'Information Services','Berge',10.25 UNION ALL SELECT 'Information Services','Trenary',50.4808 UNION ALL SELECT 'Information Services','Conroy'......


    ▪MySQL中replace into语句的用法详解

     在向表中插入数据的时候,经常遇到这样的情况: 1、首先判断数据是否存在; 2、如果不存在,则插入; 3、如果存在,则更新。   在 SQL Server 中可以这样写: 代码如下: if not exists (select 1 from table where id = 1) insert into table(id, update_time) values(1, getdate()) else update table set update_time = getdate() where id = 1 在MySQL 中也可以先select,判断是否存在,存在则 update 否则 insert 但在MySQL 中有更简单的方法,使用 replace into关键字 代码如下:......


    ▪MySQL与SQL Server的一些区别浅析

     1、mysql支持enum,和set类型,sql server不支持 2、mysql不支持nchar,nvarchar,ntext类型 3、mysql的递增语句是AUTO_INCREMENT,而mssql是identity(1,1) 4、mssql默认到处表创建语句的默认值表示是((0)),而在mysql里面是不允许带两括号的 5、mysql需要为表指定存储类型 6、mssql识别符是[],[type]表示他区别于关键字,但是mysql却是 `,也就是按键1左边的那个符号 7、mssql支持getdate()方法获取当前时间日期,但是mysql里面可以分日期类型和时间类型,获取当前日期是cur_date(),当前完整时间是 now()函数 8、mssql不支持replace into 语句,但是在最新的sql20008里面,也支持merge......


 
最新技术文章:
    ▪MySQL关闭过程详解和安全关闭MySQL的方法

     本文分析了mysqld进程关闭的过程,以及如何安全、缓和地关闭MySQL实例,对这个过程不甚清楚的同学可以参考下。 关闭过程: 1、发起shutdown,发出SIGTERM信号 2、有必要的话,新建一个关闭线程(shutdown thread)    如果是客户端发起的关闭,则会新建一个专用的关闭线程    如果是直接收到 SIGTERM 信号进行关闭的话,专门负责信号处理的线程就会负责关闭工作,或者新建一个独立的线程负责这个事    当无法创建独立的关闭线程时(例如内存不足),MySQL Server会发出类似下面的告警信息:    Error: Can't create thread to kill se......


    ▪mysql的启动过程详解

     有一天,两个不懂mysql内核的人想去了解mysql内核代码,两个人不是去调试代码、查找资料,而是在那边思考。因为不了解内核,所以边思考边去验证。   使用的mysql代码是5.1.7,调试环境是windows平台下的vs2003。   Bingxi:“alex,你觉得mysql的启动过程会是什么样的呢?我们以银行为例吧。” Alex:“嗯,bingxi。早上银行开门了,会先准备好环境,然后开门迎客,mysql也是这样。Mysql里面会有一个handle_connections_sockets函数,这个函数就好比是个叫号机,每个用户来了都会取个号,然后就会进行业务处理。” 代码如下:......


    ▪Linux中使用mysqladmin extended-status配合Linux命令查看MySQL运行状态

     mysqladmin是MySQL一个重要的客户端,最常见的是使用它来关闭数据库,除此,该命令还可以了解MySQL运行状态、进程信息、进程杀死等。本文介绍一下如何使用mysqladmin extended-status(因为没有"歧义",所以可以使用ext代替)了解MySQL的运行状态。 1. 使用-r/-i参数 使用mysqladmin extended-status命令可以获得所有MySQL性能指标,即show global status的输出,不过,因为多数这些指标都是累计值,如果想了解当前的状态,则需要进行一次差值计算,这就是mysqladmin extended-status的一个额外功能,非常实用。默认的,使用extended-status,看到也是累计值,但是,加上参数......


 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2017,169IT.COM,E-mail:www_169it_com#163.com(请将#改为@)

浙ICP备11055608号