侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

MySQL数据库运维之数据恢复的方法

数据库  /  管理员 发布于 8年前   215

之前三篇文章分别介绍了MySQL数据库常见的备份方法,其中包括逻辑备份和物理备份,本篇将总结一下MySQL数据库的数据恢复相关内容。这些数据恢复方案在之前备份内容介绍时,此处总结一下恢复方案,并结合数据库的二进制日志做下数据恢复的示范!

一、恢复方案

1、数据量不是特别大,可以将mysqldump命令备份的数据使用mysql客户端命令或者source命令完成数据的恢复;
2、使用Xtrabackup完成数据库的物理备份恢复,期间需要重启数据库服务;
3、使用LVM快照卷完成数据库物理备份恢复,期间需要重启数据库服务;

二、使用mysqlbinlog进行时间点恢复

1、介绍

mysqlbinlog是一个从二进制日志中读取语句的工具,在mysql安装完成之后自带的。

2、二进制日志恢复原理

当使用mysqldump对数据库进行备份时,生成的备份文件中包含了数据库DML操作时的时间点以及备份时的二进制日志位置信息,如果单库,可以从某个时间点开始,进行时间点恢复;如果是主从架构,可以根据备份时的--master-data=2和--single-transaction,完成根据时间点或者位置点的恢复。

3、二进制日志恢复示例

(1)单库恢复示例

创建数据库,并插入测试数据

mysql> SHOW CREATE DATABASE test_db;mysql> CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `age` tinyint(4) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;mysql> INSERT INTO student (name,age) VALUES('Jack',23),('Tomcat',24),('XiaoHong',22),('ZhangFei',29);

使用mysqldump进行全量备份,备份时滚动日志,同时记住二进制日志文件名称和日志的位置点

[root@WB-BLOG ~]# mysqldump -uroot -proot -h127.0.0.1 -P3306 --databases test_db --single-transaction --triggers --routines --flush-logs --events > /tmp/test_db.sql[root@WB-BLOG ~]# mysql -e "show binary logs" > bin_pos_`date +%F`.out

此时查看二进制日志文件名称和日志点位置如下

mysql> SHOW BINARY LOGS;+------------------+-----------+| Log_name     | File_size |+------------------+-----------+| mysql-bin.000001 |   1497 || mysql-bin.000002 |    397 |+------------------+-----------+2 rows in set (0.00 sec)

使用了一段时间,不小心误操作,执行了如下的语句,将数据库中的数据全部修改了

mysql> UPDATE STUDENT SET name = 'admin';

过了一段时间,可能是几分钟,也可能是几个小时,有人反映网站登录有问题了,查看发现好多数据被误修改,而这段时间内,还一直有写入操作,如又新增了如下的记录

mysql> INSERT INTO student(name,age) VALUES('Hbase',23),('BlackHole',30);

此时需要恢复数据,首先为了防止数据继续写入,可以先锁表,暂停写入业务,通知用户系统维护,然后执行如下操作:

#登录数据库,锁表,此时表只能读,不能写mysql> USE test_db;mysql> LOCK TABLE student READ;#然后重新(注意是重新打开)打开一个session窗口,否则会话处出之后,锁就会释放。然后压缩备份现有数据和二进制日志文件[root@WB-BLOG mysql_logs]# tar zcvf mysql_data.tar.gz /mysql_data/*[root@WB-BLOG mysql_logs]# tar zcvf mysql_bin.tar.gz /mysql_logs/*#导入最近备份的一次全备数据[root@WB-BLOG ~]# mysql -uroot -proot -h127.0.0.1 -P3306 < /tmp/test_db.sql #查看全备时的二进制日志文件和日志点[root@WB-BLOG ~]# cat bin_pos_2018-06-24.out   Log_name    File_size  mysql-bin.000001   1497  mysql-bin.000002    397#将861这个点之后的二进制日志文件转换为一个sql文件[root@WB-BLOG bin]# ./mysqlbinlog /mysql_logs/mysql-bin.000002 --start-position=397 > /tmp/tmp.sql#使用vim编辑器编辑这个sql文件,找到其中的未加条件的UPDATE语句,然后将其删掉,然后将删掉UPDATE语句之后的sql脚本内容导入到数据库中[root@WB-BLOG bin]# vim /tmp/tmp.sql  use `test_db`/*!*/;  SET TIMESTAMP=1522088753/*!*/;  update student set name = 'admin' #删掉这一句[root@WB-BLOG bin]# mysql -uroot -proot -h127.0.0.1 -P3306 < /tmp/tmp.sql#登录数据库查询数据是否恢复,可以查看被误修改的数据是否还原,然后对表执行解锁,再次全备数据mysql> UNLOCK TABLES;

(2)主从架构数据恢复示例

环境

主库:192.168.199.10(node01)
从库:192.168.199.11(node02)

首先停止从库的SQL线程,然后在从库上全备数据,并输入"SHOW SLAVE STATUS"信息到备份文件中,"SHOW SLAVE STATUS"的输出信息中记录了当前应用到了主库的哪个位置点的信息

