Time Machine 华丽营救被污的 MySQL 表
之前换新 Mac 时,Time Machine 来做的 OS X 数据迁移,立了大功。最近又立一小功。
作为一名程序员,我写了不少自己日常用的小工具,其中一些以 Web 形式搭建在自己的 Mac 上。
像往常一样利用 Web 工具记录东西,不料写错了一个值。碰巧这个工具还没有开发修改记录的功能。那就只能手撸 MySQL 了。
撸坏 MySQL 表
下边表名和字段名都打了马赛克。
相关字段是 type
,开撸:1
update table_x set type=4;
撸完去刷新 Web 页面,傻了,所有记录的类型都变成 4 了。瞬间想起 SQL 语句没加 where
限定条件,正确的语句应该是这样:1
update table_x set type=4 where id=2993;
表里有近 3000 条数据啊,现在这近 3000 条数据的 type
字段都成为 4
了。像吃了苍蝇。
Time Machine 拔刀相助
赶紧想办法恢复。首先貌似没有语句能撤销命令。
然后,找我的定时备份库,但是这个定时设置的是每天一次。如果恢复到昨天,那昨天备份时刻到现在的几十条记录就得手动去改。还是有点麻烦。
再想到 binlog,当时我没开启过 binlog,尴尬。
灵机一动,我不是有 Time Machine 嘛。MySQL 的表的数据一般存储在各自独立的文件里,能恢复这个文件到之前一两个版本就行了。赶紧用下这个月光宝盒碰碰运气。
于是用 Vim 打开 MySQL 的配置文件 /etc/my.cnf
,找到 MySQL 的数据文件存储路径的配置:1
datadir = /usr/local/var/mysql
找到被搞坏表的数据文件路径,例如我这里的 /usr/local/var/mysql/db_x/talbe_x.ibd
,然后打开 Time Machine,找到这个文件,就可以很方便的挑选中意的版本。我估算下时间,找到魔鬼命令之前的版本,选中后点击“恢复”按钮,啪叽,我那近 3000 条的数据就恢复了被搞坏前的版本。
当然,我为了安全起见,在进入 TimeMachine 之前我把 MySQL Server 服务停掉了,恢复完数据文件再重启的。
Time Machine 使用经验
先摘录下 Time Machine 偏好设置界面的说明:
Time Machine 会保留:
- 本地快照(只要空间允许)
- 过去 24 小时的每小时备份
- 过去一个月的每日备份
- 过去所有月份的每周备份
当备份磁盘装满时,最早的备份会被删除。
我用的是一个带 USB 3.0 口的移动硬盘,我的容量是 1T,做了一个 300G 的分区专门做 Time Machine 备份盘。
USB 3.0 速度会快些,现在应该是标配了吧。备份盘所需容量得看情况,我的 Mac 是 256G 硬盘,目前 Time Machine 占用了移动硬盘备份分区 300G 中的 270G 左右,显示备份数据的时间范围为 2016-05-14 ~ 2016-09-05 日。
我一般是半个月到一个月才拿出移动硬盘做次备份。
这次恢复 MySQL 表的数据文件,都不用拿移动硬盘,原因在偏好设置里也说明了。不是当你连接了移动硬盘时才做备份,平时它会将文件的版本变化存储在本地,当你连接移动硬盘时,只是将平时的备份算下增量,然后将这个增量拷贝到你的移动硬盘里。