Mysql之备份与恢复

发布于:2022-12-13 ⋅ 阅读:(377) ⋅ 点赞:(0)

目录

一,mysql日志概述

2,日志配置文件

 3,日志配置文件的查询

 二,mysql备份类型

1,物理备份

1.1,冷备份

1.2 热备份

1.3 温备份

2,逻辑备份

2.1 完全备份

2.2。差异备份

2.3增量备份

2,4 如何选择逻辑备份的策略

3,常用的备份方法

四 mysql完全备份

1,数据库完全备份分类

五,Mydsl完全备份与恢复

1,物理冷备份与恢复

 2,mysqldump备份与恢复(温备份)

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

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

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

 2.3 查看备份文件

 三,mysql完全恢复

3.1 恢复数据库

3.2 恢复数据表

 3.3加-databases和不加的区别

四,mysql增量备份与恢复

1,二进制文件介绍

1,1二进制日志记录的格式

1,STTATEMENT(基于sql语句)

2,ROW (基于行)

3,MIXED(混合模式)推荐使用

1.2 开启二进制功能

 1.3 查看二进制文件的内容

2,增量备份(完备+增量备份)

 3,增量恢复

3.1 增量恢复之  一般恢复

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

 3.2增量恢复之断点恢复实验

3.3 基于位置恢复 -at

3.4 基于时间恢复

 四,总结

1,备份的类型

2.物理备份:冷备,温备,热备

3、逻辑备份:全量备份、增量备份、差异备份

4、日志的保存类型

5、mysql恢复的方式


数据备份的重要性

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

造成数据丢失的原因

  • 程序错误
  • 认为操作错误
  • 运算错误
  • 磁盘故障
  • 灾难,盗窃

一,mysql日志概述

mysql 的日志默认报错位置在。/usr/local/mysql/data下

1,redo 重做日志,达到事务的一致性(每次重启会重做)

  • 作用:确保日志的持久性。防止在发生故障,脏 页未写入磁盘,重启数据库会进行redo log执行重做,达到事务一致性

2,undo,回滚日志

  • 作用,保证数据的原子性,记录事务发生之前的一个版本,用于回滚,innodb事务可重复读和读取已提交隔离级别就是通过mvcc+undo实现的

3,errorlog 错误日志

  • 作用:mysql本身启动,停止,运行期间发生的错误信息

4,slow query log 慢查询日志

  • 作用:记录执行时间过长的sql,时间阈值(10s) 可以配置,只记录执行成功
  • 另一个作用:在于提醒优化

5,bin。log 二进制日志

  • 作用:用于主从复制,实现主从同步
  • 记录的内容是:数据库中执行的sql语句

6,relay log 中继日志

  • 作用:用于数据库主从同步,将主库发来的bin.log保存在本地,然后从库进行回放

7,general log 普通日志

  • 作用:记录数据库的操作明细,默认关闭,开启后会降低数据库性能。

2,日志配置文件

日志文件开启关闭日志的位置
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
 
2、修改完成需要重新mysql服务
systemctl restart mysqld.service

 当我们重启了myslq服务之后,会在数据库目录下,生成以下日志文件

当我们重新启动mysql服务,二进制文件会重新生成一个新的二进制文件

 3,日志配置文件的查询

#登入mysql
mysql -u root -p[密码]
 
#查看通用查询日志是否开启
show variables like 'general%';	

#查看二进制日志是否开启
show variables like 'log_bin%';		

#查看慢查询日功能是否开启
show variables like '%slow%';		

#查看慢查询时间设置
show variables like 'long_query_time';	

#在数据库中设置开启慢查询的方法
set global slow_query_log=ON;									

查看二进制日志是否开启

 二,mysql备份类型

数据库备份可以物理备份和逻辑备份

物理备份是对数据库操作系统的物理文件(如数据文件,日志文件)的备份,这种类型的备份适用于在出现问题的时候需要快速恢复的大型重要数据库。

1,物理备份

  • 物理备份有分为,冷备份,热备份,温备份

1.1,冷备份

是在关闭数据库的时候进行备份,可以直接(tar)

  • 关闭mysql数据库
  • 使用tar命令直接打包数据库文件夹
  • 直接替换现有mysql目录即可(usr/local/mysql/data数据目录)

1.2 热备份

数据库处于运行状态,依赖数据库的日志文件进行备份(第三方工具:mysqlhotcopy)

1.3 温备份

数据库锁定表格,只可以读,不可以写入的状态下进行备份(mysqldump备份)

