MySQL数据库备份与恢复

目录

前言

一、日志管理

1、数据的重要性

2、日志分类

2.1错误日志

2.2通用查询日志

2.3二进制日志

2.4慢查询日志

2.5中继日志

3、日志配置

二、数据库备份的分类

1、物理备份

2、逻辑备份

2.1完全备份

2.2差异备份

2.3增量备份

对比

三、常见备份方法 

1、物理冷备

2、专用备份工具 

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

4、第三方工具备份

四、完全备份

1、概念

2、特点

优点

缺点

3、分类

3.1物理冷备份与恢复

3.2mysqldump备份与恢复(温备份)

4、操作

 4.1物理冷备份与恢复

4.2备份操作

5、完全恢复

方法一:使用 source 恢复数据库的步骤

方法二:使用 mysql 命令,无须登录 MySQL 数据库

6、使用Shell脚本实现自动备份

五、增量备份

1、增量恢复类型

一般恢复

基于位置恢复

基于时间点恢复

 2、增量备份操作

2.1首先开启二进制日志功能

2.2查看二进制日志文件内容

2.3进行完全备份

2.4进行增量备份,生成二进制日志文件

2.5插入新数据,以模拟数据的增加或变更

2.6再次生成新的二进制日志文件

3、增量恢复

3.1一般恢复


前言

数据传输、数据存储、数据交换、软件故障、硬盘坏道等情况容易产生数据故障。如果没有采取数据备份和数据恢复手段与措施,就会导致数据的丢失。没有数据库的备份,就没有数据库的恢复,企业应当把企业数据备份的工作列为一项不可忽视的系统工作,为其选择相应的备份设备和技术,进行经济可靠的数据备份,从而避免损失。


一、日志管理

1、数据的重要性

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

2、日志分类

2.1错误日志

用来记录当MySQL启动、停止或运行时发生的错误信息,默认开启

log-error=/usr/local/mysql/data/mysql_error.log

2.2通用查询日志

用来记录MySQL的所有连接和语句,默认是关闭的

general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log

2.3二进制日志

用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认已开启

log_bin=mysql-bin
或 log-bin=mysql-bin

2.4慢查询日志

用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便于优化,默认是关闭的

slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5 单位时间为s,缺省时为10s

慢查询日志也可用来查询哪些搜索的字段超时,可以选择是否需要增加索引,加快查询速度

2.5中继日志

一般情况下,它在MySQL主从同步(复制)、读写分离集群的从节点开启,主节点一般不需要这个日志

3、日志配置

vim /etc/my.cnf

#错误日志
log-error=/usr/local/mysql/data/mysql_error.log	 
#通用查询日志
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
#二进制日志
log-bin=mysql-bin	
#慢查询日志
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5


#配置文件添加完后需要重启MySQL
systemctl restart mysql
show variables like ‘general%’;    #查询通用日志是否开启
show variables like ‘log_bin%’;    #查询二进制日志是否开启
show variables like ‘long%’;       #查询慢查询日志超时时间

 

 

二、数据库备份的分类

1、物理备份


数据库备份可以分为物理备份逻辑备份
物理备份是对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。这种类型的备份适用于在出现问题的时候需要快速恢复的大型重要数据库。
物理备份又可以成为冷备份(脱机备份)热备份(连接备份)温备份

  • 冷备份 (脱机备份) :是在关闭数据库的时候进行的(tar)
  • 热备份 (联机备份) :数据库处于运行状态,依赖于数据库的日志文件(mysqlhotcopy mysqlbackup)
  • 温备份 :数据库锁定表格(不可写入但可读)的状态下进行备份操作(mysqldump)

2、逻辑备份


逻辑备份是对数据库逻辑组件的备份,表示为逻辑数据库结构
这种类型的备份适用于可以编辑数据值或表结构
从数据库的备份策略角度来看,备份又可分为完全备份差异备份增量备份
 

2.1完全备份

  • 每次对数据进行完整备份,即对整个数据库、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库,是差异备份与增量备份的基础完全备份的备份与恢复操作都非常简单方便,但是数据存在大量的重复并且会占用大量的磁盘空间,备份的时间也很长
  • 每次都进行完全备份,会导致备份文件占用空间巨大,并且有大量的重复数据,恢复时,直接使用完全备份的文件即可

