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

MySQL备份与恢复之保证数据一致性(5)

数据库  /  管理员 发布于 6年前   386

        在上一篇文章中我们提到热拷贝(MySQL备份与恢复之热拷贝),热拷贝也就是在MySQL或者其他数据库服务在运行的情况下使用mysqlhotcopy命令进行备份。这篇文章我们讲解怎样保证数据一致性。现在假设有这样一种情况,我们总是在凌晨对数据库进行备份,假设在凌晨之后发生数据库异常,并且导致数据丢失。这样凌晨之前的数据我们已经做了备份,但是凌晨到发生异常这段时间的数据就会丢失(没有binlog的情况下)。好在InnoDB存储引擎支持事务,也支持Binlog,凌晨到发生异常这段时间的数据就可以通过日志文件进行备份。所以,日志文件是非常重要,非常关键的。我们备份不仅要对数据进行备份,如果条件允许还需要对二进制文件进行备份。当然备份好数据之后,可以清空二进制文件,但如果为了长远考虑,比如恢复出来的数据并不是我们想要的,我们就需要备份二进制文件了。还有一点切记,恢复数据需要转到测试数据库中做,不要在生产环境中做。待测试库中测试没有问题,再在生产环境中做。
示意图


保证数据一致性模拟
第一步,验证数据

[root@serv01 databackup]# rm -rf *[root@serv01 databackup]# lsmysql> use larrydb;Database changedmysql> show tables;+-------------------+| Tables_in_larrydb |+-------------------+| class  || stu  |+-------------------+2 rows in set (0.00 sec)mysql> select * from class;+------+--------+| cid | cname |+------+--------+| 1 | linux || 2 | oracle |+------+--------+2 rows in set (0.00 sec)mysql> select * from stu;+------+---------+------+| sid | sname | cid |+------+---------+------+| 1 | larry01 | 1 || 2 | larry02 | 2 |+------+---------+------+2 rows in set (0.00 sec)

第二步,备份数据

[root@serv01 databackup]# mysqldump -uroot -p123456 --database larrydb > larrydb.sql[root@serv01 databackup]# ll larrydb.sql -rw-r--r--. 1 root root 2613 Sep 10 19:34 larrydb.sql

第三步,清空日志,因为已经做了备份,所以不需要以前的日志

mysql> show binary logs;+------------------+-----------+| Log_name  | File_size |+------------------+-----------+| mysql-bin.000001 | 27320 || mysql-bin.000002 | 1035309 || mysql-bin.000003 | 1010 || mysql-bin.000004 | 22809 || mysql-bin.000005 | 9860 || mysql-bin.000006 | 5659 || mysql-bin.000007 | 126 || mysql-bin.000008 | 10087 || mysql-bin.000009 | 8293 || mysql-bin.000010 | 476 || mysql-bin.000011 | 218 || mysql-bin.000012 | 126 || mysql-bin.000013 | 1113 || mysql-bin.000014 | 1171 || mysql-bin.000015 | 126 || mysql-bin.000016 | 107 || mysql-bin.000017 | 107 || mysql-bin.000018 | 13085 |+------------------+-----------+18 rows in set (0.00 sec)mysql> reset master;Query OK, 0 rows affected (0.01 sec)mysql> show binary logs;+------------------+-----------+| Log_name  | File_size |+------------------+-----------+| mysql-bin.000001 | 107 |+------------------+-----------+1 row in set (0.00 sec) 

第四步,更新数据

