数据库的备份的分类

1.1造成数据丢失的原因

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

1.2物理与逻辑的角度,备份的几种分类

1、物理备份:
冷备份:在数据关闭的状态下运行
热备份:在数据库运行的状态时进行备份操作,该备份方法依赖数据库日志文件。
温备份:数据局锁定表格(可以读不可以写)的状态年备份数据库
2、逻辑备份:
逻辑备份是对数据库逻辑组件(如表等数据库对象)的备份,表示为逻辑数据结构(create database、create tabale)
和内容(insert语句或分割文本文件)的信息

MySQL 完全备份与恢复

完全备份

每次对数据库进行完整的备份,即对整个数据的备份,数据库结构和文件结构备份。保存的是完整时刻的数据库

MySQL 增量备份,差异备份与恢复

1.1差异备份

备份那些自从上次完整备份之后被修改过的所有文件,备份的时间节点是从上次完整备份起,备份的数据量会越来越大,恢复数据只是恢复上次的完整备份和最近一次的差异备份。

1.2增量备份

只有那些在上次完全备份或者增量备份后被修改的文件才会备份,以上次完成整备份,或者上次的增量备份的时间点,仅备份这之间的数据变化,因而备份的数据量小,占用空间小,备份数据速度快,但恢复时候,需要从上次的完整备份开始到最后一次的增量备份之间所有的增量依次恢复,如中间某次的恢复数据备份损坏,将导致数据的丢失。

MySQL备份恢复方案

1.1物理冷备

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

[root@localhost ~]# systemctl stop mysqld                                ###关闭数据库####
[root@localhost ~]# mkdir /backup                                        ###在根下新建个backup目录
[root@localhost ~]# tar zcf /backup/mysql_all-$(date +%F).tar.gz /usr/local/mysql/data/           #####/usr/local/mysql/data备份压缩
[root@localhost ~]# cd /backup/                                               ###进入/backup/         
[root@localhost backup]# ll                                                        ##查看备份

在这里插入图片描述

备份数据库:
◆模拟故障
[root@localhost backup]# mkdir /bak                                            ####在根下新建bak目录
[root@localhost backup]# mv /usr/local/mysql/data/ /bak/          ####将目录data数据移动到bak 里面去
[root@localhost backup]# cd /usr/local/mysql/                             #####仅mysql目录查看data
[root@localhost mysql]# ll                                                              ####查看后data目录被移走 ,模拟故障成功

在这里插入图片描述

◆数据库恢复
[root@localhost mysql]# mkdir /restore                                                                                        ####根目录新建restore 目录
[root@localhost mysql]# tar xzvf /backup/mysql_all-2018-08-12.tar.gz -C /restore/              ####将备份数据库解压到 /restore目录下  不要无脑刷,时间节点不一样
usr/local/mysql/data/
usr/local/mysql/data/ibdata1
usr/local/mysql/data/ib_logfile1
usr/local/mysql/data/ib_logfile0
。。。。。省略。。。。。。

[root@localhost mysql]# mv /restore/usr/local/mysql/data/ /usr/local/mysql/          ####将备份数据移动到到/usr/local/mysql中
[root@localhost mysql]# systemctl start mysqld                                                          ####启动mysql数据库
[root@localhost mysql]# systemctl status mysqld                                                        ####查看mysql数据库启动状态  ,日志文件显示正常。

在这里插入图片描述

1.2专用备份工具mydump或mysqlhotcopy

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

将指定的库、表、或全部的库导出为SQL脚本

#####备份操作#####
mysqldump备份需要和mysql进行数据交互,如果关闭mysql 则无法备份和恢复
mysqldump [选项] 库名 [表名1] [表名2] … > /备份路径/备份文件名
mysqldump [选项] --databases 库名1 [库名2] … > /备份路径/备份文件名
mysqldump [选项] --all-databases  > /备份路径/备份文件名

