首页 > 数据库 >【MySQL核心】误删除表?帮你时间倒流!!!

【MySQL核心】误删除表?帮你时间倒流!!!

时间:2024-08-15 16:55:43浏览次数:14  
标签:误删除 mysql 备份 MySQL user sql position my2sql 倒流

背景

开发同事在操作测试库的时候,误删除了一张业务表,她问我能不能帮她找回来,我说滚!!!经不住她的软磨硬泡,我还是软了下来。

简述:

在真实的业务场景中,有时候误删除表可能不止是将这个表找回来那么简单,还需要经过业务方确认是否要补数据等处理方式。

我这里是通过备份+截取 binlog 的方式将数据恢复到删除前一个事务。

恢复思路:

  • 1、从物理备份中获取表空间 / 或者从逻辑备份中过滤出单表

  • 2、将表空间 import 到数据库 / 或者导入逻辑备份的单表

  • 3、通过 my2sql 过滤出待恢复表的 SQL语句

  • 4、将语句恢复至数据库完成恢复

1、删除一个表

drop table t_user;

2、停止业务(防止对数据二次伤害)

主库防止写入开启只读模式

set global read_only=1;

3、从物理全备恢复

解压备份文件

tar  xf  /data/backup/full.tar.gz

将备份文件重做备份路径

innobackupex --apply-log  /data/backup/full

创建一张表结构相同的表,并释放表空间

alter  table  t_user discard  tablespace;

将备份中 t_user.ibd 文件cp到生产库的相对应的库下面

cp -a  innobackupex.exp  t_user.ibd   /mydata/3306/data/test/

将文件赋权

chown -R mysql:mysql /mydata/3306/data/test/t_user.ibd

将表空间导入到生产库中

alter table t_user import tablespace;

查看数据

select * from t_user limit 10;

4、从逻辑全备恢复

如果你的是逻辑备份可以这样操作

#从全备中提取出该表的建表语句
sed -e  '/./{H;$!d;}' -e 'x;/CREATE TABLE `t_user`/!d;q' full.sql >  /tmp/t_user.sql

#提取该表的insert into语句
grep  'INSERT INTO `t_user`' full.sql >> /tmp/t_user.sql

将备份文件恢复至数据库

# 登陆数据库 执行 source
use test  # 进入库
source /tmp/t_user.sql  # 执行导入

注意:这里备份文件要手动打开看下是不是你想要的表和数据

恢复至这里已经把备份的数据恢复好了,但是备份完这段时间数据库依然在运行中,这段时间的数据都在 binlog 中,但是怎么从 binlog 中提取单个表的数据呢?

5、截取 binlog 恢复

这里选择使用 go 语言编写的 my2sql 工具进行恢复,相比于其他工具,my2sql 速度更快,功能也比较丰富。在恢复前需要先找出备份的 position 信息和 drop table 前一个position 信息用来指定恢复的位置。

项目地址:https://github.com/liuhr/my2sql

获取位置信息

获取备份结束的 position 信息

# 查看备份结束位置(--start-position位置)
cat /data/backup/full/xtrabackup_binlog_info
mysql-bin.000007    13524   # start-position位置

获取删除表前一个 position 信息

# 通过mysqlbinlog 查找删除前一个position 位置
mysqlbinlog  /mydata/3306/mysql-bin.000007 |grep  -i -B20 -C10 'drop table'

COMMIT/*!*/;
# at 43459
#240815 13:46:59 server id 330651  end_log_pos 43524 CRC32 0xd7e4f2a5   Ignorable
# Ignorable event type 33 (MySQL Gtid)
# at 43524    # 使用前一个位置点  --stop-position 位置
#240815 13:46:59 server id 330651  end_log_pos 43645 CRC32 0x0455269b   Query   thread_id=7     exec_time=0     error_code=0    xid=0
SET TIMESTAMP=1723700819/*!*/;
SET @@session.pseudo_thread_id=7/*!*/;
DROP TABLE `users` /* generated by server */

生成 sql 语句

通过my2sql 生成 users 表的 sql 语句。

安装工具

https://github.com/liuhr/my2sql

# 安装 git 和 go
yum install -y git go

git clone https://github.com/liuhr/my2sql.git
cd my2sql/
go build .

# 还可以直接下载打包好的 linux 文件 
https://github.com/liuhr/my2sql/blob/master/releases/centOS_release_7.x/my2sql

获取单表数据