2.2差异备份

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

  • 每次差异备份,都会备份上一次完全备份之后的数据,可能会出现重复数据。恢复时,先恢复完全备份的数据,再恢复差异备份的数据

 

2.3增量备份

  • 只有那些在上次完全备份或者增量备份后被修改的文件才会被备份以上次完整备份或上次增量备份的时间为时间点,仅备份期间内的数据变化,因而备份的数据量小,占用空间小,备份速度快
  • 但恢复时,需要从上一次的完整备份开始到最后一次增量备份之间的所有增量依次恢复,如中间某次的备份数据损坏,将导致数据的丢失
  • 每次增量备份都是在备份在上一次完成全备份
  • 每次增量备份都是备份在上一次完全备份或者增量备份之后的数据,不会出现重复数据的情况,也不会占用额外的磁盘空间
  • 恢复数据,需要按照次序恢复完全备份和增量备份的数据
     

 

对比

备份方式完全备份差异备份增量备份
完全备份时的状态表1、表2表1、表2表1、表2
第1次添加内容创建表3创建表3创建表3
备份内容表1、表2、表3表3表3
第2次添加内容创建表4创建表4创建表4
备份内容表1、表2、表3、表4表3、表4表4

三、常见备份方法 

1、物理冷备

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

2、专用备份工具 

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

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

  • 进行增量备份,需要刷新二进制日志
  • MySQL支持增量备份,进行增量备份时必须启用二进制日志。二进制日志文件为用户提供复制,对执行备份点后进行的数据库更改所需的信息进行恢复
  • 如果进行增量备份(包含自上次完全备份或增量备份以来发生的数据修改),需要刷新二进制日志

4、第三方工具备份

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

四、完全备份

1、概念

  • 是对整个数据库、数据库结构和文件结构的备份

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

  • 是差异备份与增量备份的基础

2、特点

优点

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

缺点

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

3、分类

3.1物理冷备份与恢复

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

3.2mysqldump备份与恢复(温备份)

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

4、操作

 4.1物理冷备份与恢复

systemctl stop mysqld.service
tar zcf /opt/mysql_all_$(date +%F).tar.gz /usr/local/mysql/data/
rm -rf /usr/local/mysql/data
tar zxvf /opt/mysql_all_2022-06-20.tar.gz
mv ./usr/local/mysql/data/ /usr/local/mysql/
systemctl start mysqld
mysql -uroot -p123456

mysql> select * from class;

 关闭mysqld.service服务

 打包数据库信息备份

 解压恢复数据文件

 进入数据库查询数据是否存在

t20

4.2备份操作

完全备份一个或多个完整的库 (包括其中所有的表)

#格式:
mysqldump -u root -p[密码] --databases 库名1 [库名2] ... > /备份路径/备份文件名.sql    #导出的就是数据库脚本文件

#示例:
mysqldump -u root -p --databases zone > /opt/zone.sql       #备份一个 zone 库
mysqldump -u root -p --databases mysql zone > /opt/mysql-zone.sql    #备份 mysql 与 zone 两个库 

完全备份 MySQL 服务器中所有的库

#格式:
mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql

#示例:
mysqldump -u root -p --all-databases > /opt/all.sql

完全备份指定库中的部分表

mysqldump -u root -p[密码] 库名 [表名1] [表名2] ... > /备份路径/备份文件名.sql
例:
mysqldump -u root -p [-d] zone info1 info2 > /opt/zone_info1.sql
#使用 "-d" 选项,说明只保存数据库的表结构 
#不使用 "-d" 选项,说明表数据也进行备份
#做为一个表结构模板

查看备份文件

grep -v "^--" /opt/zone_info1.sql | grep -v "^/" | grep -v "^$"

5、完全恢复

方法一:使用 source 恢复数据库的步骤

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

#模拟故障
use zone;
delete from dsj; 

#恢复
source /opt/zone.sql

方法二:使用 mysql 命令,无须登录 MySQL 数据库

使用 -e 删除数据表,执行 mysql 备份 sql 脚本的路径

mysqldump -uroot -p123456 zone > /opt/zone.sql
mysql -uroot -p123456 -e 'drop table zone.dsj;'
mysql -uroot -p123456 -e 'show tables from zone;'
mysql -uroot -p123456 zone < /opt/zone.sql 
mysql -uroot -p123456 -e 'show tables from zone;'

