MySQL-Binlog

mysqlbinlog结合sed命令恢复数据

假装没事ソ 提交于 2020-04-12 10:10:18
1 、环境说明 使用mysqlbinlog搭配sed命令完美还原 MySQL版本号:5.6.X及5.7.X; mysql必须开启binlog,并且mysql的binlog最好是Row模式; mysql数据库指定字符集位utf8,同时表的字符集也得为utf8,否则在mysqlbinlog 解析出来的sql文件对于中文汉字的会出现乱码,导致最后恢复数据到线上的表中报错。 满足以上条件这样可以极大的保证数据恢复的几率。 当然把控好数据库的权限问题,禁止采用不加where条件的delete 和update语句,以及禁止采用drop,truncate才是从根源保证数据安全行之有效的办法。 查看当前的binlog文件: show master status; 找到binllog文件路径下,再次之前需要确认一下你误操作的大概时间,因为我们要通过时间范围来搜索日志,执行命令如下: mysqlbinlog --base64-output=decode-rows -v -v --start-datetime=' 2019-10-17 14:40:00 ' --stop-datetime=' 2019-10-17 14:50:00 ' /data/mysql_data/binlog.000004 |grep -C 30 "UPDATE `test1`.`zx_scores`"

MySQL利用mysqlbinlog命令恢复误删除数据(运维技术交流群:926402931,欢迎大家一起来交流。)

这一生的挚爱 提交于 2020-04-11 11:01:19
目录 1.MySQL开启binlog功能 2.登录到数据库 3.创建与删除数据库 4.查看binlog日志 5.恢复数据 1.MySQL开启binlog功能 log-error=/var/log/mysql.log log-bin=/data/binlog/mysql-bin sync_binlog=1 binlog_format=row 2.登录到数据库 [root@db01 ~]# mysql -uroot -p123 3.创建与删除数据库 mysql> create database xiaohai; mysql> drop database xiaohai; 4.查看binlog日志 [root@db01 binlog]# mysqlbinlog mysql-bin.000008 # at 1200 #200409 16:41:36 server id 10 end_log_pos 1297 CRC32 0x84e92ac7 Query thread_id=8 exec_time=0 error_code=0 SET TIMESTAMP=1586421696/*!*/; create database xiaohai /*!*/; # at 1297 #200409 16:42:24 server id 10 end_log_pos 1384 CRC32

MySQL-binlog

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-11 12:50:31
一、初步了解binlog 1、MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。 a、DDL:Data Definition Language 数据库定义语言 :主要的命令有create、alter、drop等,ddl主要是用在定义或改变表(table)的结构,数据类型,表之间的连接和约束等初始工作上,他们大多在建表时候使用。 b、DML:Data Manipulation Language 数据操纵语言: 主要命令是slect,update,insert,delete,就像它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言 2、mysqlbinlog常见的选项有一下几个:     a、--start-datetime:从二进制日志中读取指定等于时间戳或者晚于本地计算机的时间     b、--stop-datetime:从二进制日志中读取指定小于时间戳或者等于本地计算机的时间 取值和上述一样     c、--start-position:从二进制日志中读取指定position 事件位置作为开始。     d、--stop-position:从二进制日志中读取指定position 事件位置作为事件截至 3

binlog2sql mysql数据库闪回工具

ⅰ亾dé卋堺 提交于 2020-02-29 08:52:04
binlog2sql工具比mysqlbinlog+sed恢复更快捷。 1、安装: 从github上下载: https://github.com/danfengcao/binlog2sql shell> git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql shell> pip install -r requirements.txt 安装完成后,将binlog2sql/binlog2sql目录下的binlog2sql_util.py文件移动到/usr/lib64/python2.7目录下。 2、使用: 参数说明: (1)**mysql连接配置** -h host; -P port; -u user; -p password (2)**解析模式** --stop-never 持续解析binlog。可选。默认False,同步至执行命令时最新的binlog位置。 -K, --no-primary-key 对INSERT语句去除主键。可选。默认False -B, --flashback 生成回滚SQL,可解析大文件,不受内存限制。可选。默认False。与stop-never或no-primary-key不能同时添加。解析回滚SQL时使用。 --back-interval -B模式下

删库了,我们一定要跑路吗?

隐身守侯 提交于 2020-02-27 05:58:34
在工作中,我们误删数据或者数据库,我们一定需要跑路吗?我看未必,程序员一定要学会自救,神不知鬼不觉的将数据找回。 在 mysql 数据库中,我们知道 binlog 日志记录了我们对数据库的所有操作,所以 binlog 日志就是我们自救的利器。 接下来就来开启程序员自救之路。 想要自救成功,binlog 这把利器一定要好,在自己之前,我们一定要确定我们有 binlog 这把利器,以下就是确保有 binlog 利器的操作。 1、确认数据库是否开启 binlog 日志 show variables like 'log_%' ; 查看红色圈出来的地方,如果为 ON 则表示开启,否则未开启。没有开启的话,就需要做以下操作。 2、开启 binlog 日志 如果未开启 binlog 日志的话,就需要开启 binlog 日志,在 MySQL 的配置文件中设置,如果你的是windowns 电脑则找到 my.ini 文件,unix 系统找到 my.cnf 文件。在文件中修改或者配置如下参数: # Binary Logging. #日志文件的名字及存储路径 log-bin=D:\Mysql-binlog\mysql-bin #设置日志格式 binlog-format=mixed 其中 binlog-format 有三种选项: STATMENT :每一条会修改数据的 SQL 语句会记录在 binlog 中