my2sql  \
-user root -password 123456  -port 3306 \
-host localhost -databases test_db  -tables orders \
-work-type 2sql   -start-file  mysql-bin.000007 \
-start-pos=44863 -stop-pos=54850 \
-output-dir /tmp

-databases 指定库

-tables 指定表

-work-type 转换类型 为 sql

-start-file 指定 binlog 文件

-start-pos 指定开始位置点

-stop-pos 指定结束位置点

-output-dir 输出文件

将 sql 导入到数据库

# 登陆 mysql
mysql -uroot -p

# 导入sql
source /tmp/forward.1.sql

欢迎、点赞、收藏、转发,下期可以详细写下 my2sql 这个工具。

标签:误删除,mysql,备份,MySQL,user,sql,position,my2sql,倒流
From: https://blog.csdn.net/weixin_45385457/article/details/141226573

相关文章

  • mysql数据库 行级锁,间隙锁和临键锁详解
    目录准备查看锁命令演示普通的select语句共享锁与排他锁无索引行锁升级为表锁间隙锁&临键锁索引上的等值查询(索引为唯一索引)索引上的等值查询(索引为普通索引)索引上的范围查询(唯一索引)准备我的mysql版本是8。CREATETABLE`user`(`id`intunsignedN......
  • 最完整版Linux安装mysql8.0(保姆教程)
    目录前言删除已安装的mysql通过yum源安装mysql前言安装mysql可以通过yum源和压缩包两种方式安装,压缩包安装的mysql通常使用的是旧的SysVinit脚本,使用命令如:servicemysqlstart。如果想要交给服务器的任务管理器管理需要进行额外配置,配置中可能会出现一些问题,推荐使......
  • MySql添加用户权限问题
    MySql添加用户权限问题要为MySQL中的test用户授予所有权限,可以按照以下步骤进行:1.连接到MySQL数据库服务器mysql-uroot-p2.授予root用户所有权限grantallon*.*to'test'@'%'identifiedby'yourpassword'withgrantoption;请注意,上述命令中的lo......
  • mysql或者mariadb修改密码不生效
    /etc/init.d/mysqlstop vim/etc/my.cnf添加skip-grant-tablesmysql-urootusemysql;updateusersetpassword=PASSWORD("mynewpassword")whereUser='root';updateusersetplugin="mysql_native_password";flushprivileges;或者/etc/......
  • 基于PHP+MySQL组合开发的同城二手市场便民小程序源码系统 带完整的安装代码包以及搭建
    系统概述随着消费观念的转变和环保意识的增强,越来越多的人开始选择二手商品作为消费首选。然而,传统的二手交易方式往往存在信息不对称、交易效率低下等问题,严重制约了二手市场的发展。因此,开发一款集信息发布、搜索浏览、在线沟通、安全交易于一体的同城二手市场小程序,显得尤......
  • 【待做】【MySQL安全】内网渗透测试:MySql的利用与提权思路总结
    一、MySQL相关信息收集二、通过MySql获取服务器权限2.1获取MySql连接密码2.2MySQL口令爆破2.3MySQL哈希值爆破2.4从网站泄露的源代码中寻找数据库密码2.5通过MySql向服务器写WebShell2.6利用Unionselect写入WebShell2.7利用分......
  • docker 安装 mysql
    docker安装MySQL命令软件的共享目录统一在 /mydata 目录下安装mysql5.7版本 #docker拉取镜像命令dockerpullmysql:5.7#宿主机新建目录mkdir-p/mydata/mysql/conf/#启动一个临时的mysql容器dockerrun-p3306:3306--namemysql-eMYSQL_ROOT_PASSWORD=root......
  • 基于SpringBoot+MySQL+SSM+Vue.js的药房药品采购系统(附论文)
    获取见最下方名片获取见最下方名片获取见最下方名片演示视频技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+Mybatis+SpringBoot文字描述基于SpringBoot+MySQL+SSM+Vue.js的药房药品采购系统(附论文......
  • 基于SpringBoot+MySQL+SSM+Vue.js的旅游咨询系统
    获取见最下方名片获取见最下方名片获取见最下方名片演示视频技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+Mybatis+SpringBoot文字描述基于SpringBoot+MySQL+SSM+Vue.js的旅游咨询系统,用户,管理......
  • MySQL(DQL)
    一,SQL语言分类(1)数据查询语言(DQL:DataQueryLanguage)其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。关键字SELECT是DQL(也是所有SQL)用得最多的动词。SELECTFROMWHEREORDERBYHAVING (2)数据操作语言(DML:DataManipulationLanguage)其语......