0%

MySQL 数据恢复

MySQL 数据恢复

生产环境在执行 update 更新时,忘记使用 where 条件,造成数据丢失,需要找回误更新数据。

CentOS 版本:6.7 x86_64
MySQL 版本:5.5.49
Xtrabackup 版本:2.3.8

MySQL 恢复数据

因为 MySQL 的 binlog 格式设置为 mixed,所以无法通过 binlog 进行回滚操作;决定使用最新的全量备份找出丢失数据,再更新到生产环境;因为这两个表完全由业务人员操作,并且数据量少更新频率很低,差异数据能够通过人工方式确认。涉及到的表:v_at_portal.api_institutionsv_at_portal.api_health_networks

还原备份数据

拷贝数据库全量备份 /root 目录。

进行全量恢复准备:

innobackupex --use-memory=1G --apply-log /root/2017_05_24/2017_05_24_full

确认数据库已关闭,datadir 目录为空,进行全量恢:

innobackupex --defaults-file=/etc/my.cnf --use-memory=1G --copy-back /root/2017_05_24/2017_05_24_full

启动数据库:

chown -R mysql:mysql /home/mysql/data
service mysqld start

生成恢复脚本

找出丢失的数据,生成 update 语句脚本,在生产环境执行 update 操作:

SELECT CONCAT("UPDATE api_institutions SET api_ins_name = '",api_ins_name,"', api_ins_address = '",api_ins_address,"' WHERE api_ins_id = ",api_ins_id,';') FROM v_at_portal.api_institutions;
SELECT CONCAT("UPDATE api_health_networks SET hea_net_name = '",hea_net_name,"' WHERE hea_net_id = ",hea_net_id,';') FROM v_at_portal.api_health_networks;

PS:数据就不进行脱敏了吧,因为公司都黄啦~~~