unknown variable 'default-character-set=utf8'

强颜欢笑 提交于 2019-12-19 19:15:33
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 下午在排查MySQL主从同步问题时,想从主库的binlog中找一些线索,裸的binlog文件是无法直视的,mysqlbinlog这个工具是用来查看binlog文件内容的(使用方式man mysqlbinlog查看),但是使用mysqlbinlog将binlog文件转换成人类可读的内容时却报错: 1 2 [xxx@dbhost log]$ mysqlbinlog mysql-bin.000004 mysqlbinlog: unknown variable 'default-character-set=utf8'   原因是mysqlbinlog这个工具无法识别binlog中的配置中的default-character-set=utf8这个指令。 两个方法可以解决这个问题 一是在MySQL的配置/etc/my.cnf中将default-character-set=utf8 修改为 character-set-server = utf8,但是这需要重启MySQL服务,如果你的MySQL服务正在忙,那这样的代价会比较大。 二是用mysqlbinlog --no-defaults mysql-bin.000004 命令打开 好吧,这篇文章含金量太低,好记性不如烂笔头,还是记录一下吧。。。。 来源: oschina 链接:

Mysql超有用的15个mysqlbinlog命令

半城伤御伤魂 提交于 2019-12-19 18:12:04
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在MySQL或MariaDB中,任意时间对数据库所做的修改,都会被记录到日志文件中。例如,当你添加了一个新的表,或者更新了一条数据,这些事件都会被存储到二进制日志文件中。二进制日志文件在MySQL主从复合中是非常有用的,主服务器会发送其数据到远程服务器中。 当你需要恢复MySQL时,也会需要使用到二进制日志文件。 mysqlbinlog 命令,以用户可视的方式展示出二进制日志中的内容。同时,也可以将其中的内容读取出来,供其他MySQL实用程序使用。 在此示例中,我们将会涉及以下内容: 获取当前二进制日志列表 mysqlbinlog默认行为 获取特定数据库条目 禁止恢复过程产生日志 在输出中控制base-64 BINLOG mysqlbinlog输出调试信息 跳过前N个条目 保存输出到文件 从一个特定位置提取条目 将条目截止到一个特定的位置 刷新日志以清除Binlog输出 在输出中只显示语句 查看特定开始时间的条目 查看特定结束时间的条目 从远程服务器获取二进制日志 1 获取当前二进制日志列表 在mysql中执行以下命令,即可查看二进制日志文件的列表。 1 2 3 4 5 6 7 8 mysql > SHOW BINARY LOGS ; + -- -- -- -- -- -- -- -- -- -- -- + -

MySQL 的 binlog 文件解析

孤人 提交于 2019-12-19 18:11:32
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 主要使用命令为: $ bin/mysqlbinlog 具体使用方法,直接参数 $ bin/mysqlbinglog --help 输出信息。 我在操作的时候,主要是针对某个 mysql-bin.000006 文件转 SQL 数据!命令为: [mysql@ryan mysql]# bin/mysqlbinlog --no-defaults -v --base64-output=DECODE-ROWS binlog_data/mysql-bin.000006 > ./my-sql.sql ----------------------------- 遇到的问题: 1. 执行 bin/mysqlbinlog 命令,报错如下: [mysql@ryan mysql]# bin/mysqlbinlog mysqlbinlog: [ERROR] unknown variable 'default_character_set=utf8mb4' [mysql@ryan mysql]# 解决办法: 在执行命令的时候增加参数 : --no-defaults , 使用如下命令: [mysql@ryan mysql]# bin/mysqlbinlog --no-defaults bin/mysqlbinlog Ver 3.4 for

mysqlbinlog查看基于行的日志--base64-output=decode-rows -v

大憨熊 提交于 2019-12-19 17:47:53
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> mysql二进制日志有三种格式:statement、row、mixed 一般我们在主从复制过程中采用的格式都是mixed。这种格式兼具了基于行(row)和基于语句(statement)的优点,速度和效率是最高的。 但是在使用mysqlbinlog查看混合模式的二进制文件时,基于行的部分默认是以base64编码显示. So 查看row 模式的binlog方式如下: $ mysqlbinlog --base64-output=decode-rows -v /var/lib/mysql/sasha-db-3.000197 来源: oschina 链接: https://my.oschina.net/AnnaWu/blog/3145035

MySQL 二进制日志 binlog

泪湿孤枕 提交于 2019-12-09 18:49:34
MySQL 5.7 开启 binlog 修改 my.cnf 文件 [mysqld] log-bin=[/存放目录/]mysql-bin #注意 mysql 可读写“存放目录”,默认数据存放目录 expire_logs_days=7 #保留7天内修改过的 binglog 文件 max_binlog_size=512M #单个 binlog 文件大小上限,默认1G #指定或忽略要复制的数据库,存在跨库问题 binlog_do_db=db1 binlog_db_db=db2 #binlog_ignore_db=db1 #binlog_ignore_db=db2 常用操作 查看所有 binlog 文件列表 show master logs; 查看 master 状态,包含最新 binlog 文件名和 position show master status; 清除过期 binlog 文件,并使用新编号的 binlog 文件开始记录日志 flush logs; 删除 binlog 文件 删除旧的 binlog 文件 purge master logs to 'mysql-bin.000573'; purge master logs before '2018-04-18 06:00:00'; purge master logs before DATE_SUB(NOW(), INTERVAL 2