Mysql 完全备份+增量备份+备份恢复详细步骤

文章目录

  • 一、简介
  • 二、完全备份与增量备份的概念
    • 2.1、从物理与逻辑的角度
    • 2.2、从数据库的备份策略角度
  • 三、mysqldump备份库
    • 3.1:物理冷备份
    • 3.2:数据恢复
  • 四:mysqldump备份数据库
    • 4.1:mysqldump命令对单个库进行完全备份
    • 4.2:mysqldump命令对多个库进行完全备份
    • 4.3:对所有库进行完全备份
    • 4.4:mysqldump备份数据表
  • 五、数据库的恢复
  • 六、增量备份

一、简介

1·完全备份与增量备份的概念
2·使用 mysqldump 完全备份
3·使用 mysqldump 进行表结构备份
4·完全备份恢复的两种方法
5·使用 flush logs 进行增量备份
6·增量备份恢复
7·基于时间点与位子的恢复
8·MySQL 备份思路

  • 在生产环境中,数据的安全性是至关重要的,任何数据的丢失都可能产生严重的后果

  • 造成数据丢失的原因:

    1.程序错误
    2.人为错误
    3.计算机失败
    4.磁盘失败
    5.灾难(如火灾、地震)和偷窃

二、完全备份与增量备份的概念

1·MySQL 完全备份:是对整个数据库的备份、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库,它也是增量备份的基础。它的优点:备份与恢复操作简单,缺点是数据存在大量的重复,占用大量的备份空间,备份时间长。
2·MySQL 增量备份:是针对在上次完全备份或增量备份后被修改的文件才会备份。因为完全备份的 缺点会占用很多的资源,所以增量备份与完全备份这中结合就能解决这样的缺点。
3·MySQL 是没有提供直接的增量备份的办法,但是可以通过MySQL的二进制日志间接实现增量备份。二进制日志保存了所有更新或者可能更新数据库的操作,使用flush logs 可以使日志分割开来,这样就可以识别每次更新的操作会在另一个日志文件中。

2.1、从物理与逻辑的角度

  • 物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。

  • 物理备份又可以分为脱机备份(冷备份)和联机备份(热备份)。

     冷备份:是在关闭数据库的时候进行的。
     热备份:数据库处于运行状态,这种备份方法依赖于数据库的日志文件。
    

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

2.2、从数据库的备份策略角度

备份可分为:

  • 完全备份:每次对数据进行完整的备份

  • 差异备份:备份那些自从上次完全备份之后被修改过的文件

  • 增量备份:只有那些在上次完全备份或者增量备份后被修改的文件才会被备份

三、mysqldump备份库

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

3.1:物理冷备份

进入数据库
[root@localhost ~]# mysql -uroot -p

创建库与表

mysql> create database aa;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aa                 |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use aa;
Database changed
mysql> create table chengji (name varchar(10),point int(10));
Query OK, 0 rows affected (0.03 sec)

mysql> desc chengji;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(10) | YES  |     | NULL    |       |
| point | int(10)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.03 sec)

Mysql 完全备份+增量备份+备份恢复详细步骤_第1张图片
插入内容

mysql> insert into chengji values('xixi',88),('ww',89);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from chengji;
+------+-------+
| name | point |
+------+-------+
| xixi |    88 |
| ww   |    89 |
+------+-------+
2 rows in set (0.00 sec)

3.2:数据恢复

[root@localhost ~]# systemctl stop mysqld.service 
[root@localhost ~]# mkdir /backup
[root@localhost ~]# tar zcvf /backup/mysql_all-$(date +%F).tar.gz /usr/local/mysql/data/
tar: 从成员名中删除开头的“/

Mysql 完全备份+增量备份+备份恢复详细步骤_第2张图片

四:mysqldump备份数据库

mysql 数据库的备份可以采取多种方式:

  • 直接打包数据库文件夹;
  • 使用专用的备份工具 ----- mysqldump ; 该命令工具可以将指定的库、表或全部的库导出为 SQL
    脚本,在需要恢复时可进行数据恢复。

4.1:mysqldump命令对单个库进行完全备份

mysqldump  -u 用户名 -p【密码】【选项】【数据库名】 > 备份路径/备份文件名

  • 单裤备份的示例
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| cjf              |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

[root@localhost ~]# mysqldump -u root -p shuai > /opt/cjf.sql
#shuai.sql就是导出的备份文件
[root@localhost opt]# ls
mysql-5.7.20                 mysql-boost-5.7.20.tar.gz  shuai.sql
mysql_all_2020-08-19.tar.gz  rh

