MySQL二进制日志文件的用法_数据恢复

文章目录

  • 开启二进制日志功能
  • 关闭/打开二进制日志记录
  • 刷新二进制日志文件
  • 查看二进制日志文件的存储位置
  • 利用二进制日志文件恢复数据的本质
  • 二进制日志提取/导出到脚本文件中
  • 查看当前二进制日志的最后一个位置
  • 查看二进制日志文件的内容
  • 执行 SQL 脚本文件以恢复数据
  • 二进制日志分析
  • 指定恢复时间
  • 指定恢复位置
  • 数据恢复演示案例
    • 备份数据库
    • 操作数据
    • 恢复数据

开启二进制日志功能

在配置文件 /etc/my.cnf 中设置二进制日志文件的保存目录及文件名前缀:

log-bin=/var/lib/mysql/mybinlog/mysql-bin
server-id=1 

启用独占表空间:

innodb_file_per_table=1

说明:

1.如上的配置,数据库服务重启后,就自动生成一个二进制日志文件保存在 /var/lib/mysql/mybinlog 目录下,而且二进制日志文件的名称会以 mysql-bin 为前缀,在后面从序号 000001 开始命名。

第一次生成日志文件的名称为:mysql-bin.000001;如果你刷新了日志,则会生成一个新的日志文件,名称为:mysql-bin.000002;继续书刷新日志,则会生成名为:mysql-bin.000003 的日志文件,以此类推。

2.在配置变量 log-bin 的同时必须要配置变量 server-id,否则数据库服务根本无法重启。

3.启用独占表空间,则每个表都有自己独立的表空间文件;默认是共享表空间,即所有数据库使用一个表空间。至于这项功能是否必须开启,暂时不清楚

关闭/打开二进制日志记录

mysql> set global sql_log_bin=0;
mysql> set global sql_log_bin=1;

刷新二进制日志文件

mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)

注:
1.会生成新的二进制日志文件
2.旧日志文件中的数据库操作日志并不会复制到新日志文件中

查看二进制日志文件的存储位置

mysql> show variables like '%log_bin%';
+---------------------------------+-----------------------------------------+
| Variable_name                   | Value                                   |
+---------------------------------+-----------------------------------------+
| log_bin                         | ON                                      |
| log_bin_basename                | /var/lib/mysql/mybinlog/mysql-bin       |
| log_bin_index                   | /var/lib/mysql/mybinlog/mysql-bin.index |
| log_bin_trust_function_creators | OFF                                     |
| log_bin_use_v1_row_events       | OFF                                     |
| sql_log_bin                     | ON                                      |
+---------------------------------+-----------------------------------------+
6 rows in set (0.01 sec)

看变量 log_bin_basename 的值,得知二进制日志文件存放在目录 /var/lib/mysql/mybinlog/ 下

利用二进制日志文件恢复数据的本质

二进制日志机制其实就是把一些 DDL、DML 操作语句记录到二进制日志文件中,而你想利用该文件恢复数据,就必须找到相关数据的命令语句,然后去执行这些命令语句。所以你需要看得懂日志文件的内容,能够把相关命令语句提取出来。关于提取你想要的命令语句的命令请看下面。

二进制日志提取/导出到脚本文件中

--start-position:指定从哪个位置开始导出日志
--stop-position:指定导出日志的结束位置
--start-datetime:指定从哪个时间开始导出日志,时间格式为:2005-12-25 11:25:56
--stop-datetime:指定导出日志的结束时间

[root@htlwk0001host ~]# mysqlbinlog --no-defaults  --start-position=1125 --stop-position=1344 /var/lib/mysql/mybinlog/mysql-bin.000004  > /root/test/001.sql

查看当前二进制日志的最后一个位置

mysql> show master status;  

查看日志文件的最后一个位置其实没有什么意义。

查看二进制日志文件的内容

[root@htlwk0001host ~]# mysqlbinlog --no-defaults /var/lib/mysql/mybinlog/mysql-bin.000004

执行 SQL 脚本文件以恢复数据

[root@htlwk0001host ~]# mysql -uroot -p123456 -D test < /root/test/004.sql;

