MySQL -- binlog 操作与恢复

binlog 开启、查看:
> show variables like ‘log_bin‘;   #查看是否开启

> set sql_log_bin=1 || set sql_log_bin=0; #启用 || 停用
> show binary logs;   //获取binlog文件列表,对应mysql-bin.index;

> show master logs;   //查看主上的binlog
> show master status;  //查看当前正在写入的binlog
> show binlog events;   //查看第一个binlog内容

> show binlog events in ‘mysql-bin.000002‘指定查看。
binlog 删除:
1.关闭mysql主从,关闭binlog,然后重启数据库

2、设置自动清理:

> mysql -e "show variables like ‘expire_log%‘;"
> mysql -e  ‘set global expire_logs_days=3;‘   //设置自动清理时间为3天
> mysql -e  ‘flush logs‘             //让二进制日志重新生成新文件,并自动清理过期日志
 (如果执行不生效,确认mysql-bin.index与外面文件一致,否则删除多余的,再 > flush logs;)
3、

> PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY);   //删除10天前的MySQL binlog日志
> purge master logs before ‘2012-03-30 17:20:00‘;  //删除指定日期以前的日志索引中binlog日志文件
> purge master logs to ‘mysql-bin.000002‘;    //删除指定日志文件的日志索引中binlog日志文件
> reset master;  or reset slave;       //置空master的binlog;置空slave的中继日志

若误删了最新的,确保mysql-bin.index内记录的和外面现有文件一致,否则删除多余的,再flush logs

4、直接rm

进入数据库数据目录 && 查看一下当前使用的binlog日志是哪个,除了这个以外的,其它都可以使用rm ,删除后把mysql-bin.index内容也对应一下
如果误删了当前使用的binlog,你会发现mysql不记录binlog日志了,你要先更改mysql-bin.index文件内容,对应一下,然后去flush logs。
----------------------------------------------------------------------------------------------------

binlog  简介:

mysql复制的三种方式:
基于SQL语句的复制(statement-based replication, SBR)

基于行的复制(row-based replication, RBR)

混合模式复制(mixed-based replication, MBR)

binlog的三种格式:

Statement

每一条会修改数据的sql都会记录在binlog中,不需记录每一行的变化,减少日志量,节约了io;
Row

5.1.5版本的MySQL才开始支持row level的复制,它不记录sql语句上下文相关信息,仅保存哪条记录被修改;
Mixed