4.2:mysqldump命令对多个库进行完全备份

mysqldump -u 用户名 -p 【密码】【选项】 --databases 库名1 【库名2.. > /备份路径/备份文件名

  • 多库备份的示例
#显示所有数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mei                |
| mysql              |
| performance_schema |
| cjf              |
| sys                |
+--------------------+
6 rows in set (0.01 sec)
#进行多库备份
[root@localhost opt]# mysqldump -uroot -pabc123 --databases cjf mei > /opt/shuai.mei
mysqldump: [Warning] Using a password on the command line interface can be insecure.

4.3:对所有库进行完全备份

  • 所有库备份的示例
[root@localhost opt]# mysqldump -uroot -123123 --all-databases > /opt/all.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

4.4:mysqldump备份数据表

  • musqldump可针对库内特定的表进行备份
  • 使用mysqldump备份表的操作
musqldump可针对库内特定的表进行备份

使用mysqldump备份表的操作

例子:

#进入cjf库
mysql> use cjf ;
#显示数据表
mysql> show tables;
+-----------------+
| Tables_in_shuai |
+-----------------+
| sus             |
+-----------------+
1 row in set (0.00 sec)
#查询表内容
mysql> select * from sus;
+----+----------+---------+
| id | name     | address |
+----+----------+---------+
|  1 | zhangsan | banjing |
|  2 | lisi     | suzhou  |
+----+----------+---------+
2 rows in set (0.00 sec)
#复制sus表 name字段 张三内容 生成一张新表aa
mysql> create table pp as select * from tom where name='zhangsan';

mysql> show tables;
+-----------------+
| Tables_in_shuai |
+-----------------+
| aa              |
| sus             |
+-----------------+
2 rows in set (0.00 sec)
#新生成表
mysql> select * from aa;
+----+----------+---------+
| id | name     | address |
+----+----------+---------+
|  1 | zhangsan | banjing |
+----+----------+---------+
1 row in set (0.00 sec)

备份cjf库aa表

[root@localhost ~]# mysql -uroot -p123123 cjf aa > /opt/pp.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
#查看备份
[root@localhost ~]# ls /opt
mysql-5.7.20  mysql-boost-5.7.20.tar.gz  aa.sql  rh

五、数据库的恢复

  • 使用mysqldump命令导出的SQL备份脚本,在进行数据恢复时可使用以下方法导入

    source命令
    mysql命令

    source命令恢复

  • 使用source恢复数据库的步骤

  • 登录到MySQL数据库

  • 执行source 备份sql脚本的路径

模拟环境:把数据库student的stu01表删除

#登录数据库
use student;
drop table stu01;

source恢复

格式:source 表备份的绝对路径;
mysql> source /opt/student_stu01.sql;   #注意:恢复的是绝对路径

Mysql 完全备份+增量备份+备份恢复详细步骤_第3张图片
mysql命令恢复

格式:
mysql -u用户名 -p[密码] 库名 < 表备份脚本的路径
例:
mysql -uroot -123123 student < /opt/student_stu01.sql 

Mysql 完全备份+增量备份+备份恢复详细步骤_第4张图片

六、增量备份

增量备份的方法

  • MySQL没有提供直接的增量备份方法
  • 可以通过MySQL提供的二进制日志 (binary logs) 间接实现增量备份
  • MySQL二进制日志对备份的意义
    • 二进制日志保存了所有更新或者可能更新数据库的操作
    • 二进制日志在启动MySQL服务器后开始记录,并在文件达到max_binlog_size所设置的大小或者接收到flush
      logs命令后重新创建新的日志文件
    • 只需定时执行flush logs方法重新创建新的日志,生成二进制文件序列,并及时把这些旧的日志保存到安全的地方就完成了一个时间段的增量备份
      一般恢复
mysqbinlog [--no-defaults] 增量备份文件 | mysql -u 用户名 -p

示例
首先进行完全备份数据库

#显示数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| cjf              |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

#进入cjf数据库
mysql> use cjf;
Database changed

#显示数据库里所有表
mysql> show tables;
+-----------------+
| Tables_in_shuai |
+-----------------+
| aa             |
| sus             |
+-----------------+
2 rows in set (0.00 sec)

#查看数据表
mysql> select * from tom;
+----+----------+---------+
| id | name     | address |
+----+----------+---------+
|  1 | zhangsan | banjing |
|  2 | lisi     | suzhou  |
+----+----------+---------+
2 rows in set (0.00 sec)

