一、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'密码' 库名 < 文件名:
库名 备份的文件路径