MySQL备份与恢复操作解析

文章目录

  • 前言
  • 一 数据备份介绍
    • 1.1 数据备份的重要性
    • 1.2 数据库备份的分类
      • 1.2.1 从物理与逻辑的角度,备份可分为
      • 1.2.2 从数据库的备份策略角度,备份可分为
    • 1.3 常见的备份方法
  • 二 MySQL完全备份与恢复
    • 2.1 MySQL完全备份
    • 2.2 数据库完全备份分类
      • 2.2.1 MySQL物理冷备份及恢复
        • 2.2.1.1 流程解析
        • 2.2.1.1 配置流程
      • 2.2.2 mysqldump(热备份)备份数据库
        • 2.2.2.1 mysqldump命令对单个库进行完全备份
        • 2.2.2.2 mysqldump命令对多个库进行完全备份
        • 2.2.2.3 对所有库进行完全备份
        • 2.2.2.4 应用示例:
    • 2.3 恢复数据库
      • 2.3.1 使用source命令恢复数据
      • 2.3.3 使用mysql命令恢复数据
    • 2.4 恢复表的操作
      • 2.4.1 应用示例:
  • 三 MySQL增量备份与恢复
    • 3.1 MySQL增量备份
    • 3.2 MySQL数据库增量恢复
      • 3.2.1 基于时间点恢复
        • 3.2.1.1 流程解析:
        • 3.2.1.2 配置流程
      • 3.2.2 基于位置点恢复
        • 3.2.2.1 流程解析:
        • 3.2.2.2 配置流程
  • 总结


前言

随着办公自动化后电子商务的飞速发展,企业对信息系统的依赖性越来越高,数据库作为信息系统的核心担当着相当重要的角色。数据库备份,是在数据丢失的情况下,能及时恢复重要数据,防止数据丢失的一种重要手段。一个合理的数据库备份方案,应该能够在数据丢失时,及时的恢复数据,同时需要考虑技术实现难度和有效利用资源。


一 数据备份介绍

1.1 数据备份的重要性

1.在生产环境中,数据的安全性至关重要
2.任何数据的丢失都可能产生严重的后果
3.造成数据丢失的原因
   程序错误
   人为操作错误
   运算错误
   磁盘故障
   灾难(如火灾,地震)和盗窃

1.2 数据库备份的分类

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

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

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

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

差异备份;备份自从上次完全备份之后被修改过的文件

增量备份:只有在上次完全备份或者增量备份后被修改的文件才会被备份(无重复备份)

MySQL备份与恢复操作解析_第1张图片

1.3 常见的备份方法

1.物理冷备

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

2.专用备份工具mydump或mysqlhotcopy

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

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

  进行增量备份,需要刷新二进制日志
  日志生成条件:1.服务重启,2.刷新日志,3.超过存储容量

4.第三方工具备份

  免费的MySQL热备份软件Percona XtraBackup

二 MySQL完全备份与恢复

2.1 MySQL完全备份

1.是对整个数据库,数据库结构和文件结构的备份

2.保存的是备份完成时刻的数据库

3.是差异备份与增量备份的基础

4.优点
  备份与恢复操作简单方便
  
5.缺点
  数据存在大量的重复
  占用大量的备份空间
  备份与恢复时间长

2.2 数据库完全备份分类

1.物理冷备份与恢复

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

2.mysqldump备份与恢复

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

2.2.1 MySQL物理冷备份及恢复

2.2.1.1 流程解析

先备份数据库中的数据打包,模拟数据丢失,损坏,利用备份打包恢复数据

物理冷备份
先关闭数据库,之后打包备份
恢复数据库
恢复数据库,采用将备份数据mv成线上库文件夹的方式

2.2.1.1 配置流程

1.首先创建数据库数据

[root@server1 ~]# mysql -uroot -pabc123   登录数据库
mysql> create database lbf;  创建数据库lbf
mysql> use lbf;  使用数据库
mysql> create table a(id int(10)); 创建数据库并设置数据
mysql> desc a; 描述表a的结构
mysql> exit 退出

MySQL备份与恢复操作解析_第2张图片

2.进行数据备份打包

[root@server1 ~]# systemctl stop mysqld    关闭数据库
[root@server1 ~]# tar zcvf /opt/mysql_all-$(date +%F).tar.gz /usr/local/mysql/data/  源文件来源路径
备份打包所有数据库,当天日期
[root@server1 ~]# cd /opt/ 
[root@server1 opt]# ls -lh   查看文件

3.模拟数据丢失,损坏