#进行完全备份
[root@localhost opt]# mysqldump -uroot -p123123  cjf sus > /opt/sus.sql

开启二进制日志文件功能

[root@localhost ~]# vim /etc/my.cnf
#在[mysqld]项中加入配置 log-bin=mysql-bin'
...省略内容
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
log-bin=mysql-bin  #添加此句  lob-bin:二进制文件功能   生成的二进制文件是以mysql-bin为开头
#重启服务
[root@localhost data]# systemctl restart mysqld.service 

查看生成的二进制日志文件
Mysql 完全备份+增量备份+备份恢复详细步骤_第5张图片
进行正常操作和误操作,进行增量备份

#使用cjf库
mysql> use cjf;

#插入数据内容  执行正确操作
mysql> insert into tom (name,address) values ('liuge','nanjing');
Query OK, 1 row affected (0.00 sec)

#显示表内容
mysql> select * from tom;
+----+----------+---------+
| id | name     | address |
+----+----------+---------+
|  1 | zhangsan | banjing |
|  2 | lisi     | suzhou  |
|  3 | liuge    | nanjing |
+----+----------+---------+
3 rows in set (0.00 sec)

#进行误操作  删除张三
mysql> delete from tom where id=1;
Query OK, 1 row affected (0.00 sec)

#显示表数据内容
mysql> select * from tom;
+----+-------+---------+
| id | name  | address |
+----+-------+---------+
|  2 | lisi  | suzhou  |
|  3 | liuge | nanjing |
+----+-------+---------+
2 rows in set (0.00 sec)

#再次进行正确操作  添加shuaige
mysql> insert into tom (name,address) values ('shuaige','shanghai');
Query OK, 1 row affected (0.00 sec)

mysql> select * from tom;
+----+---------+----------+
| id | name    | address  |
+----+---------+----------+
|  2 | lisi    | suzhou   |
|  3 | liuge   | nanjing  |
|  4 | shuaige | shanghai |
+----+---------+----------+
3 rows in set (0.00 sec)
#错误操作在两个正确操作中间   下一步进行增量恢复

增量备份

#进行增量备份
[root@localhost data]# mysqladmin -uroot -p123123 flush-logs
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root

查看增量备份文件

[root@localhost data]# pwd
/usr/local/mysql/data
#多出一个 mysql-bin.000002 
[root@localhost data]# ls
auto.cnf        ib_logfile0  mysql             mysql-bin.index     sys
ib_buffer_pool  ib_logfile1  mysql-bin.000001  performance_schema
ibdata1         ibtmp1       mysql-bin.000002  cjf

直接mysqlbinlog出来的 文件
执行sql部分的sql显示为base64编码格式
固生成sql记录的时候 不能用常规的办法去生成 需要加上相应的参数才能显示出sql语句
–base64-output=decode-rows -v

[root@localhost data]# mysqlbinlog  --no-defaults --base64-output=decode-rows -v mysql-bin.000001  > /opt/bk02.txt
#解码就可以看生成的日志文件内容

[root@localhost data]# cd /opt
[root@localhost opt]# ls
bk01.txt  bk02.txt  mysql-5.7.20  mysql-boost-5.7.20.tar.gz  rh  tom.sql

正常操作语句
Mysql 完全备份+增量备份+备份恢复详细步骤_第6张图片
错误语句 568为错误语句开始的位置id 200800 16:07:35为错误语句开始的位置时间 也就是上一次正确语句的结束
Mysql 完全备份+增量备份+备份恢复详细步骤_第7张图片
.正确语句 847是正确语句开始的地址id 也是上一次语句的结束
Mysql 完全备份+增量备份+备份恢复详细步骤_第8张图片
模拟故障,删除tom表进行恢复

mysql> select * from tom;
+----+---------+----------+
| id | name    | address  |
+----+---------+----------+
|  2 | lisi    | suzhou   |
|  3 | liuge   | nanjing  |
|  4 | shuaige | shanghai |
+----+---------+----------+
3 rows in set (0.00 sec)
3删除tom表
mysql> drop table sus;
Query OK, 0 rows affected (0.00 sec)
#sus表已经没了
mysql> show tables;
+-----------------+
| Tables_in_cjf |
+-----------------+
| aa             |
+-----------------+
1 row in set (0.00 sec)

#进行恢复   
mysql> source /opt/sus.sql;

