MySQL数据被误删怎么办?

这篇具有很好参考价值的文章主要介绍了MySQL数据被误删怎么办?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

很多年前,被公司外派到一家单位驻场开发一个OA项目,两个开发对接各部门的需求,需求还要及时生效(一边开发一边使用)。有一次生产环境的一个bug本地没办法复现,由于没有测试人员,也就不存在测试环境,所以本地连了生产库去调试。不出意外的话要出意外了:在调试的过程中,我俩当作开发环境很自然的把数据给删了。

作为一名只会CRUD的小白怎么会恢复数据这么高级的操作,不过还好,经过我俩一小时的百度,在各种ctrl+c、ctrl+v的命令操作下,最终成功的把数据恢复了。

如果我当时了解数据备份恢复,也不至于这么手忙脚乱的,所以程序员掌握数据的备份恢复操作还是很重要的。最近正好在输出MySQL系列文章,所以在这里记录一下MySQL数据备份和恢复的方法及操作,希望可以帮助到跟我一样的小伙伴。

数据备份恢复工具

MySQL自带了一个数据备份的客户端mysqldump,使用mysqldump可以基于现状生成一组SQL语句(建表语句、insert语句),在数据丢失时可以通过执行这些SQL语句恢复到原始状态,从而达到备份恢复效果。但是,当数据量很大的时候,这种方式就不是很适合了,因为mysqldump是单线程执行,过多的SQL执行会使整个恢复过程过于缓慢。

所以,基于此痛点,就诞生了一款开源的多线程备份恢复工具 mydumper,其特点就是多线程、快, 具体可以前往博客进行了解,这篇博客介绍的非常的详细,这里就不多赘述。

以上两种工具都属于逻辑备份,何为逻辑备份?就是数据通过SQL语句的形式进行备份和恢复,总的来说执行速度会很慢。

还有一种物理备份方式,简单来说就是直接将表数据.ibd文件、binlog、redolog等物理文件直接copy备份,相对逻辑备份来讲物理备份速度会快很多,目前常用的物理备份工具有PXB(Percona XtraBackup) 以及MySQL8.0推出的新特性 Clone Plugin ,感兴趣的可以自行前往了解。

数据备份策略

为了避免误操作导致数据被删除,通常在生产环境中会制定数据备份策略,比如用什么工具,备份周期是一天一次还是一周一次,每次备份是全量还是增量等,这个取决于数据的重要性、数据的变动频率、备份成本等方面的需求。

下面将基于MySQL自带的mysqldump进行数据备份,并演示一下数据被误删后的恢复操作。

数据备份恢复演示

备份前先看一下当前的数据情况。

MySQL数据被误删怎么办?,大白话聊MySQL,mysql,数据库

备份数据

在使用mysqldump的时候根据自己的备份需求加一堆参数,比如下面这条命令:

mysqldump -uroot -pLeYk2qwd -h 127.0.0.1 -P3306 -A -R  --triggers --master-data=2  --single-transaction  > /backup/full.sql
  • -u -p -h -P就不用说了,毕竟作为一个客户端,连接MySQL服务还是需要用户名密码验证的。
  • -A 是用来备份这个MySQL实例所有的库,如果要备份单个库,参数为 ‘-B db1 db2’
  • -R 是用来备份存储过程及函数。
  • --triggers 用来备份触发器。
  • --master-data=2 的作用是:在备份时记录binlog的状态信息,这个后面会用到。
  • --single-transaction 的作用是:直接备份可能会因为时间过长而导致锁等待问题。为了避免这种情况,该参数对InnoDB引擎的表数据进行快照备份,减少锁等待的同时也保证了数据一致性。

更多的参数使用请参考官方文档。

执行上面的命令后就会得到一份sql备份文件。

一般数据量级在100G左右,备份时间大约在30分钟左右,所以数据量很大的情况下建议物理备份。

模拟数据误删

执行备份命令成功后进行删库或删表操作,模拟误删场景

drop database test;

MySQL数据被误删怎么办?,大白话聊MySQL,mysql,数据库

可以看到test库已经被删除。

恢复备份的数据

接下来就可以执行恢复数据命令,将刚才备份的/backup/full.sql进行恢复,命令如下:

set sql_log_bin=0;
source /backup/full.sql;