[root@server1 opt]# systemctl start mysqld  开启数据库
[root@server1 opt]# mysql -uroot -pabc123 登录数据库
mysql> show databases;  查看数据库信息
mysql> drop database lbf;  删除数据库lbf
mysql> show databases;   查看数据库
mysql> exit

MySQL备份与恢复操作解析_第3张图片

MySQL备份与恢复操作解析_第4张图片

4.恢复数据

[root@server1 opt]# systemctl stop mysqld  关闭数据库
[root@server1 opt]# cd /opt/ 
[root@server1 opt]# tar zxvf mysql_all-2020-12-24.tar.gz  解压缩
[root@server1 opt]# ls -lh
[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]# cd
[root@server1 ~]# systemctl start mysqld  开启数据库
[root@server1 ~]# mysql -uroot -pabc123   登录数据库
mysql> show databases;       查看数据库信息 ,数据恢复
mysql> use lbf;     使用数据库
mysql> show tables; 查看表
mysql> desc a;      模式表结构
mysql> exit         退出

MySQL备份与恢复操作解析_第5张图片
MySQL备份与恢复操作解析_第6张图片

MySQL备份与恢复操作解析_第7张图片

2.2.2 mysqldump(热备份)备份数据库

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

mysqldump -u 用户名 -p [密码] [选项] [数据库名] > /备份路径/备份文件名
单库备份的示例

用法示例:

mysqldump -u root -p auth > /backup/auth.sql 
mysqldump -u root -p mysql > /bakcup/mysql.sql

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

mysqldump -u 用户名 -P [密码] [选项] --databases 库名1 [库名2]... >
/备份路径/备份文件名

用法示例:

mysqldump -u root -p --databases auth mysql > /backup/databases-
auth-mysql.sql 

2.2.2.3 对所有库进行完全备份

mysqldump -u 用户名-p [密码] [选项] -all-databases > /备份路径/备份文件名

用法示例:

mysqldump -u root -p  --all-databases > /backup/all-data.sql

2.2.2.4 应用示例:

1.创建数据库数据

mysql> show databases;  查看数据库信息
mysql> use lbf;  使用数据库
mysql> insert into a values(1); 插入数据记录
mysql> insert into a values(2);
mysql> select * from a;   查询所有字段
mysql> show databases;  

MySQL备份与恢复操作解析_第8张图片

MySQL备份与恢复操作解析_第9张图片

mysql> use tree;使用数据库
mysql> show tables; 查看表信息
mysql> select * from fruits; 查询所有字段

MySQL备份与恢复操作解析_第10张图片
2.进行数据备份

[root@server1 ~]# mkdir /backup  创建目录
[root@server1 ~]# mysqldump -uroot -pabc123 tree > /backup/tree-$(date +%F).sql 
mysqldump: [Warning] Using a password on the command line interface can be insecure.(不安全)
[root@server1 ~]# mysqldump -uroot -p --all-databases > /backup/all-databases-$(date +%F).sql
[root@server1 ~]# cd /backup  查看备份文件
[root@server1 backup]# ls -lh
[root@server1 backup]# vi tree-2020-12-24.sql 
[root@server1 backup]# vi all-databases-2020-12-24.sql

MySQL备份与恢复操作解析_第11张图片

2.3 恢复数据库

1.使用mysqldump导出的脚本,可使用导入的方法

source命令
mysql命令

2.使用source恢复数据库的步骤

登录到MySQL数据库
执行source备份sql脚本的路径

3.source恢复的示例

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

2.3.1 使用source命令恢复数据

1.模拟数据库出现问题

[root@server1 backup]# mysql -uroot -pabc123 登录数据库
mysql> show databases;  查看数据库信息
mysql> drop database tree;  删除数据库tree
mysql> show databases; 

MySQL备份与恢复操作解析_第12张图片

mysql> create database tree;    先创建同名数据库
mysql> use tree;       后使用数据库
mysql> source /backup/tree-2020-12-24.sql   恢复数据库
mysql> show databases; 查看数据库信息
mysql> use tree;       使用数据库
mysql> show tables;    查看表
mysql> select * from fruits;    程序使用字段

MySQL备份与恢复操作解析_第13张图片
MySQL备份与恢复操作解析_第14张图片

MySQL备份与恢复操作解析_第15张图片

2.3.3 使用mysql命令恢复数据

mysql -u 用户名 -p [密码] < 库备份文件脚本的路径

mysql命令恢复的示例

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

1.模拟数据库出现问题

mysql> show databases;     查看数据库信息
mysql> drop database tree; 删除数据库tree
mysql> show databases;     查看数据库信息
mysql> create database tree;创建同名空的数据库
mysql> exit  退出

