MySQL的数据备份与恢复

一、MySQL备份类型

物理备份:备份数据文件,转储数据库物理文件到某一目录。直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版本。

物理备份又分为下面三种:

        热备:在线备份,数据库处于运行状态,这种备份方法依赖于数据库的日志文件。

                优点:不中断服务。高可用性

                缺点:对性能有一定影响,备份的时间较长时,备份文件可能不一致。        

       冷备:需要完全停止数据库服务来进行备份。备份过程中数据库服务完全停止,没有任何运行的数据库操作。确保备份文件的一致性和完整性。

                优点:备份文件的一致性和完整性最高,不会影响数据库性能。

                缺点:完全停机,服务不可用。不适用于需要高可用性的系统。

        温热:针对myisam的备份,备份时候实例只读不可写,数据库锁定表格的状态下进行的。对应用影响很大。通常加一个读锁,备份时候实例只读不可写,数据库锁定表格(不可写入但可读)的状态下进行的。

逻辑备份:对数据库对象利用工具进行导出工作,汇总入备份文件内。逻辑备份恢复速度慢,需要重建索引,存储过程等。但占用空间小,更灵活。MySQL 中常用的逻辑备份工具为mysqldump 。逻辑备份就是备份sql语句。

二、物理备份的方式

1.完全备份(完整备份)

每次对数据进行完整的备份,即对整个数据库的备份、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库,是差异备份与增量备份的基础。

  • 优点:备份与恢复操作简单方便,恢复时一次恢复到位,恢复速度快

  • 缺点:占用空间大,备份速度慢

2.增量备份

每次备份上一次备份到现在产生的新数据。只有那些在上次完全备份或者增量备份后被修改的文件才会被备份。以上次完整备份或上次的增量备份的时间为时间点,仅备份这之间的数据变化。

  • 特点:因而备份的数据量小,占用空间小,备份速度快。但恢复时,需要从上一次的完整备份起按备份时间顺序,逐个备份版本进行恢复,恢复时间长,如中间某次的备份数据损坏,将导致数据的丢失。

3.差异备份

只备份跟完整备份不一样的。备份那些自从第一次次完全备份之后被修改过的所有文件,备份的时间起点是从第一次次完整备份起,且以后每次备份都是和第一次完整备份进行比较(注意是第一次,不是上一次),备份自第一次完整备份以来所有的修改过的文件。备份数据量会越来越大。

  • 特点:占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后一次的差异版本,恢复速度介于完整备份和增量备份之间。

4.用percona-xtrabackup物理备份

        4.1安装xtrabackup

##安装最新的rpm包
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm

##启用存储库
percona-release enable-only tools release

##安装percona-xtrabackup 注意自己的mysql版本
yum install -y percona-xtrabackup-24   适用于mysq15.7
yum install -y percona-xtrabackup-80    适用于mysq18.0


##查看版本
innobackupex -v

       4.2完全备份流程

##创建备份目录:
mkdir /xtrabackup/full/ -p

##备份之前,进入数据库,存入些数据
mysql -uroot -p'密码'

##创建你自己要创建的表
例:
create database ffclever;
use ffclever;
create table t1(id int);


##进行完整备份
innobackupex --user=root --password='密码' /xtrabackup/full/

这时候对产生的文件最好压缩保存一下。

##备份恢复
##关闭数据库
systemctl stop mysqld

