首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysqlbinlog 恢复单表

基础概念

mysqlbinlog 是 MySQL 数据库提供的一个工具,用于读取二进制日志(binary log)文件。二进制日志记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间。通过 mysqlbinlog 工具,可以用来恢复数据,例如在误删除或数据丢失的情况下。

相关优势

  1. 灵活性:可以恢复到指定的时间点或事件点。
  2. 精确性:可以针对单个表进行恢复,而不是整个数据库。
  3. 安全性:在恢复过程中不会影响到其他正常运行的数据库服务。

类型

  • 基于时间点的恢复:指定一个时间点,恢复到该时间点之前的状态。
  • 基于事件的恢复:指定一个事件,恢复到该事件之前的状态。
  • 基于位置的恢复:指定一个日志文件的位置,恢复到该位置之前的状态。

应用场景

  • 数据误删除:当不小心删除了重要数据时,可以通过 mysqlbinlog 恢复。
  • 数据库备份恢复:在数据库备份不可用时,可以通过二进制日志进行恢复。
  • 数据库迁移:在数据库迁移过程中,可以使用 mysqlbinlog 来同步数据。

遇到的问题及解决方法

问题:为什么使用 mysqlbinlog 恢复单表时,表结构没有恢复?

原因mysqlbinlog 默认只恢复数据,不恢复表结构。表结构通常在数据之前就已经存在,因此不会被记录在二进制日志中。

解决方法

  1. 手动创建表结构:首先手动创建需要恢复的表结构。
  2. 使用 --no-defaults 选项:在恢复数据时,使用 --no-defaults 选项,这样可以确保表结构也被恢复。
代码语言:txt
复制
mysqlbinlog --no-defaults /path/to/binlog-file | mysql -u username -p

问题:为什么恢复过程中出现了乱码?

原因:可能是由于字符集不一致导致的。

解决方法

  1. 检查字符集:确保恢复的数据库和表的字符集一致。
  2. 指定字符集:在恢复时指定正确的字符集。
代码语言:txt
复制
mysqlbinlog --no-defaults --character-set=utf8 /path/to/binlog-file | mysql -u username -p --default-character-set=utf8

示例代码

假设我们有一个名为 employees 的表,误删除了一些数据,现在需要使用 mysqlbinlog 进行恢复。

  1. 找到二进制日志文件
代码语言:txt
复制
SHOW BINARY LOGS;

假设找到的日志文件名为 mysql-bin.000001

  1. 恢复数据
代码语言:txt
复制
mysqlbinlog --no-defaults /var/lib/mysql/mysql-bin.000001 | grep 'UPDATE employees' | mysql -u username -p employees

