一、数据库全备,全备脚本如下:

[root@leader script]# cat bak_all.sh
#!/bin/bash
#Date: 2019-12-08
#Author: chan
#Mail: chan
#Function:This scripts function is More complex backup scripts which need to find binlog log files and location points
#Version: 1.1
USER=root
PASS=root
MYSOCK=/tmp/mysql.sock
DATA_PATH=/data/backup
DATA_FILE=${DATA_PATH}/mysql_backup_`date +%F`.sql.gz
LOG_FILE=${DATA_PATH}/mysql_backup_`date +%F`.log
MYSQL_PATH=/usr/local/mysql/bin
mysqldb=test
#--single-transaction Specifically for the InnoDB engine when the data is updated when the data is updated it can't see the whole isolation
MYSQL_DUMP="${MYSQL_PATH}/mysqldump -u$USER -p$PASS -S $MYSOCK --events -B -F --master-data=2 --single-transaction $mysqldb"
MYSQL_CMD="${MYSQL_PATH}/mysql -u$USER -p$PASS -S $MYSOCK"
cat |${MYSQL_CMD}<<EOF
flush table with read lock;
system echo "-----show master status result-----" >>${LOG_FILE};
system ${MYSQL_CMD} -e "show master status"|tail -1 >>${LOG_FILE};
system ${MYSQL_DUMP}|gzip > ${DATA_FILE};
unlock tables;
quit
EOF

(1)执行备份

[root@leader script]# ./bak_all.sh
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.

(2)查看备份结果

[root@leader backup]# ll
total 8
-rw-r--r-- 1 root root 70 Dec 8 13:25 mysql_backup_2019-12-08.log
-rw-r--r-- 1 root root 1742 Dec 8 13:25 mysql_backup_2019-12-08.sql.gz

(3)用crontab配置调度时间点

00 00 * * * /bin/bash /root/script/bak_all.sh >/dev/null 2>&1

二、备份后查看binlog日志情况

[root@leader mysql]# ll
total 374644
-rwxrwxr-x 1 mysql mysql 4406 Nov 23 21:40 mysql-bin.000001
-rw-r----- 1 mysql mysql 177 Nov 23 21:46 mysql-bin.000002
-rw-r----- 1 mysql mysql 32191 Nov 23 22:44 mysql-bin.000003
-rw-r----- 1 mysql mysql 360 Nov 23 22:46 mysql-bin.000004
-rw-r----- 1 mysql mysql 383565742 Dec 1 13:49 mysql-bin.000005
-rw-r----- 1 mysql mysql 1285 Dec 8 13:25 mysql-bin.000006
-rw-r----- 1 mysql mysql 154 Dec 8 13:25 mysql-bin.000007
-rw-r----- 1 mysql mysql 224 Dec 8 13:25 mysql-bin.index

[root@leader backup]# cat mysql_backup_2019-12-08.log
-----show master status result-----
test mysql

提示,我们可以看用-F参数备份生成的新的文件mysql-bin.00007,所以增量恢复是从这开始的。

三、模拟用户更新数据

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.05 sec)

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test3 |
| test4 |
| test_bf |
+----------------+
3 rows in set (0.00 sec)

mysql> select * from test_bf;
+------+---------+
| id | name |
+------+---------+
| 101 | zgp |
| 102 | fadacai |
+------+---------+
2 rows in set (0.00 sec)

mysql> insert into test_bf(id,name)values(103,'pg');
Query OK, 1 row affected (0.07 sec)

mysql> insert into test_bf(id,name)values(104,'linux');
Query OK, 1 row affected (0.09 sec)

mysql> insert into test_bf(id,name)values(105,'gp');
Query OK, 1 row affected (0.07 sec)

mysql>

下面标红部分为需要回复的数据,否则就属于丢失。

mysql> select * from test_bf;
+------+---------+
| id | name |
+------+---------+
| 101 | zgp |
| 102 | fadacai |
| 103 | pg |
| 104 | linux |
| 105 | gp |
+------+---------+
5 rows in set (0.00 sec)

三、模拟用户破坏数据库

在全备后的某个时点,有其他DBA误删了test库

mysql> drop database test;
Query OK, 3 rows affected (0.25 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)

四,故障排查

用户反馈系统报错,联系DBA排除故障,经确认是由DBA xxx误删引起的。

五、增量备份

停止主库对外访问,避免增量更新数据带来的死循环操作。

a.查看最近的全备

[root@leader backup]# ll
total 8
-rw-r--r-- 1 root root 70 Dec 8 13:25 mysql_backup_2019-12-08.log
-rw-r--r-- 1 root root 1742 Dec 8 13:25 mysql_backup_2019-12-08.sql.gz

查看binlog刷新的位置以及在那个binlog文件开始刷新,从下面可以得知从mysql-bin.00006日志文件的1238这个位置开始的全备,mysql-bin.00006日志文件以后生成的文件是从零点全备到出现问题这个时间段的增量