##删除所有数据
rm -rf /var/lib/mysql/*

##重演恢复
innobackupex --apply-log /xtrabackup/full/你的那个文件



##innobackupex:percona xtrabackup工具脚本,提供了更高级别的备份和恢复操作。
##--apply-log:这个选项用于准备备份目录,使其可以被恢复。这个过程也被称为"应用日志"。为了确保数据一致性,必须在数据恢复之前应用这些日志。


##确认数据库目录
[mysqld]
datadir=/var/lib/mysql

##恢复数据:
innobackupex --copy-back /xtrabackup/full/你的文件

##修改权限
chown mysql.mysql /var/lib/mysql -R

##启动数据库:
systemctl start mysqld

可以进入到数据库进行检验。

5.增量备份流程

每次备份上一次备份到现在产生的新数据。

# 1.在数据库上面创建一个测试的库
mysql> create database test01;
Query OK, 1 row affected (0.00 sec)

mysql> create table test01(id int);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into test01 values (1);

mysql> select * from test01;
##也要创建自己要放备份文件的文件夹,并且要保证里面为空
##第一次进行完整备份
innobackupex --user=root --password='密码' /xtrabackup/full/

##查看备份数据
ll /xtrabackup/full/你的文件


##增量备份:比如说隔一天进行再次备份,数据库发生变化
#>>> 在数据库中插入周二的数据:
mysql> use test01;
mysql> select * from test01;
mysql> insert into test01(id) values(2);
mysql> select * from test01;

##进行增量备份
innobackupex  --user=root --password='密码'  --incremental /xtrabackup/full/ --incremental-basedir=/xtrabackup/full/你的完整备份文件/
--incremental-basedir:基于哪个备份文件进行增量

##查看备份文件目录
ll /xtrabackup/full/

##再次改变数据库,并且进行增量备份
mysql> use test01;
mysql> insert into test01(id) values(3);
mysql> select * from test01;

##进行第二次增量备份(基于上一次的增量备份)
innobackupex  --user=root --password='密码'  --incremental /xtrabackup/full/ --incremental-basedir=/xtrabackup/full/你上一次的增量产生的文件/    # 基于前一天的备份为目录

##查看备份文件目录
ll /xtrabackup/full/

数据恢复流程

增量备份恢复流程
1. 停止数据库
2. 清理环境
3. 依次重演回滚redo log--> 恢复数据
4. 修改权限
5. 启动数据库

#关闭MySQL
systemctl stop mysqld

#清除脏数据
rm -rf /var/lib/mysql/*  /var/log/mysqld.log

#依次重演回滚redo log:(第一次回滚完整备份日志)
innobackupex --apply-log --redo-only /xtrabackup/full/完整备份日志/

#回滚第一次增量备份日志(基于完整备份还原)
innobackupex --apply-log --redo-only /xtrabackup/full/基于完整备份日志/  --incremental-dir=/xtrabackup/full/第一次的增量备份/
--incremental-dir:增量目录

#回滚第二次增量备份日志(基于完整备份还原)
innobackupex --apply-log --redo-only /xtrabackup/full/基于完整备份日志/  --incremental-dir=/xtrabackup/full/第二次的增量备份/

为什么一直都是针对于基于完整备份呢????
因为我们是将增量备份加入到完整备份之中,只要回滚一次增量备份,完整备份里面就是最全面的,总之就一直基于完整备份,但是要按照顺序进行回滚增量日志。

#恢复数据:(基于MySQL完整备份)
innobackupex --copy-back /xtrabackup/full/完整备份/

#修改权限(属主属组)
chown -R mysql:mysql /var/lib/mysql

6.差异备份流程

#清理备份的环境
rm -rf /xtrabackup/full/*

#登陆数据库,准备环境
mysql> delete from test01.t1;
mysql> insert into test01.t1(id) values(1);  #插入数据1

#查看当前系统时间
date
#完整备份
innobackupex --user=root --password='密码' /xtrabackup/full/

#修改时间
date 时间  格式是月日时分 --每一个都是两位,单个位要补前导零

#插入数据
mysql> insert in to test01.t1(id) values(2);  #插入数据2
mysql> select * from test01.t1;

#差异备份1
innobackupex  --user=root --password='密码' --incremental /xtrabackup/full/ --incremental-basedir=/xtrabackup/full/完整备份/

#查看
ll /xtrabackup/full

#再次修改数据
mysql> insert into test01.t1(id) values(3); 
mysql> select * from test01.test01;

#修改时间

date 时间

#差异备份2
innobackupex  --user=root --password='密码' --incremental /xtrabackup/full/ --incremental-basedir=/xtrabackup/full/完整备份/

#查看
ll /xtrabackup/

差异备份恢复流程

##差异备份恢复流程
1. 停止数据库
2. 清理环境
3. 重演回滚redo log(周一,某次差异)--> 恢复数据
4. 修改权限
5. 启动数据库

#停止数据库
systemctl stop mysqld

#删除脏数据
rm -rf /var/lib/mysql/* /var/log/mysqld.log 

#1.恢复全量的redo log
innobackupex  --apply-log --redo-only /xtrabackup/full/完整备份/

#2.恢复差异的redo log
这里我们恢复差异备份2
innobackupex --apply-log --redo-only /xtrabackup/full/完整备份/  --incremental-dir=/xtrabackup/full/差异备份2/

#3.恢复数据
[root@mysql-server ~]# innobackupex  --copy-back /xtrabackup/full/完整备份/

#修改权限(属主和属组):
chown -R mysql:mysql /var/lib/mysql

#启动MySQL服务
systemctl start mysqld

三、mysqldump逻辑备份

本身为客户端工具:
远程备份语法: # mysqldump  -h 服务器  -u用户名  -p密码   数据库名  > 备份文件.sql
本地备份语法: # mysqldump  -u用户名  -p密码   数据库名  > 备份文件.sql

备份表

mkdir /home/back  #创建备份目录
mysqldump --default-character-set=utf8mb4 --single-transaction -uroot -p'密码' 库名 表 > /home/back/想创建的文件名

备份多个表:
mysqldump --default-character-set=utf8mb4 --single-transaction -uroot -p'密码' 库名 表 表  > /home/back/想创建的文件名

 备份库

##备份库
mysqldump --default-character-set=utf8mb4 --single-transaction -uroot -p'密码' -B 库名 > /home/back/想创建的文件名

#备份多个库:需要加 -B   加了-B以后 备份的脚本中就会有建库语句
mysqldump --default-character-set=utf8mb4 --single-transaction -uroot -p'密码' -B 库名 库名 > /home/back/想创建的文件名

#备份所有的库:
mysqldump --default-character-set=utf8mb4 --single-transaction -uroot -p'密码' -A > /home/back/想起的文件名


恢复数据库和表

        为保证数据一致性,应在恢复数据之前停止数据库对外的服务,停止binlog日志 因为恢复数据时执行的sql 也会记录到binlog日志中。 所以 一般咱们在恢复数据时 暂停binlog

恢复库

#登陆mysql创建一个库   为什么要手动建个库  因为在备份的时候 没有使用-B 备份的脚本文件中 没有建库语句
mysql> create database company;

#>>> 恢复数据
mysql -uroot -p'密码' 库名 < /home/back/你的文件

#如果备份的时候有使用 -B   那么备份脚本中 有建库语句,恢复的时候 不用再指定库的名字
mysql -uroot -p'密码' < /home/back/你的文件

#加上参数  --init-command="SET sql_log_bin=0;"  就不会记录到binlog 中
mysql -uroot -p'密码' --init-command="SET sql_log_bin=0;" < /home/back/你的文件

恢复表

#登陆到刚才恢复的库中将其中的一个表删除掉
mysql> show databases;
mysql> use db1;

mysql> drop table t1,t2;

开始恢复:
mysql> set sql_log_bin=0;   #停止binlog日志
Query OK, 0 rows affected (0.00 sec)
mysql> source /home/back/你的文件;  -------加路径和备份的文件 

#>>> 恢复方式二:
# mysql -u root -p'密码'  库名  < 文件名:
                     库名    备份的文件路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值