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故障演习的更多相关文章

  1. mysql故障总结

    MYSQL故障排查 https://zhuanlan.zhihu.com/p/27834293

  2. mysql故障(主从复制sql线程不运行)

    故障现象: 进入slave服务器,运行: mysql> show slave status\G ....... Relay_Log_File: localhost Relay_Log_Pos: ...

  3. mysql 故障整理

    mysql> system mysqldump -uroot -p -B mingongge >/root/mingongge_bak.sql Enter password: mysqld ...

  4. 一次生产环境的docker MySQL故障

    问题 昨天下午本来要去吃下午茶,然后前端小伙伴突然说接口怎么崩了,我登上sentry一看,报错了 (2005, "Unknown MySQL server host 'mysql' (-3) ...

  5. 缺少索引导致的服务器和MYSQL故障。

    故障现象: 网站访问缓慢. 数据库RDS: CPU满,连接数满,其他值都是空闲. apache服务器:CPU正常,IO正常,流量报警,内存爆满. 解决思路: 一.没遇到过此情况,一脸懵逼. 二.请教大 ...

  6. mysql故障解决笔记

    错误提示如图 一开始我查询了 [root@web01 mysql]# ls -al /lib/libc* -rwxr-xr-x 1 root root 1909464 Mar 22 01:49 /li ...

  7. mysql故障

    1.服务器上是的电不要随边乱断,一定要保存,然后断电,不要在服务器插座版上乱插其他电器,导致非法断电, 2.出现断电后,检查MYSQL数据库文件是否损坏,可以看WINDOWS 应用程序程序管理日志,提 ...

  8. mysql故障(找不mysql命令)

    [root@slave support-files]# mysql -uroot -p123-bash: mysql: command not found #我的mysql编译安装指定的路径是--ba ...

  9. mysql故障(程序正在运行却找不到PID文件)

    [root@slave ~]# /etc/init.d/mysql status ERROR! MySQL is running but PID file could not be found [ro ...

随机推荐

  1. 程序中打开IE浏览器并访问指定地址

    最简单的方法 Process.Start("iexplore.exe");  //直接打开IE浏览器(打开默认首页)            Process.Start(" ...

  2. 如何在git中删除指定的文件和目录

    部分场景中,我们会希望删除远程仓库(比如GitHub)的目录或文件. 具体操作 拉取远程的Repo到本地(如果已经在本地,可以略过) $ git clone xxxxxx 在本地仓库删除文件 $ gi ...

  3. laravel中将session由文件保存改为数据库保存

    1.laravel中默认是使用文件保存session的,保存在/storage/framework/sessions下 2.修改配置文件 config/session.php中 'driver' =& ...

  4. jQuery中动态创建、添加元素的方法总结

    <input type="button" value="创建元素" id="btn"> <div id="box ...

  5. Vue 2 难点汇总

    数据侦听 Vue.$watch   watch提供了观察和响应实例上数据变动的办法,当有一些数据需要跟随其他数据变化而变化时,如子组件某个数据依赖来自于父组件的prop计算.很直观的会想到计算这功能和 ...

  6. P1047 汉诺塔

    题目描述 汉诺塔是根据一个印度传说形成的数学问题:有三根杆子A, B, C, A杆上有n个穿孔圆盘, 盘的尺寸由下到上依次变小. 要求按照下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘 大盘不能叠 ...

  7. 【16.50%】【CF 44G】Shooting Gallery

    time limit per test 5 seconds memory limit per test 256 megabytes input standard input output standa ...

  8. Linux 内核USB 接口配置

    USB 接口是自己被捆绑到配置的. 一个 USB 设备可有多个配置并且可能在它们之间转换 以便改变设备的状态. 例如, 一些允许固件被下载到它们的设备包含多个配置来实现这个. 一个配置只能在一个时间点 ...

  9. 【t044】弗洛伊德

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 弗洛伊德是一个大牛!给一个有向图G,他有n个结点,现在请你求出对于他的每一对结点(x,y),从x出发走 ...

  10. CF1169(div2)题解报告

    CF1169(div2)题解报告 A 不管 B 首先可以证明,如果存在解 其中必定有一个数的出现次数大于等于\(\frac{m}{2}\) 暴力枚举所有出现次数大于等于$\frac{m}{2} $的数 ...