MySQL数据库备份与恢复

    科技2025-12-20  11

    造成数据丢失都有什么原因呢?

    (1)程序错误 (2)人为操作错误 (3)运算错误 (4)磁盘错误 (5)灾难(如;火灾,地震)

    数据库的备份类型?

    物理与逻辑角度 物理备份;“直接复制数据库文件,不需要工具。他的缺点是跨平台较弱” 冷备份; 在数据库停止运行的时候进行备份,这种备份方式最为简单,只需要拷贝数据库物理文件即可。一、冷备份(off, 慢, 时间点上恢复)

    关闭mysql服务—创建备份数据存储路径—使用tar创建备份文件

    热备份; 在数据库运行时,,直接备份,对运行数据库没影响

    删数据库恢复数据库

    查看数据库是否删除 恢复数据库auth

    查看是否已恢复

    开启数据库二进制日志功能

    编辑主配置文件 [root@www ~]# vim /usr/local/mysql/my.cnf

    [mysqld] 下插入 log_bin=/usr/local/mysql/mysql-bin

    查看生成的日志文件

    使用mysql二进制工具进行查看日志内容(操作id 时间标记

    温备份; 在运行时备份(只可以读,不可以写操作) 逻辑备份; 从数据库中导出数据进行备份

    数据库的备份?

    完全备份; 对整个数据库的数据进行备份, 但是它的缺点是有大量的数据,会占用大量的空间 增量备份; 每次备份的数据是从上一次完全备份之后新增加的修改过的数据。但是这种备份的优点很明显:没有重复的备份数据,即节省空间,又缩短了备份时间。 但它的缺点在于当发生灾难时,恢复数据比较麻烦。 差异备份; 每次备份的数据是相对于上一次全备份之后新增加的和修改过的数据

    MYSQL如何实现增量备份?

    mysql没有提供增量备份的方法,但可通过二进制日志间接实现增量备份。 (二)MySQL数据库增量恢复

    这是mysql的一个bug,使用mysqlbinlog分析binlog日志时,需要读取my.cnf配置文件,如果my.cnf中[client] default-character-set=utf8,就会出现乱码,只需将其注释即可。待完成操作后,将注释取消。可以用下面方法解决

    启用: vi /etc/my.cnf,在[mysqld]下面加一行log-bin=/var/lib/mysql/mysql-bin-log。重启mysqld。 会在/var/lib/mysql/下面生成两个文件:mysql-bin-log.00001和mysql-bin-log.index。

    查看: mysqlbinlog /var/lib/mysql/mysql-bin-log.00001。mysqlbinlog有很多参数,如指定开始时间等,具体用法参看 mysqlbinlog --help。如果报错:mysqlbinlog unknown variable:“default-character-set=gbk”,是因为:

    [client]下的选项会被所有客 户端程序读取(但不包括mysqld),但是mysqlbinlog却不能识 别default-character-set,而当客户端不能识别时就会报错并退出,不在继续执 行。可以使用loose-variable_name=xxx来解决。

    三 种解决方法:

    修改my.cnf,在[client]下注释或删除default-character-set=gbk;

    在命令行中加入–no-defaults开 关,使用mysqlbinlog --no-defaults;

    将default-character-set=gbk改 为(不需重启): 增量恢复的方法 一般恢复:将备份的二进制日志内容全部恢复 mysqlbinlog [–no-defaults] 增量备份文件 | mysql -u 用户名 -p

    基于位置的恢复 恢复数据到指定位置 mysqlbinlog --stop-position=’操作 id’ 二进制日志 |mysql -u 用户名 -p 密码

    从指定的位置开始恢复数据 mysqlbinlog --start-position=’操作 id’ 二进制日志 |mysql -u 用户名 -p 密码

    基于时间点的恢复 从日志开头截止到某个时间点的恢复 mysqlbinlog [–no-defaults] --stop-datetime=’年-月-日 小时:分钟:秒’ 二进制日志 | mysql -u 用户名 -p 密码

    从某个时间点到日志结尾的恢复 mysqlbinlog [–no-defaults] --start-datetime=’年-月-日 小时:分钟:秒’ 二进制日志 | mysql -u 用户名 -p 密码

    从某个时间点到某个时间点的恢复 mysqlbinlog [–no-defaults] --start-datetime=’年-月-日 小时:分钟:秒’ --stop-datetime=’年-月-日小时:分钟:秒’ 二进制日志 | mysql -u 用户名 -p 密码

    下面对增量备份原理做个总结:首先是每周使用mysqldump完全备份整库,在整库备份的时间点之后,每天使用flush logs 生成新的二进制文件,二进制文件保存的是每天对数据库的操作变化的内容,内容是不重复的。所以每周的备份整库加上每天的二进制备份文件,相当于数据库现在的数据状态

    添加数据–进行完全备份—录入新的数据—进行增量备份–模拟故障–恢复操作 输入 mysql -u root -p123456

    进入mysql之后

    创建表user_info 写入数据到表user_info

    备份表user_info

    刷新二进制日志,生成新的日志文件

    继续写入测试数据(跟上面一样,进入mysql) 然后刷新生成新的日志文件 模拟故障:删除表user_info

    恢复导入完全备份

    进行增量备份的恢复(一般恢复)

    基于位置恢复 模拟删除

    查看二进制日志文件确定恢复的位置或时间 指定‘停止位置’,即不恢复‘孙七’的用户数据

    基于时间点恢复 再次模拟故障(由于我密码,比较简单那个warning提示不用管就好啦)

    在二进制日志文件中查询到创建’孙七‘的数据时间’#2020–10—09–15;29;08

    指定结束时间进行恢复 再次模拟故障

    指定起始时间进行恢复

    Processed: 0.014, SQL: 9