开源数据库MYSQL之备份

备份的原因:数据可能会丢失和被删除,这会造成巨大的损失,所以要对数据进行备份。

备份的目标:1、数据的一致性,2、服务的可用性。

备份技术:

1、物理备份/冷备份

  直接复制数据库文件,适用于大型就业环境,不受存储引擎的限制,但不能恢复到不同的MYSQL版本。

  tar  cp  scp  

  拷贝数据,优点快,缺点服务停止

2、逻辑备份/热备份

  备份的是建表、建库、插入等操作所执行的SQL语句(DDL、DML、DCL)适用于中小型数据库。

  mysqldump、mysqldumper

  效率相对较低

备份种类:

 1、完全备份

  将所有数据一次全部备份下来。

 2、增量备份

  数据进行了一次完整备份后,在备份的时候只备份完整备份之后增加的部分。

  连续恢复

  特点:因每次仅备份自上一次备份(注意是上一次,不是第一次)以来有变化的文件,所 以备份体积小,备份速度快,但是恢复的时候,需要按备份时间顺序,逐个备份版本进行恢复,恢复时间长。

3、差异备份

位于完整备份和增量备份之间的。

 跳跃恢复

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

一、使用percona-xtrabackup软件进行备份

1、简介

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

2、获得软件包

官方站点:https://www.percona.com/ 

选择版本进行下载

3、安装

① 安装yum仓库

安装percona需要的mysql包

mysql官方源:

yum install -y  https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm

yum工具:

yum -y install yum-utils

查看mysql可用的版本

yum repolist all | grep mysql

禁用80版本

yum-config-manager  --disable mysql80-community

启动57版本

yum-config-manager  --enable mysql57-community
yum -y install mysql-community-libs-compat
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

② YUM安装percona-xtrabackup

 yum -y install percona-xtrabackup-24.x86_64

 安装percona
    本地RPM:
   将percona-xtrabackup24.rpm.zip下载到本地,然后上传到系统中进行安装。

③ 查询安装结果

rpm -ql  percona-xtrabackup-24 

4、完全备份流程

innobackupex --user=root --password='weinihao@123'  /xtrabackup/full
//连接数据库,开始备份
//注意备份是否完成:下面的提示就是备份成功的提示
//xtrabackup: Transaction log of lsn (74182721) to (74182730) was copied.
171127 15:04:12 completed OK!
ls   /xtrabackup/full
//查看备份目录   数据库 配置文件  日志文件
ls /xtrabackup/full/2020-09-01_00-02-37/

查看二进制日志位置

ls /xtrabackup/full/2020-09-01_00-02-37/xtrabackup_binlog_iofo

5、完全恢复流程

因为我们实验的时候数据库是好的,我们想要进行完全恢复数据,就要模拟数据被损坏。

