MySQL备份与恢复

时间:2022-09-22 08:31:54

首先中要的一点,需要在配置文件中加入log-bin配置项:

 log_bin=mysql-bin

然后会在数据存储的目录(视不同的操作系统)出现mysql-bin.000001文件,这就是用来做恢复的文件.这个会在重启或者是调用FLUSH LOGSsql代码就会生成新的一个文件.

恢复删除数据的思路

重新生成数据库

1.假如我们不小心操作数据库的时候删除了或者批量更改了数据
这时候
我们需要这样进行处理:

mysqlbinlog --start-datetime= "2016-1-1 12:00:00"  --stop-datetime="2016-1-2 12:00:00" /usr/local/var/mysql/mysql-bin.0* > /tmp/bak.sql

起始时间要恢复数据的起始时间(可以设置久远一点,这样可以导出数据库全部数据了),截止时间为误操作的时间(如果不知道,只能整个导出mysql-bin.000001文件,然后查找相应的删除语句,就会有对应的时间戳与position),上述代码会生成可执行的sql语句 注意是在这个时间段的并且属于mysql-bin.000001这个文件的.注意mysql-bin.0* 会把所有的mysql-bin文件集体导出到/tmp/bak.sql文件当中.

2.我们现在得到了要恢复的文件/tmp/bak.sql文件,先把当前的数据库(被修改的)导出一份,以防万一.

mysqldump -uroot -p -databases dbname > /tmp/my.sql

或者

mysqldump -uroot -p -A > /tmp/my.sql

3.删除当前数据库

drop database dbname 

4.导入从二进制文件的数据

mysql -uroot -p < /tmp/bak.sql

这种方式最直接,操作简单.
至此数据库恢复完毕,其中可能遇到一些问题.

问题1 分散的数据

假设我们执行的是这样一条sql语句:

update orders set name = '1liu' where id = '1liu'; 

这样的语句注意idint类型, sql语句不会报错,并且会查找id为1的name字段更新.

先别惊讶,你可以试下,首先更严重的问题是,你需要怎么恢复?

这条语句直观反应的问题比较简单,在实际环境中你可能会遇到比这严重多的多的后果.

按上述方式恢复坑定的需要不少的时间,有之前这些修改之前的数据还好说,没有的话就很难办.
最最主要的问题是如何查找到我们之前插入的语句,而且上述执行更改的数据可能是分散的,那就更难办了.这样的话只能是重新恢复数据库.

问题2 mysql-bin的文件被删除

你可能会遇到这样的情况,服务器的磁盘空间不知不觉的被占满,结果一看是mysql-bin的二进制文件占用过多的空间,有些人没有删除这些文件之前使用mysqldump进行备份,那么可以说这是个噩耗,在没有二进制文件可恢复与备份的情况下删除数据库,那么恢复数据会很困难.

建议:再删除这些文件之前,一定要使用mysql-dump进行一次数据备份,进行mysql-dump会生成一个最新的mysql-bin文件.