Home  >  Article  >  Database  >  mysql日志文件的使用、数据恢复_MySQL

mysql日志文件的使用、数据恢复_MySQL

WBOY
WBOYOriginal
2016-06-01 13:32:29716browse

bitsCN.com

mysql日志文件的使用、数据恢复

 

一、 mysql日志类型

        MYSQL有不同类型的日志文件(各自存储了不同类型的日志),从它们当中可以查询到MYSQL里都做了些什么,对于MYSQL的管理工作,这些日志文件是不可缺少的。

         1. 错误日志(The error log):记录了数据库启动、运行以及停止过程中错误信息;

         2. ISAM操作日志(The isam log):记录了所有对ISAM表的修改,该日志仅仅用于调试ISAM模式;

         3. SQL执行日志(The query log):记录了客户端的连接以及所执行的SQL语句;

         4. 更新日志(The update log):记录了改变数据的语句,已经不建议使用,由二进制日志替代;

         5. 二进制日志(The binary log):记录了所有对数据库数据的修改语句;

         6. 超时日志(The slow log):记录所有执行时间超过最大SQL执行时间(long_query_time)或未使用索引的语句;

         7. relay log:如果你是在用mysql的复制、备份功能,那么从服务器还提供了一种叫做relay log的日志文件。

         默认情况下所有日志文件会记录在MYSQL的数据目录下,你可以通过强制mysql去关闭并重新打开一个文件进行日志记录,当然系统会自动加后缀 (如.00001, .00002),方式有在mysql环境下执行语句 mysql>flush logs; 或者通过mysqladmin管理程序执行 #mysqladmin flush-logs 或 #mysqladmin refresh

 

二、 mysql日志的配置

        这些日志的启动方式可以在mysqld_safe方式启动数据库的时候,后面跟选项参数,也可以在配置文件里配置,推荐采用第二种方式,配置方法很简单,我只配置了三种日志:

        [mysqld]

        log=/var/log/mysqld_common.log

        log-error=/var/log/mysqld_err.log

        log-bin=/var/log/mysqld_bin.bin

 

三、 mysql日志的查看

        日志的查看很简单,大部分都是文本,直接用vim、less、more之类的工具看就可以了,值得说明的是二进制文件的查看:

        1. 首先确定是否开启了二进制文件记录功能

Sql代码  

mysql>show variables like 'log_bin';  

        2. 如果你想知道现在记录二进制数据的文件具体信息,你可以通过下列语句看到现在正在记录哪个文件,以及记录的当前位置:

Sql代码  

mysql>show master status;  

        3. 查看二进制数据需要借助程序mysqlbinlog,看看它支持哪些选项,根据自己需要来使用。

Sql代码  

mysql>mysqlbinlog /var/log/mysql/mysql-bin.000040;  

        4. 将二进制日志文件导出txt文本文件查看

Sql代码  

mysql>mysqlbinlog /var/log/mysql/mysql-bin.000040 >/var/log/mysql/000040.txt;  

        5. 查询某个时间范围的可以执行下列语句,如果记录很多可以将结果定向到一个文件里自己慢慢看:-) :

Sql代码  

mysql>mysqlbinlog --start-datetime='2008-01-01 00:00:00' --stop-datetime='2008-08-08 00:00:00'  /var/log/mysql/mysql-bin.000040 > ./tmp.log  

 

四、 使用二进制日志恢复数据

        mysqlbinlog工具的使用,大家可以看MySQL的帮助手册,里面有详细的用。在这个例子中,重点是--start-position参数和--stop-position参数的使用。

        --start-position=N :从二进制日志中位置等于N参量时的事件开始读。

        --stop-position=N:从二进制日志中位置等于和大于N参量时的事件起停止读。

 

        1. 创建实验环境

        在一测试数据库里,创建一个表,并添加记录,然后产生日志文件。

Sql代码  

