MySQL备份与恢复

数据备份的重要性

在生产环境中,数据的安全性至关重要

任何数据的丢失都可能产生严重的后果

造成数据丢失的原因

  • 程序错误
  • 人为操作错误
  • 运算错误
  • 磁盘故障
  • 灾难(如火灾、地震)和盗窃

数据库备份的分类

Ⅰ、从物理与逻辑的角度,备份可分为

  1. 物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
    物理备份方法
    ① 冷备份(脱机备份)︰是在关闭数据库的时候进行的
    ② 热备份(联机备份)∶数据库处于运行状态,依赖于数据库的日志文件
    ③ 温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作

  2. 逻辑备份:对数据库逻辑组件(如:表等数据车对象)的备份

Ⅱ、从数据库的备份策略角度,备份可分为

  1. 完全备份:每次对数据库进行完整的备份
  2. 差异备份:备份自从上次完全备份之后被修改过的文件
  3. 增量备份:只有在上次完全备份或者增量备份后被修改的文件才会被备份
    在这里插入图片描述

常见的备份方法

物理冷备

  1. 备份时数据库处于关闭状态,直接打包数据库文件
  2. 备份速度快,恢复时也是最简单的

专用备份工具mydump或mysqlhotcopy

  1. mysqldump常用的逻辑备份工具
  2. mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表

启用二进制日志进行增量备份

  • 进行增量备份,需要刷新二进制日志

第三方工具备份

  • 免费的MySQL热备份软件Percona XtraBackup

MySQL完全备份

定义

  1. 是对整个数据库、数据库结构和文件结构的备份
  2. 保存的是备份完成时刻的数据库
  3. 是差异备份与增量备份的基础

优点

  • 备份与恢复操作简单方便

缺点

  • 数据存在大量的重复
  • 占用大量的备份空间
  • 备份与恢复时间长

数据库完全备份分类

物理冷备份与恢复

  • 关闭MySQL数据库
  • 使用tar命令直接打包数据库文件夹
  • 直接替换现有MySQL目录即可

mysqldump备份与恢复

  • MySQL自带的备份工具,可方便实现对MySQL的备份
  • 可以将指定的库、表导出为SQL脚本
  • 使用命令mysql导入备份的数据

项目一:物理冷备份及恢复

创建新库及表

mysql> create database abc;
Query OK, 1 row affected (0.00 sec)

mysql> use abc;
Database changed

mysql> create table a(id int(1));
Query OK, 0 rows affected (0.00 sec)

mysql> desc a;
+-------+--------+------+-----+---------+-------+
| Field | Type   | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| id    | int(1) | YES  |     | NULL    |       |
+-------+--------+------+-----+---------+-------+
1 row in set (0.00 sec)

在这里插入图片描述

创建备份,并查看备份文件

[root@server1 ~]# systemctl stop mysqld.service 
[root@server1 ~]# tar zcvf /opt/mysql_all-$(date +%F).tar.gz /usr/local/mysql/data

[root@server1 ~]# cd /opt/
[root@server1 opt]# ls -lh
总用量 1.3M
-rw-r--r--. 1 root root 1.3M 1224 19:09 mysql_all-2020-12-24.tar.gz
drwxr-xr-x. 2 root root    6 326 2015 rh

在这里插入图片描述

模拟毁坏abc表

[root@server1 ~]# systemctl start mysqld.service 
[root@server1 ~]# mysql -uroot -p123123

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| abc                |
| auth               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
7 rows in set (0.00 sec)

mysql> drop database abc;
Query OK, 1 row affected (0.00 sec)

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

abc数据表删除成功

在这里插入图片描述

恢复备份

mysql> exit
Bye
[root@server1 ~]# systemctl stop mysqld.service 
[root@server1 ~]# cd /opt/
[root@server1 opt]# tar zxvf mysql_all-2020-12-24.tar.gz 
[root@server1 opt]# ls -lh
总用量 1.3M
-rw-r--r--. 1 root root 1.3M 1224 19:09 mysql_all-2020-12-24.tar.gz
drwxr-xr-x. 2 root root    6 326 2015 rh
drwxr-xr-x. 3 root root   19 1224 19:18 usr