2,逻辑备份

逻辑备份是对数据库逻辑组件的备份,表示为逻辑数据库结构,这种类型的备份适用于可以编辑数据值或结构。

从数据库的备份策略角度来看,备份又可以分为完全备份,差异备份,增量备份。

2.1 完全备份

每次对数据进行完整备份,即对整个数据库,数据库结构,和文件结构的备份,保存的是完整备份的数据库,是差异备份和增量备份的基础完全备份的备份,与恢复操作都非常简单,但是数据存在大量的重复并且会占用大量的磁盘空间,备份的时间也很长。

优势

  • 备份恢复操作简单

劣势

  • 随着备份的次数越来越多,占用的磁盘空间和资源也较多
  • 数据存在大量的重复

2.2。差异备份

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

优势

恢复时只需要恢复完全备份和就近一次的备份文件

劣势

数据会越来越大

2.3增量备份

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

优势

没有重复的备份数据,备份数据量不打,所需时间短。

劣势

数据恢复比较麻烦,中间任何一个备份的数据都不能损坏,不然导致数据的丢失。

2,4 如何选择逻辑备份的策略

完全备份:一周进行一次全备,区内的时间需要在不提供业务的时间区间进行,晚上10点到早上5点进行全备

增量备份:一天一次增量备份

差异备份:1/2/3天一次增量备份

3,常用的备份方法

1,物理备份

备份时 数据库处于关闭状态,直接打包数据库文件(tar)

备份速度快,恢复时也是最简单的

缺点:数据的实时性较差,不能在业务正常运行的时候进行tar备份,要在服务停止的时候

2,专用备份工具mysqldump或者mysqlhotcopy

mysqldump 常用的逻辑备份工具

mysqlhotcopy  拥有备份myisam和archive表

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

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

4,第三方工具备份

免费的mysql 热备份软件 percona xtrabackup  mysqlbackup

四 mysql完全备份

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

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

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

优点

备份恢复简单

缺点

数据存在大量的重复

占用大量的备份空间

备份与恢复时间长

1,数据库完全备份分类

1,物理冷备份与恢复

关闭mysql数据库

使用tar命令直接打包数据库文件夹

直接替换现有mysql目录即可(usr/local/mysql/data)

2,mysqldump备份与恢复

mysql自带的备份工具,可方便实现对mysql的备份

可以将指定的库,表导出为sql脚本

使用命令mysql 导入备份的数据

五,Mydsl完全备份与恢复

1,物理冷备份与恢复

原理:将数据库文件进行压缩到别的目录备份,恢复时,直接解压回以前的目录即可

 

 

 

 

 

 2,mysqldump备份与恢复(温备份)

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

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

[root@nginx91 data]#mysqldump -uroot -pkya123 --databases kya >/opt/kya.sql
[root@nginx91 data]#mysqldump -uroot -pkya123 --databases kya lulu  >/opt/kya-lulu.sql

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

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

[root@nginx91 data]#mysqldump -uroot -pkya123 --all-databases >/opt/all-databases.sql

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

mysqldump -u root -p[密码] 库名 [表名1] [表名2] … > /备份路径/备份文件名.sql
 

[root@nginx91 opt]#mysqldump -uroot -pkya123 kya ky21 > /opt/kya--ky21.sql
#不使用“-d”选项,说明表数据也进行备份

#使用“-d”选项,说明只保存数据库的表结构

 

 使用“-d”选项,说明只保存数据库的表结构

 

 2.3 查看备份文件

[root@nginx91 opt]#grep -v "^--" /opt/kya--ky21.sql | grep -v "^/" |grep -v "^$"
 

 三,mysql完全恢复

3.1 恢复数据库

使用mysqldump导出的文件,可使用导入的方法

1,source 命令

2,mysql命令

使用source恢复数据库的步骤

1,登录到数据库

2,执行source备份sql脚本的路径

[root@nginx91 opt]#mysql -uroot -pkya123 -e 'drop database kya;'
[root@nginx91 opt]#mysql -uroot -pkya123 -e 'show databases;'
 

[root@nginx91 opt]#mysql -uroot -pkya123 < /opt/kya.sql 

[root@nginx91 opt]#mysql -uroot -pkya123 -e 'show databases;'
 

 

3.2 恢复数据表

mysqldump -uroot -pkya123 kya ky21 > /opt/nxx/kya-ky21.sql

grep -v "^--" /opt/nxx/kya-ky21.sql |grep -v "^/" |grep -v "