二进制日志分析

在这里插入图片描述

指定恢复时间

对于 MySQL 4.1.4,可以在 mysqlbinlog 语句中通过 --start-date--stop-date 选项指定恢复数据的起止时间。

举例说明,假设在今天上午10:00(今天是2005年4月20日),不小心删除一个表。要想恢复表和数据,你可以先恢复前晚上的备份(假设你有定时每天凌晨对数据库进行备份,备份后自动生成一个新的二进制日志文件 mysql-bin.00004),然后执行下面的语句:

[root@htlwk0001host ~]# mysqlbinlog --stop-date="2005-04-20 9:59:59" /var/log/mysql/mysql-bin.000004 | mysql -uroot -p123456

这条命令可能有问题,因为 2005-04-20 9:59:59 之前有很多数据库操作语句,这些操作语句不仅仅是前晚备份时间开始到 2005-04-20 9:59:59 之间的操作语句,前晚备份时间之前也有无数的操作语句,这些操作语句也包括在内吧,难道都执行吗?都执行肯定会报错,所以感觉有问题。

接着你可能要恢复 2005-04-20 10:01:00 之后产生的数据,你可以用起使日期和时间再次运行 mysqlbinlog

[root@htlwk0001host ~]# mysqlbinlog --start-date="2005-04-20 10:01:00" /var/log/mysql/bin.123456 | mysql -uroot -p123456

指定恢复位置

也可以不指定日期和时间,而使用 mysqlbinlog 的选项 --start-position--stop-position 来指定日志位置。它们的作用与起止日期选项相同,不同的是给出日志内容中的位置号。使用日志位置是更准确的恢复方法,特别是执行破坏性SQL语句的同时发生许多事务的时候。要想确定位置号,你必须查看日志文件的内容以寻找执行了不期望的事务的时间范围,建议你将这个时间范围的日志数据导出到文本文件中以便进行检查,你可以执行下面的语句:

[root@htlwk0001host ~]# mysqlbinlog --start-date="2005-04-20 9:55:00" --stop-date="2005-04-20 10:05:00" /var/log/mysql/mysql-bin.000004 > /tmp/mysql_restore.sql

执行到停止位置为止的所有事务,即将数据恢复到指定的停止位置:

[root@htlwk0001host ~]# mysqlbinlog --stop-position="368312" /var/log/mysql/mysql-bin.000004 | mysql -u root -pmypwd 

将恢复从给定的起始位置直到二进制日志结束的所有事务:

[root@htlwk0001host ~]# mysqlbinlog --start-position="368315" /var/log/mysql/mysql-bin.000004 | mysql -u root -pmypwd

数据恢复演示案例

备份数据库

先对某个数据库进行完整的备份:

[root@htlwk0001host ~]# mysqldump -h10.6.208.183 -uroot -p123456  -P3306 --single-transaction  --master-data=2  test > test.sql

执行上述的命令语句后,会在当前工作目录下产生一个备份脚本文件 test.sql。

在 test.sql 文件中我们会看到:

-- CHANGE MASTER TO MASTER_LOG_FILE='bin-log.000002', MASTER_LOG_POS=107;

指备份后所有的更改将会保存到 bin-log.000002 二进制文件中,备份数据在日志文件中对应的位置是 107

操作数据

接着往 test 数据库下的 student 表中插入两条记录,然后执行 flush logs 命令产生一个新的二进制日志文件 bin-log.000003。在 flush logs 之前,数据库的更改操作日志是保存在文件 bin-log.000002 中,既往表 student 增加记录的操作日志是保存在文件 bin-log.00002 中。

接着再往 test 数据库下 teacher 表中增加两条记录,然后删除 student 表和 teacher 表。执行命令 flush logs 之后,增加记录和删除表的操作日志都记录在新的二进制日志文件 bin-log.000003 中。

恢复数据

接着我们来恢复数据,首先导入全备数据:

[root@htlwk0001host ~]# mysql -h10.6.208.183 -uroot -p123456  -P3306 < test.sql

恢复 bin-log.000002:

[root@htlwk0001host ~]# mysqlbinlog /var/lib/mysql/binlog/bin-log.000002 | mysql -h10.6.208.183 -uroot -p123456 -P3306

