mysql5.5的全量备份和增量备份及误删除库后的全量和增量恢复(单库场景都innodb)

mysql5.5的全量备份和增量备份及误删除库后的全量和增量恢复(单库场景都innodb)

如果对运维课程感兴趣,可以在b站上、csdn或微信视频号 上搜索我的账号: 运维实战课程,可以关注我,学习更多免费的运维实战技术视频

模拟mysql主库误删除一个库的故障案例:(以多实例的一个主库3306实例为例)

如:每天0:00都是全量备份,在10:00时候,对主库操作,误删除了一个库。10:10分发现故障。

一般的当主库故障,如误操作删除了一个库,需要数据恢复的时候,最理想情况,首先数据库对外不要让用户访问了(因为数据不一致到时恢复会很麻烦)。可以考虑用iptables设置drop规则,禁止web等应用写数据库或者锁表,让主库暂时停止更新,只要求自己的客户端能连接数据库,其他都不让连接数据库。然后开始恢复数据,首先恢复全量备份(0:00之前的数据)。第二,恢复0:00到10:00之间的增量备份。做法:将该段时间的binlog日志转成sql语句,然后将sql语句里面的drop语句删除掉,然后再导入数据库。此时恢复了0:00到10:00之间的数据。10:00到10:10这段时间,因为库已经被删除掉,所以数据写不进来,也就没有新的数据,不用恢复。

注意:myisam引擎和innodb引擎的备份方式区别

myisam引擎的备份:(全量备份所有数据库为例)

#mysqldump  -u用户名  -p密码 -A -B -F --master-data=1/2 -x --events |gzip > /路径/…/all.sql.gz  #-x锁表  

innodb引擎的备份:(全量备份所有数据库为例)

#mysqldump  -u用户名  -p密码 -A -B -F --master-data=1/2 --events  --single-transaction|gzip > /路径/…/all.sql.gz  #全备数据库时,--single-transaction是锁表的,不过时间很短,该参数仅仅使用于innodb引擎。

在服务器192.168.37.128上:(双实例myslq5.5版本,以3306主库实例为例)myslq5.5版本默认存储引擎是innodb

1)主库上建立一些数据,模拟生产环境有数据

[root@localhost ~]# mysql -uroot -p123 -S /data/3306/mysql.sock

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| test               |

+--------------------+

mysql> create database ku;

mysql> use ku;

mysql> create table biao (id int(2),name varchar(8));

mysql> insert into biao values (1,'shi1');

mysql> insert into biao values (2,'shi2');

mysql> insert into biao values (3,'shi3');

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| ku                 |

| mysql              |

| performance_schema |

| test               |

+--------------------+

mysql> select * from ku.biao;

+------+------+

| id   | name |

+------+------+

|    1 | shi1 |

|    2 | shi2 |

|    3 | shi3 |

+------+------+

mysql> show create table biao\G

*************************** 1. row ***************************

       Table: biao

Create Table: CREATE TABLE `biao` (

  `id` int(2) DEFAULT NULL,

  `name` varchar(8) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8

mysql> quit

2)开启binlog日志

[root@localhost ~]# vim /data/3306/my.cnf

[mysqld]

……

log-bin = /data/3306/mysql-bin              #开启binlog日志,在mysqld模块下

server-id = 1                               #主从的server-id不能一样,在mysqld模块下

wq

[root@localhost ~]# ls /data/3306

data  my.cnf  mysql  mysqld.pid  mysql_oldboy3306.err  mysql.sock

[root@localhost ~]# mysql -uroot -p123 -S /data/3306/mysql.sock -e "show variables like 'log_bin'"

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| log_bin       | OFF   |

+---------------+-------+

[root@localhost ~]# /data/3306/mysql stop

[root@localhost ~]# /data/3306/mysql start

[root@localhost ~]# ls /data/3306

data  my.cnf  mysql  mysql-bin.000001  mysql-bin.index  mysqld.pid  mysql_oldboy3306.err  mysql.sock

[root@localhost ~]# mysql -uroot -p123 -S /data/3306/mysql.sock -e "show variables like 'log_bin'"

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| log_bin       | ON    |

+---------------+-------+

3)模拟0:00主库上做全量备份(innodb的锁表(--single-transaction)、刷新binlog(切换)、)

[root@localhost ~]# mysqldump -uroot -p123 -S /data/3306/mysql.sock -A -B -F --master-data=1 --events --single-transaction|gzip > /opt/all.bak_$(date +%F).sql.gz

[root@localhost ~]# ls /opt/

all.bak_2017-11-25.sql.gz

[root@localhost ~]# ls /data/3306/

data  my.cnf  mysql  mysql-bin.000001  mysql-bin.000002  mysql-bin.index  mysqld.pid  mysql_oldboy3306.err  mysql.sock

4)模拟0:00主库全量备份完毕后,之后时间又增量写入数据

[root@localhost ~]# mysql -uroot -p123 -S /data/3306/mysql.sock

mysql> use ku;