#登录从库,然后关闭SQL线程mysql> STOP SLAVE SQL_THREAD;Query OK, 0 rows affected (0.01 sec)#然后记录从库中当前应用的主库的二进制日志文件信息[root@node02 mysql_data]# mysql -e "SHOW SLAVE STATUS \G" > slave_`date +%F`.info[root@node02 mysql_data]# mysqldump -uroot -proot -h127.0.0.1 -P3306 --databases test_db --routines --triggers --single-transaction > /tmp/mysql_test_db_`date +%F`.sql

在从库上备份完成之后,重新启动从库的SQL线程

mysql> START SLAVE SQL_THREAD;Query OK, 0 rows affected (0.01 sec)

启动SQL线程之后,备份这段时间内在主库上的DML操作会重新同步到从库上。假如在主库上发生了一个误操作,没加条件更新了student表中的所有数据,导致了表中所有数据被修改,此时由于同步操作,从库也被修改了

#登录主库,修改数据库的对外用户,使其暂不提供服务,然后滚动日志mysql> UPDATE mysql.user SET Host = '127.0.0.1' WHERE User='tomcat';Query OK, 1 rows affected (0.00 sec)#刷新权限表mysql> FLUSH PRIVILEGES;Query OK, 0 rows affected (0.00 sec)#滚动日志mysql> FLUSH LOGS;Query OK, 0 rows affected (0.01 sec)#将从库备份的数据及备份时刻的从库slave信息传到主库上[root@node02 mysql_data]# scp /tmp/mysql_test_db_2018-06-24.sql 192.168.199.10:/root/[root@node02 mysql_data]# scp slave_2018-06-24.info node01:/root/

备份主库的数据目录和二进制日志文件目录

[root@node01 mysql_logs]# tar zcvf mysql_master_data.tar.gz /mysql_data/*[root@node01 mysql_logs]# tar zcvf mysql_logs.tar.gz /mysql_logs/*  

导入从库最近一次备份的数据

[root@node01 mysql_logs]# mysql -uroot -proot -h127.0.0.1 -P3306 < /root/mysql_test_db_2018-03-26.sql #注意:上述的操作不能锁主库的表,否则全备数据无法导入。

查看备份时刻的从库中应用到的主库二进制日志文件名称及位置点

[root@node01 mysql_logs]# cat /root/slave_2018-03-26.info  Master_Log_File: master-bin.000002 #备份时所应用的主库二进制日志文件名称  Read_Master_Log_Pos: 395  #备份时所应用的主库二进制日志文件的位置

从该日志文件及日志点开始,将395日志点之后的日志文件转换为sql脚本,如果有多个二进制日志文件可以同时转换为sql脚本,如下所示

[root@node01 mysql_logs]# mysqlbinlog /mysql_logs/master-bin.000002 --start-position=395 > /tmp/tmp.sql#将master-bin.000003,master-bin.000004,master-bin.000005合并到/tmp.sql文件中[root@node01 mysql_logs]# mysqlbinlog /mysql_logs/master-bin.00000{3,4,5} --start-position=395 > /tmp/tmp.sql

找到误操作的update语句,然后删除该语句,并将增量的sql脚本导入数据库

[root@node01 mysql_logs]# vim /tmp/tmp.sql  use `test_db`/*!*/;  update student set name = 'admin' #删掉这一句[root@node01 mysql_logs]# mysql -uroot -proot -h127.0.0.1 -P3306 < /tmp/tmp.sql 

登录数据库,查看数据是否正常,被误修改的数据是否已经恢复,如果恢复,则在主库上全备数据,然后传到从库,完成从库恢复

[root@node01 mysql_data]# mysqldump -uroot -proot -h127.0.0.1 -P3306 --databases test_db --routines --triggers --single-transaction --master-date=1 > /tmp/master_test_db_`date +%F`.sql[root@node01 mysql_data]# scp /tmp/master_test_db_2018-06-24.sql node01:/root/#如果从库设置了只读,需要先去掉只读限制mysql> SET GLOBAL read_only = OFF;Query OK, 0 rows affected (0.00 sec)#将数据导入从库[root@node02 mysql_logs]# mysql -uroot -proot -h127.0.0.1 -P3306 < /root/master_test_db_2018-06-24.sql#开启从库的只读mysql> SET GLOBAL read_only = ON;Query OK, 0 rows affected (0.00 sec)

由于在主库上备份时添加了--master-date=1参数,所以从库导入之后,不需要重新执行change master操作。

登录从库,查看SHOW SLAVE STATUS信息是否正常,如果正常,登录主库,重新修改授权表,然后对外提供服务

mysql> UPDATE mysql.user set Host = '192.168.0.%' WHERE User = 'tomcat';mysql> FLUSH PRIVILEGES;Query OK, 0 rows affected (0.00 sec)

执行完成之后,主从数据恢复完毕。

至此,数据恢复介绍完毕,上述介绍了使用全备加二进制日志实现单实例数据库和主从数据库的数据恢复过程,如有问题,欢迎评论指出。也希望大家多多支持。


  • 上一条:
    MySQL中有哪些情况下数据库索引会失效详析
    下一条:
    MySQL数据库的实时备份知识点详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客