#######创建环境#####
[root@localhost mysql]# mysql -uroot -p                  #### 进入数据库
mysql> create databases auth;                              	####创建auth 这个数据库
mysql> use auth;                              		####进入auth 这个数据库
mysql> create table users (user_name CHAR(16) NOT NULL, user_passwd CHAR(48) DEFAULT '', PRIMARY KEY (user_name));
Database changed
mysql> insert into users(user_name,user_passwd) values('zhangsan', password('123456'));
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> insert into users values('lisi', password('123456'));
Query OK, 1 row affected, 1 warning (0.01 sec)

在这里插入图片描述

[root@localhost /]# mysqldump -u root -p mysql user >mysql-user.sql     ###备份数据路mysql中的user表  ,文件保存在当前操作目录下面
Enter password:                                                                                                  ###输入密码abc123            

######列子#####
[root@localhost /]# mysqldump -u root -p --databases auth >auth.sql      ####备份auth数据库     文件保存在当前操作目录下面
Enter password:                                                                                             ####输入密码abc123 

备份好数据库之后,我们vi /auth.sql 进入这个备份文件看下里面内容

在这里插入图片描述
从数据可以看出,当还原的试试,如果存在相同的表,会把之前的表删除,但是并没有删除相同的库的程序,故如果恢复数据的时候,要手动先把库给删了,避免报错。当然这也是仅针对于备份单个库,如果备份多个库时,则脚本文件里有如存在相同的库是,会删除之前相同的库。这样恢复时就不需要再手动进行删库。

#####恢复操作#####
mysql [选项] [库名] [表名] < /备份路径/备份文件名


