前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RDS表更新数据恢复

RDS表更新数据恢复

原创
作者头像
wangwei-dba
修改2021-04-22 17:48:02
6.3K0
修改2021-04-22 17:48:02
举报
文章被收录于专栏:mysql-dba

收到公司产品人员消息,让我恢复一个表的数据

通过了解系统是公司很多年前的一个老系统,面向美国用户的,数据库是阿里云的rds 所在区为美国弗吉尼亚mysql版本为5.6,产品在update操作时候字段名称写错了,把一个字段值覆盖掉了

代码语言:javascript
复制
UPDATE tab_xxxx set imgxx=REPLACE(zip_linkxx,"aaa","bbb.com") where img like "%bbb.bb%"

找操作人员询问了执行的语句,执行的大概时间点,要到rds登录方式等

1.第一想到的恢复方法是通过binlog日志进行恢复

登录rds控制台在备份恢复的日志备份中找binlog 发现binlog每4个小时备份一次,需要的日志没有下载列表

2.既然需要的日志,是不是可以通过全备进行恢复整个表(由于是老系统这表基本不会更新),不过看到全备的文件压缩后30多个G就放弃这种方法(30G下载就需要很长时间了)

3.第三种方法远程获取binlog日志 mysqlbinlog --read-from-remote-server

远程获取Binlog日志

通过客户端连接实例,执行如下SQL语句,查看并记录logs表中的Log_name列值,该值即为Binlog日志文件名,例mysqlbin.xxx。

show binary logs;(确定要获取哪一个binlog日志文件)

根据上一步获取的Binlog文件名,在客户端执行如下命令,远程获取Binlog日志并保存至本地。

代码语言:javascript
复制
./mysql-5.6.40-linux-glibc2.12-x86_64/bin/mysqlbinlog -uxxx -p'xxx' -h'xx.xx.xx' --read-from-remote-server mysql-bin.001120 > mysql-bin.001120

./mysql-5.6.40-linux-glibc2.12-x86_64/bin/mysqlbinlog -uxxx -p'xxx' -h'xx.xx.xx' --read-from-remote-server mysql-bin.001120 > mysql-bin.001120(这一步是在其他ecs服务器上执行的,要把ecs服务器加入到rds白名单中)

按照阿里云给的步骤获取的日志进行解析,报错

代码语言:javascript
复制
[root@ops_server01 ww]# ./mysql-5.6.40-linux-glibc2.12-x86_64/bin/mysqlbinlog -vv --base64-output=DECODE-ROWS mysql-bin.001120 > 1120.sql
ERROR: File is not a binary log file.

原因是远程获取日志没有以二进制日志格式方式来保留日志解析不了,还是不能进行恢复

最后通过远程获取时加 -vv进行解析重定向到文件中

./mysql-5.6.40-linux-glibc2.12-x86_64/bin/mysqlbinlog -uxxx -p'xxx' -h'xx.xx.xx.xx' -vv --read-from-remote-server mysql-bin.001120 > ww.sql

代码语言:javascript
复制
### UPDATE `xx`.`xx`
### WHERE
###   @1=41 /* INT meta=0 nullable=0 is_null=0 */
###   @2='Mask Ⅲ' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */
###   @3=1 /* TINYINT meta=0 nullable=1 is_null=0 */
###   @4='http://ec2user.res.xxx.com/upload/zip/201708/sticker_g244/sticker_thumb.jpg' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */
###   @5=0 /* TINYINT meta=0 nullable=1 is_null=0 */
###   @6=1 /* TINYINT meta=0 nullable=1 is_null=0 */
###   @7='' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */
###   @8=1476946736 /* INT meta=0 nullable=1 is_null=0 */
###   @9='yangy' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */
###   @10=183 /* INT meta=0 nullable=1 is_null=0 */
###   @11='http://ec2user.resxx.com/upload/zip/201708/sticker_g244.zip' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */
###   @12='' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */
###   @13=0 /* INT meta=0 nullable=1 is_null=0 */
###   @14=1 /* TINYINT meta=0 nullable=1 is_null=0 */
###   @15=0 /* INT meta=0 nullable=1 is_null=0 */
### SET
###   @1=41/* INT meta=0 nullable=0 is_null=0 */
###   @2='Mask Ⅲ' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */
###   @3=1 /* TINYINT meta=0 nullable=1 is_null=0 */
###   @4='http://ec2user.res.xxxx.com/upload/zip/201708/sticker_g244/sticker_thumb.jpg' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */
###   @5=0 /* TINYINT meta=0 nullable=1 is_null=0 */
###   @6=1 /* TINYINT meta=0 nullable=1 is_null=0 */
###   @7='' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */
###   @8=1476946736 /* INT meta=0 nullable=1 is_null=0 */
###   @9='yangy' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */
###   @10=183 /* INT meta=0 nullable=1 is_null=0 */
###   @11='http://ec2user.res.xxs.com/upload/zip/201708/sticker_g244.zip' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */
###   @12='' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */
###   @13=0 /* INT meta=0 nullable=1 is_null=0 */
###   @14=1 /* TINYINT meta=0 nullable=1 is_null=0 */
###   @15=0 /* INT meta=0 nullable=1 is_null=0 */

最后通过脚本处理解析的文件(之前写的脚本),生产回滚的语句,在数据库直接执行就可以了

代码语言:javascript
复制
UPDATE `xx`.`xxx`
set
  id=168 ,
  name='Blusher' ,
  pid=10 ,
  img='http://ec2user.res.xxx.com/upload/zip/201708/sticker_g168.zip' ,
  type=0 ,
  publish=1 ,
  txt='' ,
  addtime=1502689653 ,
  operate='chenghao'
  orderval=179 ,
  zip_link='http://ec2user.res.xx.com/upload/zip/201708/sticker_g168.zip' ,
  big_img='http://ec2user.res.xx.com/upload/img/201708/Blushernew.jpg' ,
  coin=0 ,
  fid=1 ,
  rate=0
where
  id=168  and
  name='Blusher'  and
  pid=10  and
  img='http://ec2user.res.xx.com/upload/img/201708/Blushernew.jpg'  and
  type=0  and
  publish=1  and
  txt=''  and
  addtime=1502689653  and
  operate='chenghao' ;
  orderval=179 ,
  zip_link='http://ec2user.res.xxx.com/upload/zip/201708/sticker_g168.zip' ,
  big_img='http://ec2user.res.xx.com/upload/img/201708/Blushernew.jpg' ,
  coin=0 ,
  fid=1 ,
  rate=0 ;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档