MySQL备份恢复第二篇(r5笔记第6天)

MySQL中的数据恢复功能相比Oracle来说还是要单薄一些,而Oracle中的数据恢复相对来说自动化的程度要高一些。不过Mysql的二进制日志提供的信息很丰富,而日志信息在Oracle中式完全屏蔽的,对于数据的恢复可能MySQL也很灵活。 我们来模拟一下通过完整备份+增量备份(binlog)的方式来恢复。 首先我们来选择一个表new_test作为恢复的参考点。 mysql> select count(*)from new_test; +----------+ | count(*) | +----------+ | 32081 | +----------+ 1 row in set (0.02 sec) 查看一下binlog的情况,这个可以作为后续的恢复使用。 mysql> show binary logs ; +-----------------------+-----------+ | Log_name | File_size | +-----------------------+-----------+ | mysql_oel1_bin.000001 | 3413422 | | mysql_oel1_bin.000002 | 356 | +-----------------------+-----------+ 2 rows in set (0.00 sec) mysql> \q Bye 我们来做一个完全备份。 [mysql@oel1 full_bak]$ mysqldump -u root --lock-all-tables --master-data=2 --flush-logs --all-databases > full.sql [mysql@oel1 full_bak]$ ll total 1672 -rw-r--r-- 1 mysql dba 1704276 Apr 14 18:50 full.sql 做完备份,我们尝试做一些数据变更,这样模拟增量备份就更清楚了。 mysql> insert into new_test select *from new_test limit 1,5; Query OK, 5 rows affected, 1 warning (0.01 sec) Records: 5 Duplicates: 0 Warnings: 1 mysql> select count(*)from new_test; +----------+ | count(*) | +----------+ | 32086 | +----------+ 1 row in set (0.02 sec) 可以看到在全量备份的时候指定刷新日志,日志增长了一个。 mysql> show binary logs; +-----------------------+-----------+ | Log_name | File_size | +-----------------------+-----------+ | mysql_oel1_bin.000001 | 3413422 | | mysql_oel1_bin.000002 | 408 | | mysql_oel1_bin.000003 | 356 | +-----------------------+-----------+ 3 rows in set (0.00 sec) 这个时候我们可以备份binlog,为了更加简化,我们可以直接导出二进制日志中的sql [mysql@oel1 data]$ mysqlbinlog mysql_oel1_bin.000003 > /u02/mysql/bak/new_bak/new.sql 这个时候我们做了一个大胆的决定,删除所有的数据,直接到data目录下,全部删除,删删删。 [mysql@oel1 data]$ rm -rf * 这个时候直接去停Mysql都会有问题,我们来通过mysqladmin来停。 [mysql@oel1 data]$ mysqladmin -u root shutdown [mysql@oel1 data]$ 150414 18:54:34 mysqld_safe mysqld from pid file /u02/mysql/data/oel1.pid ended 这个时候查看mysql进程的情况。 [mysql@oel1 data]$ pstree -p|grep mysql 做完破坏,任务开始了,我们来做恢复,先来尝试一下是否能启动Mysql,毫无疑问启动失败。 [mysql@oel1 mysql]$MYSQL_BASE/bin/mysqld_safe --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1550 --log-bin=mysql_oel1_bin --log-error=/u02/mysql/log/log_error.log --long_query_time=5 --slow-query-log=true --slow-query-log-file=/u02/mysql/log/slow_qeury.log & [mysql@oel1 mysql]$ 150414 18:55:20 mysqld_safe Logging to '/u02/mysql/log/log_error.log'. 150414 18:55:21 mysqld_safe Starting mysqld daemon with databases from /u02/mysql/data 150414 18:55:22 mysqld_safe mysqld from pid file /u02/mysql/data/oel1.pid ended [mysql@oel1 mysql]$ pstree -p|grep mysql 但是数据目录下生成了一些文件这是在初始化的时候创建的,但是最后无功而返。我们也不需要,可以直接删除。 [mysql@oel1 mysql]$ cd data [mysql@oel1 data]$ ll total 110724 -rw-rw---- 1 mysql dba 56 Apr 14 18:55 auto.cnf -rw-rw---- 1 mysql dba 12582912 Apr 14 18:55 ibdata1 -rw-rw---- 1 mysql dba 50331648 Apr 14 18:55 ib_logfile0 -rw-rw---- 1 mysql dba 50331648 Apr 14 18:55 ib_logfile1 -rw-rw---- 1 mysql dba 120 Apr 14 18:55 mysql_oel1_bin.000001 -rw-rw---- 1 mysql dba 24 Apr 14 18:55 mysql_oel1_bin.index [mysql@oel1 data]$ rm -rf * 这个时候我们来做初始化,就更重新弄创建MySQL一样。 [mysql@oel1 mysql]$ $MYSQL_BASE/scripts/mysql_install_db --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1550 然后启动MySQL服务。 [mysql@oel1 mysql]$MYSQL_BASE/bin/mysqld_safe --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1550 --log-bin=mysql_oel1_bin --log-error=/u02/mysql/log/log_error.log --long_query_time=5 --slow-query-log=true --slow-query-log-file=/u02/mysql/log/slow_qeury.log & 启动的过程很快,从日志中看到启动成功。 [mysql@oel1 mysql]$ 150414 18:57:14 mysqld_safe Logging to '/u02/mysql/log/log_error.log'. 150414 18:57:14 mysqld_safe Starting mysqld daemon with databases from /u02/mysql/data 对应的mysql进程也都起来了。 [mysql@oel1 mysql]$ pstree -p|grep mysql |-mysqld_safe(20548)---mysqld(20781)-+-{mysqld}(20803) | |-{mysqld}(20804) | |-{mysqld}(20805) | |-{mysqld}(20806) | |-{mysqld}(20807) | |-{mysqld}(20808) | |-{mysqld}(20809) | |-{mysqld}(20810) | |-{mysqld}(20811) | |-{mysqld}(20812) | |-{mysqld}(20814) | |-{mysqld}(20815) | |-{mysqld}(20816) | |-{mysqld}(20817) | |-{mysqld}(20818) | |-{mysqld}(20819) | |-{mysqld}(20820) | |-{mysqld}(20821) | |-{mysqld}(20822) | `-{mysqld}(20823) 这个时候来做恢复,先来恢复最初的全量备份。 [mysql@oel1 full_bak]$ mysql -u root < full.sql [mysql@oel1 full_bak]$ 查看数据的情况,数据是最开始的状态了。 mysql> select count(*)from new_test; +----------+ | count(*) | +----------+ | 32081 | +----------+ 1 row in set (0.03 sec) 然后我们来部署最新的增量备份,就是二进制日志导出的sql文件 [mysql@oel1 new_bak]$ mysql -u root < new.sql 数据就这样恢复了。 mysql> select count(*)from new_test; +----------+ | count(*) | +----------+ | 32086 | +----------+ 1 row in set (0.02 sec) 不过整个过程中,没有考虑实时的数据变化情况,对于binlog的备份就显得更为重要。要不很多最新的变更就会丢失。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-04-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏喵了个咪的博客空间

基于PhalApi2的Redis拓展

基于PhalApi2的Redis拓展 ? 前言 Redis在PHP开发中运用场景已经无处不在,小到简单缓存大到数据库或消息队列都可以使用Redis来进行实现,基...

3085
来自专栏云计算教程系列

如何在Ubuntu 18.04上使用PostgreSQL 10设置逻辑复制

在为生产设置应用程序时,准备好多个数据库副本通常很有用。保持数据库副本同步的过程称为复制。复制可以为大量同时读取操作提供高可用性水平扩展,同时减少读取延迟。它还...

2975
来自专栏木头编程 - moTzxx

PHP 开发学习[7] —— 代码实现主从数据库 读写分离

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

1223
来自专栏GopherCoder

Django:web框架的学习(1)

1654
来自专栏张善友的专栏

AggregateCacheDependency、CacheDependency、SqlCacheDependency Asp.net 2.0和Sql Server的缓存管理和使用ObjectBuil

       这两天 PetShop is Evil?等对PetShop 的讨论很多,我在这里也发一篇凑凑热闹。我下面主要是对Asp.net 2.0新增的缓存管...

2038
来自专栏日常分享

Oracle常用数据库系统表单以及SQL的整理

  因为最近涉及到了一些数据库的归档,备份等工作,所以一部分的重心放在了数据库上,毕竟之前对数据库的了解也只停留在了一般的建表,查询,最多最多再写一写触发器之类...

1421
来自专栏Linux运维学习之路

MySQL体系结构及多实例

MySQL客户端和服务器端模型 MySQL是一个典型C/S,服务器端与客户端两部分组成 服务器端程序  mysqld mysql自带的客户端(mysql mys...

37012
来自专栏林欣哲

MySQL数据库备份和恢复

2312
来自专栏Java帮帮-微信公众号-技术文章全总结

Quartz数据库表分析【面试+工作】

共11张表,前6张都是关于各种triggers的信息,后面包括job,悲观锁,调度状态等信息;相关表操作在类StdJDBCDelegate中,相关sql语句在S...

1944
来自专栏小狼的世界

重新认识wget

Wget是平时经常会用到的一个工具,这个工具其实有着非常丰富的参数和配置,能够实现很强大的功能。比较常用的一个就是抓站或者为网站做镜像。

901

扫码关注云+社区

领取腾讯云代金券