数据恢复
前言:既然要恢复,肯定要先备份,如何备份看这篇MySQL数据库备份
全库恢复
- 先找到需要恢复的数据,解压出来
gunzip miaosha-202008061026.sql.gz
- 使用解压出来的文件,将数据恢复到指定的新数据库中
方式一,linux命令行下:
mysql -uroot -p db2 < miaosha-202008061026.sql
方式二,mysql命令行下:
source miaosha-202008061026.sql
单表恢复
- 方式一,使用MySQL数据库备份中的3.对指定表进行备份方式生成的表备份来恢复
mysql -uroot -p db2 < table_backupData.sql
- 方式二,使用MySQL数据库备份中的4.使用-tab备份到指定目录方式生成的表结构和表数据进行恢复 注意:这里需要进入mysql命令行
#导入表结构
source /usr/local/backupData/goods.sql
#导入表数据
load data infile '/usr/local/backupData/goods.txt' into table goods;
单表中的差异恢复
- 新建数据库,将数据恢复到指定的新数据库中(注意:要恢复到同一台主机的mysql实例下) 此方式一般针对的是误操作造成的数据差异,通过对两个库中的表的查询,查处差异数据,然后进行恢复 因为是针对某个表的数据的某些数据行进行恢复,数据量很少的情况下,可以用insert into select 来进行恢复,
方式一:
insert into miaosha.goods (id, goods_name,goods_title,goods_img,goods_detail,goods_price,goods_stock)
select o.* from db2.goods o
Where not exists(select 1 from miaosha.goods g where o.id = g.id);
方式二:
insert into miaosha.goods (id, goods_name,goods_title,goods_img,goods_detail,goods_price,goods_stock)
select o.* from db2.goods o
left join miaosha.goods g on o.id = g.id
where g.id is null;
指定某一时间点的数据恢复
此方式一般针对的是误操作造成的数据差异,需要把数据恢复到误操作的时间节点 前提:要有上次数据库的全备,并且开启了binlog日志,有上次全备时到现在的所有binlog日志 简单分析下:我们需要先将数据库恢复到上一次备份节点,节点后面的数据就使用来进行恢复
- 1.先将数据库恢复到上一次备份节点
mysql -uroot -p miaosha < miaosha-202008061026.sql
- 2.找到上次备份节点的二进制日志的文件名和时间点
more miaosha-202008061026.sql
- 3.找到现在的binlog日志 进入位置
cd /var/lib/mysql/
注意:binlog存放的位置,可能不一样,可通过下面命令查到
show variables like 'general_log_file';
- 4.使用mysqlbinlog对日志进行分析
mysqlbinlog --base64-output=decode-rows -vv --start-position=155 --database=miaosha binlog.000005 | grep -B3 DELETE | more
- 5.把两个节点间的数据导出到文件
mysqlbinlog --start-position=155 --stop-position=363439 --database=miaosha binlog.000005 > miaosha_diff.sql
- 6.把差异数据导入
mysql -uroot -p miaosha < miaosha_diff.sql