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)

原文地址:https://www.cnblogs.com/lhat/p/10136497.html

时间: 2024-08-01 17:57:20

MySQL故障演习的相关文章

Linux下mysql故障

由于很多故障问题都没有截图,所以在记录过程中大多是陈述,不是那么直观,初衷更多是想作为自己解决过程的记录,当然如果有遇到相同问题的,不太明白也可以留言联系,希望能帮上忙. 在Linux系统上搭建应用平台,使用tomcat.mysql,执行程序.数据库.补丁都已经打包在一起,直接安装就行.安装Linux就遇到问题,外接光驱光盘安装RHEL5.1,工控机主板直连键盘,出现初始安装界面(文本模式提示linux text地方)键盘无法按键,让其自动进入安装,键盘就可以用了,BIOS也能认到键盘,已确认非

MySQL故障案例

第1章 MySQL故障案例: 1.1 背景说明: mysql的架构中没有主从复制的体系,也没有按时进行备份 数据库中有两个库conf库和jira库,仅有一份备份的数据,还是一年前的备份 1.2 故障场景: 意外宕机,导致磁盘物理损坏,也就是说mysql软件程序中data数据目录中的jira文件都没有了 数据库无法启动,经过检查,conf库数据文件都还在,也就是ibd和frm文件都存在 领导要求,conf还是好的,能不能临时先把数据库跑起来,然后想办法修复jira库 1.3 故障环境模拟: 1.3

mysql故障解决笔记

错误提示如图 一开始我查询了 [[email protected] mysql]# ls -al /lib/libc* -rwxr-xr-x 1 root root 1909464 Mar 22 01:49 /lib/libc-2.12.so -rwxr-xr-x 1 root root  195532 Mar 22 01:49 /lib/libcidn-2.12.so lrwxrwxrwx 1 root root      15 Apr 13 21:57 /lib/libcidn.so.1 -

mysql故障:重启mysql后启动报错

昨天在试运行环境做系统升级,突然间SSH连接断开,尝试进行连接一直报错,后来重启我的电脑再次进行连接,依然报错,奇怪的测试人员访问公司的liferay界面可以正常访问,后来给部门同事打电话问他们今天有没有对试运行环境做过什么修改,两个同事都说是今天没有对试运行服务器做过任何操作,我自己也没有做过什么操作,后来跟机房的技术支持打电话咨询了一下,技术支持说机房今天也没有做什么操作更没有做什么限制,后来通过登录Xenserver来登录到试运行这台机器,发现没有异常,还特意看了一下SSH的连接数,查看l

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

故障现象: 网站访问缓慢. 数据库RDS: CPU满,连接数满,其他值都是空闲. apache服务器:CPU正常,IO正常,流量报警,内存爆满. 解决思路: 一.没遇到过此情况,一脸懵逼. 二.请教大神寻求思路. 根据现行表明有可能是: 1.慢查询,表锁 2.CC攻击或者蜘蛛抓取导致大量的小查询(可能没有索引)       一.查看数据库,有没有存在慢查询和锁表情况.(show full processlist),关注:查看最长时间查询的几个连接.注意:(带动作的连接,如果只连接值是null)不

mysql 故障

The MySQL server has gone away (error 2006) has two main causes and solutions: Server timed out and closed the connection. To fix, check that “wait_timeout” mysql variable in your my.cnf configuration file is large enough. Server dropped an incorrect

服务器修改IP地址导致zabbix 不能连接mysql故障

一.故障说明: zabbix服务器IP 地址由192.168.1.226 改为192.168.1.73 访问zabbix时出现故障如下: 二.分析错误提示:连接数据库失败 解决思路: 1.在安装zabbix设定的数据库名称.端口.IP.账号.密码等,如果能修改此处设置的IP地址,问题可能会得到解决. 2.安装是填写的信息会生成一个配置文件,修改配置文件即可. #vi /etc/zabbix/web/zabbix.conf.php 三. 重启apache: #systemctl  restart

mysql故障--mysqlbinlog无法查询日志问题说明

问题说明: 下载binlog日志 mysqlbinlog  mysq-bin.000285查看binlog日志的时候报错 ERROR: Error in Log_event::read_log_event(): 'Sanity check failed', data_len: 73, event_type: 30 ERROR: Could not read entry at offset 240: Error in log format or read error. 注释: 由于mysqlbin

mysql故障---is not allowed to connect to this MySQL server解决办法

is not allowed to connect to this MySQL server解决办法 ERROR 1130: Host '192.168.1.3′ is not allowed to connect to this MySQL server这是告诉你没有权限连接指定IP的主机,下面我们来看看解决办法. 处理方法有二个 1.(如何解决客户端与服务器端的连接(mysql) :xxx.xxx.xxx.xxx is not allowed to connect to this mysql