从5.1.8版本开始,MySQL提供了Mixed格式,实际上就是Statement与Row的结合,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存
文件配置:
binlog_format  = MIXED     //binlog日志格式
log_bin = 目录/mysql-bin.log  //binlog日志名
expire_logs_days = 7      //binlog过期清理时间
max_binlog_size  100m     //binlog每个日志文件大小,默认1G
binlog 恢复:
1、开启binlog,最好是改配置文件,或者数据库内直接打开
2、模拟数据写入,依照如下附录.......查询当前的数据,然后记录下当前内容,如下:
mysql> select * from number;         
+--------------------------------+
|  1 | 2016-06-29 23:27:15 |
|  2 | 2016-06-29 23:27:15 |
|  3 | 2016-06-29 23:27:15 |
|  4 | 2016-06-29 23:27:15 |
|  5 | 2016-06-29 23:27:15 |
|  6 | 2016-06-29 23:27:15 |
|  7 | 2016-06-29 23:27:15 |
|  8 | 2016-06-29 23:27:15 |
|  9 | 2016-06-29 23:27:15 |
|  10 | 2016-06-29 23:27:15 |
+-------+------------------------+
3、进行全量备份,mysqldump  -F --master-data=2 backup |gzip > backup_all.sql.gz  //-F 刷新binlog为0002  (或者我们最好每天早上4/5点进行一次全量备份)
4、继续模拟数据写入,执行附录下的内容,查看:
+----+---------------------------+
|  1  | 2016-06-29 23:27:15 |
|  2  | 2016-06-29 23:27:15 |
|  3  | 2016-06-29 23:27:15 |
|  4  | 2016-06-29 23:27:15 |
|  5  | 2016-06-29 23:27:15 |
|  6  | 2016-06-29 23:27:15 |
|  7  | 2016-06-29 23:27:15 |
|  8  | 2016-06-29 23:27:15 |
|  9  | 2016-06-29 23:27:15 |
|  10  | 2016-06-29 23:27:15 |
|  11  | 2016-06-29 23:31:03 |
|  12  | 2016-06-29 23:31:03 |
|  13  | 2016-06-29 23:31:03 |
|  14  | 2016-06-29 23:31:03 |
|  15  | 2016-06-29 23:31:03 |
|  16  | 2016-06-29 23:31:03 |
|  17  | 2016-06-29 23:31:03 |
|  18  | 2016-06-29 23:31:03 |
|  19  | 2016-06-29 23:31:03 |
|  20  | 2016-06-29 23:31:03 |
+-------+---------------------+
5、删除数据表:delete from number;
6、再次模拟数据写入,select * from bumber;
+------+------------------------+
| id | updatetime          |
+------+------------------------+
| 21 | 2016-06-29 23:41:06 |
| 22 | 2016-06-29 23:41:06 |
| 23 | 2016-06-29 23:41:06 |
| 24 | 2016-06-29 23:41:06 |
| 25 | 2016-06-29 23:41:06 |
| 26 | 2016-06-29 23:41:06 |
| 27 | 2016-06-29 23:41:06 |
| 28 | 2016-06-29 23:41:06 |
| 29 | 2016-06-29 23:41:06 |
| 30 | 2016-06-29 23:41:06 |
+------+------------------------+
7、恢复数据:
先锁住表,不进行数据操作:lock table number read;  
之后最好刷新一下日志,产生新的binlog,单独操作出问题的binlog(先备份问题binlog)
进数据库看问题的pos点:show binlog events in ‘mysql-bin.000002‘;   //然后删除出问题的pos点记录
导入早上或某时的全量备份:mysql backup <  backup_all.sql
binlog日志恢复法一:
mysqlbinlog mysql-bin.000002 | mysql -u用户名 -p密码 数据库名
[mysqlbinlog --start-position=1038 --stop-position=1164 --database=zyyshop  mysql-bin.00002 | mysql  -v zyyshop ]  
常用选项:
  --start-position=953   起始pos点
  --stop-position=1437   结束pos点
  ---start-datetime="2013-11-29 13:18:54" 起始时间点
  ---stop-datetime="2013-11-29 13:21:53"  结束时间点
  ---database=zyyshop   指定只恢复zyyshop数据库(一台主机上往往有多个数据库,只限本地log日志)
binlog日志恢复法二:
mysqlbinlog  mysql-bin.000002 > tmp.sql     
vim  tmp.sql        //找到delete那步操作,将之删除
mysql backup < tmp.sql    //然后把操作打入数据库
注:因为锁表后续没有数据插入,如果有数据写入,也要把最新的binlog导入到数据库。
8、查看会发现数据都已经回来了。

附录:
1、建表

Create databases  backup;
CREATE TABLE `number` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT ‘编号‘,
  `updatetime` timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、写入数据的试验程序:

#coding:utf8
#python2.7
import MySQLdb
import time
def connect_mysql(db_host="192.168.11.169",user="martin",passwd="martin",db="backup",charset="utf8"):
    conn = MySQLdb.connect(host=db_host,user=user,passwd=passwd,db=db,charset=charset)
    conn.autocommit(True)
return conn.cursor()

3、数据插入:

for i in range(0,10):
#time=time.strftime("%Y-%m-%d %H:%M:%S")
sql = ‘insert into number(updatetime) values(%s)‘
values = [(time.strftime("%Y-%m-%d %H:%M:%S"))]
    db1 = connect_mysql()
print db1.executemany(sql,values)
时间: 2024-10-01 10:04:22

MySQL -- binlog 操作与恢复的相关文章

Mysql binlog日志及binlog恢复数据库操作

初识MySQL 日志binlogMySQL重要log,二进制日志文件,记录所有DDL和DML语句(除select),事件形式记录,包含语句所执行的消耗时间,事务安全型.DDL(数据库定义语言),主要命令有create.alter.drop等.DDL主要定义或改变表table的结构.数据类型.建表时使用.MDL(数据操纵语言),主要命令有select.update.insert.delete. mysqlbinlog常见选项:--start-datetime:从二进制中读取指定时间戳.--stop