参考链接

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • MySQL恢复步骤详解

    万幸的是,只是写花了,而不是哪位大神在DB里面玩drop table。...虽然已经很久没进行恢复了,但大致步骤都还在脑海中,没花多久就搞定了~ 言归正传,记录一下恢复的步骤和关键点,提醒自己也提醒大家。...具体操作举例如下: ### 使用mysqlbinlog将二进制日志转化为明文SQL日志 mysqlbinlog mysql-bin.000123 > /data1/000123.sql ### 使用linux...第四步: 在主库上将写花的改名,其目的有二个,其一,停止对这个的写入(当然这对业务会有一定的影响,会出现一段时间内的写入失败报警,需要提前和业务部门联系好),其二,一旦恢复失败,至少还有一个写花的存在...第五步: 基本DBA的事情就没有了,这时候就需要告诉开发同学恢复完毕,进行应用测试及数据正确性效验了。如果一切都没有问题之后,我们需要将刚才rename的drop掉,整个恢复操作就算大功告成了。

    2.2K10

    mysqlbinlog命令详解 Part 10 恢复MySQL

    命令的详解 mysqlbinlog是MySQL中用来处理binlog的工具 上节的内容为新建一个备份策略 这节内容讲如何使用mysqldump恢复MySQL 1....-p 1.3 恢复至最新状态 如果损坏数据库的二进制文件还存在,则可利用其进行恢复 假设周五零点到九点的二进制文件为mysql-bin.000006 mysql-bin.000007 则可以使用如下命令...shell> mysqlbinlog mysql-bin.000006 mysql-bin.000007 | mysql -h127.0.0.1 -usystem -P3306 -p 1.3.1 基于时间点恢复...这里我们同样可以恢复到早上8点 首先使用mysqlbinglog查看早上8点在哪个二进制文件中 这里假设在mysql-bin.000007 中 之后用如下语句恢复 mysqlbinlog --stop-datetime...我们同样可以通过事件的位置来进行恢复 我们假设一个drop的操作发生在master-bin.000007的位置100处 我们可以使用下面语句 mysqlbinlog --stop-position

    85110

    MySQL如何快速恢复(物理方式)

    ---+ | 1 | 张三 | | 2 | 李四 | | 3 | 王二 | +----+--------+ 3 rows in set (0.00 sec) 物理复制方法介绍 上述物理复制的方法...简单总结一下上述物理复制过程: 1、create table like语法创建一个相同结构的空的目标 2、目标执行alter table discard,丢弃ibd文件 3、源执行flush...table for export语法,生成.cfg文件,并锁 4、使用cp命令复制源cfg文件和ibd文件为目标 5、unlock tables 释放源的cfg文件和锁 6、alter table...table_name.cfg的文件 5、处理完复制后,需要使用UNLOCK tables释放源的MDL锁或者断开连接。...注意: 因为flush table for export锁,所以这种方法更适合在从库上停掉复制关系,然后执行这个复制的操作。如果有业务操作当前的源,需要谨慎考虑。

    1.6K80

    从全备中恢复库或,小心有坑!

    不清楚你有没有做过恢复恢复场景可能就比较多了,比如我想恢复某个库或某个等。那么如何从全备中恢复库或,这其中又有哪些隐藏的坑呢?这篇文章我们一起来看下。...1.如何恢复库或 前面文章有介绍过 MySQL 的备份与恢复。...-uroot -pxxxx --one-database testdb < all_db.sql 除了上述方法外,恢复库或还可以采用手动筛选的方法。...这个时候 Linux 下大名鼎鼎的 sed 和 grep 命令就派上用场了,我们可以利用这两个命令从全备中筛选出库或的语句,筛选方法如下: # 从全备中恢复库 sed -n '/^-- Current...all_db.sql | grep --ignore-case 'insert into `test_tb`' > /tmp/test_tb_data.sql 2.小心有坑 对于上述手动筛选来恢复库或的方法

    1K30

    SQL Server数据库的数据恢复

    SELECT CONVERT(INT,RAND()*1000),'AA',GETDATE()GO 30这里插入了30条数据select count(*) from Tab where name='AA';当前的总行数....20240117.2.bak' WITH COMPRESSION,INIT,FORMAT,NAME = N'OldDatabase.log.20240117.2.bak';7、做一个作update全更新操作...LSNupdate 对应的是LOP_MODIFY_ROW, delete对应的是LOP_DELETE_ROWS, insert对应的是LOP_INSERT_ROWS-- 填入库名和操作类型,即可看到某个的操作历史类型...这里的文件路径是随手写的,因为只是临时数据恢复用下,用完这个库就删掉了,也不会产生多大影响4、再逐个恢复事务日志-- 恢复第一个日志RESTORE LOG [NewDatabase] FROM DISK...= N'D:\OldDatabase.log.20240117.1.bak' WITH NORECOVERY, NOUNLOAD, STATS = 10;-- 恢复第N个日志(步骤省略)-- 恢复最后一个日志

    38910

    CentOS下利用mysqlbinlog恢复MySQL数据库

    我今天就因为不小心删除了某个数据库,但最后的备份是1个礼拜前的,唯一能解决的办法就是通过mysqlbinlog恢复了。...解决方案如下: 如果MySQL服务器启用了二进制日志,你可以使用mysqlbinlog工具来恢复从指定的时间点开始(例如,从你最后一次备份)直到现在或另一个指定的时间点的数据。...指定恢复时间 对于MySQL5.1.54,可以在mysqlbinlog语句中通过–start-date和–stop-date选项指定DATETIME格式的起止时间。...举例说明,比如在今天下午14:02(今天是2012年3月15日),不小心执行SQL语句删除了一个数据,但发现没有最新的备份(当然,这只是开发环境,并不是正式的生产环境,正式环境还得定时做数据备份)。...要想恢复和数据,可以通过mysqlbinlog恢复指定时间的备份,输入: mysqlbinlog –stop-date=”2012-03-15 14:02:00″ /data1/log/mysql/mysql-bin

    4.8K110

    MySQL用全库备份数据恢复数据

    备份数据库时,采用了全库备份,但是因为某些原因需要回滚一个的数据到备份数据库上,如果回滚整个库就比较费时间,因为可能这个只有几十M,但是其它可能有十几上百G,这时候就需要将需要恢复提取出来了...现在有备份库fdcsqlMySQL-2018_11_30-03_00_01.sql,里面有多张,现在需要恢复其中fdc_document这张的数据 提取建表语句 sed -e '/....d;}' -e 'x;/CREATE TABLE `名`/!d;q' mysqldump.sql(备份文件的文件名) sed -e '/./{H;$!...40101 SET character_set_client = @saved_cs_client */; 提取数据 grep 'INSERT INTO名' mysqldump.sql(备份文件的文件名...,就可以正常恢复数据了 建库建 先创建数据库,再根据上面的SQL语句创建fdc_document 导入数据 MySQL [document]> souce /data/backup/mysql/

    92810

    oracle恢复数据

    误删或者delete from XXX没有带条件清空后不要慌,能恢复的,咱有flashback table咱怕啥 只要删除的人没有加PURGE就好。...oracle还是够抗造的 一、删恢复 flashback table tablename_has_deleted to before drop 二、清数据恢复 1.确认一下数据对不对,是不是你想恢复的节点...yyyy-mm-dd hh24:mi:ss’); 国内要注意时区的问题,需要减8小时 有可能你用实际的时间点查询报错,ora-没记住,基本上是因为你输入时间太靠前了,系统都没到达这个时间点 2.恢复数据...TABLENAME_DATA_CLEANED as of timestamp to_timestamp(‘误操作的时间点前一丢丢’, ‘yyyy-mm-dd hh24:mi:ss’)); 谨慎一点先备份,视情况决定要不要清...create table TABLENAME_DATA_CLEANED_BAK as select * from TABLENAME_DATA_CLEANED – 备份一下如果表里有数据的话

    1.1K10

    到分库分的平滑迁移

    背景我们接下来用电商作为案例分享业务视角在业务初期,数据库基本上都是由实现的,这样既可以快速支持业务试错,同时又可以把资源成本控制到最低,但随着业务不断发展,数据量也会呈指数形式增长,最终会发现无法支撑业务快速发展...技术视角根据前人经验,最多支撑2000W左右的数据,如果数据量再增长,则会影响读写效率,就需要对进行分库的改造存在的问题:性能瓶颈:随着数据量的增加,数据库的读写、查询性能会逐渐下降...:的架构很难做到高可用性和灾备。...而且,数据恢复的时间较长,影响业务的正常运行。扩展性问题:随着业务的发展,数据量和访问量不断增加,的架构很难通过简单的扩展来满足需求。...架构升级历程参考:数据库架构演变过程这里我们直接一步到位,实现到垂直拆库,水平分迁移过程场景汇总新老数据读写老数据是是老数据是是迁移步鄹实现新数据的读和写的能力实现老数据到新数据的同步(监听binlog

    12710

    RDS更新数据恢复

    收到公司产品人员消息,让我恢复一个的数据 通过了解系统是公司很多年前的一个老系统,面向美国用户的,数据库是阿里云的rds 所在区为美国弗吉尼亚mysql版本为5.6,产品在update操作时候字段名称写错了...binlog日志进行恢复 登录rds控制台在备份恢复的日志备份中找binlog 发现binlog每4个小时备份一次,需要的日志没有下载列表 2.既然需要的日志,是不是可以通过全备进行恢复整个(由于是老系统这基本不会更新...),不过看到全备的文件压缩后30多个G就放弃这种方法(30G下载就需要很长时间了) 3.第三种方法远程获取binlog日志 mysqlbinlog --read-from-remote-server...远程获取Binlog日志 通过客户端连接实例,执行如下SQL语句,查看并记录logs中的Log_name列值,该值即为Binlog日志文件名,例mysqlbin.xxx。...原因是远程获取日志没有以二进制日志格式方式来保留日志解析不了,还是不能进行恢复 最后通过远程获取时加 -vv进行解析重定向到文件中 .

    6.3K101

    到分库分的平滑迁移

    背景我们接下来用电商作为案例分享业务视角在业务初期,数据库基本上都是由实现的,这样既可以快速支持业务试错,同时又可以把资源成本控制到最低,但随着业务不断发展,数据量也会呈指数形式增长,最终会发现无法支撑业务快速发展...技术视角根据前人经验,最多支撑2000W左右的数据,如果数据量再增长,则会影响读写效率,就需要对进行分库的改造存在的问题:性能瓶颈:随着数据量的增加,数据库的读写、查询性能会逐渐下降...:的架构很难做到高可用性和灾备。...而且,数据恢复的时间较长,影响业务的正常运行。扩展性问题:随着业务的发展,数据量和访问量不断增加,的架构很难通过简单的扩展来满足需求。...架构升级历程参考:数据库架构演变过程这里我们直接一步到位,实现到垂直拆库,水平分迁移过程场景汇总新老数据读写老数据是是老数据是是迁移步鄹实现新数据的读和写的能力实现老数据到新数据的同步(监听binlog

    33521

    空间时间点恢复

    在Oracle中,通常所有的空间都要在同一个时间点上保持一致。但实际工作中,有时我们需要在同一个数据库中,把部分数据恢复到不同的时间点。这时就要用到RMAN的空间时间点恢复功能。...参考官方文档《Backup and Recovery User's Guide》21 Performing RMAN Tablespace Point-in-Time Recovery (TSPITR) 空间时间点恢复实质是先将指定空间按照时间点恢复到一个辅助的实例...姚远老师这里计划把MVA这个空间恢复到第13个归档日志的时间点,使用下面的RMAN命令进行空间的时间点恢复。...完成恢复空间为offline的状态,需要备份后再改为online。...如果是恢复PDB中的空间,可以使用类似下面的命令 RECOVER TABLESPACE PDBA:MVA UNTIL LOGSEQ 30 AUXILIARY DESTINATION '/u01/tmp

    29430

    替换加密

    通用特性 明文与密文一一对应 密钥空间较小的情况下,采用暴力破解方式 密文长度足够长的时候,使用词频分析 Caesar 凯撒密码加密时将明文中的每个字母都按照其在字母中的顺序向后(或向前)移动固定数目...(循环移动)得到密文,解密时将密文中的每个字母都按照其在字母中的顺序向前(或向后)移动固定数目(循环移动)得到明文。...else: return 'Err' return self.value 凯撒密码扩展 基于密钥的凯撒密码,给定一个密钥,将密钥的每一位转换为数字(字母对应顺序的数字...Atbash Cipher 埃特巴什码使用字母中的最后一个字母代表第一个字母,倒数第二个字母代表第二个字母,以此类推进行替换。

    29330
    领券