我最近搞错了一个查询,导致 MySQL 中的一个表被删除。我还意识到我没有一个 cron 来执行夜间 SQL 转储。但我有一个夜间磁盘映像,我已将其恢复并安装在数据库服务器上。
我在 ~/my_restore/var/lib/mysql 中发现了一个巨大的“ibdata1”文件,听起来它可能是我的数据库。
是否有一个命令可以运行来直接从数据库文件中进行转储?
或者也许我应该停止 mysql 并更新 /etc/mysql/my.cnf 以指向新的数据文件?
在我把愚蠢变得更愚蠢之前,我只是想得到一些建议。
答案1
首先,获取正在运行的 mysql 服务器的磁盘映像几乎肯定会导致备份损坏。这是一个糟糕的备份策略,您应该尽快纠正。Mysqldump 是首选工具,其次是停止 mysql 服务器。
无论如何,如果我处于您的位置并且可以承受一些停机时间,我会遵循以下步骤。
- 使用支持的方法对当前数据库进行备份(不想在修复过程中使情况变得更糟)。
- 停止 Mysql 服务器
- 将 mysql 数据目录重命名为某个临时位置(mv /var/lib/mysql /var/lib/mysql_production)
- 尝试将磁盘映像中的数据恢复到 /var/lib/mysql
- 启动mysql服务器并查看错误
- 对“恢复的”数据进行备份/导出。
- 切换回生产数据库
- 停止服务器
- git 删除恢复的 /var/lib/mysql
- 将 /var/lib/mysql_production 移回 /var/lib/mysql
- 启动 mysql 服务器
- 从您导出的恢复数据中选择性地恢复单个表/数据/等等。
答案2
备份 MySQL 的最佳方法是通过 导出 MySQL 数据mysqldump
。在运行时拍摄整个服务器的映像只会导致服务器可能损坏。
因此,我建议如下。
- 恢复您拥有的图像。
- 一旦恢复,请登录并
mysqldump
在有问题的数据库上运行。 - 将导出的 MySQL 文件重新导入到您的工作设置中。