MySQL备份与恢复操作解析_第16张图片
MySQL备份与恢复操作解析_第17张图片

2.恢复数据库

[root@server1 ~]# mysql -uroot -pabc123 < /backup/tree-2020-12-24.sql 
[root@server1 ~]# mysql -uroot -pabc123 < /backup/all-databases-2020-12-24.sql
[root@server1 ~]# mysql -uroot -pabc123  登录数据库
mysql> show databases;
mysql> use tree;
mysql> show tables;
mysql> select * from fruits;

MySQL备份与恢复操作解析_第18张图片

MySQL备份与恢复操作解析_第19张图片
MySQL备份与恢复操作解析_第20张图片

MySQL备份与恢复操作解析_第21张图片

2.4 恢复表的操作

1.恢复表时同样可以使用source或者mysql命令

2.source恢复表的操作与恢复库的操作相同

3.当备份文件中只包含表的备份,而不包括创建库的语句时,必须指定库名,且目标库必须存在

   mysql -u 用户名 -p [密码] < 表备份脚本的路径
   mysql -u root -p mysql <  /backup/mysql-user.sql

4.在生产环境中,可以使用Shell脚本自动实现定时备份

2.4.1 应用示例:

mysql> use tree;    使用数据库
mysql> create table a(id int(1)); 创建新的表a设置数据
mysql> insert into a values(1),(2);  插入数据记录
mysql> select * from a;  查询所有字段
mysql> show tables; 查看表信息
mysql> exit 

MySQL备份与恢复操作解析_第22张图片
2.创建备份

[root@server1 ~]# mysqldump -uroot -pabc123 tree a > /opt/tree-a.sql  
[root@server1 ~]# mysql -uroot -pabc123 登录数据库
mysql> use tree;使用数据库
mysql> show tables;  查看表信息
mysql> drop table a;  删除表a
mysql> show tables; 

MySQL备份与恢复操作解析_第23张图片
MySQL备份与恢复操作解析_第24张图片

3.恢复数据表

mysql> source /opt/tree-a.sql   
mysql> select * from a;  查询所有字段
mysql> show tables; 查看表信息

MySQL备份与恢复操作解析_第25张图片
注:备份库里的某张表时,应该针对这张坏的表删除,使用原来数据库,重新source备份的sq1可以实现,不需要删除整个库,只需删除相应的表就行了,进行备份。

三 MySQL增量备份与恢复

3.1 MySQL增量备份

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

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

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

3.特点

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

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

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

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

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

3.2 MySQL数据库增量恢复

1.一般恢复

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

2.基于位置恢复

数据库在某一时间点可能既有错误的操作也有正确的操作
可以基于精准的位置跳过错误的操作
发生错误节点之前的一个节点,上一次正确操作的位置点停止

3.基于时间点恢复

跳过某个发生错误的时间点实现数据恢复
在错误时间点停止,在下一个正确时间点开始

3.2.1 基于时间点恢复

3.2.1.1 流程解析:

还原时间点的步骤

删除原先坏掉的那张表
还原完全备份的那个数据库
停止在错误的时间点
开始在正确的时间点

3.2.1.2 配置流程

1.开启二进制日志文件

[root@server1 ~]# vi /etc/my.cnf   编辑配置文件
[root@server1 ~]# systemctl restart mysqld  服务重启,日志生成
[root@server1 ~]# cd /usr/local/mysql/data/  查看日志
[root@server1 data]# ls -lh
添加
log_bin=/usr/local/mysql/data/mysql_bin
选项                          日志名称

MySQL备份与恢复操作解析_第26张图片
MySQL备份与恢复操作解析_第27张图片

2.查看二进制日志内容