mysql> insert into biao values (10,'shi10');

mysql> insert into biao values (11,'shi11');

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| ku                 |

| mysql              |

| performance_schema |

| test               |

+--------------------+

mysql> select * from ku.biao;

+------+-------+

| id   | name  |

+------+-------+

|    1 | shi1  |

|    2 | shi2  |

|    3 | shi3  |

|   10 | shi10 |

|   11 | shi11 |

+------+-------+

mysql> quit

5)模拟10:00的误操作,删除了库ku

[root@localhost ~]# mysql -uroot -p123 -S /data/3306/mysql.sock

mysql> drop database ku;

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| test               |

+--------------------+

mysql> quit

6)模拟10:10发现问题(通过各种途径),发现ku被删除掉了,检查全量备份文件和增量备份文件,准备恢复数据

[root@localhost ~]# cd /opt/

[root@localhost opt]# ls

all.bak_2017-11-25.sql.gz                                   #检查全量备份文件

[root@localhost opt]# gzip -d all.bak_2017-11-25.sql.gz     #解压全量备份文件

[root@localhost opt]# ls

all.bak_2017-11-25.sql

[root@localhost opt]# cd /data/3306/             #检查增量备份文件,并判断哪个新增里面是新插入数据的

data  my.cnf  mysql  mysql-bin.000001  mysql-bin.000002  mysql-bin.index  mysqld.pid  mysql_oldboy3306.err  mysql.sock

[root@localhost 3306]# mysqlbinlog mysql-bin.000001 |grep -E "insert|drop"

/*!40019 SET @@session.max_insert_delayed_threads=0*/;

[root@localhost 3306]# mysqlbinlog mysql-bin.000002 |grep -E "insert|drop"

/*!40019 SET @@session.max_insert_delayed_threads=0*/;

insert into biao values (10,'shi10')

insert into biao values (11,'shi11')

drop database ku

7)模拟10:10之后,恢复数据(按常规情况,数据库停止对外访问时候的恢复,先设置不让用户写数据了)

a)首先立刻刷新binlog(切换),此时如果主库有写的需求,会记录到新的binlog日志中,恢复时候新的先无需管,先将之前的binlog增量恢复,会方便点(如果停止数据库对外访问,此步骤也可不做,为了保险,做了还是好点吧。)

[root@localhost 3306]# mysqladmin -uroot -p123 -S /data/3306/mysql.sock flush-logs

[root@localhost 3306]# ls

data    mysql             mysql-bin.000002  mysql-bin.index  mysql_oldboy3306.err

my.cnf  mysql-bin.000001  mysql-bin.000003  mysqld.pid       mysql.sock

此时的增量恢复,只需恢复mysql-bin.000002,而就暂时可以不考虑新的mysql-bin.000003了

b)准备选择好的增量备份文件,转成sql语句,并删除sql语句中的drop语句,以备增量恢复使用

[root@localhost 3306]# cp mysql-bin.000002 /opt/

[root@localhost 3306]# cd /opt/

[root@localhost opt]# ls

all.bak_2017-11-25.sql  mysql-bin.000002

[root@localhost opt]# mysqlbinlog mysql-bin.000002 > zl.bin.sql    #因就一个库,可以不分库

[root@localhost opt]# ls

all.bak_2017-11-25.sql  mysql-bin.000002  zl.bin.sql

[root@localhost opt]# vim zl.bin.sql

--drop database ku    #找到该语句,删除掉,这里为了标识,其实是要删除掉的。

wq

c)恢复全量备份数据(0:00之前的全量数据恢复)

[root@localhost opt]# ls

all.bak_2017-11-25.sql  mysql-bin.000002  zl.bin.sql

[root@localhost opt]# mysql -uroot -p123 -S /data/3306/mysql.sock < all.bak_2017-11-25.sql #无需指定库

d)恢复增量备份数据(0:00到10点的增量数据恢复)

[root@localhost opt]# grep insert zl.bin.sql

/*!40019 SET @@session.max_insert_delayed_threads=0*/;

insert into biao values (10,'shi10')

insert into biao values (11,'shi11')

[root@localhost opt]# mysql -uroot -p123 -S /data/3306/mysql.sock ku < zl.bin.sql #需指定库,因无-B的备份

8)登录进去查看数据恢复情况:全量备份和增量备份数据都恢复。

[root@localhost opt]# mysql -uroot -p123 -S /data/3306/mysql.sock

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| ku                 |

| mysql              |

| performance_schema |

| test               |

+--------------------+

mysql> select * from ku.biao;

+------+-------+

| id   | name  |

+------+-------+

|    1 | shi1  |

|    2 | shi2  |

|    3 | shi3  |

|   10 | shi10 |

|   11 | shi11 |

+------+-------+

9)然后对外开放服务,允许用户写入数据。

如果对运维课程感兴趣,可以在b站上、csdn或微信视频号 上搜索我的账号: 运维实战课程,可以关注我,学习更多免费的运维实战技术视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运维实战课程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值