set sql_log_bin=0;是将binlog日志记录进行关闭,否则数据恢复时所执行的sql语句也会被记录到binlog中,binlog是不需要记录恢复的操作。

命令执行成功后,刚才被删的库以及表数据就被恢复了。

恢复未备份的数据

在实际应用中,恢复数据不是这么简单的,因为备份操作基本上不会是实时的,如果昨天备份数据,今天误删了数据,那么在这之间的数据如何恢复?

这个时候就体现出binlog的作用了,之前的文章介绍过,binlog会记录所有的增删改操作,所以,未备份的数据就可以通过binlog进行恢复。如何恢复呢?

上面说到,mysqldump命令中有一个参数:--master-data=2,加上这个参数后,会在备份的sql文件中记录此次备份的数据位于binlog的位置,如下图

MySQL数据被误删怎么办?,大白话聊MySQL,mysql,数据库

MASTER_LOG_FILE 的意思是此次的备份已经到‘mysql-bin.000004’这个文件了,备份最末端的数据在文件中的偏移量为MASTER_LOG_POS=2548

基于这个信息,我们可以知道: 未备份的数据位于binlog偏移量为MASTER_LOG_POS至误删操作的偏移量。

通过命令mysqlbinlog /data/mysql/mysql-bin.000004 或者 show binlog events in 'mysql-bin.000004'可以看到未备份数据的偏移量。如下图

MySQL数据被误删怎么办?,大白话聊MySQL,mysql,数据库

为了演示“恢复未备份的数据”,我在account表中添加几条数据,然后再进行「删库->恢复备份的数据->恢复未备份的数据」的操作。备份状态如下图

MySQL数据被误删怎么办?,大白话聊MySQL,mysql,数据库

再次执行恢复命令后,会发现新添加的这两条数据不存在。

MySQL数据被误删怎么办?,大白话聊MySQL,mysql,数据库

此时,备份的数据和binlog的状态对应如下图

MySQL数据被误删怎么办?,大白话聊MySQL,mysql,数据库

然后先执行以下命令将未备份的数据SQL语句导出来

mysqlbinlog --start-position=2770 --stop-position=3327 /data/mysql/mysql-bin.000004 >/backup/bin.sql 

再登录到mysql服务执行以下命令即可恢复到删库前的状态。

set sql_log_bin=0;
source /backup/bin.sql
set sql_log_bin=1;

至此,在误删操作后,数据就恢复成功了。

可能会有人问“binlog也被删除了呢?怎么恢复?”,这个就涉及到主从复制、高可用模式了。下篇文章会介绍,感兴趣的话点点关注吧。

在这要说明一下,MySQL5.7后默认开启了GTID(全局事务标识符)特性,用于简化 MySQL 主从复制和故障恢复,也可以应用到刚才的恢复未备份的数据中。跟基于偏移量导出binlog相比,执行基于gtid的sql可以保证唯一性、幂等性,功能更丰富。操作与偏移量相似,这里就不演示了,贴一个相关的命令作为参考

-- 导出gtid为1至10,不包括6和9的sql语句,
mysqlbinlog --skip-gtids --include-gtids='xxxxxxx-1xxxx-xxxx-0xxxxxx:1-10' --exclude-gtids='xxxxxxx5-axxxx-1xxx-8xxx-0xxxx:6','48xxxx5-axxx-1xxa-xxxxxx:9' mysql-bin.000004 >/backup/bin.sql 

总结

mysqldump只是进行了数据的备份,无法做到完全的恢复,在恢复数据时还要借助binlog对未及时备份的数据进行恢复。

虽然现在许多公司倾向于使用云端的高可用性集群数据库,忽略了对备份恢复操作的关注,但为了安全起见,仍需掌握数据备份与恢复的操作。这样可以在突发情况下,可以采取应对措施,减少事故带来的损失。文章来源地址https://www.toymoban.com/news/detail-789246.html

