MySQL故障演习
MySQL故障演习
接上次的 MySQL定时备份
该次实验主要是练习在MySQL数据库发生误删等意外情况下,利用全量备份文件和增量备份文件恢复数据。
1. 实验环境
-- 创建数据库
create database db1 character set utf8 collate utf8_general_ci;
create table db1.author (
id int(11) primary key auto_increment,
name varchar(20) comment '姓名',
phone varchar(20) comment '电话'
) comment '作者表';
create table db1.book (
id int(11) primary key auto_increment,
name varchar(100) comment '名称',
price decimal(10,2) comment '售价'
) comment '图书表';
insert into db1.author(name, phone) values
('孔子', '111'),
('亚瑟.叔本华', '222');
insert into db1.book(name, price) values ('论语', 19.9);
此时的author表和book表记录是这样的:
mysql> select * from db1.author;
+----+-------------+-------+
| id | name | phone |
+----+-------------+-------+
| 1 | 孔子 | 111 |
| 2 | 亚瑟.叔本华 | 222 |
+----+-------------+-------+
3 rows in set (0.00 sec)
mysql> select * from db1.book;
+----+------+-------+
| id | name | price |
+----+------+-------+
| 1 | 论语 | 19.90 |
+----+------+-------+
1 row in set (0.00 sec)
2. 每周日全量备份
2.1 凌晨3点全量备份
全量备份文件:db1_20181216.sql.tgz
2.2 数据库操作
insert into db1.author(name, phone) values ('刘慈欣', '333');
此时的author表记录是这样的:
mysql> select * from db1.author;
+----+-------------+-------+
| id | name | phone |
+----+-------------+-------+
| 1 | 孔子 | 111 |
| 2 | 亚瑟.叔本华 | 222 |
| 3 | 刘慈欣 | 333 |
+----+-------------+-------+
3 rows in set (0.00 sec)
3. 周一操作
3.1 周一凌晨3点增量备份
增量备份文件:mysql-bin.000026
3.2 数据库操作
-- 插入数据
insert into db1.book(name, price) values ('三体', 65);
-- 更新数据
update db1.author set phone='001' where name='孔子';
此时的author表和book表记录是这样的:
mysql> select * from db1.author;
+----+-------------+-------+
| id | name | phone |
+----+-------------+-------+
| 1 | 孔子 | 001 |
| 2 | 亚瑟.叔本华 | 222 |
| 3 | 刘慈欣 | 333 |
+----+-------------+-------+
3 rows in set (0.00 sec)
mysql> select * from db1.book;
+----+------+-------+
| id | name | price |
+----+------+-------+
| 1 | 论语 | 19.90 |
| 2 | 三体 | 65.00 |
+----+------+-------+
2 rows in set (0.00 sec)
3.3 误操作
一不小心执行了 delete from db1.author,author表的数据全都清空了,这可怎么办啊!如果有撤回操作就好了。
而备份恢复就像是撤回操作
此时的author表记录是这样的:
mysql> select * from db1.author;
Empty set (0.00 sec)
mysql> select * from db1.book;
+----+------+-------+
| id | name | price |
+----+------+-------+
| 1 | 论语 | 19.90 |
| 2 | 三体 | 65.00 |
+----+------+-------+
2 rows in set (0.00 sec)
4. 备份恢复
在全量备份后,我们进行了n条数据库操作,这些操作都保存在今天(周一)凌晨的增量备份和当前 binlog 里。如下:
操作1
操作2
操作3(误操作)
恢复的时候,我们先将数据库恢复到原始数据状态,然后再执行一遍增量备份和binlog里的操作(特别注意:错误操作除外)就行了。
备份恢复的时候干脆先停止当前系统的使用(应该有更好的解决方法,既不影响系统的使用,也能完成备份恢复,在用户无知觉的情况下恢复数据)
(1) 增量备份
执行增量备份的脚本
/root/bash/Mysql-DailyBak.sh
增量备份文件:mysql-bin.000027
(2) 恢复备份前全量备份数据库
该步骤完全是为了以防万一,和要进行的备份恢复没啥关系。
注意执行以下命令备份:
/usr/local/mysql/bin/mysqldump -uroot -ptencns152 --quick --events --databases db1 --single-transaction > db1_20181217.sql
(3) 恢复全量备份
mysql> source /home/mysql/backup/db1_20181216.sql
mysql> select * from db1.author;
+----+-------------+-------+
| id | name | phone |
+----+-------------+-------+
| 1 | 孔子 | 111 |
| 2 | 亚瑟.叔本华 | 222 |
+----+-------------+-------+
2 rows in set (0.00 sec)
mysql> select * from db1.book;
+----+------+-------+
| id | name | price |
+----+------+-------+
| 1 | 论语 | 19.90 |
+----+------+-------+
1 row in set (0.00 sec)
(4). 恢复增量备份
增量备份共有2个:mysql-bin.000026 和 mysql-bin.000027
(4.1) 恢复 mysql-bin.000026 的操作
/usr/local/mysql/bin/mysqlbinlog --no-defaults /home/mysql/backup/daily/mysql-bin.000026 | mysql -uroot -p db1
此时的数据表是这样的:
mysql> select * from db1.author;
+----+-------------+-------+
| id | name | phone |
+----+-------------+-------+
| 1 | 孔子 | 111 |
| 2 | 亚瑟.叔本华 | 222 |
| 3 | 刘慈欣 | 333 |
+----+-------------+-------+
3 rows in set (0.00 sec)
mysql> select * from db1.book;
+----+------+-------+
| id | name | price |
+----+------+-------+
| 1 | 论语 | 19.90 |
+----+------+-------+
1 row in set (0.00 sec)
(4.2) 恢复 mysql-bin.000027 的操作(除误操作外)
# 查看 mysql-bin.000027
/usr/local/mysql/bin/mysqlbinlog --base64-output=decode-rows -v /home/mysql/backup/daily/mysql-bin.000027 > mysql-bin.000027.txt
通过观察 mysql-bin.000027.txt
....
/*!*/;
# at 842
#181218 11:17:24 server id 152 end_log_pos 896 CRC32 0xeff9a750 Table_map: `db1`.`author` mapped to number 3960
# at 896
#181218 11:17:24 server id 152 end_log_pos 992 CRC32 0x87dc5c6f Delete_rows: table id 3960 flags: STMT_END_F
### DELETE FROM `db1`.`author`
### WHERE
### @1=1
### @2='孔子'
### @3='001'
### DELETE FROM `db1`.`author`
### WHERE
### @1=2
### @2='亚瑟.叔本华'
### @3='222'
### DELETE FROM `db1`.`author`
### WHERE
### @1=3
### @2='刘慈欣'
### @3='333'
# at 992
#181218 11:17:24 server id 152 end_log_pos 1023 CRC32 0x8c16a4e2 Xid = 73792
COMMIT/*!*/;
# at 1023
....
可以看出,在位置 896 到 992 之间执行了误操作,删除了author的所有数据。
所以我们在恢复时,跳过这个位置范围即可。
/usr/local/mysql/bin/mysqlbinlog --stop-position=896 --database=db1 /home/mysql/backup/daily/mysql-bin.000027 | mysql -uroot -p db1
/usr/local/mysql/bin/mysqlbinlog --start-position=992 --database=db1 /home/mysql/backup/daily/mysql-bin.000027 | mysql -uroot -p db1
备份恢复成功 _
查询结果如下:
mysql> select * from db1.author;
+----+-------------+-------+
| id | name | phone |
+----+-------------+-------+
| 1 | 孔子 | 001 |
| 2 | 亚瑟.叔本华 | 222 |
| 3 | 刘慈欣 | 333 |
+----+-------------+-------+
3 rows in set (0.00 sec)
mysql> select * from db1.book;
+----+------+-------+
| id | name | price |
+----+------+-------+
| 1 | 论语 | 19.90 |
| 2 | 三体 | 65.00 |
+----+------+-------+
2 rows in set (0.00 sec)
MySQL故障演习的更多相关文章
- mysql故障总结
MYSQL故障排查 https://zhuanlan.zhihu.com/p/27834293
- mysql故障(主从复制sql线程不运行)
故障现象: 进入slave服务器,运行: mysql> show slave status\G ....... Relay_Log_File: localhost Relay_Log_Pos: ...
- mysql 故障整理
mysql> system mysqldump -uroot -p -B mingongge >/root/mingongge_bak.sql Enter password: mysqld ...
- 一次生产环境的docker MySQL故障
问题 昨天下午本来要去吃下午茶,然后前端小伙伴突然说接口怎么崩了,我登上sentry一看,报错了 (2005, "Unknown MySQL server host 'mysql' (-3) ...
- 缺少索引导致的服务器和MYSQL故障。
故障现象: 网站访问缓慢. 数据库RDS: CPU满,连接数满,其他值都是空闲. apache服务器:CPU正常,IO正常,流量报警,内存爆满. 解决思路: 一.没遇到过此情况,一脸懵逼. 二.请教大 ...
- mysql故障解决笔记
错误提示如图 一开始我查询了 [root@web01 mysql]# ls -al /lib/libc* -rwxr-xr-x 1 root root 1909464 Mar 22 01:49 /li ...
- mysql故障
1.服务器上是的电不要随边乱断,一定要保存,然后断电,不要在服务器插座版上乱插其他电器,导致非法断电, 2.出现断电后,检查MYSQL数据库文件是否损坏,可以看WINDOWS 应用程序程序管理日志,提 ...
- mysql故障(找不mysql命令)
[root@slave support-files]# mysql -uroot -p123-bash: mysql: command not found #我的mysql编译安装指定的路径是--ba ...
- mysql故障(程序正在运行却找不到PID文件)
[root@slave ~]# /etc/init.d/mysql status ERROR! MySQL is running but PID file could not be found [ro ...
随机推荐
- Tenka1 Programmer Beginner Contest D IntegerotS(补)
当时没做出来,官方题解没看懂,就看别人提交的代码,刚对着别人代码调了几组数据,才发现,思路差不多,不过,原来是这样实现啊,果然我还是很菜 思路:题目要求是选取的这些数字全部进行OR运算,结果<= ...
- ubuntu14.04本地域名服务器配置
dnsmasq 1 修改dnsmasq配置文件/etc/dnsmasq.conf # Change this line if you want dns to get its upstream serv ...
- SuperSocket主动从服务器端推送数据到客户端
关键字: 主动推送, 推送数据, 客户端推送, 获取Session, 发送数据, 回话快照 通过Session对象发送数据到客户端 前面已经说过,AppSession 代表了一个逻辑的 socke ...
- 限制允许某些IP访问服务器
买了台阿里云服务器,部署了一些东西在上面,但是最近老是发现有异常登录,而且不仅仅是登录就完事了,还把服务器上一些重要的项目数据文件都给删除了,由于本人不是专业的运维人员,单位也没有运维人员,百度了一下 ...
- Python--day33--当面试时候问到如何解决黏包问题?的回答。
- 用jsonp 解决跨域问题
想自己用 js写一个原生的ajax请求,访问本地文件,json/txt.但是demo,写了一个后,发现 原来是跨域了. js 写的原生ajax 请求代码如下 html代码 将获取的txt 文件 展示出 ...
- centos7 安装R和RstudioServer版
参考: http://www.cnblogs.com/inspursu/p/4275701.html http://blog.csdn.net/u010022051/article/details/5 ...
- java编译器优化和运行期优化
概述 最近在看jvm优化,总结一下学习的相关知识 (一)javac编译器 编译过程 1.解析与填充符号表过程 1).词法.语法分析 词法分析将源代码的字符流转变为标记集合,单个字符是程序编 ...
- 关于POSTMAN做并发压测
一开始我个人在做测试时用到了POSTMAN,用了两种方式做测试, 第一种: 测试发现这种方式是阻塞排队,我让接口睡两秒,这100次请求间隔就是2秒,是串行执行 于是想到第二种,在一个collectio ...
- C# 获取 PC 序列号
在 C++ 需要使用 GetSystemFirmwareTable 的方法来获得 PC 的序列号,需要写的代码很多,但是在 C# 可以使用 WMI 来拿到序列号 首先是安装 System.Manage ...