Linux上通过binlog文件恢复mysql数据库详细步骤

 一、binlog 介绍

  服务器的二进制日志记录着该数据库的所有增删改的操作日志(前提是要在自己的服务器上开启binlog),还包括了这些操作的执行时间。为了显示这些二进制内容,我们可以使用mysqlbinlog命令来查看。

  用途1:主从同步

  用途2:恢复数据库(也是线上出现一次数据库文件丢失后,才对这个有所了解并学习的)

  mysqlbinlog命令用法:shell> mysqlbinlog [options] log_file ...

<!--[if !supportLists]-->1) mysqlbinlog 选项示例

常见的选项有以下几个:

--start-datetime

从二进制日志中读取指定等于时间戳或者晚于本地计算机的时间。取值如:="1470733768" 或者="2016-08-09 5:09:28"

示例:

[root@hcloud ~]# mysqlbinlog --start-datetime="2016-08-09 5:05:27" /var/lib/mysql/mysql-bin.000001
--stop-datetime

从二进制日志中读取指定小于时间戳或者等于本地计算机的时间 取值和上述一样

--start-position

从二进制日志中读取指定position 事件位置作为开始。取值:="2698"

示例:

[root@hcloud ~]# mysqlbinlog --start-position="2698" /var/lib/mysql/mysql-bin.000001
--stop-position

从二进制日志中读取指定position 事件位置作为事件截至。取值:="2698"

二、环境准备以及备份恢复

  1) 安装好mysql后,检查开启binlog

mysql> SHOW BINARY LOGS;

ERROR 1381 (HY000): You are not using binary logging :上面提示说明没有服务器开启binlog

  修改/etc/my.cnf

  在mysqld选项中添加 一行内容如下:

  log-bin=mysql-bin

  默认如果不给值的话,log-bin 的会以mysqld-bin 为索引,创建mysqld-bin.00001等

  重启mysqld即可。

  2) 检查下binlog

mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 106 |
+------------------+-----------+
1 row in set (0.00 sec)

  3) 先创建一些原始数据。

mysql> create database Test_DB;
Query OK, 1 row affected (0.00 sec)
mysql> use Test_DB;
Database changed
mysql> CREATE TABLE OneTb(id INT(10) NOT NULL,name varchar(20),age INT(10));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into OneTb values (1,'user1',18);
mysql> insert into OneTb values (2,'user2',19);
insert into OneTb values (3,'user3',20);

  检查下数据:

mysql> select * from OneTb;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 18 |
| 2 | user2 | 19 |
| 3 | user3 | 20 |
+----+-------+------+
3 rows in set (0.00 sec)

  4) 备份还原 (完整备份以及还原)

  这里我们模拟一下做下每天的完整备份数据库任务。

[root@hcloud ~]# mysqldump -uroot -p Test_DB > /data/mysqlbackup/Test_DB_0809-16:50.sql
Enter password:

  模拟下操作失误,将数据修改错误了。

mysql> update OneTb set age = 15;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> select * from OneTb;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 15 |
| 2 | user2 | 15 |
| 3 | user3 | 15 |
+----+-------+------+
3 rows in set (0.00 sec)

  现在我们使用传统的方式来进行恢复还原。

[root@hcloud ~]# mysql -uroot -p Test_DB < /data/mysqlbackup/Test_DB_0809-16\:50.sql 

再次查询一下:

mysql> select * from Test_DB.OneTb;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 18 |
| 2 | user2 | 19 |
| 3 | user3 | 20 |
+----+-------+------+
3 rows in set (0.00 sec)

  可以看到数据都已经还原回来。

  5) 利用binlog模拟还原

  在原表的基础上在创建几条数据。

mysql> insert into Test_DB.OneTb values(4,'user4',21),(5,'user5',22),(6,'user6',23);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from Test_DB.OneTb;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 18 |
| 2 | user2 | 19 |
| 3 | user3 | 20 |
| 4 | user4 | 21 |
| 5 | user5 | 22 |
| 6 | user6 | 23 |
+----+-------+------+
6 rows in set (0.00 sec)

  如果这个时候我们把数据不小心修改了或者把库删除掉了,导致数据全部丢失,这个时候如果再用之前最新的备份文件 Test_DB_0809-16:50.sql,去恢复数据的话,那么将会丢掉备份之后新插入的数据。

  注意:如果真的使用最近的一次备份文件去做的话,一定是在万不得已的情况(比如binlog 被删除,整个硬盘挂掉、、、 想想都可怕。。。)。

  模拟误操作,批量更改下用户的名字。

mysql> update Test_DB.OneTb set name='user10';
Query OK, 6 rows affected (0.00 sec)
Rows matched: 6 Changed: 6 Warnings: 0

  不行,上一步不够狠,这里再狠一点,把表都给删除

mysql> drop table Test_DB.OneTb;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 3
Current database: *** NONE ***
Query OK, 0 rows affected (0.00 sec)

  由于之前我们一开始开启了binlog 日志选项,用binlog恢复数据库。下面从binlog入手,先检查一下binlog 文件,目前我的mysql 服务自开启binlog 后重启了两次,所以有2个binlog文件(每重启一次,便会重新生成一个binlog文件,还有一种情况就是运行了FLUSH LOGS命令也会重建一个);

  mysql-bin.index 文件中记录的是:自log-bin选项开启后,记录的所有的二进制日志清单列表。

  注意:在实际生产环境中,如果遇到需要恢复数据库的情况,不要让用户能访问到数据库,以避免新的数据插入进来,以及在主从的环境下,关闭主从。

  使用mysqlbinlog 命令可以查看binlog文件.我们看下最新的文件mysql-bin.00002

  从最后可以看出有删除的操作。但是我们不能完全的恢复,因为最后还有删除的操作。

  现在我的思路就是,先将第一个binlog 和第二个binlog 文件导出来à利用指定的position位置的方式(过滤掉删除表操作和update Test_DB.OneTb set name='user10';这条语句 ),导出2个sql 语句,最后我们将2个sql 合成一个sql,导入到数据库中即可。

  我们先用mysqlbinlog命令找到update 那条语句的位置,然后指定position 将mysql-bin.00001 导出来。

[root@hcloud ~]# mysqlbinlog /var/lib/mysql/mysql-bin.000001
….
#160809 5:09:28 server id 1 end_log_pos 2698 Query thread_id=17 exec_time=0 error_code=0
SET TIMESTAMP=1470733768/*!*/;
SET @@session.foreign_key_checks=1, @@session.unique_checks=1/*!*/;
SET @@session.sql_mode=0/*!*/;
/*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;
insert into Test_DB.OneTb values(4,'user4',21),(5,'user5',22),(6,'user6',23)
/*!*/;
# at 2698
#160809 5:19:49 server id 1 end_log_pos 2795 Query thread_id=17 exec_time=0 error_code=0
SET TIMESTAMP=1470734389/*!*/;
update Test_DB.OneTb set name='user10'
/*!*/;
# at 2795
#160809 5:30:38 server id 1 end_log_pos 2814 Stop
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

  从上面可以看到我们在做插入正常数据后的position 是2698,那么使用下面的命令导出sql

[root@hcloud ~]# mysqlbinlog --stop-position="2698" /var/lib/mysql/mysql-bin.000001 > Backup_1.sql 

  然后导出mysql-bin.00002的sql 语句(注:由于演示操作,该文件只有一个drop 表操作,所以不做处理,但是在实际环境中,由于中途可能会有重启数据库操作,那时就需要检测最新的binlog有没有业务需要的语句。)

  sql 语句已经导出来了。我们可以利用该语句直接恢复所有正常的数据。

  注:本次恢复没有利用到之前的完整备份,因为我是开启binlog后,然后才做的所有建库建表操作,第一个binlog文件里已经记录了所有的数据库操作,所以不需要使用之前的完整备份(另外:实际的生产环境,还是需要利用到完整备份的,因为线上环境可能会有N多个binlog文件,所以需要利用到完整备份和最新的binlog文件来结合恢复)

  开始恢复前,我们将原有的Test_DB数据库也给干掉吧。毕竟我们的binlog中有创建操作

mysql> DROP DATABASE Test_DB;
Query OK, 0 rows affected (0.03 sec)

  恢复数据库时还可以利用在登陆mysql 后,用source 命令导入sql语句,这里暂不介绍

[root@hcloud ~]# mysql -uroot -p < Backup_1.sql 

Enter password:

  恢复完成后,我们检查下表的数据是否完整

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| Test_DB |
| mysql |
+--------------------+
3 rows in set (0.00 sec)
mysql> select * from Test_DB.OneTb;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 18 |
| 2 | user2 | 19 |
| 3 | user3 | 20 |
| 4 | user4 | 21 |
| 5 | user5 | 22 |
| 6 | user6 | 23 |
+----+-------+------+
6 rows in set (0.00 sec)

  Ok完整的都恢复过来了。

三、总结

  1) 恢复方式

    a) 利用最新一次的完整备份加binlog 指定事件起始时间和终止时间或者position恢复数据库

    b) 利用所有binlog指定事件起始位置和终止时间来合并sql文件恢复数据库(此方法要确保binlog文件的完整)

    c) 利用mysqldump 使用完整恢复。(在确保最新一次的完整备份后的数据不重要,允许丢掉的情况下,直接恢复。该方法最简单、效率最高)

  2) 附:官方建议的备份原则(为了能睡个好觉….嗯,是的)

    a) 在mysql安装好并运行时,就始终开启 log-bin选项,该日志文件位于datadir目录下,也要确保该目录所在存储介质是安全的。

    b) 定期做完整的mysql 备份。

    c) 定期使用 FlUSH LOGS 或者 mysqladmin flush-logs ,该操作会关闭当前的二进制日志文件,并新建一个binlog日志文件。(和重启mysql后新建的binlog操作一样)。以备份binlog日志,利用binlog日志也可以做增量备份。