在这里插入图片描述

[root@server1 opt]# mkdir mysql_old
[root@server1 opt]# mv /usr/local/mysql/data/ mysql_old/
[root@server1 opt]# mv usr/local/mysql/data/ /usr/local/mysql/
[root@server1 opt]# cd /usr/local/mysql/
[root@server1 mysql]# ls -lh

[root@server1 data]# date
20201224日 星期四 19:21:30 CST
[root@server1 data]# systemctl start mysqld.service 

[root@server1 data]# mysql -uroot -p123123

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| abc                |
| auth               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
7 rows in set (0.00 sec)

mysql> use abc;
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> dasc a;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'dasc a' at line 1
mysql> show tables;
+---------------+
| Tables_in_abc |
+---------------+
| a             |
+---------------+
1 row in set (0.00 sec)

mysql> desc a;
+-------+--------+------+-----+---------+-------+
| Field | Type   | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| id    | int(1) | YES  |     | NULL    |       |
+-------+--------+------+-----+---------+-------+
1 row in set (0.00 sec)

恢复备份成功

在这里插入图片描述

项目二:物理热备份及恢复

创建新表

mysql> insert into abc.a values(1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into abc.a values(2);
Query OK, 1 row affected (0.00 sec)

mysql> select * from abc.a;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)

在这里插入图片描述

恢复数据库2-1

  • 使用mysqldump导出的脚本,可使用导入的方法
    ① source命令
    ② mysql命令

  • 使用source恢复数据库的步骤
    ① 登录到MySQL数据库
    ② 执行source备份sql脚本的路径

  • source恢复的示例

MySQL [(none)]>source /backup/all-data.sql

:需先创建同名的空数据库,use这个数据库再恢复

  • 使用mysql命令恢复数据
mysql -u用户名-p[密码]<库备份脚本的路径

mysql命令恢复的示例

mysql -u root -p </backupl/all-data.sql

进行热备份(完全备份)

[root@server1 opt]# cd /usr/local/mysql/
[root@server1 mysql]# cd data/

[root@server1 data]# mysqldump -uroot -p123123 aaa > /backup-$(date +%F).sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.   //提示密码不安全

[root@server1 data]# mysqldump -u root -p --all-databases > /backup-all_databases-$(date +%F).sql
Enter password:                //非明文显示,密码输入123123

[root@server1 ~]# cd /
[root@server1 /]# ls -lh
总用量 802K
drwxr-xr-x.   2 root root    6 1224 16:44 backup
-rw-r--r--.   1 root root 3.6K 1224 19:30 backup-2020-12-24.sql
-rw-r--r--.   1 root root 768K 1224 19:35 backup-all_databases-2020-12-24.sql

在这里插入图片描述

[root@server1 /]# vi backup-2020-12-24.sql    //查看备份内容

在这里插入图片描述

[root@server1 /]# vi backup-all_databases-2020-12-24.sql 

在这里插入图片描述

删除aaa数据库

[root@server1 ~]# mysql -uroot -p123123

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| abc                |
| auth               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
7 rows in set (0.00 sec)

mysql> drop database aaa;
Query OK, 3 rows affected (0.00 sec)

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

在这里插入图片描述

还原备份

mysql> create database aaa;    //创建同名库
Query OK, 1 row affected (0.00 sec)

mysql> use aaa;      //进入库中还原
Database changed
mysql> source /backup-2020-12-24.sql

在这里插入图片描述

在这里插入图片描述

mysql> show tables;
+---------------+
| Tables_in_aaa |
+---------------+
| cj            |
| cj2           |
| t1            |
+---------------+
3 rows in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| abc                |
| auth               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
7 rows in set (0.00 sec)