mysql> insert into class values(3,'Devel');Query OK, 1 row affected (0.01 sec)mysql> update class set cname="dab" where cid=2;Query OK, 1 row affected (0.01 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from class;+------+-------+| cid | cname |+------+-------+| 1 | linux || 2 | dab || 3 | Devel |+------+-------+3 rows in set (0.00 sec)mysql> select * from stu;+------+---------+------+| sid | sname | cid |+------+---------+------+| 1 | larry01 | 1 || 2 | larry02 | 2 |+------+---------+------+2 rows in set (0.00 sec)mysql> delete from stu where cid=2;Query OK, 1 row affected (0.00 sec)mysql> update stu set sname="larry007" where sid=1;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from stu;+------+----------+------+| sid | sname | cid |+------+----------+------+| 1 | larry007 | 1 |+------+----------+------+1 row in set (0.00 sec)[root@serv01 data]# dateTue Sep 10 19:38:24 CST 2013

第五步,模拟数据丢失,删除库

[root@serv01 data]# rm -rf /usr/local/mysql/data/larrydb/mysql> show databases;+--------------------+| Database  |+--------------------+| information_schema || game  || hello  || mnt  || mysql  || performance_schema || test  |+--------------------+7 rows in set (0.00 sec)[root@serv01 data]# cd /usr/local/mysql/data/[root@serv01 data]# lltotal 28736drwx------. 2 mysql mysql 4096 Sep 10 19:14 gamedrwx------. 2 mysql mysql 4096 Sep 7 00:43 hello-rw-rw----. 1 mysql mysql 18874368 Sep 10 19:36 ibdata1-rw-rw----. 1 mysql mysql 5242880 Sep 10 19:36 ib_logfile0-rw-rw----. 1 mysql mysql 5242880 Sep 4 23:39 ib_logfile1drwxr-xr-x. 2 mysql mysql 4096 Sep 10 18:35 mntdrwxr-xr-x. 2 mysql mysql 4096 Sep 4 23:39 mysql-rw-rw----. 1 mysql mysql 998 Sep 10 19:37 mysql-bin.000001-rw-rw----. 1 mysql mysql 19 Sep 10 19:34 mysql-bin.indexdrwx------. 2 mysql mysql 4096 Sep 4 23:39 performance_schema-rw-r-----. 1 mysql root 26371 Sep 10 19:30 serv01.host.com.err-rw-rw----. 1 mysql mysql 5 Sep 10 18:36 serv01.host.com.piddrwx------. 2 mysql mysql 4096 Sep 7 00:13 test#可以使用mysqlbinlog命令查看日志文件[root@serv01 data]# mysqlbinlog mysql-bin.000001mysql> show databases;+--------------------+| Database  |+--------------------+| information_schema || game  || hello  || mnt  || mysql  || performance_schema || test  |+--------------------+7 rows in set (0.00 sec)mysql> drop database larrydb;Query OK, 0 rows affected (0.01 sec)

第六步,导入更新之前的数据

[root@serv01 databackup]# mysql -uroot -p123456 < larrydb.sql ERROR 1050 (42S01) at line 33: Table '`larrydb`.`class`' already exists[root@serv01 databackup]# mysql -uroot -p123456 < larrydb.sql mysql> use larrydb;Database changedmysql> select * from stu;+------+---------+------+| sid | sname | cid |+------+---------+------+| 1 | larry01 | 1 || 2 | larry02 | 2 |+------+---------+------+2 rows in set (0.00 sec)mysql> select * from class;+------+--------+| cid | cname |+------+--------+| 1 | linux || 2 | oracle |+------+--------+2 rows in set (0.00 sec)


 
第七步,根据日志恢复数据

[root@serv01 data]# mysqlbinlog --stop-datetime "2013-09-10 19:37:45" mysql-bin.000001 | mysql -uroot -p123456mysql> select * from stu;+------+---------+------+| sid | sname | cid |+------+---------+------+| 1 | larry01 | 1 |+------+---------+------+1 row in set (0.00 sec)mysql> select * from class;+------+-------+| cid | cname |+------+-------+| 1 | linux || 2 | dab || 3 | Devel |+------+-------+3 rows in set (0.00 sec)#规律:恢复的时间点(或者是Commit之后的那个时间点)是发生事故的那个点再加上一秒。[root@serv01 data]# mysqlbinlog --stop-datetime "2013-09-10 19:37:46" mysql-bin.000001 | mysql -uroot -p123456mysql> select * from stu;+------+----------+------+| sid | sname | cid |+------+----------+------+| 1 | larry007 | 1 |+------+----------+------+1 row in set (0.00 sec)mysql> select * from class;+------+-------+| cid | cname |+------+-------+| 1 | linux || 2 | dab || 3 | Devel || 3 | Devel |+------+-------+4 rows in set (0.00 sec)[root@serv01 data]# mysqlbinlog mysql-bin.000001 # at 7131#130910 19:37:45 server id 1 end_log_pos 7240 Query thread_id=20 exec_time=996 error_code=0SET TIMESTAMP=1378813065/*!*/;update stu set sname="larry007" where sid=1/*!*/;# at 7240#130910 19:37:45 server id 1 end_log_pos 7312 Query thread_id=20 exec_time=996 error_code=0SET TIMESTAMP=1378813065/*!*/;COMMIT/*!*/;DELIMITER ;# End of log fileROLLBACK /* added by mysqlbinlog */;/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

以上就是本文的全部内容,不知道大家是否有所收获,联系前几篇的内容进行理解,学习效果会更好哦


  • 上一条:
    解析SQL Server 视图、数据库快照
    下一条:
    MySQL 5.6 中 TIMESTAMP 的变化分析
  • 昵称:

    邮箱:

    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交流群

    侯体宗的博客