[root@leader mysql]# ll
total 374644
-rwxrwxr-x 1 mysql mysql 4406 Nov 23 21:40 mysql-bin.000001
-rw-r----- 1 mysql mysql 177 Nov 23 21:46 mysql-bin.000002
-rw-r----- 1 mysql mysql 32191 Nov 23 22:44 mysql-bin.000003
-rw-r----- 1 mysql mysql 360 Nov 23 22:46 mysql-bin.000004
-rw-r----- 1 mysql mysql 383565742 Dec 1 13:49 mysql-bin.000005
-rw-r----- 1 mysql mysql 1285 Dec 8 13:25 mysql-bin.000006
-rw-r----- 1 mysql mysql 1106 Dec 8 13:45 mysql-bin.000007

提示:我们在0点执行的全备,所以binlog日志文件是从0点往后更新的。我们可以用mysqlbinlog参数查看一下零点之后更新的binlog文件,看看里面有没有更新的数据。当然我们也可以通过查看0点全备的数据文件里面的change master的位置来查看最新更新的binlog文件。可以看到执行全备后的所有binlog日志文件,它里面记录了从0点全备之后到第二天十点所有有更新的数据包括执行的误操作,所以我们在增量恢复的时候必须把执行误操作的那条语句删掉。例如本次演示应该把drop那条语句删掉。

b.刷新binlog

一般数据库故障我们要停止数据库,不能停这种情况下我们要刷新一下binlog。刷新一下binlog就会生成一个新的mysql-bin日志文件mysql-bin.000008,这时候再更新数据就会往这个新的里面写。现在增量恢复的目标就是mysql-bin.000008。

[root@leader backup]# /usr/local/mysql/bin/mysqladmin -uroot -proot -S /tmp/mysql.sock flush-logs

c.增量备份binlog防止二次破坏

c.1 备份00007,忽略演示

c.2将mysql-bin.000007解析成test.sql数据文件

[root@leader mysql]# /usr/local/mysql/bin/mysqlbinlog -d test /var/log/mysql/mysql-bin.000007>/data/backup/test.sql
WARNING: The option --database has been used. It may filter parts of transactions, but will include the GTIDs in any case. If you want to exclude or include transactions, you should use the options --exclude-gtids or --include-gtids, respectively, instead.

C.3删除导致故障语句

[root@leader backup]# grep 'drop' test.sql
drop database test

注意:将生产的test.sql文件内容中的drop database test删掉保存,再进行增量恢复,不然恢复不了!

六、恢复数据

如果不挺库禁止对外访问就会有一个问题,什么问题呢?
第一个问题就是,在恢复的时候还有用户往数据库写数据,mysql-bin.000008还会记录更新的内容;全备恢复和增量恢复后还要恢复mysql-bin.000008更新的数据,备份mysql-bin.000008还得刷新binlog,增量恢复完mysql-bin.000008还得增量恢复更新的binlog,这样就死锁了老得恢复。
第二个问题就是,我们在增量恢复的时候,mysql-bin.000008也会记录全量和增量恢复的更新。在全量和增量恢复之后再恢复mysql-bin.000008更新的记录的时候就会导致主键冲突,可以编辑mysql-bin.000008解析成的mysql数据文件将冲突的数据删掉,如果数据多呢?还可以关闭sql_log_bin。关闭sql_log_bin就不会更新binlog日志文件了,这样会导致数据缺失。最好的方法就是停库,禁止对外访问,再做全量和增量备份。最根本的就是数据库的权限管理,不给删除修改权限,只给数据库管理员删除修改权限,防止故障的发生。谁有权限都要有记录,谁导致的故障要负责任。

mysql> show variables like '%log_bin%';
+---------------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------+
| log_bin | ON |
| log_bin_basename | /var/log/mysql/mysql-bin |
| log_bin_index | /var/log/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+--------------------------------+
6 rows in set (0.01 sec)

mysql> set sql_log_bin=off;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%log_bin%';
+---------------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------+
| log_bin | ON |
| log_bin_basename | /var/log/mysql/mysql-bin |
| log_bin_index | /var/log/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | OFF |
+---------------------------------+--------------------------------+
6 rows in set (0.01 sec)

全量恢复

[root@leader backup]# gzip -d mysql_backup_2019-12-08.sql.gz
[root@leader backup]# ls
mysql_backup_2019-12-08.log mysql_backup_2019-12-08.sql test.sql
[root@leader backup]# mysql -uroot -proot </data/backup/mysql_backup_2019-12-08.sql
mysql: [Warning] Using a password on the command line interface can be insecure.

增量恢复

[root@leader backup]# mysql -uroot -proot </data/backup/test.sql
mysql: [Warning] Using a password on the command line interface can be insecure.

查看恢复后的数据

mysql> select * from test_bf;
+------+---------+
| id | name |
+------+---------+
| 101 | zgp |
| 102 | fadacai |
| 103 | pg |
| 104 | linux |
| 105 | gp |
+------+---------+
5 rows in set (0.00 sec)

小结:

1.人为SQL造成的误操作

2.全量和增量

3.恢复时建议对外停止更新

4.恢复全量,然后把增量日志中有问题的SQL语句删除,恢复到数据库。

增量恢复的核心思想:

