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或微信视频号 上搜索我的账号: 运维实战课程,可以关注我,学习更多免费的运维实战技术视频