刚才进 blog 数据库手工修改一条记录,结果 UPDATE 语句忘了打 WHERE 条件,表里的所有行都被 update 了。受影响的列是用户的 Email。

然后查到 mysql -U 可以使用 safe update mode,会拒绝没有 WHERE 条件和不以 key 作为条件的 UPDATE 和 DELETE,避免误操作造成数据丢失。可以在 ~/.bashrc 中设置 alias mysql=’mysql -U’,这样每次使用 mysql 命令都会使用 safe update mode。

恢复过程如下(如果以后出现误操作可以参考):从 /var/backup/db 中找到当天的加密备份(需要 root 权限才能查看),从 /etc/automysqlbackup/automysqlbackup.conf 中找出备份的密码,执行下列命令备份当前数据库,并将凌晨的数据库恢复回去。

mysqldump -u root -p --databases ustcblog >ustcblog-now.sql
openssl enc -aes-256-cbc -d -in /path/to/backup/file.sql.gz.enc -out ustcblog-backup.sql.gz
gunzip ustcblog-backup.sql.gz
mysql -u root -p ustcblog <ustcblog-backup.sql

比较 ustcblog-now.sql 和 ustcblog-backup.sql,找出今天新增的行,把这些行使用 INSERT 语句逐一添加回去。

使用其他办法恢复被 UPDATE 覆盖的列。例如这次覆盖的是用户的邮箱地址,而这个信息在用户 blog 的数据库里也有存储。例如对于 1000 号用户:

use ub_1000;
select option_value from wp_options where option_name='admin_email';