#显示所有表    已经恢复了
mysql> show tables;
+-----------------+
| Tables_in_cjf |
+-----------------+
| aa              |
| cjf            |
+-----------------+
2 rows in set (0.00 sec)
#恢复成功
mysql> select * from sus;
+----+----------+---------+
| id | name     | address |
+----+----------+---------+
|  1 | zhangsan | banjing |
|  2 | lisi     | suzhou  |
+----+----------+---------+
2 rows in set (0.00 sec)

基于位置恢复
恢复数据到指定位置

mysqlbinlog --stop-position='操作id'  二进制日志 | mysql -u 用户名 -p 密码

从指定的位置开始恢复数据

mysqlbinlog --start-position=‘操作‘ 二进制日志 | mysql -u 用户名 -p密码

示例

#错误的开始是621  所有正确的一值到621之前结束
[root@localhost opt]# mysqlbinlog --no-defaults --stop-position='568' /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123123
mysql: [Warning] Using a password on the command line interface can be insecure.
#liuge已经恢复
mysql> select * from tom;
+----+----------+---------+
| id | name     | address |
+----+----------+---------+
|  1 | zhangsan | banjing |
|  2 | lisi     | suzhou  |
|  3 | liuge    | nanjing |
+----+----------+---------+
3 rows in set (0.00 sec)

#恢复cjfghe   添加此句   
只要绕过错误的语句id就行  错误id为621   从错误的id下面的678开始就可恢复
[root@localhost opt]# mysqlbinlog --no-defaults --start-position='678' /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123123
mysql: [Warning] Using a password on the command line interface can be insecure.
#恢复shuaige成功
mysql> select * from sus;
+----+----------+----------+
| id | name     | address  |
+----+----------+----------+
|  1 | zhangsan | banjing  |
|  2 | lisi     | suzhou   |
|  3 | liuge    | nanjing  |
|  4 | shuaige  | shanghai |
+----+----------+----------+
4 rows in set (0.00 sec)
#断点的恢复避免了完全恢复  也把错误操作恢复的优点 生产环境运用较多  

基于时间恢复
从日志开头截止到某个时间点的恢复

mysqlbinlog [--no-defaults]--stop-datetime='年--日小时:分钟:秒二进制

日志|mysql -u用户名-p密码从某个时间点到日志结尾的恢复

mysqlbinlog [--no-defaults]--start-datetime='年--日小时:分钟:秒二进制

日志| mysql -u用户名-p密码从某个时间点到某个时间点的恢复

mysqlbinlog [--no-defaults] --start-datetime='年--日小时:分钟:--stop-
datetime='年-月-日小时:分钟:秒'二进制日志|mysql-u用户名-p密码

模拟删除数据

#删除tombiao
mysql> drop table sus;
Query OK, 0 rows affected (0.01 sec)

#已经没了
mysql> show tables;
+-----------------+
| Tables_in_shuai |
+-----------------+
| aa              |
+-----------------+
1 row in set (0.00 sec)

#进行一次完整恢复
mysql> source /opt/sus.sql;

mysql> show tables;
+-----------------+
| Tables_in_cjf |
+-----------------+
| aa              |
| sus             |
+-----------------+
2 rows in set (0.00 sec)

mysql> select * from  sus;
+----+----------+---------+
| id | name     | address |
+----+----------+---------+
|  1 | zhangsan | banjing |
|  2 | lisi     | suzhou  |
+----+----------+---------+
2 rows in set (0.00 sec)

基于时间恢复

[root@localhost opt]# mysqlbinlog --no-defaults --stop-datetime='2020-08-22 16:07:35' /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123123

#查看表   liuge恢复完毕
mysql> select * from  tom;
+----+----------+---------+
| id | name     | address |
+----+----------+---------+
|  1 | zhangsan | banjing |
|  2 | lisi     | suzhou  |
|  3 | liuge    | nanjing |
+----+----------+---------+
3 rows in set (0.00 sec)

[root@localhost opt]# mysqlbinlog --no-defaults --start-datetime='2020-08-22 16:12:05' /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123123

#恢复成功
mysql> select * from cjf;
+----+----------+----------+
| id | name     | address  |
+----+----------+----------+
|  1 | zhangsan | banjing  |
|  2 | lisi     | suzhou   |
|  3 | liuge    | nanjing  |
|  4 | shuaige  | shanghai |
+----+----------+----------+

你可能感兴趣的:(云计算,数据库,增量备份,linux,mysql,运维,云计算,数据库)