1.流程制度的控制,如果不做,面临服务和数据,鱼和熊掌不可兼得。

2.可以通过延迟备份来解决或者通过监控,黑名单(不加where的语句是不让执行),白名单机制。

3.业务需求容忍度,选择停库,根据业务需求选择停库或锁表或者容忍丢失部分数据。

Mysql模拟故障恢复案例过程的更多相关文章

  1. mysql中SQL执行过程详解与用于预处理语句的SQL语法

    mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...

  2. 神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程(二)

    开心一刻 一头母牛在吃草,突然一头公牛从远处狂奔而来说:“快跑啊!!楼主来了!” 母牛说:“楼主来了关我屁事啊?” 公牛急忙说:“楼主吹牛逼呀!” 母牛大惊,拔腿就跑,边跑边问:“你是公牛你怕什么啊? ...

  3. MySQL查询语句执行过程及性能优化(JOIN/ORDER BY)-图

    http://blog.csdn.net/iefreer/article/details/12622097 MySQL查询语句执行过程及性能优化-查询过程及优化方法(JOIN/ORDER BY) 标签 ...

  4. ECharts模拟迁徙案例

    ECharts模拟迁徙案例 独立页面:http://211.140.7.173:8081/t/wuhairui/ditu/a.html

  5. MySQL查询语句执行过程及性能优化-查询过程及优化方法(JOIN/ORDER BY)

    在上一篇文章MySQL查询语句执行过程及性能优化-基本概念和EXPLAIN语句简介中介绍了EXPLAIN语句,并举了一个慢查询例子:

  6. Telnet 模拟邮件发送过程

    Telnet 模拟邮件发送过程 windows要提前开启Telnet客户端的功能,再按照下面步骤完成邮件发送: 1.通过 cmd 进入命令窗口 2.连接要发送邮件的服务器:telnet smtp.al ...

  7. Redis缓存Mysql模拟用户登录Java实现实例[www]

    Redis缓存Mysql模拟用户登录Java实现实例 https://jingyan.baidu.com/article/09ea3ede1dd0f0c0aede3938.html redis+mys ...

  8. Cacti监控mysql数据库服务器实现过程

    Cacti监控mysql数据库服务器实现过程 2014-05-29      0个评论    来源:Cacti监控mysql数据库服务器实现过程   收藏    我要投稿 1 先在cacti服务器端安 ...

  9. Java多线程 编写三各类Ticket、SaleWindow、TicketSaleCenter分别代表票信息、售票窗口、售票中心。 售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。

    package com.swift; import java.util.ArrayList; import java.util.HashMap; import java.util.List; impo ...

随机推荐

  1. ModbusRtu通信报文详解【一】

    Modbus协议可谓是工业控制领域应用最广泛的协议之一.根据不同的电气接口,包括Modbus Rtu/ASCII,Modbus TCP/UDP,从学习的角度来说,只要学会其中一种,剩余的都是大同小异的 ...

  2. [转载]深入理解maven构建生命周期和各种plugin插件

    我就不复制博主文章了,到原文地址看吧.写这个只是为了自己搜索起来方便些: https://blog.csdn.net/zhaojianting/article/details/80321488 htt ...

  3. opencv3.3 CUDA 初学实例

    //swap.cu #include "cuda_runtime.h" #include "device_launch_parameters.h" #inclu ...

  4. JS中的SRC

    当应用SRC属性时,首先需要创建一个JS文件.为什么不在此文件中使用<script>标记?您可以直接使用输出语句吗?我会分享我的报告一个答案 JS文件不是HTM文件,因此内部不能有HTML ...

  5. ES6新增内容总结

    ES6新增内容有:1,模块化思想.2,关于变量let和const.3,解构赋值.4,字符串的扩展.5,函数的扩展.6,箭头函数.7,继承apply的用法 以下就是详解: 1:模块化思想 非模块化有命名 ...

  6. 绑定css样式,点击高亮

    <div class="flex-lay" style="color:#999"> <div bindtap="changeType ...

  7. JavaWeb【五、内置对象】

    简介 Web容器创建的一组对象,不用new即可使用. 共有9种,out.request.response.session.application,五种比较常用,page.pageContent.exc ...

  8. shell查询MySQL并将结果写入文件中

    背景 说下需求,自己搭建的一个接口开放平台,包含API文档和功能测试,部分内网地址需要修改hosts文件 准备 新建表 然后查看服务器中hosts文件 命令:cat /etc/hosts 我们要做的就 ...

  9. “联邦对抗技术大赛”9月开战 微众银行呼唤开发者共同“AI创新”

    “联邦对抗技术大赛”9月开战  微众银行呼唤开发者共同“AI创新”   从<第五元素>中的智能系统到<超体>中的信息操控,在科幻电影中人工智能已经发展到了极致.而在现实中,目前 ...

  10. C++ SQLite的使用总结

    SQLite3简介 SQLite3只是一个轻型的嵌入式数据库引擎,占用资源非常低,处理速度比Mysql还快,专门用于移动设备上进行适量的数据存取,它只是一个文件,不需要服务器进程. SQL语句是SQL ...