一、背景某天,张三打算操作数据库,删除自己项目的无用数据,但是一不小心数据删多了。被误删的数据,如何恢复呢?本文将介绍相关方法,以及现成的一些工具。 */;# at 292#240914 17:16:36 server id 1 end_log_pos 345 CRC32 0x1832ced4 Table_map: `tests`. */;# at 685#240914 17:15:13 server id 1 end_log_pos 716 CRC32 0x1ea4a681 Xid = 30610COMMIT/*! `person` WHERE `id`=1 AND `name`='first' LIMIT 1; #start 4 end 395 time 2024-09-14 17:16:36命令中,新增一个参数 data to any point四、总结我们可以通过binlog找回误删的数据,前提是开启了binlog。
误删数据的几种操作 delete语句误删数据行 drop table或者truncate table误删数据表 drop database误删数据库 rm命令误删整个MySQL实例 如何事前预防误删数据 误删行数据恢复可以使用Flashback工具。 误删库/表 drop table或者truncate table误删数据表无法通过Flashback工具恢复,因为binlog_format的格式即使是ROW模式,在binlog中记录的也只是一条drop ,除了误删除数据的语句外,全部应用到临时库 为了加速数据恢复,如果这个临时库上有多个数据库,在使用mysqlbinlog命令时可以增加--database参数指定误删的表所在的数据库,避免在恢复数据时还要应用其他库日志的情况 (比如将误删除的GTID加到实例集合中),就可以恢复出需要的数据。
查看 查看mysql版本 select version(); 查看开启状态 show variables like 'log_bin'; 如果值为OFF 则未开启 ? (注:名称若带有小数点,则只取第一个小数点· 前的部分作为名称) mkdir /data/mysql/logs/ chown -R mysql.mysql /data/mysql/logs/ [mysqld ] #设置日志格式 binlog_format = row #设置日志路径,注意路经需要mysql用户有权限写 log-bin = /data/mysql/logs/mysql-bin.log #设置binlog 清理时间保留天数 expire_logs_days = 7 #binlog每个日志文件大小 max_binlog_size = 100m #binlog缓存大小 binlog_cache_size = 4m 数据存储目录 show variables like '%dir%'; # 查看binlog的目录 show global variables like "%log_bin%"; # 查看当前服务器使用的
由于头两天面试时被问了这样一个问题,如果某同事误删了某个表,你该怎么恢复? 数据库误删某表恢复方法,这个前提是针对每天有备份的数据库和开启binlog日志的 ,如果没有备份和binlog日志 恢复起来会非常非常麻烦,所以奉劝大家还是要备份!备份!备份! ****** 3 File: mysql-bin.000001 4 Position: 4666 5 Binlog_Do_DB: 6 Binlog_Ignore_DB 2 | | 7 | 类的方法 | 5 | +----+--------------+------------+ 7 rows in set (0.00 sec) 以上就是数据库表被误删或数据被误删的恢复方法 *******************总结************************ 此方法只能对启动binlog日志的mysql进行恢复 恢复过程中禁止在对数据库进行任何操作 数据库乃是企业的重中之重
下面介绍下 mysqlbinlog找回备份时间点之后的数据的办法: 做个简单的实验,将mysql的表数据删除之后,然后用mysqlbinlog 找回刚才删除的表的数据。 app where id <6; Query OK, 4 rows affected (0.01 sec) mysql> select count(1) from app; +----------+ | : 1.找到bin log的位置: /app/mysql/log -rw-rw---- 1 mysql mysql 17K Feb 4 11:43 alert.log -rw-rw---- 1 mysql mysql 13K Feb 4 12:02 master-bin.000006 可以看到 最近被修改的bin log 只有 master-bin.000006 (要是误删除跨越了好几个bin log 创建临时数据库 create database for_bak; 导出当前数据库中被误删的表 app mysqldump -uroot -ppwd my_db app > /app/mysql/app.sql
下面将基于MySQL自带的mysqldump进行数据备份,并演示一下数据被误删后的恢复操作。 数据备份恢复演示 备份前先看一下当前的数据情况。 模拟数据误删 执行备份命令成功后进行删库或删表操作,模拟误删场景 drop database test; 可以看到test库已经被删除。 恢复未备份的数据 在实际应用中,恢复数据不是这么简单的,因为备份操作基本上不会是实时的,如果昨天备份数据,今天误删了数据,那么在这之间的数据如何恢复? 基于这个信息,我们可以知道: 未备份的数据位于binlog偏移量为MASTER_LOG_POS至误删操作的偏移量。 set sql_log_bin=0; source /backup/bin.sql set sql_log_bin=1; 至此,在误删操作后,数据就恢复成功了。
from app where id <6; Query OK, 4 rows affected (0.01 sec) mysql> select count(1) from app; +--- : 1.找到bin log的位置: /app/mysql/log -rw-rw---- 1 mysql mysql 17K Feb 4 11:43 alert.log -rw-rw --- 1 mysql mysql 13K Feb 4 12:02 master-bin.000006 可以看到 最近被修改的bin log 只有 master-bin.000006 (要是误删除跨越了好几个bin log 找回数据的时候就必须一个个的bin log日志去找回了) 将这一段时间所有执行的sql语句存入到 待恢复的 sql文件中。 创建临时数据库 create database for_bak; 导出当前数据库中被误删的表 app mysqldump -uroot -ppwd my_db app > /app/mysql
下面介绍下 mysqlbinlog找回备份时间点之后的数据的办法: 做个简单的实验,将mysql的表数据删除之后,然后用mysqlbinlog 找回刚才删除的表的数据。 app where id <6; Query OK, 4 rows affected (0.01 sec) mysql> select count(1) from app; +----------+ | : 1.找到bin log的位置: /app/mysql/log -rw-rw---- 1 mysql mysql 17K Feb 4 11:43 alert.log -rw-rw---- 1 mysql mysql 13K Feb 4 12:02 master-bin.000006 可以看到 最近被修改的bin log 只有 master-bin.000006 (要是误删除跨越了好几个bin log 创建临时数据库 create database for_bak; 导出当前数据库中被误删的表 app mysqldump -uroot -ppwd my_db app > /app/mysql/app.sql
《我说》为迪B课堂的答疑系列,3分钟帮您解决数据库日常运维过程中的小难题。搜索关注腾讯云数据库官方微信,立得10元云代金券,可移动端一键管理数据库。 本期解答的问题是:MySQL误删数据如何规避? 注意事项 数据库审计目前支持:TencentDB for MySQL 5.6 版本,暂不支持 TencentDB for MySQL 5.5 版本以及 5.7 版本。 一、如何进行审计操作? UPDATE, 4. DELETE, 5. CREATE, 6. DROP, 7. ALTER, 8. REPLACE, 9. SET,10. 现就职于腾讯公司腾讯云数据库(TencentDB)产品团队,曾负责腾讯公司OMG(现PCG)事业群MySQL、MongoDB、Redis数据库平台的管理、建设以及相关运维工作,主要服务腾讯视频,企鹅号, 往期推荐 《迪B课堂:如何正确的选择云数据库》 《使用JSON类型选择MongoDB还是MySQL?》 《迪B课堂:关于MySQL备份周期》 《迪B课堂:MySQL运行时系统CPU压力大怎么办?》
MySQL误删数据救命指南:必收藏 首先看下MySQL误删数据排名最前的几种是什么,然后说几点平时预防误操作导致文件/数据丢失不成熟的建议,最后再说万一发生误操作时,怎么以最快速度进行补救。 首先看下MySQL误删数据排名最前的几种是: 1.误删文件 2.误删库、表 3.错误全表删除 / 更新 4.升级操作失误 都来看看你命中过几个,hoho。 简单说下我亲手造的一个大事故吧。 3.用delete命令删除数据时,应当先显式开启事务,这样误操作时,还有机会进行回滚。 4.要大批量删除数据时,可以将这些数据insert...select到一个新表,确认无误后再删除。 2.接上,采用共享表空间模式下,误删后立刻杀掉(kill -9)mysql相关进程(mysqld_safe、mysqld),然后尝试从ibdataX文件中恢复数据。 3.误删除正在运行中的MySQL表ibd或ibdataX文件。
对象存储COS准备了一份“防误删”和“误删恢复”攻略给大家,本文将深入介绍这两部分。 防误删:构建数据安全的第一道防线 一. .E9.AA.A4)。 误删追溯和恢复:数据的“时光机” 一、背景与意义 即使数据安全有了第一道防线保障,数据误删除的威胁依旧不可忽视。无论是操作失误还是系统故障引发的数据丢失,都可能对企业带来严重影响。 运行recoverDemo.java文件,运行成功后即可恢复被删除的数据。 总结 数据防误删和误删恢复在我们日常工作中尤为重要。 从防误删到误删恢复,我们致力于将数据丢失的风险降到最低,确保企业能够在安全可靠的环境中蓬勃发展。
1.背景 MySQL一旦误删数据库之后恢复数据很麻烦,这里记录一下艰辛的恢复过程。 2.方法 2.1首先在MySQL中查看是否打开bin目录 mysql> show variables like 'log_%'; 这里可以看到log_bin是ON的状态,恢复有望。 2.2显示当前主分支的状态 mysql> show master status; 可以看到binlog文件已经排到17号了 2.3显示mysql-bin.000001文件 mysql> show binlog events in 'mysql-bin.000001'; 2.4在MySQL的data目录下打开cmd,选择开始节点和结束节点的数据,并且存放到E盘下的update.sql中 mysqlbinlog -d testdb 是为了只更新跟testdb相关的数据。 2.5在MySQL中导入数据,执行以下命令即可 mysql> source e:update.sql;
前言 作为小站长,mysql数据库算是比较常用的了。作为运维,肯定遇到过数据被误删的情况。下面模拟数据库为误操作删除后的恢复过程。 #导入 gzip -d mysql_taskmonitor_0913.gz mysql -uroot -p123456 taskmonitor < mysql_taskmonitor_0913 清理数据库 bin/rm -f ${LOCK_FILE} ##del back 10 days before## /bin/rm -f ${BACKUP_DIR}/${DEL_BAK}*.gz 定时全量备份,每周日4点 10分 全备 10 4 * * 0 /bin/bash /opt/scripts/backup_db_taskmonitor.sh >/dev/null 2>&1 手动执行 /bin/bash /opt/scripts/backup_db_taskmonitor.sh 执行误删操作 drop database taskmonitor; 恢复准备 数据恢复,登录数据库,刷新binlog flush
举例 假设当前库的备份策略是一天一备,假如有人中午12点误删了一个库,恢复流程如下: 取最近一次的全备,也就是当天的0点 用备份恢复出一个临时库 从日志备份里,取出凌晨0点之后的日志 把这些日志除了误删数据的语句外 如果临时库上有多个数据库,可以在使用mysqlbinlog时,加上一个-database参数,用来指定误删表所在的库,这样就避免了在恢复数据时还要应用其他库日志的情况(读取无用日志) 跳过误操作的binlog 主要原因: ● 如果是误删表,最好就是只恢复出这张表,但是mysqlbinlog工具并不能指定只解析一个表的日志 ● 用mysqlbinlog解析出日志应用,应用日志的过程只能是单线程,MySQL 通过 CHANGE MASTER TO MASTER_DELAY = N 命令,可以指定这个备库持续保持跟主库有 N 秒的延迟,比如你把 N 设置为 3600,这就代表了如果主库上有数据被误删了,并且在 MySQL实例 对于一个有高可用机制的MySQL集群来说,rm删除数据后,只要不是恶意的把整个集群删除,而只是删除了其中一个节点的数据的话,HA就会开始工作,选出一个新的主库,从而保证整个集群的正常工作
,将被删除的数据重新插入到数据库。 */;# at 292#240914 17:16:36 server id 1 end_log_pos 345 CRC32 0x1832ced4 Table_map: `tests`. */;# at 685#240914 17:15:13 server id 1 end_log_pos 716 CRC32 0x1ea4a681 Xid = 30610COMMIT/*! `person`(`id`, `name`) VALUES (1, 'first'); #start 4 end 395 time 2024-09-14 17:16:36DELETE FROM `tests `person` WHERE `id`=1 AND `name`='first' LIMIT 1; #start 4 end 395 time 2024-09-14 17:16:36命令中,新增一个参数
误删数据的分类: 使用 delete 语句误删数据行; 使用 drop table 或者 truncate table 语句误删数据表; 使用 drop database 语句误删数据库; 使用 rm 命令误删整个 MySQL 实例。 误删行 如果是使用 delete 语句误删了数据行,可以用 Flashback 工具通过闪回把数据恢复回来。 Flashback 恢复数据的原理,是修改 binlog 的内容,拿回原库重放。 rm 删除数据 其实,对于一个有高可用机制的 MySQL 集群来说,最不怕的就是 rm 删除数据了。 还原后找到误操作表的.ibd文件,copy到新实例对应的位置 4、在之前创建的mysql实例上import tablespace 5、利用mysqlbinlog 处理增量数据 6、最后导出 再导入
写在前面 DBA或开发人员,有时会误删或者误更新数据 你是否有删库经历?删库是否真的无解 如果是线上环境并且影响较大,就需要能快速回滚。 本文将简单进行mysql根据binlog闪回数据的实战测试 基础知识准备 binlog是二进制日志文件,用来记录Mysql内部对数据库的改动(只记录对数据的修改操作),主要用于数据库的主从复制以及增量恢复 当我们搭建mysql主从复制的时候,两个实例之间也是通过binlog来完成数据的备份同步。 所以有这种根据binlog得到执行sql语句、闪回sql语句,我们只需要利用根据分析binlog,然后就可以找到准确的数据改动sql,并得到闪回sql,检查无误后执行就可以恢复数据了 准备工作 我们采用 server主从配置 在mysql配置文件中填写以下内容 [mysqld] server_id = 1 log_bin = /var/log/mysql/mysql-bin.log max_binlog_size
同事反馈说某个测试的MySQL数据库误删除了ibdata1文件,导致库启动不了,而且没做备份,能不能恢复? 如果误删除文件,但是数据库没进行过重启,只要删除的文件句柄还在系统中,就可以进行恢复,可以参考《Linux恢复误删文件的操作》。但是这套环境中,数据库进程已经被删除了,lsof未找到误删除的文件。 经过确认,可以不要这些数据了,能启动就行。 如果不管ibdata1,直接启动数据库,会提示如下错误, 2023-11-01T05:16:55.058805Z mysqld_safe Logging to '/mysql/3306/log/mysql-error.log 因此针对MySQL 5.7,如果误删除ibdata1,不需要数据的前提下,可以再删除ib_logfile0、ib_logfile1,让MySQL可以自动创建这几个文件,带起数据库。
实际工作中总会发生数据误删除的场景,在没有备份情况下,如何快速恢复误删数据就显得非常重要。 本文基于MySQL的binlog日志机制,当日志格式设置为“binlog_format=ROW”时,记录一步一步手动解析binlog、恢复误删数据的全过程,供大家参考使用。 *#,#g' liking-3.sql > liking-4.sql得到如下结果:head -50 liking-4.sqlDELETE FROM `数据脱敏`. 七、浏览结果做对应处理鉴于还有一些insert、update语句,只取出前面的delete语句:sed -n '1,493200p' liking-4.sql > liking-5.sql八、全文替换关键字 `数据脱敏数据脱敏`SELECT 222248 , 'CMHE-202200393' , '数据脱敏数据脱敏数据脱敏数据脱敏数据脱敏数据脱敏数据脱敏数据脱敏数据脱敏数据脱敏数据脱敏数据脱敏数据脱敏数据脱敏
在我们实际工作中,尤其在公司的测试环境下,经常会有多个业务方服务共用同一套服务器,部署自身MySQL环境。很不巧的是,会出现有MySQL数据文件被删除/误删除的情况发生。 先别着急,今天来跟大家分享一个对于MySQL数据文件被误删除后尝试恢复的办法。一旦发生上述情况,同时实例数据未做备份,是否有机会进行数据恢复呢? #当前实例 mysql> select * from t1; Empty set (0.00 sec) 4OS层获取内存中的数据 当前实例没有关闭的情况下,查看实例pid。 sec) #3、将上面准备好的数据文件放入正确目录 [root@admin-db64 data]#mv t1.ibd test/ #4、import 表空间 mysql> alter table 写在最后 今天跟大家分享了一种误删数据文件利用内存数据恢复的方法,其实还有一些其他的恢复方法,需要根据不同场景去选取最优的处理方案。 最后,需要跟大家强调的是:预防远比处理的意义大得多。