日志还原前提,必须数据有完整备份,恢复昨天的完整备份,然后根据日志恢复昨天到现在的日志sql,
mysql安装目录bin下有mysqlbinlog文件
几个参数 -u后边是用户名-p后边是密码-h后边是host链接-P是端口 -D 后边是数据库名 mysql-bin.000473使用sql命令查看
mysql -uroot -p -D test
完整恢复语句
恢复的时候的库名、表名需要和备份的库名表名格式一致才可以恢复。
/www/server/mysql/bin/mysqlbinlog --no-defaults -vv --base64-output=decode-rows --database="数据库名" --start-datetime="2021-11-24 23:50:00" --stop-datetime="2021-11-25 16:50:00" /www/server/mysql/bin/mysql-bin.000472 | /www/server/mysql/bin/mysql -u root -p -D 数据库名
show binary logs;
#show variables like '%log_bin%';
#show master status;
#CALL DBMS_RECYCLE.SHOW_TABLES();
#show binary logs;
#show binlog events in "mysql-bin.000473";
下载日志文件到本地
[root@iZ8vbg3hxkp6i6anzunut7Z bin]# ./mysqlbinlog --no-defaults -ubeiyaozhongtai1 -pekcxc9jy@byj -hrm-8vb7.mysql.zhangbei.rds.aliyuncs.com --raw --read-from-remote-server --stop-never mysql-bin.000473
导出sql 语句 另存为sql 文件
[root@iZ8vbg3hxkp6i6anzunut7Z bin]# ./mysqlbinlog --no-defaults --database=beiyaozhongtai --base64-output=decode-rows -v --start-datetime="2021-11-25 11:50:00" --stop-datetime="2021-11-25 16:55:00" /www/wwwroot/8.142.24.194/mysql-bin.000473 >/www/wwwroot/8.142.24.194/restore.sql
前言
某天早上公司测试人员,写了一条坑爹的delete from语句,没在测试环境执行,直接在生产库执行导致目标表数据全部被删除;部分业务出现问题,广告无法正常展示,需及时恢复业务。
操作步骤
1.进入阿里云RDS后台,根据误操作的时间找到对应时间段的binlog文件,将binlog文件下载到测试服务器
2.通过下面命令读取binlog二进制文件
mysqlbinlog --database prod --base64-output=DECODE-ROWS -v mysql-bin.026846 > binlog.sql
通过grep过滤指定的表和DELETE FROM操作,找到前后的position
3.获取到position后,通过定位position使用如下命令再次读取binlog文件,得到误操作SQL的记录
mysqlbinlog --database prod --base64-output=DECODE-ROWS -v mysql-bin.026846 --start-position="213044104" --stop-position="213044642" > restore.sql
4.将DELETE FROM语句格式化为INSERT INTO语句,也可以将语句拷贝到Excel进行处理
cat ad.sql | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/VALUES/g;' | sed -r 's/(@28.*),/\1;;;;;;;;;;;;;/g' | sed 's/@[0-9]*=/@@@@@=/g' > restore.sql
5.执行修改好的restore.sql,恢复误删除的数据
实例2 [mysql中bin-log日志备份以及恢复误删数据]
mysqlbinlog工具的作用是解析mysql的二进制binlog的日志内容,把二进制日志解析成可以在MySQL数据库里执行的SQL语句。
1.mysql的binlog日志是什么
mysql数据目录下的xxx-bin.000001这样的文件就是mysql的binlog日志
2.mysql的binlog日志的作用
mysql的binlog日志用于记录MySQL内部的增删改等操作,也就是对MySQL数据库更新内容的记录(对数据库的改动),对数据库进行查询的语句(如以show、select开头的语句),不会被binlog日志记录。binlog日志的主要作用是数据库的主从复制以及数据灾难后的增量恢复。
3.mysql的binlog日志功能如何开启
在mysql的配置文件my.cnf中,增加log_bin参数即可开启binlog日志,也可以通过赋值来指定binlog日志的文件名。
vi /etc/my.cnf
[mysqld]
log_bin=/data/mysql/mysql-bin
4.mysqlbinlog工具解析binlog日志
binlog日志是二进制格式的,不能使用查看文本工具的命令(比如,cat、vi等)查看。
4.1.解析指定库的binlog日志
利用“mysqlbinlog -d”参数解析指定库的binlog日志:
mysqlbinlog -d oldboy mysql-bin.000004 -r bin.sql #-d指定库,-r指定生成的文件
grep -i insert bin.sql #过滤内容
mysqlbinlog可以指定-d实现分库导出binlog,如果使用-d参数,那么在更新数据时,必须要有use库名,才能分出指定库的binlog,例如,写入数据库的语句必须采用的写法。
use oldboy;
insert into test values(1,'oldboy');
这种写法是不行的:
insert into oldboy.test values(2,'oldgirl');
4.2.按照位置截取binlog内容
按照位置截取binlog内容的优点是精确,但是要花费时间寻找位置。
mysqlbinlog mysql-bin.000009 --start-position=365 --stop-position=456 -r pos.sql
指定了开始位置,而不指定结束位置
mysqlbinlog mysql-bin.000009 --start-position=365 -r pos.sql
指定了结束位置,而不指定开始位置:
mysqlbinlog mysql-bin.000009 --start-position=456 -r pos.sql
所谓的位置点,就是mysqlbinlog解析文件里的不同行行首的“# at 数字”标识的数据。
4.3.按照时间截取binlog内容
按照时间截取binlog内容的缺点是模糊、不准确,截取的内容会丢失部分数据,精确到秒,1秒也可能会有很多条语句。
截取mysql-bin.000009文件中从‘2014-10-16 17:14:15'时间到’2014-10-26 17:15:15‘时间的数据
mysqlbinlog mysql-bin.000009 --start-datetime='2014-10-16 17:14:15' --stop=datetime='2014-10-26 17:15:15' -r time.sql
指定了开始时间,而不指定结束时间:
mysqlbinlog mysql-bin.000009 --start-datetime='2014-10-16 17:14:15' -r time.sql
指定了结束时间,而不指定开始时间:
mysqlbinlog mysql-bin.000009 --stop=datetime='2014-10-26 17:15:15' -r time.sql
所谓的时间点,就是mysqlbinlog解析文件里的不同行行首的“#170303 9:44:22“标识的数据
5.mysqlbinlog命令常用参数
- | - | - |
---|---|---|
mysqlbinlog命令常用参数 | 参数说明 | |
-d,--databases=name | 根据指定库拆分binlog(拆分单表binlog可通过SQL关键字过滤) | |
-r,--result-file=name | 指定解析binlog输出SQL语句 | |
-R,--read-from-remote-server | 从MySQL服务器读取binlog日志,是下面参数的别名read-from-remote-master=BINLOG-DUMP-NON-GTIDS | |
-j,--start-position=# | 读取binlog的起始位置点,#号是具体的位置点 | |
--stop-position=# | 读取binlog的停止位置点,#号是具体的位置点 | |
--start-datetime=name | 读取binlog的起始位置点,name是具体的时间,格式为:2004-12-25 11:25:56 | |
--stop-datetime=name | 读取binlog的停止位置点,name是具体的时间,格式为:2004-12-25 11:25:56 | |
--base64-output=decode-rows | 解析ROW级别binlog日志的方法,例如,mysqlbinlog --base64-output=decode-rows -v mysql-bin.000016 |
网友评论