mysql> create table test(id int auto_increment not null primary key,val int,data varchar(20));  

  mysql> insert into test(val,data) values(10,'liang');  

  Query OK, 1 row affected (0.03 sec)  

  mysql> insert into test(val,data) values(20,'jia');  

  Query OK, 1 row affected (0.08 sec)  

  mysql> insert into test(val,data) values(30,'hui');  

  Query OK, 1 row affected (0.03 sec)  

  mysql> flush logs; --产生第二个日志文件  

  Query OK, 0 rows affected (0.09 sec)  

  mysql> insert into test(val,data) values(40,'aaa');  

  Query OK, 1 row affected (0.05 sec)  

  mysql> insert into test(val,data) values(50,'bbb');  

  Query OK, 1 row affected (0.03 sec)  

  mysql> insert into test(val,data) values(60,'ccc');  

  Query OK, 1 row affected (0.03 sec)  

  mysql> delete from test where id between 4 and 5; --删除记录  

  Query OK, 2 rows affected (0.05 sec)  

  mysql> insert into test(val,data) values(70,'ddd');  

  Query OK, 1 row affected (0.03 sec)  

  mysql> flush logs; --产生第三个文件文件  

  Query OK, 0 rows affected (0.11 sec)  

  mysql> insert into test(val,data) values(80,'dddd');  

  Query OK, 1 row affected (0.05 sec)  

  mysql> insert into test(val,data) values(90,'eeee');  

  Query OK, 1 row affected (0.03 sec)  

  mysql> drop table test; --删除表  

  Query OK, 0 row affected (0.05 sec)  

     

        2. 恢复数据

        先用mysqlbinlog工具将日志文件生成txt文件出来分析。

Sql代码  

  mysql>mysqlbinlog /var/log/mysql/mysql-bin.000001 > /var/log/mysql/000001.txt;  

mysql>mysqlbinlog /var/log/mysql/mysql-bin.000002 > /var/log/mysql/000002.txt;  

mysql>mysqlbinlog /var/log/mysql/mysql-bin.000003 > /var/log/mysql/000003.txt;  

        

        通过这三个命令,可以生成分别记录了日志文件的内容,也就是用户操作的步骤。

        因为我们需要重做第一个日志文件的所有操作,所以这里只需要将第一个日志文件全恢复就行了。

Sql代码  

mysql>mysqlbinlog /var/log/mysql/mysql-bin.000001  | mysql -uroot –p  

        

        Ok,接着,我们需要分析的是第二个日志文件。为什么要分析它呢,因为它中途执行了一个操作是DELETE,因为我们要做的是恢复全部数据,也就是我们不希望去重做这个语句。所以在这里我们要想办法去绕开它。

        我们先打开.txt文件来分析一下。

Sql代码  