systemctl stop mysqld  //停止数据库 
rm -rf  /var/lib/mysql/*
rm -rf /var/log/mysql.log 
//清理环境(模拟数据库被损坏)
innobackupex  --apply-log  /xtrabackup/full/2020-09-01_00-02-37/   
//指定备份点    //生成回滚日志
innobackupex  --copy-back  //xtrabackup/full/2020-09-01_00-02-37/
//恢复文件

验证登录

ls  /var/lib/mysaql
chown  -R mysql.mysql /var/lib/mysql
systemctl start mysqld
mysql -uroot -p'QianFeng@123'

6、增量备份流程

准备工作:

create database  testdb;
use testdb;
create  table test(id  int);
insert into test values (1);
select * from test;
mysql> select * from test;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

完整备份,周一

rm -rf  /xtrabackup/*
date 090100000  //时间建议靠后设计
innobackupex  --user=root --password='weinihao@123'   /xtarbackup
ll /xtarbackup/mysql>2020-09-01_00-02-37

增量备份,周二

date  09020000  //更新时间
mysql -uroot -p'QianFeng@123' -e  'insert into testdb.test values (2)'
mysql -uroot -p'QianFeng@123' -e 'select * from testdb.test'
innobackupex  --user=root --password='weinihao@123' --incremental  /xtrabackup/   --incremental-basedir=/xtrabackup/2020-09-01_00-02-37
//basedir基于周一的备份,会生成一个今天的

增量备份,周三

date 09030000
ls /xtarbackup/
mysql -uroot -p'QianFeng@123' -e  'insert into testdb.test values (3)'
innobackupex --user=root --password='weinihao@123' --incremental   /xtrabackup/ --incremental-basedir=/xtarbackup/2020-09-02_00-07-40  //basedir会基于周二的备份生成一个今天的
ls /xtrabackup/

7、增量恢复流程

停止数据库

systemctl  stop mysqld

清理环境

rm -rf /var/lib/mysql/*

周一

innobackupex --apply-log --redo-only /xtrabackup/2020-09-01_00-02-37   //回滚合并

周二

innobackupex  --apply-log  --redo-only /xtrabackup/2020-09-01_00-02-37  --incremental-dir=/xtrabackup/2020-09-02_00-07-40

恢复

innobackuex  --copy-back  /xtrabackup/2020-09-01_00-02-37    //将2中的数据合并到1中,一起恢复回来。所以现在1中有1和2的数据。
chown -R mysql.mysql /var/lib/mysql  //授权
systemctl start mysqld

二、使用mysqldump+binlog备份数据

优势

1 自动记录日志position位置。
        (show master  status\G;)

 2 可用性,一致性
        锁表机制。

语法

mysqldump  -h 服务器  -u用户名  -p密码   数据库名  > 备份文件.sql

ps:参数说明
        库的范围
          -A, --all-databases    所有库
          school    数据库名
          school stu_info t1    是指school数据库的表stu_info、t1
          -B, --databases bbs test mysql    多个数据库
          --single-transaction                    #InnoDB 一致性 服务可用性
          --master-data=1|2    #该选项将会记录binlog的日志位置与文件名并追加到文件中,或添加注释
          高级选项
           --opt         #同时启动各种高级选项
           -R, --routines             #备份存储过程和存储函数
            -F, --flush-logs        #备份之前刷新日志,截断日志。备份之后新binlog。
            --triggers        #备份触发器
    帮助
        mysqldump --help

1、mysqldump进行备份

准备两套密码:密码1:weinihao123,密码2:weinihao1234(备用)

① 准备库

ps:做实验之前清理掉之前test库,防止混淆。

mysql -p'QianFeng@123'
create database testdb1;
create table testdb1.t1(id int);
insert into testdb1.t1 values(1);
insert into testdb1.t1 values(2);
insert into testdb1.t1 values(3);
select * from testdb1.t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+

② 执行备份

mkdir /backup
[root@localhost ~]#mysqldump  -p'weinihao@123' \
--all-databases --single-transaction \
--master-data=2 \
--flush-logs \
> /backup/`date+%F-%H`-mysql-all.sql
vim /backup/2020-09-03-12-mysql-all.sql  //观察备份细节
LOCK TABLES `user` WRITE;
	//观察各种锁机制,用来保证数据一致性
22 CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.000004', MASTER_LOG_POS=154;
	//二进制日志截断位置。第22行

③ 备份后的数据变更行为在testdb2.t2 中插入数据1,2,3;
创testdb3库
切断二进制日志(重启数据库)

 mysql> select * from testdb2.t2;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+

在testdb2.t2 中插入数据4;
删testdb3库
在testdb2.t2 中插入数据5;  

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| testdb1            |
| testdb2            |
+--------------------+
12 rows in set (0.00 sec)
mysql> 

2、恢复备份

cp /var/lib/mysql/*bin*  ~  //备份二进制文件
模拟损坏环境:
systemctl stop mysqld    
rm -rf /var/lib/mysql/*  //清理环境
systemctl strat mysqld  //启动数据库  (相当于一个新的数据库)
grep 'password' /var/log/mysql.log  //查找密码 ,
mysqladmin  -uroot -p'%?i=Yx)xa5p1' password 'weinihao@1234' //使用备份密码
mysql -p'weinihao@1234' < /backup//backup/2020-09-03-12-mysql-all.sql     //mysql恢复数据
mysql -p'QianFeng@1234' -e 'flush privileges'
	//请使用备份时密码 
vim /backup/2016-11-25-14-mysql-all.sql  //观察二进制的截取记录
CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.0000002', MASTER_LOG_POS=154;

mysqlbinlog  localhost-bin.0000002 localhost-bin.0000003  --start-position=154 |mysql -p'weinihao@123' //二进制日志恢复
//后续有多少个日志要跟多少个日志名字。

猜你喜欢

转载自blog.csdn.net/yiweii/article/details/108286799