[root@server1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000001 
--no-defaults:解决utf-8报错
--base64-output=decode-rows:解决乱码问题
-v:输出文件指向
无新操作,无新增的信息

MySQL备份与恢复操作解析_第28张图片
3.创建数据库数据

[root@server1 ~]# mysql -uroot -pabc123  登录数据库
mysql> show databases;    查看数据库信息
mysql> use tree;          使用数据库
mysql> create table bb(name varchar(128), score int(10));  创建设置表bb数据
mysql> insert into bb values('wang',60);   插入数据记录
mysql> insert into bb values('zhu',80);
mysql> select * from bb;  查询所有字段
mysql> exit 退出

MySQL备份与恢复操作解析_第29张图片
MySQL备份与恢复操作解析_第30张图片

4.完全备份

[root@server1 ~]# mysqldump -uroot -pabc123 tree  > /backup/tree-bb.sql
[root@server1 ~]# cd /backup/ 查看备份
[root@server1 backup]# ls -lh
[root@server1 backup]#  mysqladmin -uroot -p flush-logs  刷新日志
[root@server1 backup]# cd /usr/local/mysql/data/
[root@server1 data]# ls -lh

MySQL备份与恢复操作解析_第31张图片
5.再次操作,增量备份
数据配置

[root@server1 ~]# mysql -uroot -pabc123 登录数据库
mysql> use tree; 使用数据库
mysql> insert into bb values('da',75);  插入数据记录 正确操作
mysql> delete from bb where name='zhu'; 删除数据记录,误操作
mysql> insert into bb values('xiao',3); 插入数据记录 正确操作
mysql> select * from bb;  查询所有字段
mysql> exit

MySQL备份与恢复操作解析_第32张图片

MySQL备份与恢复操作解析_第33张图片

6.刷新并查看新二进制日志文件

[root@server1 ~]# mysqladmin -uroot -p flush-logs
[root@server1 ~]# cd /usr/local/mysql/data/
[root@server1 data]# ls -lh

MySQL备份与恢复操作解析_第34张图片

7.查看日志

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

MySQL备份与恢复操作解析_第35张图片

查找到错误时间点停止
201225 1:29:48
MySQL备份与恢复操作解析_第36张图片

在下一个正确时间点开始
201225 1:29:56
MySQL备份与恢复操作解析_第37张图片

8.模拟数据损坏

[root@server1 ~]# mysql -uroot -pabc123 登录数据库
mysql> show databases;      查看数据库信息
mysql> drop database tree;  删除数据库tree
mysql> show databases;  
mysql> create database tree; 创建同名为空的数据库
mysql> show databases;    查看数据库
mysql> use tree;          使用数据库
mysql> source /backup/tree-bb.sql  还原完全备份的那个数据库
mysql> select * from bb;  查询所有字段
mysql> exit 

MySQL备份与恢复操作解析_第38张图片
MySQL备份与恢复操作解析_第39张图片
MySQL备份与恢复操作解析_第40张图片

MySQL备份与恢复操作解析_第41张图片

9.恢复数据

停止在错误的时间点201225  1:29:48
[root@server1 ~]# mysqlbinlog --no-defaults --stop-datetime='2020-12-25   1:29:48' /usr/local/mysql/data/mysql_bin.000002 | mysql -uroot -p

开始在正确的时间点201225  1:29:56
[root@server1 ~]# mysqlbinlog --no-defaults --start-datetime='2020-12-25    1:29:56 ' /usr/local/mysql/data/mysql_bin.000002 | mysql -uroot -p

[root@server1 ~]# mysql -uroot -pabc123 登录数据库
mysql> use tree;          使用数据库
mysql> select * from bb;  查询所有字段

发现恢复的数据自动跳过发生错误的时间点恢复了,

MySQL备份与恢复操作解析_第42张图片
MySQL备份与恢复操作解析_第43张图片

3.2.2 基于位置点恢复

3.2.2.1 流程解析:

位置点恢复
删除原先坏掉的那张表
任意删除两个数据字段
利用日志,备份恢复
查询该二进制日志内容
上一次正确操作的位置点停止
下一次正确操作的位置点开始

3.2.2.2 配置流程

1.设置数据库数据

[root@server1 ~]# mysql -uroot -pabc123 登录数据库
mysql> use tree;使用数据库
mysql>  select * from bb; 查询所有字段
mysql>  delete from bb where name='da';   删除数据字段
mysql>  delete from bb where name='xiao';  删除数据字段
[root@server1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000003  查看日志

MySQL备份与恢复操作解析_第44张图片
MySQL备份与恢复操作解析_第45张图片

上一次正确操作的位置点停止
3475
MySQL备份与恢复操作解析_第46张图片

下一次正确操作的位置点开始
3829
MySQL备份与恢复操作解析_第47张图片
2.恢复数据

[root@server1 ~]# mysqlbinlog --no-defaults --stop-position='3475' /usr/local/mysql/data/mysql_bin.000003 | mysql -uroot -p
[root@server1 ~]#  mysqlbinlog --no-defaults --start-position='3829' /usr/local/mysql/data/mysql_bin.000003 | mysql -uroot -p
[root@server1 ~]# mysql -uroot -pabc123登录数据库
mysql> use tree
mysql>  select * from bb; 查询所有字段

MySQL备份与恢复操作解析_第48张图片


总结

通过以上知识的了解,学习,灵活掌握可以在在数据丢失的情况下,能及时恢复重要数据,防止数据丢失。

你可能感兴趣的:(MySQL数据库)