MySQL——MySQL备份

Posted Pakho`

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL——MySQL备份相关的知识,希望对你有一定的参考价值。

一、前言——关于备份

一、为什么要数据库备份?

  • 数据备份就是要保存数据的完整性,防止非法关键,断电,病毒感染等等情况,使数据丢失。有必要的话,最好勤备份,防止数据丢失。
  • 最主要的原因:尽可能地减少损失,包括时间上、精神上和金钱上的损失。很多人都不注意备份数据,以致在发生问题后丢失大量的重要数据。要知道,在地球上网是很危险的,即使做好安全预防措施,也难免会发生不可预想的问题。因此,数据备份是日常必不可少的操作。

二、备份目标

  • 数据的一致性
  • 服务的可用性

三、备份技术

物理备份/冷备份

  • 直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,不不能恢复到不同的MySQL服务器
  • tar,cp,scp
  • 拷贝数据,优点块,缺点服务停止

逻辑备份/热备份

  • 备份的建表,建库,插入等操作所执行SQL语句(DDL DML DCL),适用于中小型企业
  • mysqldump,myduper
  • 效率相对较低

四、备份方式

  • 完全备份
  • 增量备份
  • 差异备份

二、Xtrabackup完整性备份

2.1 Percona Xtrabackup

在这里插入图片描述

  • 它是开源免费的支持MySQL数据库热备份的软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份,它不暂停服务创建Innodb热备份为MySQL做增量备份,在MySQL服务器之间做在线表迁移,使创建replication更加容易,备份MySQL而不增加服务器的负载
  • percona是一家老牌的MySQL技术咨询公司,它不仅支持的MySQL的技术支持、培训、咨询,还发布了MySQL的分支版本–Percona Server,并围绕Percona Server还发布了一系列的MySQL工具
  • 官方站点及下载 https://www.percona.com/

2.2 安装Percona Xtrabackup

一、安装Percona需要的MySQL包

1、安装Mysql官方源: yum -y install https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm
2、yum 工具 :   yum -y install yum-utils
3、查看mysql可用版本 :yum repolist all| grep mysql
4、随后前往YUM仓库路径修改YUM下载关闭80开启57
6、yum -y install mysql-community-libs-compat

二、安装Percona Xtrabackup YUM仓库

[root@mysqlmaster611 ~]# yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
[root@mysqlmaster611 ~]# yum repolist   #安装完成后刷新YUM仓库

三、YUM 安装 Percona Xtrabackup

[root@mysqlmaster611 ~]# yum install percona-xtrabackup-24.x86_64

四、准备备份环境

mysql> create database test1;
mysql> create database test2;
mysql> create database test3;

在这里插入图片描述

2.3 完全备份流程

一、执行完全备份

[root@mysqlmaster611 ~]# innobackupex --user=root --password='***' /xtrabackup/full
#inno 数据库默认引擎   用户:root    备份在根下的两级目录下 full:全部

在这里插入图片描述
二、完全备份完成后的检查

[root@mysqlmaster611 ~]# ls /xtrabackup/full/

在这里插入图片描述

[root@mysqlmaster611 ~]# cat /xtrabackup/full/2021-06-04_15-49-15/xtrabackup_binlog_info  
#观察二进制文件的位置

2.4 完全备份恢复流程

一、停止数据库

[root@mysqlmaster611 ~]# systemctl stop  mysqld

二、清理数据库(模拟损坏)
模拟 !!!!!!

[root@mysqlmaster611 ~]# rm -rf /var/lib/mysql/*    #删除数据库注意没有删除文件夹
[root@mysqlmaster611 ~]# rm -rf /var/log/mysqld.log #删除MySQL日志

三、生成回滚日志

[root@mysqlmaster611 ~]# innobackupex --apply-log /xtrabackup/full/2021-06-04_15-49-15/
#apply:应用

四、恢复文件

[root@mysqlmaster611 ~]# innobackupex --copy-back /xtrabackup/full/2021-06-04_15-49-15/

五、登陆验证

[root@mysqlmaster611 ~]# ls /var/lib/mysql

在这里插入图片描述

[root@mysqlmaster611 ~]# chown -R mysql.mysql /var/lib/mysql
#为数据库授权 因为恢复的文件是root身份 mysql用户无法打开
[root@mysqlmaster611 ~]# systemctl start mysqld
[root@mysqlmaster611 ~]# mysql -uroot -p'***'
mysql> show databases;

在这里插入图片描述

2.5 增量备份流程

一、什么是增量备份?

  • 比如说数据库里面已有数据是集合A,然后今天因为一些业务又发生了一些数据,假设为B,那么做备份的时候,只是针对增加了的这一部分进行备份,即copy B而不是 copy (A+B)。
  • 大型企业中涉及业务的数据库基本上都是采用这种方法每天将发生的业务数据进行备份,而不需要从数据库初始备份到现在,即速度上会快很多!

二、准备工作

使用指定的数据库

mysql> create database testdb;
mysql> use testdb;
mysql> create table test (id int);
mysql> insert into test values (1);
mysql> select * from test;

在这里插入图片描述
三、完整备份:周一

增量备份前提是需要完整备份

[root@mysqlmaster611 ~]# rm -rf /xtrabackup/*   #清除刚才实验的残留 
[root@mysqlmaster611 ~]# date 06010000          #调整时间方便实验

在这里插入图片描述

#执行完整备份
[root@mysqlmaster611 ~]# innobackupex --user=root --password='***' /xtrabackup/

四、增量备份:周二

[root@mysqlmaster611 ~]# date 06020000

在这里插入图片描述

[root@mysqlmaster611 ~]# mysql -uroot -p'***'
mysql> insert into testdb.test values (2);    #为testdb库里的test表插入2号数据
[root@mysqlmaster611 ~]# innobackupex --user=root --password='***' --incremental /xtrabackup/ --incremental-basedir=/xtrabackup/2021-06-01_00-01-27/
#incremental:增量   base:基于 dir:目录   基于完整备份
[root@mysqlmaster611 ~]# ls /xtrabackup/     #检查一下备份路径

在这里插入图片描述

一般情况下周一至周五做增量备份,周六周日会选择一天做完整备份

五、增量备份:周三

[root@mysqlmaster611 ~]# date 06030000

在这里插入图片描述

[root@mysqlmaster611 ~]# mysql -uroot -p'***' -e 'insert into testdb.test values (3)';
[root@mysqlmaster611 ~]# innobackupex --user=root --password='***' --incremental /xtrabackup/ --incremental-basedir=/xtrabackup/2021-06-02_00-07-41/
[root@mysqlmaster611 ~]# ls /xtrabackup/     #检查一下备份路径

在这里插入图片描述

2.6 增量备份恢复流程

一、停止数据库

[root@mysqlmaster611 ~]# systemctl stop mysqld

二、清理环境(模拟损坏)

模拟 !!!!!!

[root@mysqlmaster611 ~]# rm -rf /var/lib/mysql/*

三、回滚合并

[root@mysqlmaster611 ~]# innobackupex --apply-log --redo-only /xtrabackup/2021-06-01_00-01-27/  #应用周一的日志
[root@mysqlmaster611 ~]# innobackupex --apply-log --redo-only /xtrabackup/2021-06-01_00-01-27/ --incremental-dir=/xtrabackup/2021-06-02_00-07-41/ #incremental-dir:增量的目录
[root@mysqlmaster611 ~]# innobackupex --apply-log --redo-only /xtrabackup/2021-06-01_00-01-27/ --incremental-dir=/xtrabackup/2021-06-03_00-04-26/ #基于完整备份追加三号数据

四、恢复文件

[root@mysqlmaster611 ~]# innobackupex --copy-back /xtrabackup/2021-06-01_00-01-27/
#使用完整备份进行恢复因为所有日志都和1号合并在一起

五、登陆验证

[root@mysqlmaster611 ~]# chown -R mysql.mysql /var/lib/mysql
#为数据库授权 因为恢复的文件是root身份 mysql用户无法打开
[root@mysqlmaster611 ~]# systemctl start mysqld
[root@mysqlmaster611 ~]# mysql -uroot -p'***' -e 'select * from testdb.test'

在这里插入图片描述

2.7 差异备份流程

一、什么是差异备份?

  • 差异备份是指在一次全备份后到进行差异备份的这段时间内,对那些增加或者修改文件的备份。
  • 在进行恢复时,我们只需对第一次全备份和最后一次差异备份进行恢复。
  • 差异备份在避免了另外两种备份策略缺陷的同时,又具备了它们各自的优点。
  • 首先,它具有了增量备份需要时间短、节省磁盘空间的优势;
  • 其次,它又具有了全备份恢复所需磁带少、恢复时间短的特点。
  • 系统管理员只需要两盘磁带,即全备份磁带与灾难发生前一天的差异备份磁带,就可以将系统恢复

二、清除实验环境

[root@mysqlmaster611 ~]# rm -rf /xtrabackup/*

三、准备工作

[root@mysqlmaster611 ~]# date 10010000
[root@mysqlmaster611 ~]# mysql -uroot -p'***'
mysql> use testdb;
mysql> create table test2 (id int);
mysql> insert into test2 values (2);
mysql> select * from test2;

在这里插入图片描述

2.7.1 完整备份:周一

[root@mysqlmaster611 ~]# innobackupex --user=root --password='***' /xtrabackup/
[root@mysqlmaster611 ~]# ls /xtrabackup/
[root@mysqlmaster611 ~]# du -sh /xtrabackup/      #统计文件夹大小

在这里插入图片描述

2.7.2 差异备份:周二

[root@mysqlmaster611 ~]# date 10020000
[root@mysqlmaster611 ~]# mysql -uroot -p'***' -e'insert into testdb.test2 values (3)'
[root@mysqlmaster611 ~]# mysql -uroot -p'***' -e'select * from testdb.test2'

在这里插入图片描述

[root@mysqlmaster611 ~]# innobackupex --user=root --password '***' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2021-10-01_00-05-53

2.7.3 差异备份:周三

[root@mysqlmaster611 ~]# date 10030000
[root@mysqlmaster611 ~]# mysql -uroot -p'***' -e'insert into testdb.test2 values (4)'
[root@mysqlmaster611 ~]# innobackupex --user=root --password '***' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2021-10-01_00-05-53/

注意:命令与之前一样,但是数据增加了,备份基于周一完整备份,包含周二和周三的内容

2.8 差异备份恢复流程

一、停止数据库

[root@mysqlmaster611 ~]# systemctl stop mysqld

二、模拟数据库损坏

[root@mysqlmaster611 ~]# rm -rf /var/lib/mysql/* 

三、2.9.3 恢复数据

[root@mysqlmaster611 ~]# innobackupex --apply-log --redo-only /xtrabackup/2021-10-01_00-05-53/  #应用10月1日完整日志
[root@mysqlmaster611 ~]# innobackupex --apply-log --redo-only /xtrabackup/2021-10-01_00-05-53 --incremental-dir=/xtrabackup/2021-10-03_00-02-49/
[root@mysqlmaster611 ~]# innobackupex --copy-back /xtrabackup/2021-10-01_00-05-53/

注意:还原1号的日志,为什么会有所有的数据,因为第二步将3号的日志追加至了1号日志,所以只需要还原1号的日志

四、登陆验证

[root@mysqlmaster611 ~]# chown -R mysql.mysql /var/lib/mysql
[root@mysqlmaster611 ~]# systemctl start mysqld
[root@mysqlmaster611 ~]# mysql -uroot -p'***' -e 'select * from testdb.test2'

在这里插入图片描述

三、MySQLDump

一、什么是MySQLDump?

  • mysqldump工具很多方面类似相反作用的工具mysqlimport。它们有一些同样的选项。但mysqldump能够做更多的事情。
  • 它可以把整个数据库装载到一个单独的文本文件中。
  • 这个文件包含有所有重建您的数据库所需要的SQL命令。
  • 这个命令取得所有的模式(Schema,后面有解释)并且将其转换成DDL语法(CREATE语句,即数据库定义语句),取得所有的数据,并且从这些数据中创建INSERT语句。
  • 这个工具将您的数据库中所有的设计倒转。
  • 因为所有的东西都被包含到了一个文本文件中。这个文本文件可以用一个简单的批处理和一个合适SQL语句导回到MySQL中。
  • mysqldump是mysql用于转存储数据库的实用程序。它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等。

在这里插入图片描述

二、 MySQLDump的优势

  • 自动记录日志position位置
  • 可用性,一致性

三、MySQLDump语法

mysqldump -h 服务器 -u 用户名 -p 密码 数据库名 > 备份文件.sql
-h:一般不用 如果要用需要加上对方服务器的IP地址
帮助: mysqldump --help

3.1 MySQLDump数据备份

一、准备两套root密码

密码1:AaBbCc@123  配置到当前数据库中
密码2:AaBbCc@1234 备用

二、准备库

注意:清理掉之前的test库,实验后半部分,需要继续创建test库,避免混淆

[root@mysqlmaster611 ~]# mysql -uroot -p'***'
mysql> drop database testdb;
mysql> create database testdb1;
mysql> use testdb1;
mysql> create table t1 (id int);
mysql> insert into testdb1.t1 values (1),(2),(3);
mysql> select * from testdb1.t1;

在这里插入图片描述
三、执行备份

[root@mysqlmaster611 ~]# mysqldump -uroot -p'***' 
--all-databases                       #所有的库
--single-transaction                  #保持数据可用性,不关机的备份 InnoDB一致性服务可用性
--master-data=2                       #注释掉二进制日志记录
--flush-logs                          #切断日志
> /backup/`date +%F-%H`mysql-all.sql #重定向到备份文件,前提是有

3.1.1 观察备份细节

在这里插入图片描述

[root@mysqlmaster611 ~]# vim /backup/2021-10-03-01mysql-all.sql

在这里插入图片描述在这里插入图片描述

LOCK TABLES `user` WRITE;
  • 图中黄色部分为Mysqldump锁机制,用来保证数据一致性
  • 当Mysqldump准备备份一张数据表时,会用MySQL的锁锁定文件,也可以理解为去掉文件的写入权限
  • 好处是文件不能被写入但是能够被读取
  • 同样备份时,也不用暂停服务
22 -- CHANGE MASTER TO MASTER_LOG_FILE='mysqlmaster611-bin.000002', MASTER_LOG_POS=154;
  • 文中第22行显示一个二进制文件是被flush-logs截断的
  • master-data 主服务的数据被记录下来,以带注释的方式,记录的位置为二进制文件的最新位置
  • 表示这一次的备份时间节点在以mysqlmaster611-bin.000002日志的154号节点位,再此之前的已备份,在此之后的还未备份
  • 如果备份时master-data=1 就没有22后的 注释

3.1.2 备份后的数据变更行为

模拟数据库备份完成后的数据库变更行为

[root@mysqlmaster611 ~]# mysql -uroot -p'***'
mysql> create database testdb2;
mysql> create table testdb2.t2 (id int);
mysql> insert into testdb2.t2 values (1),(2);
mysql> create database testdb3;
[root@mysqlmaster611 ~]# systemctl restart mysqld

3.2 MySQLDump数据恢复

模拟生产环境中数据库恢复数据的一种错误

一、备份二进制日志文件

[root@mysqlmaster611 ~]# cp /var/lib/mysql/*bin* .           #备份二进制日志文件

二、停止数据库

[root@mysqlmaster611 ~]# systemctl stop mysqld               #停止数据库

三、清理环境

[root@mysqlmaster611 ~]# rm -rf /var/lib/mysql/*             #清理环境

四、启动数据库并配置新密码登陆

[root@mysqlmaster611 ~]# systemctl start   mysqld            #开启数据库
[root@mysqlmaster611 ~]# grep password /var/log/mysqld.log   #查找数据库初始密码
2021-10-02T17:46:32.014498Z 1 [Note] A temporary password is generated for root@localhost: sbfCr?Cll7pS
[root@mysqlmaster611 ~]# mysqladmin -uroot -p'sbfCr?Cll7pS' password 'AaBbCc@1234' #修改数据库密码
[root@mysqlmaster611 ~]# mysql -u root -p'AaBbCc@1234'

在这里插入图片描述

3.2.1 MySQL数据恢复

[root@mysqlmaster611 ~]# mysql -uroot -p'AaBbCc@1234' </backup/2021-10-03-01mysql-all.sql
#完成后登陆数据库查看数据是否恢复
mysql> show databases;

在这里插入图片描述

mysql> flush privileges;   #刷新数据库
[root@mysqlmaster611 ~]# mysql -uroot -p'AaBbCc@1234'  #再次登陆

在这里插入图片描述已无法登陆

从备份点至灾难点之间的数据如何恢复?
答:二进制日志文件恢复

四、BinLog(二进制日志恢复)

一、观察二进制截取记录

[root@mysqlmaster611 ~]# vim /backup/2021-10-03-01mysql-all.sql
22 -- CHANGE MASTER TO MASTER_LOG_FILE='mysqlmaster611-bin.000002', MASTER_LOG_POS=154;

二、数据恢复

[root@mysqlmaster611 ~]# mysqlbinlog mysqlmaster611-bin.000002 mysqlmaster611-bin.000003 --start-position=154 | mysql -uroot -p'***'
#添加标记的备份文件 
#服务器在刷新和重启的时候会自动截断日志 全部在这里加上
#--start-position :开始位置
# 使用 | 登陆

在这里插入图片描述
观察数据,在数据库备份完成后执行的操作是成功的,数据是完整的
同理,使用Percona Xtrabackup 也会使用二进制日志进行恢复

五、关于数据恢复时的多余日志

一、关闭二进制文件方法一

[root@mysqlmaster611 ~]# mysql -uroot -p'***'
mysql> set sql_log_bin=0;                       #暂时关闭二进制日志文件
mysql> source /backup/*.sql                     #读取二进制文件资源
mysql> set sql_log_bin=1;                       #读取完成后再打开
mysql> \\q
Bye

二、关闭二进制文件方法二

[root@mysqlmaster611 ~]# vim /etc/my.cnf
...
#log_bin
...

六、记录的导入和导出

6.1 记录的导出

一、注意目录权限

[root@mysqlmaster611 ~]# vim /etc/my.cnf    #进入主配置文件添加第三行
[mysqld]
slow_query_log=1        
long_query_time=3                           #此处为慢日志查询
secure-file-priv=/backup                    #安全文件指定为/backup
[root@mysqlmaster611 ~]# chown mysql.mysql /backup/ #为目录授权

二、导出数据

mysql> select * from ceshi into outfile '/backup/ceshi.txt'; #通过select查询ceshi表 并输出至/backup下的ceshi.txt
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement  #发生了报错,因为刚才没重启
mysql> system systemctl restart mysqld;                      #在mysql中执行重启
mysql> select * from ceshi into outfile '/backup/ceshi.txt'; #再次执行

在这里插入图片描述

[root@mysqlmaster611 ~]# ls /backup/   #检查

在这里插入图片描述

三、MySQL命令导出文本文件多种格式

1、普通格式

[root@mysqlmaster611 ~]# mysql -uroot -p'***' -e 'select * from test1.ceshi' >/backup/222.txt
[root@mysqlmaster611 ~]# cat /backup/222.txt 

在这里插入图片描述
2、XML格式

[root@mysqlmaster611 ~]# mysql -uroot -p'***' --xml -e 'select * from test1.ceshi' >/backup/333.txt
#指定输出格式为xml
[root@mysqlmaster611 ~]# cat /backup/333.txt

在这里插入图片描述
3、html格式

[root@mysqlmaster611 ~]# mysql -uroot -p'***' --html -e 'select * from test1.ceshi' >/backup/index.html

在这里插入图片描述

6.2 记录的导入

同样注意目录权限,如果没有权限执行目录 <6.1.1> 命令

一、实验导入前的环境准备

[root@mysqlmaster611 ~]# mysql -uroot -p'***'
mysql> delete from test1.ceshi;              #删除表中内容

二、数据导入

mysql> load data infile '/backup/ceshi.txt' into table test1.ceshi;
#加载 数据 文件 +文件路径                       插入  表
#如果没有表需要创建表

在这里插入图片描述

以上是关于MySQL——MySQL备份的主要内容,如果未能解决你的问题,请参考以下文章

Java 备份mysql数据库的问题

如何用Java实现MySQL数据库的备份和恢复

部分代码片段

mysql 自动备份脚本

从mysql的片段中加载ListView

Mysql的主主备份与主从备份--同步