恢复部分 bin-log.000003:

需要查看文件 bin-log.000003 中的内容,找到开始删除数据的位置,然后将这个位置之前的日志数据导出到 SQL 脚本文件中,然后执行该脚本文件以恢复被删除的数据;当然你找到恢复数据的位置点之后,也可以直接指定这个位置点,通过下面的语句来恢复数据:

[root@htlwk0001host ~]# mysqlbinlog /var/lib/mysql/binlog/mysql-bin.000003 --stop-position=208 | mysql -h10.6.208.183 -uroot -p123456  -P3306

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

启动weblogic需要账号密码问题

<Server is Running in Production Mode and Native Library(terminalio) to read the password securely from commandline is not found.> 解决方法 在weblogic路径下创建 \weblogic11\user_projects\domains\base_domain\servers\AdminServer\security 目录下创建bo…

mysqlbinlog: [ERROR] unknown variable ‘default-character-set=utf8mb4‘

错误提示&#xff1a; [roothtlwk0001host ~]# mysqlbinlog /var/lib/mysql/mybinlog/mysql-bin.000004 mysqlbinlog: [ERROR] unknown variable default-character-setutf8mb4原因&#xff1a; mysqlbinlog 这个工具无法识别 binlog 中的配置中的 default-character-setutf8m…

Mybatis一对一结果映射

