zoukankan      html  css  js  c++  java
  • mysqlbinlog工具基于日志恢复详细解释

    如果每天都会生成大量的二进制日志,这些日志长时间不清理的话,将会对磁盘空间带来很大的浪费,所以定期清理日志是DBA维护mysql的一个重要工作

    1)RESET MASTER
    在上面查看日志存放的文件夹中,二进制日志命名的格式是以mysql-bin.*,*代表日志的序号,序号是递增的,其中还有mysql-bin.index是日志的索引文件,记录了日志的最大序号
    我们执行RESET MASTER命名删除全部日志



    查看删除后的日志



    可以看到,以前的日志全部被清空,新的日志从00001开始

    2)PURGE MASTER LOGS TO & PURGE MASTER LOGS BEFORE
    执行PURGE MASTER LOGS TO 'mysql-bin.******'命令,是将'******'编号之前的所有日志进行删除
    执行PURGE MASTER LOGS BEFORE 'yyyy-mm-dd hh:mm:ss'命令,是将在'yyyy-mm-dd hh:mm:ss'时间之前的所有日志进行删除

    3)-EXPIRE_LOGS_DAYS
    此参数是设置日志的过期天数,过期的日志将会被自动删除,这有利于减少我们管理日志的工作量,需要修改my.cnf


    这里我们设定保存日志为3天,3天之后过期的日志将被自动删除

    恢复
     bin-log是记录着mysql所有事件的操作,当mysql发生灾难性错误时,可以通过bin-log做完整恢复,基于时间点的恢复,和基于位置的恢复


    完整恢复,假定我们每天凌晨2点都会使用mysqldump备份数据库,但在第二天早上9点由于数据库出现了故障,数据无法访问,需要恢复数据,先使用昨天凌晨备份的文件进行恢复到凌晨2点的状态,在使用mysqlbinlog恢复自mysqldump备份以来的binlog
    mysql localhost mysql-bin.000001 | mysql -uroot -p
    这样数据库就可以完全的恢复到崩溃前的完全状态

    基于时间点的恢复
    ,由于误操作,比如说删除了一张表,这时使用上面讲的完全恢复是没有用的,因为日志里面还存在误操作的语句,,我们需要的是恢复到误操作前的状态,然后跳过误操作的语句,再恢复后面操作的语句,假定我们删除了一张表的误操作发生在10:00这个时间点,我们可以使用下面的语句用备份和binlog将数据恢复到故障前

    mysqlbinlog --stop-date='2010-09-04 9:59:59' /var/log/mysql-bin.000001 | mysql -uroot -p


    然后跳过误操作的时间点,继续执行后面的binlog

    mysqlbinlog --start-date='2010-09-04 10:01:00' /var/log/mysql-bin.000001 | mysql -uroot -p


    其中--stop-date='2010-09-04 9:59:59' 和 --start-date='2010-09-04 10:01:00' 其中的时间是你误操作的时间点,当然了,这个时间点你需要你自己计算的,而且这个时间点还可以涉及到的不只是误操作,还可以有正确的操作也被跳过去了。

    基于位置恢复,由于上面提到的,使用基于时间点的恢复可能出现,在一个时间点里面可能存在误操作和其他正确的操作,所以我们需要一种更为精确的恢复方式
    使用mysqlbinlog查看二进制,可看到



    其中drop tables test1这个误操作的end_log_pos为8879917,几下这个id,得出它前后操作的id分别为8879916,8879918
    我们将进行位置恢复操作

    mysqlbinlog --stop-position='8879916' /var/log/mysql-bin.000001 | mysql -uroot -p

    mysqlbinlog --start-position='8879918' /var/log/mysql-bin.000001 | mysql -uroot -p

    服务器生成的二进制日志文件写成二进制格式。要想检查这些文本格式的文件,应使用mysqlbinlog实用工具。
    应这样调用mysqlbinlog
    shell> mysqlbinlog [options] log-files例如,要想显示二进制日志binlog.000003的内容,使用下面的命令:
    shell> mysqlbinlog binlog.0000003输出包括在binlog.000003中包含的所有语句,以及其它信息例如每个语句花费的时间、客户发出的线程ID、发出线程时的时间戳等等。
    通常情况,可以使用mysqlbinlog直接读取二进制日志文件并将它们用于本地MySQL服务器。也可以使用–read-from-remote-server选项从远程服务器读取二进制日志。
    当读取远程二进制日志时,可以通过连接参数选项来指示如何连接服务器,但它们经常被忽略掉,除非你还指定了–read-from-remote-server选项。这些选项是–host、–password、–port、–protocol、–socket和–user。
    还可以使用mysqlbinlog来读取在复制过程中从服务器所写的中继日志文件。中继日志格式与二进制日志文件相同。

    mysqlbinlog支持下面的选项:
    ·
    —help,-?
    显示帮助消息并退出。
    ·
    —database=db_name,-d db_name
    只列出该数据库的条目(只用本地日志)。
    ·
    –force-read,-f
    使用该选项,如果mysqlbinlog读它不能识别的二进制日志事件,它会打印警告,忽略该事件并继续。没有该选项,如果mysqlbinlog读到此类事件则停止。
    ·
    –hexdump,-H
    在注释中显示日志的十六进制转储。该输出可以帮助复制过程中的调试。在MySQL 5.1.2中添加了该选项。
    ·
    –host=host_name,-h host_name
    获取给定主机上的MySQL服务器的二进制日志。
    ·
    –local-load=path,-l pat
    为指定目录中的LOAD DATA INFILE预处理本地临时文件。
    ·
    –offset=N,-o N
    跳过前N个条目。
    ·
    –password[=password],-p[password]
    当连接服务器时使用的密码。如果使用短选项形式(-p),选项和 密码之间不能有空格。如果在命令行中–password或-p选项后面没有 密码值,则提示输入一个密码。
    ·
    –port=port_num,-P port_num
    用于连接远程服务器的TCP/IP端口号。
    ·
    –position=N,-j N
    不赞成使用,应使用–start-position。
    ·
    –protocol={TCP | SOCKET | PIPE | -position

    使用的连接协议。
    ·
    –read-from-remote-server,-R
    从MySQL服务器读二进制日志。如果未给出该选项,任何连接参数选项将被忽略。这些选项是–host、–password、–port、–protocol、–socket和–user。
    ·
    –result-file=name, -r name
    将输出指向给定的文件。
    ·
    –short-form,-s
    只显示日志中包含的语句,不显示其它信息。
    ·
    –socket=path,-S path
    用于连接的套接字文件。
    ·
    –start-datetime=datetime
    从二进制日志中第1个日期时间等于或晚于datetime参量的事件开始读取。datetime值相对于运行mysqlbinlog的机器上的本地时区。该值格式应符合DATETIME或TIMESTAMP数据类型。例如:
    shell> mysqlbinlog –start-datetime=”2004-12-25 11:25:56″ binlog.000003该选项可以帮助点对点恢复。
    ·
    –stop-datetime=datetime
    从二进制日志中第1个日期时间等于或晚于datetime参量的事件起停止读。关于datetime值的描述参见–start-datetime选项。该选项可以帮助及时恢复。
    ·
    –start-position=N
    从二进制日志中第1个位置等于N参量时的事件开始读。
    ·
    –stop-position=N
    从二进制日志中第1个位置等于和大于N参量时的事件起停止读。
    ·
    –to-last-logs,-t
    在MySQL服务器中请求的二进制日志的结尾处不停止,而是继续打印直到最后一个二进制日志的结尾。如果将输出发送给同一台MySQL服务器,会导致无限循环。该选项要求–read-from-remote-server。
    ·
    –disable-logs-bin,-D
    禁用二进制日志。如果使用–to-last-logs选项将输出发送给同一台MySQL服务器,可以避免无限循环。该选项在崩溃恢复时也很有用,可以避免复制已经记录的语句。注释:该选项要求有SUPER权限。
    ·
    –user=user_name,-u user_name
    连接远程服务器时使用的MySQL用户名。
    ·
    –version,-V
    显示版本信息并退出。

  • 相关阅读:
    spring@Async注解实现异步方法调用
    mysql锁机制
    springboot启动时执行任务CommandLineRunner
    java-并发编程之fork/join框架
    mysql explain 执行计划详解
    mysql 时间相关sql , 按天、月、季度、年等条件进行查询
    swagger2 常用注解说明
    VirtualBox 安装CentOS虚拟机网卡配置
    RestFul是啥
    文本内文字字数过多,显示省略号
  • 原文地址:https://www.cnblogs.com/archoncap/p/5035698.html
Copyright © 2011-2022 走看看