mysql数据如何恢复到任意时间节点?mysql数据恢复,mysql数据备份

写在前面

作为互联网开发人员来说,数据安全性一直排在第一位的重中之重。

mysql作为关系型数据库的一个巨头,其备份与恢复更是大家所关心的。

今天就详细聊聊,mysql如何备份,以及被“删库跑路”之后如何恢复。

数据备份与恢复

1、全量备份

最简单的备份方式就是全量备份。

全量备份就是将数据库整库备份到磁盘中,恢复的时候再将文件读取到数据库中。

mysql可以使用mysqldump命令来执行全量备份。

模拟全量备份与恢复

1、准备数据

CREATE TABLE `stu` (
  `id` int NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

insert into stu values('1', '张一');
insert into stu values('2', '张二');
insert into stu values('3', '张三');
insert into stu values('4', '张四');
insert into stu values('5', '张五');

2、全量备份

将mytest数据库全量备份。
使用参数–single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。

mysqldump -uroot -p mytest > mytest.sql
-- 输入密码之后就会生成mytest.sql

3、删除表所有数据

truncate table stu;

4、数据恢复

mysql -uroot -p mytest < mytest.sql
-- 输入密码之后,就会恢复备份时刻的数据库全部信息

全量备份的缺点

全量备份的代价非常高。

1、数据库数据多的话,占用磁盘空间非常大。
2、每次备份需要拷贝所有数据,备份过程中占用的CPU、磁盘等资源,会严重影响系统运行。
3、为了保证数据一致性,还可能锁表,导致备份期间许多业务进入停用状态。

所以说,我们不能经常进行全量备份,基本每天一次就可以了。

这也就意味着,如果数据库的数据丢失,只能恢复到最近一次全量备份的时间点,这期间发生的数据还是丢失了。

2、增量备份

MySQL 自带了 Binlog,就是一种实时的增量备份。Binlog 里面记录的就是 MySQL 数据的变更的操作日志,开启 Binlog 之后,我们对 MySQL 中的每次更新数据操作,都会被记录到 Binlog 中。

Binlog 是可以回放的,回放 Binlog,就相当于把之前对数据库所有数据更新操作按照顺序重新执行了一遍,回放完成之后数据自然就恢复了。这就是 Binlog 增量备份的基本原理。很多数据库都有类似于 MySQL Binlog 的日志,原理和 Binlog 是一样的,备份和恢复方法也是类似的。

首先我们看mysql是否开启了binlog:

show variables like '%log_bin%';
show master status;

在这里插入图片描述
在这里插入图片描述

可以看到当前这个数据库已经开启了 Binlog,log_bin_basename 表示 Binlog 文件在服务器磁盘上的具体位置。然后用“show master status”命令可查看当前 Binlog 的状态,显示正在写入的 Binlog 文件,及当前的位置。假设我们每天凌晨用 mysqldump 做一个全量备份,然后开启了 Binlog,有了这些,我们就可以把数据恢复到全量备份之后的任何一个时刻。

模拟增量备份与恢复

1、准备数据

CREATE TABLE `stu` (
  `id` int NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

insert into stu values('1', '张一');
insert into stu values('2', '张二');
insert into stu values('3', '张三');
insert into stu values('4', '张四');
insert into stu values('5', '张五');

2、随便插入几条数据

insert into stu values('6', '张6');
insert into stu values('7', '张7');
insert into stu values('8', '张8');
insert into stu values('9', '张9');
insert into stu values('10', '张十');

3、数据删除

truncate table stu;

4、通过全量备份,恢复数据到备份时刻

mysql -uroot -p mytest < mytest.sql
-- 输入密码之后,就会恢复备份时刻的数据库全部信息

5、我们发现,后来insert的五条数据还没有恢复,此时用增量备份恢复

mysqlbinlog --start-datetime "2022-12-12 02:43:00" --stop-datetime "2022-12-12 02:46:00" /var/lib/mysql/mysql-bin.000005 | mysql -uroot -p

6、此时数据已经恢复

增量备份注意事项

恢复数据时,一定要恢复执行truncate语句之前的时间,否则binlog会将执行的truncate一起执行。
所以,恢复时一定要搞清楚数据删除的时间节点。

在回放 Binlog 的时候,指定的起始时间可以比全量备份的时间稍微提前一点儿,确保全量备份之后的所有操作都在恢复的 Binlog 范围内,这样可以保证恢复的数据的完整性。
回放 Binlog 的操作是具备幂等性的,重复回放的那部分 Binlog 并不会影响数据的准确性,所以binlog提前一点多恢复是没问题的。

总结

发生删库跑路,不要慌,还是可以恢复数据的。

正常来说全量备份+binlog就可以恢复所有的数据,但是数据安全性可并不止这些。

“不要把所有的鸡蛋放在同一个篮子中”,无论是全量备份还是 Binlog,都不要和数据库存放在同一个服务器上。最好能做到不同机房,甚至不同城市,离得越远越好。这样即使出现机房着火、光缆被挖断甚至地震也不怕。

猜你喜欢

转载自blog.csdn.net/A_art_xiang/article/details/128283203