MySQL binlog日志恢复数据

我们了解了MySQL 的 binlog 日志的开启方式以及 binlog 日志的一些原理和常用操作,我们知道,binlog 有两大作用,一个是使用 binlog 恢复数据,另一个就是用来做主从复制.本篇笔记就是来记录如何使用 binlog 日志来做数据恢复.当然了,使用 binlog 日志所恢复的数据只能是部分数据,并不能够使用 binlog 日志来做数据库的备份,如果想要做数据库备份,依然要使用我们传统的备份方法,而 binlog 可以作为增量备份. 视频链接:http://www.ronco

Mysql误操作恢复流程

一.开启binlog. show variables like 'log_bin'; #vim  /etc/my.cnf 在[mysqld]中加入 log-bin                 = mysql-binlog-bin                 = /usr/local/mysql/log/mysql-bin.log 重启mysql服务 #service mysqld stop#service mysqld start 二.数据写入 建库 create database ba

使用MySQL自身复制来恢复binlog

如果需要恢复的二进制日志较多,较复杂,强烈建议使用MySQL自身复制来恢复binlog,而不要使用mysqlbinlog. 目录 [hide] 1. 如何操作 1.1 将binlog作为relay log来执行 1.2 从专门构建的binlog server上拉binlog 2. 其他需要注意的事项 在MySQL手册中一直是推荐使用mysqlbinlog工具来实现指定时间点的数据恢复,事实上,这是一个经常"让人郁闷"的办法.更好的办法是,使用MySQL内部复制线程中的SQL Threa

MySQL relaylog + SQL_Thread 增量恢复binlog

一.设置3308实例的已经执行过的gtid号为当天全量备份结束时的gtid号 查看当天xtrabackup全量备份时结束的binlog文件名,binlog的pos 位置点,以及全量备份结束后的Gtid号: [[email protected] backup]# cat /data/backup/db_3306_20190808/xtrabackup_info |grep binlog_pos binlog_pos = filename 'mysql-bin.000003', position '

mysql通过binlog日志来恢复数据

简介 在生产的过程中有这么一个业务场景:比如我在2016-11-19 09:30:00 通过mysqldump的方式备份了数据库,但是在2016-11-19 10:30:00的时候数据库崩溃了,如果通过我们的备份文件来恢复,也只能恢复到 2016-11-19 09:30:00 这个时间点,而9.30分到10:30分这一个小时的数据恢复不了,这时候我们可以通过mysql的binlog日志来恢复没有备份到的这一小时的数据. 1.开启mysql的binlog日志(默认情况下没有开启) #vim /et

mysql权限的误操作的恢复

mysql权限的误操作的恢复 原因:由于误操作,我把repl用户授予了所有权限,但删除了数据库中的其他用户及权限,因此repl用户虽然具有操作所有数据库的权限,但没有grant权限,所以若想授予其他用户权限,来管理数据库,出现这种状况就酷毙了,没有授予权限怎麽办? 误操作过程: mysql >grant all on *.* to 'repl'@'192.168.1.%' identified by '123456'; mysql> flush privileges; 授予完以后,我把其他的所

mysql 选取操作日志(mysql-bin.0000恢复数据)

my.ini 配置log-bin=mysql-bin 启用日志 用  mysql-bin.0000 mysqlbinlog -d keyboard ../data/mysql-bin.000024 –start-datetime="2017-05-29 12:17:56″ –stop-datetime=" 2017-05-29 12:57:56″ > D:k.sql 说明: mysqlbinlog -d 数据库  日志文件路径  –start-datetime="开始时

mysql之备份和恢复(msyqldump、LVM、xtrabackup)

备份类型:    根据备份时是服务器是否在线:        热备份(HOT):            读写操作不受影响        温备份(WARM):            进可以执行读操作,写操作不能执行        冷备份(COLD):            读写操作均不能进行 根据备份时对数据文件的操作:        物理备份:            直接复制数据文件.速度快,但是跨平台移植可能受到底层文件系统格式的影响.        逻辑备份:            将数据导