Linux下MySQL数据库备份与恢复

个人环境

(1)Centos 7.0
(2)MySQL 8.0.16

这里大家注意一下,我用的是8.0版本,如果你用的是5.7版本,在操作上可能和我的略有不同,按照我的这个,可能会出错。例如:在创建用户的时候5.7版本可以既创建又授权,一条命令搞定,而8.0版本就需要分开操作,先创建再授权。

1.数据库备份类型

1.热备份:指的是当数据库进行备份时,数据库的读写操作均不受影响(本次实验使用)
2.温备份:指的是当数据库进行备份时,数据库的读操作可以执行,但是不能执行写操作
3.冷备份:指的是当数据库进行备份时,数据库不能进行读写操作,即数据库要下线
注:要进行数据库的备份,首先要分清楚两个概念,简单的来说,(1)全量备份:指的就是将数据库下的所有内容进行备份。(2)增量备份:只对新增部分的数据进行备份。

2.模拟全量与二进制增量备份数据恢复实例

2.1 数据库全量备份与恢复

2.1.1 数据库备份

首先创建一个存放备份文档的目录

[root@localhost ~]# mkdir /backup

将对应的数据库进行备份

[root@localhost ~]# mysqldump -uroot -pLxlxin@123 --single-transaction --master-data=2 test > /backup/test_`date +%F`.sql
[root@localhost backup]# mysqldump -uroot -pLxlxin@123 --single-transaction --master-data=2 test | gzip > /backup/test_`date +%F`.sql

第二行是利用gzip进行压缩备份,这里的–single-transaction的作用是基于此项可以对InnoDB表做热备份,–master-data=2的作用是备库,该选项将会记录binlog的日志位置与文件名,并追加到文件中,如果为1将会输出CHANGE MASTER命令,主从下有用。

此时查看/backup目录,可以看到备份的文件

[root@localhost ~]# cd /backup/
[root@localhost backup]# ls
test_2020-03-01.sql  test_2020-03-01.sql.gz

注:既然我们选择备份,害怕的就是我们的数据库的数据丢失,或者哪个准备跑路的,他给你临走的时候删了,哈哈,开个玩笑!

2.1.2 数据库恢复

首先创建一个test库,然后将备份文件倒进去

[root@localhost backup]# mysql -uroot -pLxlxin@123 -e 'create database test'
[root@localhost backup]# mysql -uroot -pLxlxin@123 test < /backup/test_2020-03-01.sql

这时候你去检查自己的数据库,里面的test数据库就恢复了。

2.2 模拟凌晨12:00数据库增量备份

增量备份的前提:
(1)my.cnf 是要开启MySQL log-bin日志功能,若没有开启则修改配置文件

log_bin = /data/mysql/data/mysql-bin

重启MySQL

查看MySQL是否开启了二进制日志:

log_bin 为ON表示开启,为OFF表示未开启

log_bin_basename 表示二进制的文件保存路径

mysql> show variables like 'log_bin%';
+---------------------------------+-----------------------------+
| Variable_name                   | Value                       |
+---------------------------------+-----------------------------+
| log_bin                         | ON                          |
| log_bin_basename                | /var/lib/mysql/binlog       |
| log_bin_index                   | /var/lib/mysql/binlog.index |
| log_bin_trust_function_creators | OFF                         |
| log_bin_use_v1_row_events       | OFF                         |
+---------------------------------+-----------------------------+

此时查看二进制日志状态正常的话,就表示二进制日志开启正常

mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000019 |     3463 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+

接下来就可以进入正题了

2.2.1 准备数据库和表
mysql> create database xingyun default character set utf8;
mysql> use xingyun
mysql> create table `Student`(  `Sno` int(10) not null comment '学号', `Sname` varchar(16) not null comment '姓 名', `Ssex` char(2) not null comment '性别', `Sage` tinyint(2) not null default '0' comment '学生年龄', `Sdept` varchar(16) default 'null' comment '学生所在系别', primary key(`Sno`))  engine=InnoDB auto_increment=1 default charset=utf8 collate=utf8_general_ci;