```powershell
[root@localhost /]# mysql -u root -p                  ###进入数据库###
Enter password:                                                    ###输入密码####
mysql> show databases;                                      ###查看数据库####
+--------------------+
| Database           |
+--------------------+
| information_schema |
| auth               |
| bdqn               |
| myadm              |
| mysql              |
| performance_schema |
| sys                |

mysql> create database text ;                           ####新建数据库text ,等下导表用###
Query OK, 1 row affected (0.00 sec)
mysql> exit                                                      ####退出#####

[root@localhost opt]# mysql -u root -p text < mysql-user.sql 
Enter password: 

[root@localhost /]# mysql -u root -p -e 'show tables from text'    #######验证输出结果####
Enter password:                                                                               ######输入密码
+----------------+
| Tables_in_text |
+----------------+
| user           |                                                                                   ####导进去的表
+----------------+

[root@localhost /]# mysql -u root -p -e 'drop database auth'            ######模拟故障删除auth数据库
Enter password: 
[root@localhost /]# mysql -u root -p -e 'show databases'                  ######查看databases所有数据库有没有auth,发现没有了
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bdqn               |
| myadm              |
| mysql              |
| performance_schema |
| sys                |
| text               |
[root@localhost /]# mysql -u root -p < ./auth.sql                             ####导入数据库auth
Enter password:                                                                                  ####输入密码
[root@localhost /]# mysql -u root -p -e 'show databases'                ######查看databases所有数据库有没有auth,发现有了
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| auth               |                                                                                  ####导进去的auth数据库
| bdqn               |
| myadm              |
| mysql              |
| performance_schema |
| sys                |
| text               |
+--------------------+
1.3启动二进制日志进行增量备份

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

**#####一般恢复####
mysqlbinlog [–no-defaults] 增量备份文件 | mysql -u 用户名 -p

####基于位置的恢复###
1、恢复数据到指定位置
mysqlbinlog --stop-position=’操作 id’ 二进制日志 |mysql -u 用户名 -p 密码

2、从指定的位置开始恢复数据
mysqlbinlog --start-position=’操作 id’ 二进制日志 |mysql -u 用户名 -p 密码
**



#####基于时间点的恢复#####
1、从日志开头截止到某个时间点的恢复
mysqlbinlog [--no-defaults] --stop-datetime=’年--日 小时:分钟:秒’ 二进制日志 | mysql -u 用户名 -p 密码

2、从某个时间点到日志结尾的恢复
mysqlbinlog [--no-defaults] --start-datetime=’年--日 小时:分钟:秒’ 二进制日志 | mysql -u 用户名 -p 密码

3、从某个时间点到某个时间点的恢复
mysqlbinlog [--no-defaults] --start-datetime=’年--日 小时:分钟:秒’ --stop-datetime=’年--日小时:分钟:秒’ 二进制日志 | mysql -u 用户名 -p 密码
#########mysql企业备份案例######
1、一般恢复(丢什么数据,找什么数据)
[root@localhost opt]# mysql -u root -p
Enter password: 
mysql> create database client;
Query OK, 1 row affected (0.01 sec)
mysql> use client;
mysql> create table user_info(身份证 char(20) not null,姓名 char(20) not null,姓别 char(4),用户ID号 char(10) not null,资费 int(10));
mysql> insert into user_info values('000006','张三','男','016','10');
mysql> insert into user_info values('000007','李四','女','017','91');
mysql> insert into user_info values('000008','王五','女','018','23');
mysql> select * from user_info;

mysql> show master logs;                                    ####查看当前数据库binlog文件
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |      1492 |
+------------------+-----------+
1 row in set (0.00 sec)


2、进行一次完全备份
mysql>lock tables user_info read;                     #####备份前需要将数据库加读锁,防止数据在备份时写入。
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye
[root@localhost ~]# mkdir /mysql_bak                       ###创建/mysql_bak 目录

[root@localhost opt]# mysqldump -u root -p client user_info >/mysql_bak/client_userinfo-$(date +%F).sql      ####这边括号中%F 的F必须是大写的
Enter password: 
[root@localhost ~]# ll /mysql_bak/
总用量 4
-rw-r--r-- 1 root root 2055 8月  15 05:55 client_userinfo-2018-08-15.sql

[root@localhost ~]# cd /mysql_bak/
[root@localhost mysql_bak]# mysqladmin -u root -p flush-logs
[root@localhost ~]#  ll /usr/local/mysql/data/

在这里插入图片描述

3、继续录入新的内容并进行增量备份
[root@localhost mysql_bak]# mysql -u root -p
Enter password: 
mysql> unlock tables;             #######解除表锁。
Query OK, 0 rows affected (0.00 sec)
mysql> use client;
mysql> insert into user_info values('000009','赵六','男','019','37');
mysql> insert into user_info values('000010','孙七','男','020','36');
mysql> select * from user_info;
+-----------+--------+--------+-------------+--------+
| 身份证    | 姓名   | 姓别   | 用户ID号    | 资费   |
+-----------+--------+--------+-------------+--------+
| 000006    | 张三   || 016         |     10 |
| 000007    | 李四   || 017         |     91 |
| 000008    | 王五   || 018         |     23 |
| 000009    | 赵六   || 019         |     37 |
| 000010    | 孙七   || 020         |     36 |
+-----------+--------+--------+-------------+--------+
5 rows in set (0.00 sec)

mysql> exit
Bye

[root@localhost mysql_bak]# mysqladmin -u root -p flush-logs
Enter password:

[root@localhost ~]# ll /usr/local/mysql/data
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200913171920615.png#pic_center在这里插入图片描述
在这里插入图片描述

[root@localhost ~]# cp /usr/local/mysql/data/mysql-bin.000002 /mysql_bak/


4、模拟误操作删除 user_info表
[root@localhost mysql_bak]# mysql -u root -p -e 'drop table client.user_info'
Enter password: 
[root@localhost mysql_bak]# mysql -u root -p -e 'select * from client.user_info'
Enter password: 
ERROR 1146 (42S02) at line 1: Table 'client.user_info' doesn't exist

5、恢复操作
[root@localhost mysql_bak]# mysql -u root -p client < /mysql_bak/client_userinfo-2018-08-14.sql 
Enter password: 
[root@localhost mysql_bak]# mysql -u root -p -e'select * from client.user_info'
Enter password: 
+-----------+--------+--------+-------------+--------+
| 身份证    | 姓名   | 姓别   | 用户ID号    | 资费   |
+-----------+--------+--------+-------------+--------+

| 000006    | 张三   || 016         |     10 |
| 000007    | 李四   || 017         |     91 |
| 000008    | 王五   || 018         |     23 |
+-----------+--------+--------+-------------+--------+

[root@localhost ~]# mysqlbinlog --no-defaults /mysql_bak/mysql-bin.000002 |mysql -u root -p
Enter password: 
[root@localhost ~]#  mysql -u root -p -e'select * from client.user_info'
Enter password: 
+-----------+--------+--------+-------------+--------+
| 身份证    | 姓名   | 姓别   | 用户ID号    | 资费   |
+-----------+--------+--------+-------------+--------+
| 000006    | 张三   || 016         |     10 |
| 000007    | 李四   || 017         |     91 |
| 000008    | 王五   || 018         |     23 |
| 000009    | 赵六   || 019         |     37 |
| 000010    | 孙七   || 020         |     36 |
+-----------+--------+--------+-------------+--------+
######基于位置恢复#####
[root@localhost mysql_bak]# mysql -uroot -p -e 'drop table client.user_info'    ### 删除表user_info
Enter password: 

[root@localhost mysql_bak]# mysql -uroot -p -e 'select * from client.user_info'
Enter password: 
ERROR 1146 (42S02) at line 1: Table 'client.user_info' doesn't exist   //报错,因为表已经被删除



[root@localhost mysql_bak]# mysql -u root -p client < /mysql_bak/client_userinfo-2020-09-13.sql 
Enter password:

[root@localhost ~]# mysql -u root -p -e'select * from client.user_info'
Enter password: 
+-----------+--------+--------+-------------+--------+
| 身份证    | 姓名   | 姓别   | 用户ID号    | 资费   |
+-----------+--------+--------+-------------+--------+
| 000006    | 张三   || 016         |     10 |
| 000007    | 李四   || 017         |     91 |
| 000008    | 王五   || 018         |     23 |
+-----------+--------+--------+-------------+--------+

[root@localhost ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /mysql_bak/mysql-bin.000002 ####–base64-output=decode-rows 64解码 ### -v 换行显示
在这里插入图片描述
在这里插入图片描述

[root@localhost mysql_bak]# mysqlbinlog --no-defaults --stop-position='517' /mysql_bak/mysql-bin.000002 |mysql -u root -p
Enter password: 
[root@localhost mysql_bak]#  mysql -u root -p -e'select * from client.user_info'
Enter password: 

在这里插入图片描述

[root@localhost ~]# mysql -u root -p -e 'drop table client.user_info'
Enter password: 
[root@localhost ~]#  mysql -u root -p client < /mysql_bak/client_userinfo-2020-09-13.sql
Enter password: 
[root@localhost ~]# mysqlbinlog --no-defaults --start-position='657' /mysql_bak/mysql-bin.000002 |mysql -u root -p        ####操作的节点附近即可
Enter password: 
[root@localhost ~]# mysql -u root -p -e'select * from client.user_info'
Enter password: 
+-----------+--------+--------+-------------+--------

| 身份证    | 姓名   | 姓别   | 用户ID号    | 资费   |
+-----------+--------+--------+-------------+--------+
| 000006    | 张三   || 016         |     10 |
| 000007    | 李四   || 017         |     91 |
| 000008    | 王五   || 018         |     23 |
| 000010    | 孙七   || 020         |     36 |
+-----------+--------+--------+-------------+--------+
#######总结##
基于位置恢复的操作,节点不要选择太靠近操作的节点,否则容易恢复失败。

######基于时间恢复#####  20200913  0:01:10
mysqlbinlog --no-defaults --stop-datetime='2018-8-15 6:07:39' /mysql_bak/mysql-bin.000002 |mysql -u root -p    ##恢复赵六
mysqlbinlog --no-defaults --start-datetime='2018-8-15 6:07:39' /mysql_bak/mysql-bin.000002 |mysql -u root -p    ##恢复孙七


mysqlbinlog --no-defaults --stop-datetime='2020-9-13 0:01:10' /mysql_bak/mysql-bin.000002 |mysql -u root -p    ##恢复赵六
mysqlbinlog --no-defaults --start-datetime='2020-9-13 0:01:10' /mysql_bak/mysql-bin.000002 |mysql -u root -p    ##恢复孙七


mysqlbinlog --no-defaults --start-datetime='2019-3-13 18:16:30' /mysql_bak/mysql-bin.000003 |mysql -u root -p
18:16:30

####列子###
[root@localhost ~]# mysql -u root -p -e 'drop table client.user_info'
Enter password: 
[root@localhost ~]# mysql -u root -p client < /mysql_bak/client_userinfo-2018-08-15.sql 
Enter password: 
[root@localhost ~]# mysqlbinlog --no-defaults --stop-datetime='2018-8-15 6:07:39' /mysql_bak/mysql-bin.000002 |mysql -u root -p          ######时间戳不要弄错了
Enter password: 
[root@localhost ~]# mysql -u root -p -e'select * from client.user_info'
Enter password: 
+-----------+--------+--------+-------------+--------+
| 身份证    | 姓名   | 姓别   | 用户ID号    | 资费   |
+-----------+--------+--------+-------------+--------+
| 000006    | 张三   || 016         |     10 |
| 000007    | 李四   || 017         |     91 |
| 000008    | 王五   || 018         |     23 |
| 000009    | 赵六   || 019         |     37 |
+-----------+--------+--------+-------------+--------+

[root@localhost ~]# mysql -u root -p -e 'drop table client.user_info'
Enter password: 
[root@localhost ~]# mysql -u root -p client < /mysql_bak/client_userinfo-2018-08-15.sql 
Enter password: 
[root@localhost ~]# mysqlbinlog --no-defaults --start-datetime='2018-8-15 15:33:48' /mysql_bak/mysql-bin.000002 |mysql -u root -p    ######时间戳不要弄错了,根据的你的日志文件来##
Enter password: 
[root@localhost ~]# mysql -u root -p -e'select * from client.user_info'
Enter password: 
+-----------+--------+--------+-------------+--------+
| 身份证    | 姓名   | 姓别   | 用户ID号    | 资费   |
+-----------+--------+--------+-------------+--------+
| 000006    | 张三   || 016         |     10 |
| 000007    | 李四   || 017         |     91 |
| 000008    | 王五   || 018         |     23 |
| 000010    | 孙七   || 020         |     36 |
+-----------+--------+--------+-------------+--------+

#####验证表的锁定是否产生二进制文件####

mysqladmin -u root -p flush-logs
[root@localhost ~]# mysql -uroot -p -e 'show master logs'
Enter password: 
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |      1539 |
| mysql-bin.000002 |       797 |
| mysql-bin.000003 |      9438 |
| mysql-bin.000004 |       154 |
+------------------+-----------+
mysql> use client;

mysql> insert into user_info values('000009','老八','男','025','23');
mysql> select * from user_info;
mysql>LOCK TABLES tbl_name READ;

mysql> insert into user_info values('000010','赵9','男','030','23');


[root@localhost ~]# mysqladmin -u root -p flush-logs
Enter password: 
[root@localhost ~]# mysql -uroot -p -e 'show master logs'
Enter password: 
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |      1539 |
| mysql-bin.000002 |       797 |
| mysql-bin.000003 |      9438 |
| mysql-bin.000004 |       499 |
| mysql-bin.000005 |       154 |
+------------------+-----------+

[root@localhost ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /mysql_bak/mysql-bin.000004              ####--base64-output=decode-rows    64解码    ###  -v   换行显示



1.4 第三方工具备份

免费的MySQL 热备份软件Percona XtraBackup

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