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的备份就显得更为重要。要不很多最新的变更就会丢失。
- sql server存储过程编程
- sql server 2008 数据库的完整性约束
- sql server T-SQL 基础
- sql server 触发器
- T-SQL 查询、修改数据表
- sql server 事务处理
- Android P专区免费开放 -- 同样的Android,不同的体验
- YJango:TensorFlow中层API Datasets+TFRecord的数据导入
- CentOS7上ElasticSearch安装填坑记
- ASP.NET Core 阶段性总结
- Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程案例演示
- C# 窗体常用API函数 应用程序窗体查找
- C#进阶系列——WebApi接口测试工具:WebApiTestClient
- 由Dapper QueryMultiple 返回数据的问题
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- Sqlilabs通关笔记(一)
- nodejs可读流源码分析
- Sqlilabs通关笔记(二)
- Sqlilabs通关笔记(四)
- Sqlilabs通关笔记(五)
- 如何证明sleep不释放锁,而wait释放锁?
- 如何将SAP Document Builder的word控件设置成只读模式
- 在SAP CRM WebClient UI里打开ABAP Webdynpro页面
- SAP CRM WebClient UI和ABAP Webdynpro页面的互相跳转
- 通过 Apache Ant 来运行 Tomcat
- 你要的干货!信息收集之绕过CDN获取真实网站IP方法总结
- ES聚合操作
- leetcode-easy-array-删除排序数组中的重复项
- SQL注入靶场之SQLiLabs搭建指南
- [OHIF-Viewers]医疗数字阅片-医学影像-redux-token实操(1)