2.2.2 表中插入数据
 insert into `Student` values (1,'陆亚','男',24,'计算机网络'),(2,'tom','男',26,' 英语'),(3,'张阳','男',21,'物流管理'),(4,'alex','女',22,'电子商务');
2.2.3 半夜12点模拟全量备份
[root@localhost ~]# date
2020年 02月 29日 星期六 20:27:51 CST
[root@localhost ~]# date -s '20200301'
[root@localhost ~]# mkdir /server/backup
[root@localhost ~]# mysqldump -uroot -pLxlxin@123 --default-character-set=utf8 --single-transaction -F -B xingyun -e | gzip > /server/backup/musql_backup_`date +%F`.sql.gz
2.2.4 备份后继续插入数据
mysql> insert into Student values (0005,'xumubin','男',29,'中文专业'),(0006,'wangzhao','男',21,'导弹专业');
2.2.5 模拟用户破坏数据库
mysql> drop database xingyun; 
2.2.6 增量备份的恢复

1.检查凌晨备份
2.检查全备后的所有binlog

[root@localhost ~]# ls -lrt /var/lib/mysql/binlog.*
-rw-r-----. 1 mysql mysql 2797 Feb 25 16:20 /var/lib/mysql/binlog.000012
-rw-r-----. 1 mysql mysql 6364 Feb 26 09:36 /var/lib/mysql/binlog.000013
-rw-r-----. 1 mysql mysql  155 Feb 27 18:55 /var/lib/mysql/binlog.000014
-rw-r-----. 1 mysql mysql  368 Feb 28 10:43 /var/lib/mysql/binlog.000015
-rw-r-----. 1 mysql mysql  155 Feb 29 11:16 /var/lib/mysql/binlog.000016
-rw-r-----. 1 mysql mysql 1530 Mar  1 00:04 /var/lib/mysql/binlog.000017
-rw-r-----. 1 mysql mysql  693 Mar  1 00:08 /var/lib/mysql/binlog.000018
-rw-r-----. 1 mysql mysql  288 Mar  1 00:12 /var/lib/mysql/binlog.index

思路:看到这里,相信大家应该知道我为什么要改系统时间了吧?我们再修改时间之前,对数据库已经进行过全量备份,修改之后,我们又新插入了一些数据,之后我们把数据库破坏掉。所以根据前面的备份,我们可以将之前的数据恢复,那么之后新增的数据怎么恢复呢,就要根据修改时间后的二进制文件来恢复了,可以看到最后三个文件是符合的。

3.立即刷新并备份出binlog

[root@localhost ~]# mysqladmin -uroot -p flush-logs
[root@localhost ~]# cp /var/lib/mysql/binlog.* /server/backup/

4.恢复binlog生成sql语句

[root@localhost backup]# mysqlbinlog binlog.000017 > bin.sql
[root@localhost backup]# vim bin.sql

有人会问为什么要恢复呢?因为那是二进制文件,咋们凡人看不懂…
之后打开这个文件,找一个命令,那就是 ’drop database xingyun ‘
就是当初删库用的这句命令,把它找出来删除掉,然后保存。如果这个文件中没有,去另外的一个文件去查,一般会在第二个文件中找到。

5.先恢复凌晨全量备份

[root@localhost backup]# gunzip musql_backup_2020-03-01.sql.gz
[root@localhost backup]# mysql -uroot -pLxlxin@123 -e 'create database xingyun'
[root@localhost backup]# mysql -uroot -pLxlxin@123 test < /backup/test_2020-03-01.sql

6.后恢复增量备份
当找到那句命令后,之前所有查过的binlog文件(包括查出来命令的本文件),都必须进行恢复,之后没看的数据也就不用恢复了,因为那都是删库之后的操作。

[root@localhost backup]# mysql -uroot -pLxlxin@123 < bin1.sql

至此,你去查看一下数据库,所有文件应该都全部恢复了。
注:如果最后一步出现报错,也属于正常情况,你只管查看你的数据库,数据绝对已恢复。

你可能感兴趣的:(Linux下MySQL数据库备份与恢复)