目录结构 创建数据库相应的表 一个账户对应一个用户 accout CREATE TABLE account (aid int(11) NOT NULL AUTO_INCREMENT,accountname varchar(20) DEFAULT NULL,money float(10,2) DEFAULT NULL,userId int(11) DEFAULT NULL,PRIMARY KEY (aid),KEY userId (userId),CONSTR…

lambda表达式java_Lambda表达式Java教程

lambda表达式java在本文中&#xff0c;我们提供了全面的Lambda Expressions Java教程。 1. Lambda Expressions Java教程–简介 Lambda表达式被认为是Java 8中引入的最好的功能之一。Lambda表达式被认为是Java进入函数式编程世界的第一步 。 可以将其视为无需类即可创建的函数…

MySQL命令之mysqlhotcopy -- 热备份

文章目录命令介绍命令格式安装 mysqlhotcopy常用选项命令介绍 mysqlhotcopy 只是简单的缓存写入和文件复制的过程&#xff0c;其使用 LOCK TABLES、FLUSH TABLES 和 CP 来进行快速备份,占用资源和备份速度比 mysqldump 快很多很多。特别适合大的数据库&#xff0c;但需要注意的…

trackby_使用trackBy启动流程

trackby仍然沿用我的Corda Services趋势&#xff0c;我还有其他一些技巧可帮助您的CorDapp顺利工作。 这次&#xff0c;我们将重点关注使用trackBy从服务内部启动流以及如果您不小心可能会引发的离散问题。 这应该是一个相对简短的职位&#xff0c;因为我可以依靠以前的职位&a…

SQL查询语句的排序

order by column1 asc, column2 desc -- 按column1升序排序&#xff0c;若column1值相同&#xff0c;则按column1降序排序asc&#xff0c;ascend 的缩写&#xff0c;表示正序&#xff0c;即升序&#xff0c;从小到大&#xff0c;可以省略&#xff0c;默认的 desc&#xff0c;de…

SpringBoot创建项目入门案例

目录结构 一、创建SpringBoot项目 1.创建骨架名称 2.给项目命名 3.配置pom.xml文件 4.MySql的驱动包 5.自动生成的pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xs…

apache spark_Apache Spark Job的剖析

apache sparkApache Spark是通用的大规模数据处理框架。 了解spark如何执行作业对于获取大部分作业非常重要。 关于Spark评估范式的简要介绍&#xff1a;Spark使用的是惰性评估范式&#xff0c;在该范式中&#xff0c;Spark应用程序在驱动程序调用“ Action”之前不会执行任何…

MySQL常用权限的解释

文章目录全局管理权限数据库/数据表/数据列权限特别的权限全局管理权限 FILE: 在MySQL服务器上读写文件。 PROCESS: 显示或杀死属于其它用户的服务线程。 RELOAD: 重载访问控制表&#xff0c;刷新日志等。 SHUTDOWN: 关闭MySQL服务。 数据库/数据表/数据列权限 ALTER: 修改已…

No identifier specified for entity没有为实体指定标识符

异常 ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘userController’: Injection of resour…

aws jenkins_Jenkins在AWS上(第1部分)

aws jenkins这是我对PEAT UK播客的逐字记录&#xff1a; 你好&#xff0c;再一次到另一个热点。 我叫Peter Pilgrim。 我曾经是DevOps专家&#xff0c;欢迎观看另一集。 这是11 Jenkins n AWS的第一部分&#xff0c;我是一名平台工程师&#xff0c;并且是Java Champion。 在…

SELECT ... FOR UPDATE_手动加行级排他锁_行级写锁_行级独占锁

文章目录介绍加锁情况分析明确指定主键&#xff0c;并且数据真实存在&#xff0c;锁定行明确指定主键&#xff0c;但数据不存在&#xff0c;不加锁主键不明确&#xff0c;锁定整个表无主键&#xff0c;锁定整个表应用场景介绍 1.FOR UPDATE 加的锁是一种行级排他锁&#xff0c…

广义表

广义表(广义表也称为列表&#xff0c;是线性表的一种推广&#xff0c;也是数据元素的有序序列) 一、基础 1.如何设定链表结点?广义表中的数据元素可能为单元素(原子)或子表&#xff0c;由此需要两种结点:一种是表结点&#xff0c;用以表示广义表;一种是单元素结点&#xff0c;…

数据库各种锁详解

文章目录排他锁共享锁更新锁意向锁锁的粒度数据库自动加锁手动加锁各种锁之间的兼容问题排他锁 Exclusive Locks&#xff0c;英译&#xff1a;排他锁&#xff0c;简称 X 锁&#xff0c;又称为写锁或独占锁。排他锁分为表级排他锁和行级排他锁。 如果事务 T1 对数据行对象 A 加…

activiti dmn_新的DMN编辑器预览

activiti dmnWorkbench 7.13.0.Final于10月16日星期二发布&#xff0c;此版本带来了许多有趣的功能和重要的修复程序。 亮点之一是作为技术预览功能的新DMN编辑器&#xff0c;该功能仍在开发中&#xff0c;但您可以开始使用。 在本文中&#xff0c;您将学习如何启用DMN编辑器预…

MySQL的索引存储数据结构BTree和B+Tree的区别

文章目录BTree 原理示意图BTree 原理示意图BTree的树层级很少BTree 可以高效支持范围查找BTree 原理示意图 注&#xff1a;BTree 就是 B-Tree&#xff0c;实际上官方并没有 B-Tree 的说法。 BTree 原理示意图 BTree的树层级很少 BTree 的数据存在每个节点中&#xff0c;所以每…

jdk11 javafx_JDK 11上的JavaFX

jdk11 javafx在JFX第11版发布后&#xff0c;人们对JavaFX与JDK的解耦感到百感交集。 我们许多人认为现在是时候告别JavaFX并改用另一种GUI技术了&#xff0c;而另一些人对此情况感到高兴。 他们认为&#xff0c;将JavaFX与Oracle分离开来&#xff0c;并致力于将其作为开源社区驱…

配置Java环境变量

JAVA环境变量配置 一、新建系统变量 新建变量&#xff0c;找到安装目录新建一个JAVA_HOME,路径为bin目录的前一级目录。 可以安装多个JAVA版本&#xff0c;然后新建不同的JAVA_HOME名称&#xff0c;然后填写bin目录的前一级路径。 二、编辑环境变量 找到path,然后编辑%JAVA…

MySQL的存储引擎InnoDB,B+Tree数据结构索引的实现原理图(聚簇索引/聚集索引)

1.表数据文件本身就是按BTree组织的一个索引结构文件 2.InnoDB的BTree的索引数据结构中&#xff0c;表数据和索引数据合并在一起&#xff0c;即叶子节点包含了完整的数据记录&#xff0c;这样的索引叫聚簇索引。