注意:mysqldump 严格来说属于温备份,会需要对表进行写入的锁定

在全量备份与恢复实验中,假设现有 school 库,需要注意的一点为:
① 当备份时加 --databases,表示针对于 school 库
备份命令:
mysqldump -uroot -p123456 --databases school > /opt/school_01.sql 备份库后
恢复命令过程为:
mysql -uroot -p123456;
drop database school;
exit
mysql -uroot -p123456 < /opt/school_01.sql
② 当备份时不加 --databases,表示针对 school 库下的所有表
备份命令:
mysqldump -uroot -p123456 school > /opt/school_all.sql
恢复过程:
mysql -uroot -p123456
drop database school;
create database school;
exit
mysql -uroot -p123456 school < /opt/school_all.sql
主要原因在于两种方式的备份(前者会从 "create databases" 开始,而后者则全是针对表格进行操作)

6、使用Shell脚本实现自动备份

0 1 * * 6 /usr/local/mysql/bin/mysqldump -uroot -p123456 schooldb info1 > ./schooldb_info1_$(date +%Y%m%d).sql
/usr/local/mysql/bin/mysqladmin -uroot -p123456 flush-logs	#刷新日志

五、增量备份

1、增量恢复类型

一般恢复

  • 将所有备份的二进制日志内容全部恢复.3基于位置恢复

基于位置恢复

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


基于时间点恢复

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

 2、增量备份操作

2.1首先开启二进制日志功能

vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED       #可选,指定二进制日志(binlog)的记录格式为MIXED(混合输入)
server-id = 1               #可加可不加该命令
-------------------------------------------
systemctl restart mysqld	#重启 mysqld

二进制日志(binlog)有 3 种不同的记录格式:STATEMENT(基于 SQL 语句)、ROW(基于行)、MIXED(混合模式),默认格式是 STATEMENT
STATEMENT(基于SQL语句)
每一条涉及到被修改的 sql 都会记录在 binlog 中;
日志量过大,如 sleep() 函数,last_insert_id(),以及 user-defined fuctions(udf)、主从复制等架构记录日志时会出现问题;
增删改查通过 sql 语句来实现记录,高并发环境下可能会出错,可能有时间差异或者延迟,可能不是我们想恢复的,准确率低。
ROW(基于行)
只记录变动的记录,不记录 sql 的上下文环境;
如果遇到 update......set....where true 那么 binlog 的数据量会越来越大;
update、delete 以多行数据起作用,用行记录,只记录变动的记录,不记录 sql 的上下文环境,比如 sql 语句记录一行,但是 ROW 就可能记录 10 行,但是准确性高,高并发的时候由于操作量多,性能变低。
MIXED 推荐使用
一般的语句使用 STATEMENT,函数使用 ROW 方式存储。

2.2查看二进制日志文件内容

cp /usr/local/mysql/data/mysql-bin.000002 /opt/
mysqlbinlog --no-defaults /opt/mysql-bin.000002
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002


--base64-output=decode-rows :使用 64 位编码机制去解码(decode)并按行读取(rows)
-v :显示详细内容
--no-defaults :默认字符集(不加会报 UTF-8 的错误)
PS :可以将解码后的文件导出为 txt 格式,方便查阅
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002 > /opt/mysql-bin.000002


at:开始的位置点 
end_log_pos:结束的位置
时间戳:211026 21:54:54 
SQL 语句

2.3进行完全备份

说明:增量备份是基于完全备份的,所以我们先完全备份数据库

mysqldump -uroot -p123456 school info > /opt/kgc_info1_$(date +%F).sql
mysqldump -uroot -p123456 school > /opt/school_all_$(date +%F).sql

mysqldump -uroot -p123456 --all-databases > /opt/all_$(date +%F).sql

2.4进行增量备份,生成二进制日志文件

每天进行增量备份操作,生成新的二进制日志文件(例如:mysql-bin.000002)
如果刚开启了二进制日志功能,只有 mysql-bin.000001,刷新后就有了 mysql-bin.000002

mysqladmin -u root -p123456 flush-logs

2.5插入新数据,以模拟数据的增加或变更

在第一次完全备份之后刷新二进制文件,在第二个二进制文件中记载着增量备份的数据

mysql -uroot -p123456
create database school;
use school;
create table test1 (id int(4),name varchar(4));
insert into test1 values(1,'one');
insert into test1 values(2,'two');
select * from test1;
------------------------------------------
mysql> create database school;
Query OK, 1 row affected (0.00 sec)

