如果所有数据被意外删除,是否可以将表恢复到上次的数据。
ycl3bljg1#
还有另一种解决方案,如果您的服务器上有活动的二进制日志,则可以使用mysqlbinlog生成一个sql文件
mysqlbinlog
mysqlbinlog binary_log_file > query_log.sql
字符串然后搜索你丢失的行。如果你没有激活它,没有其他解决方案。下次做备份。
weylhg0b2#
有点.使用phpMyAdmin我只是删除了一行太多.但我抓住了它之前,我继续和大部分的数据从删除确认消息.我能够重建记录.但确认消息截断了一些文字评论.比我更了解phpMyAdmin的人可能知道一个设置,这样你就可以得到一个更完整的删除确认消息的回声。有了一个完整的删除消息,如果你放慢速度并发现错误,你可以恢复整个记录。(PS此应用程序还发送创建记录的提交的电子邮件。如果客户端有副本,我将能够完全恢复记录)
5lwkijsr3#
正如Mitch所说,备份数据是最好的方法。然而,根据情况或所使用的DB服务器,可能会部分提取丢失的数据。在大多数情况下,如果没有任何备份,您就不走运了。
2nbm6dog4#
对不起,但这是不可能的,除非你做了备份文件之前。编辑:实际上这是可能的,但它变得非常棘手,如果数据不是真的,真的很重要,你就不应该考虑它。你看:当数据从计算机中删除时,它仍然保留在磁盘上的同一位置,只有其扇区被标记为空。因此数据保持完整,除非它被新数据覆盖。有几个程序设计用于此目的,有公司谁专门从事数据恢复,虽然它们相当昂贵。
guykilcj5#
对于InnoDB表,Percona has a recovery tool which may help。它远非故障安全或完美,并且在意外删除后停止MySQL服务器的速度有很大影响。如果你足够快,更改可以恢复相当多的数据,但恢复 * 所有 * 数据几乎是不可能的。当然,适当的每日备份,binlog,可能还有一个复制从站(这对意外删除没有帮助,但在硬件故障的情况下确实有帮助)是要走的路,但是这个工具可以让你在没有这些东西的时候尽可能多地保存数据。
rekjcdws6#
不,这是不可能的。唯一的解决办法是定期备份。这是非常重要的。
8cdiaqws7#
如果你在默认配置下运行服务器,去获取你的备份(你有备份,对吗?)-通常,数据库不会保留你的数据的以前版本,或者修改的版本:只有当前状态。(或者,如果您通过自定义前端删除了数据,很可能前端实际上并没有发出删除命令:许多表都有一个is_deleted字段或类似字段,这只是由前端切换。请注意,这是前端应用程序中实现的“软删除”-在这种情况下,数据实际上并没有被删除;如果您实际上发出了DELETE、TRUNCATE或类似的SQL命令,则这不适用。)
is_deleted
DELETE
TRUNCATE
yqkkidmi8#
如果你使用binlog和binlog_format=ROW,这两个都是mysql 8.0的默认值,并且没有在可用binlog文件的生命周期内完成完整备份,即在binlog_expire_logs_seconds的配置时间之后完成mysqldump,以执行建议的Point-in-Time Recovery,然后你仍然可以尝试恢复删除的行,只使用一个binlog文件,该文件覆盖了这些删除的事件,并在https://github.com/lefred/MyUndelete/issues/5中使用这种方法将它们转换为插入事件:它可以用http://thenoyes.com/littlenoise/?p=307中的原始awk脚本替换事件类型:
binlog
binlog_format=ROW
binlog_expire_logs_seconds
mysqldump
BEGIN { regexp = "$^" } /^BINLOG/ { print; getline; regexp = "^" substr($0, 1, 5) "[CSiy][ABCD]" substr($0, 8, 4); } $0 ~ regexp { n = $0; $0 = substr(n, 1, 5) $0 = $0 substr("BRhx", index("CSiy", substr(n, 6, 1)), 1) $0 = $0 substr("4567", index("ABCD", substr(n, 7, 1)), 1) $0 = $0 substr(n, 8) ; } { print; }
个字符
jbose2ul9#
如果您使用MyISAM表,则可以恢复您删除的任何数据,只需打开文件:mysql/data/[your_db]/[your_table].MYD用任意文本编辑器
9条答案
按热度按时间ycl3bljg1#
还有另一种解决方案,如果您的服务器上有活动的二进制日志,则可以使用
mysqlbinlog
生成一个sql文件
字符串
然后搜索你丢失的行。如果你没有激活它,没有其他解决方案。下次做备份。
weylhg0b2#
有点.使用phpMyAdmin我只是删除了一行太多.但我抓住了它之前,我继续和大部分的数据从删除确认消息.我能够重建记录.但确认消息截断了一些文字评论.
比我更了解phpMyAdmin的人可能知道一个设置,这样你就可以得到一个更完整的删除确认消息的回声。有了一个完整的删除消息,如果你放慢速度并发现错误,你可以恢复整个记录。
(PS此应用程序还发送创建记录的提交的电子邮件。如果客户端有副本,我将能够完全恢复记录)
5lwkijsr3#
正如Mitch所说,备份数据是最好的方法。
然而,根据情况或所使用的DB服务器,可能会部分提取丢失的数据。在大多数情况下,如果没有任何备份,您就不走运了。
2nbm6dog4#
对不起,但这是不可能的,除非你做了备份文件之前。
编辑:实际上这是可能的,但它变得非常棘手,如果数据不是真的,真的很重要,你就不应该考虑它。你看:当数据从计算机中删除时,它仍然保留在磁盘上的同一位置,只有其扇区被标记为空。因此数据保持完整,除非它被新数据覆盖。有几个程序设计用于此目的,有公司谁专门从事数据恢复,虽然它们相当昂贵。
guykilcj5#
对于InnoDB表,Percona has a recovery tool which may help。它远非故障安全或完美,并且在意外删除后停止MySQL服务器的速度有很大影响。如果你足够快,更改可以恢复相当多的数据,但恢复 * 所有 * 数据几乎是不可能的。
当然,适当的每日备份,binlog,可能还有一个复制从站(这对意外删除没有帮助,但在硬件故障的情况下确实有帮助)是要走的路,但是这个工具可以让你在没有这些东西的时候尽可能多地保存数据。
rekjcdws6#
不,这是不可能的。唯一的解决办法是定期备份。这是非常重要的。
8cdiaqws7#
如果你在默认配置下运行服务器,去获取你的备份(你有备份,对吗?)-通常,数据库不会保留你的数据的以前版本,或者修改的版本:只有当前状态。
(或者,如果您通过自定义前端删除了数据,很可能前端实际上并没有发出删除命令:许多表都有一个
is_deleted
字段或类似字段,这只是由前端切换。请注意,这是前端应用程序中实现的“软删除”-在这种情况下,数据实际上并没有被删除;如果您实际上发出了DELETE
、TRUNCATE
或类似的SQL命令,则这不适用。)yqkkidmi8#
如果你使用
binlog
和binlog_format=ROW
,这两个都是mysql 8.0的默认值,并且没有在可用
binlog
文件的生命周期内完成完整备份,即在binlog_expire_logs_seconds
的配置时间之后完成mysqldump
,以执行建议的Point-in-Time Recovery,然后你仍然可以尝试恢复删除的行,只使用一个
binlog
文件,该文件覆盖了这些删除的事件,并在https://github.com/lefred/MyUndelete/issues/5中使用这种方法将它们转换为插入事件:它可以用http://thenoyes.com/littlenoise/?p=307中的原始awk脚本替换事件类型:
个字符
jbose2ul9#
如果您使用MyISAM表,则可以恢复您删除的任何数据,只需
打开文件:mysql/data/[your_db]/[your_table].MYD
用任意文本编辑器