在这里插入图片描述

恢复成功

MySQL增量备份

1、使用mysqldump进行完全备份存在的问题

  • 备份数据中有重复数据
  • 备份时间与恢复时间过长

2、是自上一次备份后增加/变化的文件或者内容

3、特点

  • 没有重复数据备份量不大时间短
  • 恢复需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复

4、MySQL没有提供直接的增量备份方法

5、可通过MySQL提供的二进制日志间接实现增量备份

6、MySQL二进制日志对备份的意义

  • 二进制日志保存了所有更新或者可能更新数据库的操作
  • 二进制日志在启动MySQL服务器后开始记录,并在文件达到max_binlog_size所设置的大小或者接收到flush
    logs令后重新创建新的日志文件
  • 只需定时执行flush logs方法重新创建新的日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份

MySQL数据库增量恢复

一般恢复

  • 将所有备份的二进制日志内容全部恢复

基于位置恢复

  • 数据库在某一时间点可能既有错误的操作也有正确的操作
  • 可以基于精准的位置跳过错误的操作

基于时间点恢复

  • 跳过某个发生错误的时间点实现数据恢复

项目三:基于时间点恢复

创建新表

mysql> create table IT_salary(岗位类别 CHAR(16) NOT NULL, 姓名 CHAR(16) NOT NULL, 年龄 INT(10) NOT NULL, 员工ID INT(10) NOT NULL, 学历 CHAR(16) NOT NULL, 年限 INT(10) NOT NULL, 薪资 INT(10) NOT NULL, PRIMARY KEY (姓名));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into IT_salary values('网络工程师','张三','27','016','本科','3','6000');
Query OK, 1 row affected (0.00 sec)

mysql> select * from IT_salary;
+-----------------+--------+--------+----------+--------+--------+--------+
| 岗位类别        | 姓名   | 年龄   | 员工ID   | 学历   | 年限   | 薪资   |
+-----------------+--------+--------+----------+--------+--------+--------+
| 网络工程师      | 张三   |     27 |       16 | 本科   |      3 |   6000 |
+-----------------+--------+--------+----------+--------+--------+--------+
1 row in set (0.00 sec)

在这里插入图片描述

增加表ttt及新数据

mysql> create table ttt(name char(16), scores int (20));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into ttt values('sam','80');
Query OK, 1 row affected (0.00 sec)

mysql> insert into ttt values('jack','70');
Query OK, 1 row affected (0.00 sec)

mysql> select * from ttt;
+------+--------+
| name | scores |
+------+--------+
| sam  |     80 |
| jack |     70 |
+------+--------+
2 rows in set (0.00 sec)

在这里插入图片描述

开启增量备份

[root@server1 ~]# cd /opt/
[root@server1 opt]# mkdir bak_sql
[root@server1 opt]# mysqldump -uroot -p aaa > /opt/bak_sql/cloud-$(date +%F).sql
Enter password:              //非明文,输入密码123123

[root@server1 opt]# vi /etc/my.cnf
log_bin=/usr/local/mysql/data/mysql_bin   //添加位置如下

在这里插入图片描述

重启服务

[root@server1 opt]# cd
[root@server1 ~]# systemctl restart mysqld.service 

开始操作增量备份

[root@server1 ~]# mysqladmin -uroot -p flush-logs
Enter password:              //非明文,输入密码123123

[root@server1 ~]# cd /usr/local/mysql/data/
[root@server1 data]# ls -lh

在这里插入图片描述

查询该二进制日志内容是否正确