/*  

  /*!40019 SET @@session.max_insert_delayed_threads=0*/;  

  /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;  

  DELIMITER /*!*/;  

  # at 4  

  #090427 15:27:56 server id 1 end_log_pos 106 Start: binlog v 4, server v 5.1.32-community-log created 090427 15:27:56  

  BINLOG '  

  fF71SQ8BAAAAZgAAAGoAAAAAAAQANS4xLjMyLWNvbW11bml0eS1sb2cAAAAAAAAAAAAAAAAAAAAA  

  AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC  

  '/*!*/;  

  # at 106  

  #090427 15:28:37 server id 1 end_log_pos 176 Query thread_id=1 exec_time=0 error_code=0  

  use mytest/*!*/;  

  SET TIMESTAMP=1240817317/*!*/;  

  SET @@session.pseudo_thread_id=1/*!*/;  

  SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;  

  SET @@session.sql_mode=1344274432/*!*/;  

  SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;  

  /*!/C gbk *//*!*/;  

  SET @@session.character_set_client=28,@@session.collation_connection=28,@@session.collation_server=28/*!*/;  

  SET @@session.lc_time_names=0/*!*/;  

  SET @@session.collation_database=DEFAULT/*!*/;  

  BEGIN  

  /*!*/;  

  # at 176  

  #090427 15:28:37 server id 1 end_log_pos 204 Intvar  

  SET INSERT_ID=4/*!*/;  

  # at 204  

  #090427 15:28:37 server id 1 end_log_pos 312 Query thread_id=1 exec_time=0 error_code=0  

  SET TIMESTAMP=1240817317/*!*/;  

  insert into test(val,data) values(40,'aaa')  

  /*!*/;  

  # at 312  

  #090427 15:28:37 server id 1 end_log_pos 339 Xid = 12  

  COMMIT/*!*/;  

  # at 339  

  #090427 15:28:46 server id 1 end_log_pos 409 Query thread_id=1 exec_time=0 error_code=0  

  SET TIMESTAMP=1240817326/*!*/;  

  BEGIN  

  /*!*/;  

  # at 409  

  #090427 15:28:46 server id 1 end_log_pos 437 Intvar  

  SET INSERT_ID=5/*!*/;  

  # at 437  

  #090427 15:28:46 server id 1 end_log_pos 545 Query thread_id=1 exec_time=0 error_code=0  

  SET TIMESTAMP=1240817326/*!*/;  

  insert into test(val,data) values(50,'bbb')  

  /*!*/;  

  # at 545  

  #090427 15:28:46 server id 1 end_log_pos 572 Xid = 13  

  COMMIT/*!*/;  

  # at 572  

  #090427 15:29:35 server id 1 end_log_pos 642 Query thread_id=1 exec_time=0 error_code=0  

  SET TIMESTAMP=1240817375/*!*/;  

  BEGIN  

  /*!*/;  

  # at 642  

  #090427 15:29:35 server id 1 end_log_pos 670 Intvar  

  SET INSERT_ID=6/*!*/;  

  # at 670  

  #090427 15:29:35 server id 1 end_log_pos 778 Query thread_id=1 exec_time=0 error_code=0  

  SET TIMESTAMP=1240817375/*!*/;  

  insert into test(val,data) values(60,'ccc')  

  /*!*/;  

  # at 778  

  #090427 15:29:35 server id 1 end_log_pos 805 Xid = 14  

  COMMIT/*!*/;  

  # at 805  

  #090427 15:30:21 server id 1 end_log_pos 875 Query thread_id=1 exec_time=0 error_code=0  

  SET TIMESTAMP=1240817421/*!*/;  

  BEGIN  

  /*!*/;  

  

# at 875  

  #090427 15:30:21 server id 1 end_log_pos 981 Query thread_id=1 exec_time=0 error_code=0  

  SET TIMESTAMP=1240817421/*!*/;  

  delete from test where id between 4 and 5  

  /*!*/;  

  # at 981  

  #090427 15:30:21 server id 1 end_log_pos 1008 Xid = 15  

  COMMIT/*!*/;  

  # at 1008  

  #090427 15:30:34 server id 1 end_log_pos 1078 Query thread_id=1 exec_time=0 error_code=0  

  SET TIMESTAMP=1240817434/*!*/;  

  BEGIN  

  /*!*/;  

  # at 1078  

  #090427 15:30:34 server id 1 end_log_pos 1106 Intvar  

  SET INSERT_ID=7/*!*/;  

  # at 1106  

  #090427 15:30:34 server id 1 end_log_pos 1214 Query thread_id=1 exec_time=0 error_code=0  

  SET TIMESTAMP=1240817434/*!*/;  

  insert into test(val,data) values(70,'ddd')  

  /*!*/;  

  # at 1214  

  #090427 15:30:34 server id 1 end_log_pos 1241 Xid = 16  

  COMMIT/*!*/;  

  # at 1241  

  #090427 15:30:41 server id 1 end_log_pos 1282 Rotate to mysql-bin.000003 pos: 4  

  DELIMITER ;  

  # End of log file  

  ROLLBACK /* added by mysqlbinlog */;  

  /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;  

 

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn