使用bin log文件进行数据库恢复 (通过bin log恢复数据库)

:如何在系统崩溃或数据误删除时保障数据安全

随着数码技术的大力发展,信息化系统已经成为现代企业运转的必备手段之一。假如说这个信息化系统中的数据库在系统崩溃或数据误删除之后不能及时修复,那么对于企业的打击将不可想象。因此,如何对数据库进行备份和恢复就成为很多企业需要重视的问题。本篇文章重点介绍的方法。

一、什么是bin log文件?

MySQL的bin log文件是一个二进制日志文件,它记录了MySQL服务器执行的所有数据更改操作。它包含从服务器启动到现在之间的所有SQL命令,以及命令执行后影响的行数等详细信息。

二、为什么?

在维护一个大型的数据系统时,数据丢失或系统崩溃是不可避免的。在这种情况下,从备份数据中恢复数据库是最常用的方法。然而,在某些情况下,我们可能没有及时地进行数据备份工作,或者是备份数据也已经因为各种原因而丢失了,此时我们就需要使用MySQL的bin log文件进行数据库恢复。

三、如何

在MySQL的bin log文件中,每一条记录都包含一条SQL命令的执行情况。如果要恢复到某个特定时间点的状态,需要先找到该时间点之前的最后一个命令的位置。具体的恢复方法如下:

1. 找到最新的备份数据

在使用bin log文件恢复时需要先找到最新的备份数据,并根据该备份数据进行恢复。如果没有备份数据可以使用,则只能按照bin log文件中的记录一个一个恢复。

2. 定位bin log文件

使用bin log文件进行恢复需要先找到bin log文件。一般默认存储在MySQL的数据目录下,以binlog开头,并以数字形式命名。可以使用SHOW MASTER STATUS命令查看当前的bin log文件和位置。

3. 分析bin log文件中的内容

使用mysqlbinlog命令可以将bin log文件中的内容以人类可读的形式输出。可以通过-G选项指定输出的格式,例如输出每一条记录的时间戳,执行数据库命令的用户名以及执行的SQL命令内容等。

4. 恢复数据

将bin log文件中的命令逐个执行,可以把数据库恢复到特定的时间点。这些命令的执行顺序非常重要,必须在正确的顺序下才能有效地进行恢复。

四、bin log文件的缺点

有以下缺点:

1. 需要手动处理bin log文件,花费时间较长。

2. bin log文件中记录的内容过于详细,恢复时需要一步步逐条执行,比较麻烦。

3. bin log文件中包含了所有的更改操作,包括被删除的数据,而且没有可靠的过滤机制,无法确保恢复的数据兼容且一致。

五、

尽管bin log文件在恢复数据库的过程中存在一定的缺点,但它是一种可靠的恢复数据库的方法。事实上,在大多数情况下,使用bin log文件进行数据恢复的成功率很高。因此,无论是一个小型的网站还是大型的企业系统,都应该在备份的同时保留bin log文件,以保障在系统崩溃或数据误删除时的数据安全。

相关问题拓展阅读:

mysql恢复数据mysqlbinlog

有完整备份的话,先用完整备份还原下,然后在用binlog恢复从完整备份到当前时间点的数据。

如果没有完整备份的话,使用binlog也可以恢复,不过10G的数据可能需要很长的时间。

相关语法如下:

mysql -hlocalhost test 1.sql

当启动Binlog后,事务会产生Binlog Event,这些Event被看做事务数据的一部分。因此要保证事务的Binlog Event和InnoDB引擎中的数据的一致性。所以带Binlog的CrashSafe要求MySQL宕机重启后能够保证:

– 所有已经提交的事务的数据仍然存在。

– 所有没有提交的事务的数据自动回滚。

– 所有已经提交了的事务的Binlog Event也仍然存在。

– 所有没有提交事务没有记录Binlog Event。

这些要求很好理解,如果重启后数据还在,但是Binlog Event没有了,就没办法复制到其他节点上了。如果重启后,数据没了,但是Binlog Event还在,那么不存在的数据就会被复制到其他节点上,从而导致主从的不一致。

为了保证带Binlog的CrashSafe,MySQL内部使用的两阶段提交(Two Phase Commit)。

2 – MySQL的Two Phase Commit(2PC)

在开启Binlog后,MySQL内部会自动将普通事务当做一个XA事务来处理:

– 自动为每个事务分配一个唯一的ID

– COMMIT会被自动的分成Prepare和Commit两个阶段。

– Binlog会被当做事务协调者(Transaction Coordinator),Binlog Event会被当做协调者日志。

想了解2PC,可以参考文档:【

。】

– 分布式事务ID(XID)

使用2PC时,MySQL会自动的为每一个事务分配一个ID,叫XID。XID是唯一的,每个事务的XID都不相同。XID会分别被Binlog和InnoDB记入日志中,供恢复时使用。MySQ内部的XID由三部分组成:

– 前缀部分

前缀部分是字符串”MySQLXid”

– Server ID部分

当前MySQL的server_id

– query_id部分

为了保证XID的的唯一性,数字部分使用了query_id。MySQL内部会自动的为每一个语句分配一个query_id,全局唯一。

参考代码:sql/xa。h的struct xid_t结构。

– 事务的协调者Binlog

Binlog在2PC中充当了事务的协调者(Transaction Coordinator)。由Binlog来通知InnoDB引擎来执行prepare,commit或者rollback的步骤。事务提交的整个过程如下:

1. 协调者准备阶段(Prepare Phase)

告诉引擎做Prepare,InnoDB更改事务状态,并将Redo Log刷入磁盘。

2. 协调者提交阶段(Commit Phase)

2.1 记录协调者日志,即Binlog日志。

2.2 告诉引擎做commit。

注意:记录Binlog是在InnoDB引擎Prepare(即Redo Log写入磁盘)之后,这点至关重要。

在MySQ的代码中将协调者叫做tc_log。在MySQL启动时,tc_log将被初始化为mysql_bin_log对象。参考sql/binlog.cc中的init_server_components():

if (opt_bin_log) tc_log= &mysql_bin_log;

而在事务提交时,会依次执行:

tc_log->prepare();

tc_log->commit();

参考代码:sql/binlog.cc中的ha_commit_trans()。当mysql_bin_log是tc_log时,prepare和commit的代码在sql/binlog.cc中:

MYSQL_BIN_LOG::prepare();

MYSQL_BIN_LOG::commit();

-协调者日志Xid_log_event

作为协调者,Binlog需要将事务的XID记入日志,供恢复时使用。Xid_log_event有以下几个特点:

– 仅记录query_id

因为前缀部分不变,server_id已经记录在Event Header中,Xid_log_event中只记录query_id部分。

– 标志事务的结束

在Binlog中相当于一个事务的COMMIT语句。

一个事务在Binlog中看起来时这样的:

Query_log_event(“BEGIN”);DML产生的events; Xid_log_event;

– DDL没有BEGIN,也没有Xid_log_event 。

– 仅InnoDB的DML会产生Xid_log_event

因为MyISAM不支持2PC所以不能用Xid_log_event ,但会有COMMIT Event。

Query_log_event(“BEGIN”);DML产生的events;Query_log_event(“COMMIT”);

问题:Query_log_event(“COMMIT”)和Xid_log_event 有不同的影响吗?

– Xid_log_event 中的Xid可以帮助master实现CrashSafe。

– Slave的CrashSafe不依赖Xid_log_event

事务在Slave上重做时,会重新产生XID。所以Slave服务器的CrashSafe并不依赖于Xid_log_event 。Xid_log_event 和Query_log_event(“COMMIT”),只是作为事务的结尾,告诉Slave Applier去提交这个事务。因此二者在Slave上的影响是一样的。

3 – 恢复(Recovery)

这个机制是如何保证MySQL的CrashSafe的呢,我们来分析一下。这里我们假设用户设置了以下参数来保证可靠性:

– 恢复前事务的状态

在恢复开始前事务有以下几种状态:

– InnoDB中已经提交

根据前面2PC的过程,可知Binlog中也一定记录了该事务的的Events。所以这种事务是一致的不需要处理。

– InnoDB中是prepared状态,Binlog中有该事务的Events。

需要通知InnoDB提交这些事务。

– InnoDB中是prepared状态,Binlog中没有该事务的Events。

因为Binlog还没记录,需要通知InnoDB回滚这些事务。

– Before InnoDB Prepare

事务可能还没执行完,因此InnoDB中的状态还没有prepare。根据2PC的过程,Binlog中也没有该事务的events。 需要通知InnoDB回滚这些事务。

– 恢复过程

从上面的事务状态可以看出:恢复时事务要提交还是回滚,是由Binlog来决定的。

– 事务的Xid_log_event 存在,就要提交。

– 事务的Xid_log_event 不存在,就要回滚。

恢复的过程非常简单:

– 从Binlog中读出所有的Xid_log_event

– 告诉InnoDB提交这些XID的事务

– InnoDB回滚其它的事务

MySQL怎么恢复半个月前的数据?

首先确认一下是否有散耐销定期的备份任务,如果没有在考虑下面的方式。

配置参数冲游上,是否开启了bin-log日志?如果开启了并且bin-log日志的周期保亩孝留比较长,可以通过重放bin-log日志的方式恢复数据。

通过整库备份+binlog进行恢复. 前提是要有定期整库备份且保存了binlog日志.。

通过bin log恢复数据库的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于通过bin log恢复数据库,使用bin log文件进行数据库恢复,mysql恢复数据mysqlbinlog,MySQL怎么恢复半个月前的数据?的信息别忘了在本站进行查找喔。


数据运维技术 » 使用bin log文件进行数据库恢复 (通过bin log恢复数据库)