mysql -uroot -pkya123  -e 'drop table kya.ky21;'

mysql  -uroot -pkya123;
source /opt/nxx/kya-ky21.sql;

select * fromky21 ;

show tables;

 

 

 也可以使用重定向的方式恢复数据

 3.3加-databases和不加的区别

  • mysqldump严格来说属于温备份,会需要对表进行写入的锁定
  • 在全量备份和恢复使用中,加上-databases表示指定备份的是这个数据库以及下面所以的表,如果不加-databases时,表示只备份这个数据库下面的表,并不备份数据库

加 -databases实验
 

mysqldump -uroot -pkya123 --databases kya > /opt/nxx/kya-sql

​​​​​​​#全量备份,加上--databases,指定备份数据库,以及下面所有的表

mysql -uroot -pkya123

drop database kya

#进入数据库,进行删除数据库

source /opt/nxx/kya-sql;

恢复数据库

 

 

 不加–databases时实验

 

 

 

 

四,mysql增量备份与恢复

mysql数据库增量恢复有:一般恢复,基于位置恢复,基于时间的恢复

一般恢复

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

基于位置恢复

数据库在某一时间点可能既有错误的操作也有正确的操作

可以基于精准的位置跳过错误的操作

发生错误节点之前的一个节点,上一次正确操作的位置点停止

基于时间点恢复

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

在错误时间点停止,在下一个正确的时间点开始

1,二进制文件介绍

1,1二进制日志记录的格式

二进制日志由三种不同的记录格式

1,STTATEMENT(基于sql语句)

每一条涉及被修改的sql语句都会被记录在binlog中

缺点

日志量过大,如sleep (函数),last_insert_id()>(聚合函数),以及user-definedfuctions(udf),垂直复制等架构日志时会出现问题。

总结

增删改查通过sql语句来实现记录,如果用高并发可能会出错,可能时间差异或者延迟,可能不是我们想象的恢复可能你先删除或在修改,可能会倒过来,准确率低

2,ROW (基于行)

只记录变动的行,不记录sql语句的上下文环境

缺点

如果遇到update,set,where,true 那么binlog的数据量会越来越大。

总结

update,dalete多行数据其作用,来用行记录下来,只计量变动的记录,不记录sql的上下文环境,比如sql语句记录一行,但是row就可能记录10行,但是准确性高,高并发的时候由于操作量能变低,所以记录都记下来。

3,MIXED(混合模式)推荐使用

上面两种的混合版本,都进行记录

一般的语句使用statement,函数时间ROW方式存储

1.2 开启二进制功能

vim /etc/my.coom
[mysqld]
log-bin=mysql-bin
binlog_format= MIXED
#二进制日志有三种不同的记录格式:statement(基于sql语句),ROW(基于行),MIXED(混合模式)

server-id= 1
server-id 为服务的序号,在mysql主备,高可用中需要指定服务的序号


systemctl restart mysqld
重启服务

 1.3 查看二进制文件的内容

mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000001 > /opt/mysql-bin2.000001
#把日志文件复制到/opt目录下慢慢看,可以直接使用cat查看

或者
cp mysql-bin.000001 /opt
#直接复制二进制文件到/opt

mysqlbinlog  --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000001
#--no-defaults : 默认字符集(不加会报UTF-8的错误)
#--base64-output=decode-rows: 使用64位编码机制去解码(decode)并按行读取(rows)
#-v: 显示详细内容

mysqladmin -uroot -p123 flush-logs;
#刷新二进制日志文件(为了不重启,进行刷新,这样二进制文件会重新生成一个,相当于增量备份)

日志文件内容解析(需要关注的点)
at 127                 #起始位置
220810 23:15:25       #起始时间
create database ydq;   #具体操作
at 130                 #结束位置
220810 13:15:50       #结束时间

at 138                 #表示下一个任务开始的时间
220810 23:16:10
use ydq;
at 140

2,增量备份(完备+增量备份)

在ky21表中创建一条语句 

[root@nginx91 nxx]#mysql -uroot -pkya123
mysql> use kya;
mysql> show tables;
mysql> use ky21;


mysql> insert into ky21 values(17,'班切罗',20,33,'奥兰多');
插入一条数据

 

 进行增量备份

 3,增量恢复

3.1 增量恢复之  一般恢复

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

drop table kgc.ky21;
#模拟ky20表中的所有数据全部丢失。

现在需要还原ky21表,且还要恢复里面的两条数据

[root@nginx91 opt]#mysql -uroot -pkya123 kya < /opt/kya--ky21.sql 

#先进行完会恢复,(但是完全恢复的文件中,ky21表中只有一条数据)

[root@nginx91 data]#mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000009 |mysql -uroot -pkya123

#基于mysql-bin.000009日志文件恢复(恢复ky21表中的另一条数据)

 

 

 3.2增量恢复之断点恢复实验

下面介绍二进制文件主要的内容,位置点用于基于位置点恢复,时间戳用于基于时间恢复

 增量备份

在前面加过在日志文件中有一些位置标示:at,代表一个位置点,后面恢复时,也可以基于位置点进行恢复。

[root@nginx91 opt]#mysqldump -uroot -pkya123 kya ky21 > /opt/nxx/ky21_2.sql

mysql -uroot -p123 flush-logs;

 先进行完全备份当前ky21表

 然后在数据库中创建3条新的数据

 

 现在进行增量备份4条数据的日志文件

 现在有人不小心删除了与ky21表相关的东西,导致数据不完整,现在客户只想恢复两条语句,最后一条语句不想要了。

3.3 基于位置恢复 -at

 查看第二条语句中的结束位置点:3760

 先进行完全备份恢复到原始数据

 再基于位置节点进行恢复

3.4 基于时间恢复

基于时间恢复和基于位置恢复是基本类似。现在使用基于时间用来恢复第三条语句

[root@nginx91 data]#mysql -uroot -pkya123 kya < /opt/nxx/ky21_2.sql 
#先进行全量恢复,()

[root@nginx91 data]#mysqlbinlog --no-defaults --stop-datetime='2022-09-18 21:25:35' mysql-bin.000010 |mysql -uroot -pkya123
#仅恢复到第三条语句结束的时候

[root@nginx91 data]#mysql -uroot -pkya123 -e 'use kya;select *  from ky21;'

 进行完全恢复和时间戳恢复

 四,总结

1,备份的类型

物理备份,逻辑备份

2.物理备份:冷备,温备,热备

  • 冷备: 需要关闭mysql服务,或者确保mysql服务在进行tar备份时,没有客户端的写入操作
  • 温备: mysqldump,这个是mysql自带的备份工具

特性: 逐表备份,每备份一张表时,会先drop删除,然后重新create创建表结构,然后再解锁表

(仅锁定写的操作,但可读),进行insert语句的备份,备份完成后,进行unlock解锁,然后继续备份下一个。

  • 热备: xtrabackup或mysqlhotcopy等热备工具(第三方),在mysql正常运行时,进行备份。
     

3、逻辑备份:全量备份、增量备份、差异备份

  • 全量备份: tar压缩、mysqldump -u -p --all-databases
  • 增量备份: 主要使用bin-log,来舒心生成新的增备的日志文件,可以通过:mysqladmin -u -p fiush-logs 来刷新生成新的增备的日志文件,同时可以结合crontan,完成自动刷新。

注意: 再进行基于二进制文件的备份恢复时,有必要的话,需要先回复完备的数据,再逐个恢复增备的数据,直到恢复至我们需要恢复的数据为止。

  • 差异备份: 主要备份一次完备,后面修改的数据全部基于完备进行恢复。(相当于快照)

4、日志的保存类型

  • 混合模式Mixed(建议使用): 记录行和sql
  • 基于行ROWS: 只记录被修改的行的记录
  • 基于sql(默认): 记录修改内容的执行语句

5、mysql恢复的方式

1,基于冷备(tar)形式:**t ar zxvf解压打包的/usr/local/mysql/data数据下的内容

2,基于自带的温备工具: 使用mysqldump进行备份后,可使用两种方式进行恢复

  • mysql -u -p 库名 </opt/mysql_all.sql(备份文件的路径)
  • mysql -u -p -e ’ source /opt/mysql_all.sql’ 直接使用source进行恢复

3,基于日志:bin-log

  • 首先开启二进制日志的配置log-bin=mysql-bin ;log_format=MIXED
  • 然后再/usr/local/mysql/data 目录下,会生成mysql-bin.00000x的二进制文件进行恢复
  • 接着使用mysqlbinlog --no-defaults 二进制日志路径|mysql -u -p 基于完整的二进制日志文件进行恢复。

4,基于位置点和时间点进行恢复

  • 使用mysqlbinlog --no-defaults --base64-output-decode-rows -v 二进制日志文件路径,查看正确和需要跳过的错误操作的at(position位置带点)和datetime(时间点)来进行恢复

本文含有隐藏内容,请 开通VIP 后查看