mysql> use school;
Database changed

mysql> create table test1 (id int(4),name varchar(4));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into test1 values(1,'one');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test1 values(2,'two');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test1;
+------+------+
| id   | name |
+------+------+
|    1 | one  |
|    2 | two  |
+------+------+
2 rows in set (0.00 sec)

2.6再次生成新的二进制日志文件

先前刷新了一次,有了 mysql-bin.000002,修改了数据库数据后再次刷新应该生成 mysql-bin.000003

mysqladmin -u root -p123456 flush-logs

之前的步骤 2.5的数据库操作会保存到 mysql-bin.000002 文件中,之后我们测试删除 ky11 库的操作会保存在 mysql-bin.000003 文件中(以免当我们基于 mysql-bin.000002 日志进行恢复时,依然会删除库)

3、增量恢复

3.1一般恢复

模拟丢失更改的数据的恢复步骤
备份 ky11 库中 test1 表

mysqldump -uroot -p123456 ky11 test1 > /opt/school_test1.sql


删除 ky11 库中 test1 表

mysql -uroot -p123456 -e 'drop table school.test1;'


恢复 test1 表

mysql -uroot -p123456 ky11 < /opt/school_test1.sql



查看日志文件

mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002


模拟丢失所有数据的恢复步骤
模拟丢失所有数据

mysql -uroot -p123456 -e 'drop database school;'



基于 mysql-bin.000002 恢复

mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p123456



查看恢复情况

mysql -uroot -p123456 -e 'select * from school.test1;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+------+------+
| id   | name |
+------+------+
|    1 | one  |
|    2 | two  |
+------+------+



(2) 断点恢复
① 基于位置恢复
插入三条数据

use school;
select * from test1;
insert into test1 values(3,'true');
insert into test1 values(4,'f');
insert into test1 values(5,'t');
select * from test1;
-----------------------------------
mysql> select * from test1;
+------+------+
| id   | name |
+------+------+
|    1 | one  |
|    2 | two  |
|    3 | true |
|    4 | f    |
|    5 | t    |
+------+------+
5 rows in set (0.00 sec)



实验需求:我们先删除 id=4 的行然后通过位置点恢复

确认位置点,删除指定内容

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


#看图寻找 at 位置点
 

#先删除 test1 表中 第四行数据
mysql -uroot -p123456 -e 'delete from school.test1 where id=4;'
mysql -uroot -p123456 -e 'select * from school.test1;'

#通过位置点恢复
mysqlbinlog --no-defaults --start-position='4098' --stop-position='4378' /usr/local/mysql/data/mysql-bin.000003 | mysql -uroot -p123456
mysql -uroot -p123456 -e 'select * from school.test1;'



看图可以知道,id=4 的数据已经恢复,不过并没有按照顺序排列,这是因为创建 test1 表的时候没有设置主键,设置 id 为主键就会按照 id 顺序排列了。

#仅恢复从 623 开头到二进制文件结尾的数据
mysqlbinlog --no-defaults --start-position='623' /usr/local/mysql/data/mysql-bin.000003 | mysql -uroot -p

#仅恢复从二进制文件开头到 1000 结尾的数据
mysqlbinlog --no-defaults --stop-position='1000' /usr/local/mysql/data/mysql-bin.000003 | mysql -uroot -p

#恢复从位置为 400 开始到位置为 500 为止
mysqlbinlog --no-defaults --start-position='400' --stop-position='500' /usr/local/mysql/data/mysql-bin.000003 | mysql -uroot -p      


基于时间点恢复

格式:

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


案例:

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

mysql -uroot -p123456 -e 'delete from school.test1 where id=4;'
mysql -uroot -p123456 -e 'select * from school.test1;'

mysqlbinlog --no-defaults --start-datetime='2021-10-26 23:27:18' --stop-datetime='2021-10-26 23:27:30' /usr/local/mysql/data/mysql-bin.000003 | mysql -uroot -p123456
mysql -uroot -p123456 -e 'select * from school.test1;'

如果恢复某条 SQL 语句之前的所有数据,就 stop 在这个语句的位置节点或者时间点
如果恢复某条 SQL 语句以及之后的所有数据,就从这个语句的位置节点或者时间点 start
 

  • 1
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值