[root@server1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000002

在这里插入图片描述

再次操作,再次增量备份

[root@server1 ~]# mysql -uroot -p123123
mysql> show tables;
+---------------+
| Tables_in_aaa |
+---------------+
| IT_salary     |
| cj            |
| cj2           |
| t1            |
| ttt           |
+---------------+
5 rows in set (0.00 sec)

mysql> insert into ttt values('sisi','90');
Query OK, 1 row affected (0.01 sec)   //正确操作

mysql> delete from ttt where name='jack';
Query OK, 1 row affected (0.00 sec)    //误操作

mysql> insert into ttt values('haha','65');
Query OK, 1 row affected (0.01 sec)    //正确操作

在这里插入图片描述

开始操作增量备份

mysql> exit

[root@server1 ~]# mysqladmin -uroot -p flush-logs
Enter password:             //非明文,输入123123
[root@server1 ~]# 

[root@server1 ~]# cd /usr/local/mysql/data/
[root@server1 data]# ls -lh

在这里插入图片描述

查询该二进制日志内容

[root@server1 data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000003

**加粗样式**

删除原先坏掉的那张表

[root@server1 ~]# mysql -uroot -p123123
mysql> use aaa;
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> drop table ttt;
Query OK, 0 rows affected (0.00 sec)

在这里插入图片描述

还原完全备份的那个数据库

查看备份文件

[root@server1 ~]# cd /opt/bak_sql/
[root@server1 bak_sql]# ls -lh
总用量 8.0K
-rw-r--r--. 1 root root 5.0K 1224 20:08 cloud-2020-12-24.sql

在这里插入图片描述

开始还原

[root@server1 ~]# mysql  -u root -p aaa < /opt/bak_sql/cloud-2020-12-24.sql
Enter password:        //非明文,输入123123

再次查看备份日志

确认停止错误的时间和开始正确的时间

mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000003

停止错误的时间
在这里插入图片描述
开始正确的时间
在这里插入图片描述

[root@server1 ~]# mysqlbinlog --no-defaults --stop-datetime='2020-12-24 20:48:38' /usr/local/mysql/data/mysql_bin.000003 | mysql -uroot -p
Enter password:          //非明文,输入123123,停止错误的时间
[root@server1 ~]# mysqlbinlog --no-defaults --start-datetime='2020-12-24 20:58:02' /usr/local/mysql/data/mysql_bin.000003 | mysql -uroot -p
Enter password:         //非明文,输入123123,开始正确的时间

在这里插入图片描述

验证

登录数据库,查看删除的ttt表是否恢复

[root@server1 ~]# mysql -uroot -p123123
mysql> use aaa;
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 databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| abc                |
| auth               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
7 rows in set (0.00 sec)

mysql> show tables;
+---------------+
| Tables_in_aaa |
+---------------+
| IT_salary     |
| cj            |
| cj2           |
| t1            |
| ttt           |
+---------------+
5 rows in set (0.00 sec)

mysql> select * from ttt;
+------+--------+
| name | scores |
+------+--------+
| sam  |     80 |
| jack |     70 |
| sisi |     90 |
| haha |     65 |
+------+--------+
4 rows in set (0.00 sec)

在这里插入图片描述
在这里插入图片描述

项目四:基于位置点恢复

删除原先坏掉的那张表;

mysql> use aaa;

mysql> delete from ttt where name='sisi';
Query OK, 1 row affected (0.00 sec)

mysql> delete from ttt where name='haha';
Query OK, 1 row affected (0.00 sec)

在这里插入图片描述

查询该二进制日志内容

[root@server1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000003

上一次正确操作的位置点停止

[root@server1 ~]# mysqlbinlog --no-defaults --stop-position='13492' /usr/local/mysql/data/mysql_bin.000003 | mysql -uroot -p

在这里插入图片描述

下一次正确操作的位置点开始

[root@server1 ~]# mysqlbinlog --no-defaults --start-position='13523' /usr/local/mysql/data/mysql_bin.000003 | mysql -uroot -p

验证

mysql> select * from ttt;
+------+--------+
| name | scores |
+------+--------+
| sam  |     80 |
| jack |     70 |
| sisi |     90 |
| haha |     65 |
+------+--------+
4 rows in set (0.00 sec)

在这里插入图片描述
恢复成功成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值