以上所述是小编给大家介绍的Linux上通过binlog文件恢复mysql数据库详细步骤,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • linux中误删除程序包恢复实例

    本文主要是介绍linux中误删除程序包恢复实例,小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧. 以CentOS-7.2为例: 删除kernel包,无法重启: 1.删除kernel包 2.重启,无法启动 3.再次重启,出现进度条时按下Esc键,出现如下界面,选择从光盘启动 4.进入如下界面,选择Troubleshooting 5.选择救援模式,Rescue a CentOS system 6.键入回车 7.选择Continue ,键入1,进入 8.回车进入shell

  • Linux下实现MySQL数据备份和恢复的命令使用全攻略

    为了保障数据的安全,需要定期对数据进行备份.备份的方式有很多种,效果也不一样.一旦数据库中的数据出现了错误,就需要使用备份好的数据进行还原恢复.从而将损失降到最低.下面我们来了解一下MySQL常见的有三种备份恢复方式: 1.利用Mysqldump+二进制日志实现备份 2.利用LVM快照+二进制日志实现备份 3.使用Xtrabackup备份 一:实验环境介绍: 系统介绍:CentOS6.4_X64 数据库版本:mysql-5.5.33 二:基于Mysqldump命令实现备份恢复 2.1.思路概念

  • Windows或Linux系统中备份和恢复MongoDB数据的教程

    windows下面mongodb数据库备份和恢复 我可以讲数据备份到c:\data\dump目录下面,首先创建这个路径.然后进入到mongodb的bin目录下面 我的是: C:\Program Files\mongodb\bin 备份脚本是: //备份 mongodump -h 127.0.0.1:27017 -d test -o c:\data\dump 恢复脚本是: //恢复 mongorestore -h 127.0.0.1:27017 -d test --directoryperdb c

  • linux grub的启动加密及删除恢复方法

    一.实验1:设置grub口令 1.生成一个加密运算为"nd5"的密码 2.设置grub口令 3.测试grub是否已加密 4.在虚拟机的下图的图形界面中,直接敲"Esc"或者"e"键 5.在图形的框下,提示只能敲"p"键,原因是因为grub加密的原因 6.直接敲"p"键后提示要求输入密码,将刚才编辑的密码填入 7.输入密码后,已经进入了编辑菜单界面 8.直接敲"a"键进入了"gr

  • 轻松解决 Linux操作系统故障恢复技巧

    不论你在运行什么操作系统,在很多情况下,你会面对灾难恢复操作.你的主引导区被覆盖,你的硬盘不能启动,或者一个重要的文件被删除,或者你的显示卡启动时闪烁一下就黑屏了.本文会就这些问题作一些技巧性的讨论,帮助你在遇到这些问题时,不致于手足无措. 首先需要的是一张应急启动软盘,在安装 Linux 时,一般会要求建立一张的,所以,你应该有这张磁盘的,如果还没有建立的话,赶紧去建立一张吧,什么?不知道怎么做?很简单的,一般的 Linux 系统下使用 mkbootdisk 命令就可以了.后面的那些参数,只要

  • Linux命令替换rm命令防止误删除

    推荐阅读:Linux rm 命令误删文件的恢复方法 1. 在/home/username/ 目录下新建一个目录,命名为:.trash 2.. 在/home/username/tools/目录下,新建一个shell文件,命名为: remove.sh 复制代码 代码如下: PARA_CNT=$# TRASH_DIR="/home/username/.trash" for i in $*; do STAMP=`date +%s` fileName=`basename $i` mv $i $T

  • linux VPS之间网站数据的备份与恢复(网站迁移教程)

    本文所用命令Debian和CentOS通用,文件目录默认与LNMP相同,请做相应修改. 文中www.xxx.com绑定在VPS1的wwwroot目录上为例 1.VPS1上数据打包(备份) a.VPS1上文件数据打包(Tar命令详解 http://www.jb51.net/os/RedHat/1219.html) cd /home/wwwroot/ tar zcvf xxx.tar.gz 网站目录(如/home/wwwroot/vmvps.com) b.VPS1上MySQL数据导出 mysqldu

  • linux备份与恢复基础知识

    unix系统为每个文件都记录这三个不同的时间,第一个是mtime,即修改时间.无论何时,只要文件内容被改变,mtime的值就会被相应修改.第二个是atime,即访问时间.只要文件被访问(比如运行或读取),它就会被修改.第三个是ctime,即变更时间.当文件的属性发生变化(比如改变权限或者所有关系)时,ctime的值就会被改变.管理员用ctime来查找黑客. 备份会改变atime,tar,cpio,dd都会这样做,dump通过原始设备来读取文件系统,因此它不 会改变atime. dump的语法.

  • Linux恢复删除文件的lsof命令详解

    lsof命令 lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行. 在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操

  • Linux上通过binlog文件恢复mysql数据库详细步骤

     一.binlog 介绍 服务器的二进制日志记录着该数据库的所有增删改的操作日志(前提是要在自己的服务器上开启binlog),还包括了这些操作的执行时间.为了显示这些二进制内容,我们可以使用mysqlbinlog命令来查看. 用途1:主从同步 用途2:恢复数据库(也是线上出现一次数据库文件丢失后,才对这个有所了解并学习的) mysqlbinlog命令用法:shell> mysqlbinlog [options] log_file ... <!--[if !supportLists]-->

  • JSP连接MySQL数据库详细步骤

    目录 JSP中的MySQL驱动程序配置 MySQL中创建表 JSP中SELECT操作 JavaBean 定义与使用 动态Web程序运行在Web容器之中,利用Web容器可以使用JDBC技术来实现数据库数据的CRUD操作,将数据表中的数据取出并结合JSP动态生成HTML页面进行显示. JSP中的MySQL驱动程序配置 本文开发使用的是MySQL数据库,如果要想使用MySQL数据库,则一定要在Tomcat中进行MySQL驱动程序的配置.这个配置可以考虑将获取到的MySQL的程序包 jar包 保存到你本

  • Mysql通过ibd文件恢复数据的详细步骤

    恢复步骤 1.创建数据库(随意创建) 2.创建数据表(备注:表结构要和要恢复的表结构一致,row_format要和ibd文件的row_format一致,否则,会提示两者不一致. 当前row_format=dynamic) 3.表的属性查看 我们使用:show table status like ‘matlab’\G,查看表的属性 备注:创建表时候的row_format和表属性的不一致,基于innodb是,要把row_format设置成dynamic时,需要修改mysql的全局配置,直接在myql

  • Linux远程部署MySQL数据库详细步骤

    Linux远程部署MySQL数据库,供大家参考,具体内容如下 1.0 安装 yum install lrzsz -y 命令(导入外界压缩包插件(已下载无视即可)) 1.1 将mysql压缩包拷贝到 /usr/local 文件目录下进行解压: 1.2 将导入的Mysql压缩包进行解压,输入:tar -zxvf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz命令 1.3 解压完成后,将解压后的文件更改名字为:mysql 输入:mv mysql-5.7.28-li

  • 在Linux上搭建一个Java部署环境的详细步骤

    目录 在Linux上搭建一个Java部署环境 1. 安装jdk 2.操作步骤: 3. 安装mysql 小结 上篇介绍了如何在 Linux 上搭建 java 部署环境(安装jdk/tomcat/mysql) + 将程序部署到云服务器上的操作). 在Linux上搭建一个Java部署环境 为了部署java web程序,需要安装:jdk.tomcat.mysql.(注意:所有的安装yum都需要管理员权限) 1. 安装jdk 安装jdk有很多种方式,但是我们这里推荐的是使用yum直接安装openjdk.

  • java连接mysql数据库详细步骤解析

    第一步:下载一个JDBC驱动包,例如我用的是:mysql-connector-java-5.1.17-bin.jar 第二步:导入下载的JDBC驱动包,我用的是myeclipse,选中自己要导包的项目,右   击选中propertise,再选JavaBuild Path, 右边会出现libreries,点进去,再点Add External JARs  然后再找到你要导入的驱动包.完了之后再点Order andExport,下面再选中你导入的包. 第三步:加载驱动程序:Class.forName(

  • 教你如何通过日志文件恢复MySQL数据

    目录 前言 1.找到最新的 binlog 文件 2.找到我们想恢复数据在日志文件里的开始结束位置 2.1.使用时间范围 2.2.使用 position 范围 3.恢复 3.1 通过时间恢复 3.2 通过 position 恢复 总结 前言 本文将讲述怎么通过 MySql 的日志 binlog 文件进行数据恢复. 通过已备份数据 加上 binlog 文件恢复上次备份到删除之间的数据 1.找到最新的 binlog 文件 进入 mysql 命令行执行如下命令 mysql> show master st

  • 用Jena将本体文件存入MySQL数据库的实现方法

    昨天对其配置了一天,其配置为Jena 2.4.0,MySQL数据库版本为5.1.42-community,JDK版本为1.6.0,MySQLdriver为mysql-connector-java-3.1.14: 并按照网络上的资源编写了一个例子,结果出现了一个问题,程序在debug到 使用数据库连接参数创建一个模型制造器 ModelMaker maker = ModelFactory.createModelRDBMaker(conn); 创建一个默认模型,命名为 MyOntology Model

  • Python3实现将本地JSON大数据文件写入MySQL数据库的方法

    本文实例讲述了Python3实现将本地JSON大数据文件写入MySQL数据库的方法.分享给大家供大家参考,具体如下: 最近导师给了一个yelp上的评论数据,数据量达到3.55个G,如果进行分析时直接使用本地文件,选择python来分析,那么效率是非常低的:另一方面使用SQL来储存文本文件最为安全,之前使用CSV,txt存储的文本文件最后莫名其妙地出现一些奇怪字符,导致读取数据分割时出现错乱.下面给出一个简单的代码,将本地JSON文件内容存入数据库. 说明:python版本为3.5,使用第三方库为

  • DBF 文件恢复 ORACLE 数据库的方法

    清·魏源<庸易通义>:"至道问学之有知无行,分温故为存心,知新为致知,而敦厚为存心,崇礼为致知,此皆百密一疏." 起因 在我们的生产活动中,意外总是在不经意间发生.那天一个安装有 oracle 数据库的盘符不小心被格式化了,好几个项目都炸了.不过还好有备份,不过只有 .DBF 文件和几个日志文件: //数据库系统相关 REDO01.LOG REDO02.LOG REDO03.LOG SYSTEM01.DBF UNDOTBS01.DBF SYSAUX01.DBF USERS0

随机推荐