到了这里,关于MySQL数据被误删怎么办?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL数据库忘记密码怎么办?教你一招

    文章目录 1.以管理员身份打开cmd,关闭Mysql服务 2. 跳过密码授权登录  3.再继续以管理员身份打开一个cmd窗口,进行重置密码  4.使用新密码重新登录mysql验证  5.使用Navicat可视化工具连接Mysql Mysql数据库之前安装好了,但是突然忘记当初自己设置的登录密码了,导致使用Navi

    2024年02月04日
    浏览(46)
  • SQL中如何用快照,恢复被误删的数据?

    什么是快照 数据库快照是sql server 2005的一个新功能。MSDN上对它的定义是: 数据库快照是数据库(称为“源数据库”)的只读静态视图。在创建时,每个数据库快照在事务上都与源数据库一致。在创建数据库快照时,源数据库通常会有打开的事务。在快照可以使用之前,打开

    2024年02月13日
    浏览(36)
  • ubuntu mysql密码忘记了怎么办,ubuntu怎么查看mysql密码

    1.首先输入以下指令: sudo cat /etc/mysql/debian.cnf 运行截图如下: 2. 再输入以下指令: mysql -u debian-sys-maint -p //注意! //这条指令的密码输入是输入第一条指令获得的信息中的 password = ZCt7QB7d8O3rFKQZ 得来。//请根据自己的实际情况填写! 运行截图如下: (注意! 这步的密码输入的是

    2024年02月12日
    浏览(40)
  • MySQL分页查询慢怎么办

    今天看到一个问题。 MySQL分页查询慢怎么办? 第一反应是用limit限制返回的条数。 比如 实际上我们限制的只是返回的条数是100,并不是查询时就从第10条开始获取数据。 所以实际上MySQL会从第0条开始查询,得到10+100=110条数据,然后放弃掉前面10条数据,返回100条数据。 所以

    2024年02月11日
    浏览(37)
  • Navicat 无法连接 MySQL 怎么办?

    Navicat 是图形化操作 MySQL 的强大工具,但是当数据库的服务器没有开放 3306 端口给办公网络时,在办公网使用 navicat 连接数据库是连不上的。要操作数据库,只能先 ssh 登陆到数据库服务器,然后在黑屏敲命令操作数据库,非常不友好,会有一些换行看不清、乱码等问题。 这

    2024年02月11日
    浏览(31)
  • windows下mysql忘记密码怎么办?

    【Win + r】,之后输入【SERVICES.MSC】然后回车,会打开服务列表,在服务列表输入【mysql】即可选中mysql对应服务,找到自己的mysql服务,我的是MYSQL57选中它【右键】单击,然后点击【停止】选项即可停止mysql服务。

    2024年02月12日
    浏览(52)
  • MySQL的ID用完了,怎么办?

    目 录 一 首先首先分情况 二  自增ID 1 mysql 数据库创建一个自增键的表 2 导出表结构 3 重新创建 自增键是4294967295的表 4 查看表结构 5 异常测试 三 填充主键 1 首先创建一个test 表,主键不自增 2 插入主键最大值 3 再次插入主键最大值+1 四 没有声明主键 1 在创建表没有声明主

    2024年02月03日
    浏览(24)
  • docker中mysql忘记密码怎么办?

    进入容器:docker exec -it mysql bash 修改mysql配置: [mysqld] skip-host-cache skip-name-resolve skip-grant-tables 进入mysql交互环境:mysql -uroot -p( 备注:不要输入密码直接点击enter键进入 ) 重置密码为空:update user set authentication_string=‘’ where user=‘root’; 生效配置:flush privileges; 重置新密码

    2024年02月07日
    浏览(38)
  • mysql占用cpu超过100%怎么办?mysql占用cpu特别高的解决方法!

    前段时间我的一个网站经常打不开,通过检查发现服务器cpu占用超过100%;通过top命令发现是mysql占用cpu特别高导致的,于是优化了mysql语句,mysql升级到了mysql8最新版本等,但是并没有什么卵用。过几天有出现这种情况。甚至以为是服务器配置太低了,准备升级配置。 后面分

    2024年02月08日
    浏览(42)
  • 重新安装mysql时,Windows Service Name已经被占用了怎么办

    重新安装mysql时,Windows Service Name已经被占用了怎么办,如图: 解决办法: 一,以管理员身份运行命令提示符(直接在搜索栏输入:cmd); 运行之后: 二, 输入命令:sc delete MySQL80(输入重复的Windows Service Name,我MySQL的Windows Service Name是MySQL80,你输入你的Windows Service Name)

    2024年02月12日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包