开源数据库MySQL DBA运维实战—第5章—备份。

目录

一 关于备份

1.备份原因

2.备份目标

3备份技术

4备份种类

二 实战案例1:(增量备份)

percona-xtrabackup

1.简介

2.获得软件包

3.安装

4-1.完全备份流程

4-2完全恢复流程

5-1 增量备份流程

5-2增量恢复流程

三 实战案例2:   (差异、跳跃)

mysqldump + binlog

1.优势

2.语法

3.实战备份

4恢复实战


一 关于备份

1.备份原因

丢失、删除等原因

2.备份目标

数据的一致性

服务的可用性

3备份技术

==物理备份 /冷备份==

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

tar, cp, scp(跨设备拷贝文件)

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

==逻辑备份 /热备份==

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

mysqldump , mydumper

缺点:效率相对较低

4备份种类

==完全备份==

每次备份都是从第一次备份起点开始的

==增量备份==

 

 连续回复   每次备份是从上次备份结束时,到这次备份之间有变化的文件进行备份

 备份体积小,备份速度快。恢复的时候需按备份时间顺序,逐个备份版本进行恢复,时间长。

   

==差异备份== 

 

 第二次及以后的备份,在第一次备份结束后开始

 跳跃恢复   ,恢复时仅需恢复第一个完整版本和最后一次的差异版本(包含所有的差异)

 占用空间介于前两种之间,恢复速度介于两种之间

  

二 实战案例1:(增量备份

percona-xtrabackup

1.简介

logo:(percona)

 它是开源免费的支持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 install -y yum-utils

查看MySQL可用版本:

yum repolist all | grep mysql

禁用80

yum-config-manager --disable mysql80-community

启用57

yum-config-manager --enable mysql57-community

下载相关服务软件

yum  install mysql-community-libs-compat -y

下载yum源

yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

==YUM安装percona-xtrabackup==

yum -y install percona-xtrabackup-24.x86_64   

   由于是国外网络,速度特别慢,本次试验用本地安装


 本地RPM安装percona-xtrabackup

        percona-xtrabackup24.rpm.zip

 步骤   mkdir  bf.sql     //创建文件夹存放项目压缩包)

           cd  bf.sql   进入到文件夹

           rz    //项目压缩包上传到文件夹

           unzip   percona-xtrabackup24.rpm.zip   //解压此项目文件

           yum  -y  instasll   bf.sql/percona-xtrabackup24.rpm/*    //把解压的软件都安装一下

          

==查询安装结果==

rpm -ql percona-xtrabackup-24        //查询软件安装版本eg:rpm -qa |grep  mysql

4-1.完全备份流程

innobackupex  --user=root  --password='QianFeng@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/2017-08-01_00-00-02/

观看二进制日志位置

cat /xtrabackup/full/2017-08-01_00-00-18/xtrabackup_binlog_info   //二进制日志

4-2完全恢复流程

停止数据库

systemctl stop mysqld

清理环境(模拟损坏。在公司不可尝试停止、删除)

rm -rf  /var/lib/mysql/*     //删除MySQL的文件

rm -rf  /var/log/mysqld.log    //删除MySQL的日志

生成回滚日志

   指定(找到)备份点

innobackupex --apply-log   /xtrabackup/full/2017-08-01_00-00-18/   

 提示:

恢复文件 

  从备份点复制回

innobackupex  --copy-back  /xtrabackup/full/2017-08-01_00-00-18/

提示:

==登录验证==

ls  /var/lib/mysql      //查看文件是否恢复

chowm  -R  mysql.mysql   /var/lib/mysql      //给mysql 文件授权

systemctl  start  mysql   //重启MySQL服务

mysql   -uroot  -p'QianFeng@123'     //登录MySQL查看

5-1 增量备份流程

==准备工作==

使用指定的数据库

mysql> great  database  testdb;      //创建库

mysql> use  testsb;

mysql>create table  test(id  int);

mysql> insert into test values(1);

ymsql> select * from test;

==完整备份:周一==

# rm -fr  /xtrabackup/*     //清空之前备份

# date 09010000     //设置时间

# innobackupex --user=root --password='QianFeng@123'  /xtrabackup    //备份

# ll /xtrabackup/      //查看备份
    2020-09-01_00-00-04

==增量备份:周二==

更新时间:# 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='QianFeng@123'        
  --incremental  /xtrabackup/                              
  --incremental-basedir=/xtrabackup/2020-09-01_00-00-04

备份--->备份 增量--->(参照物) basedir基于周一的备份,会生成一个今天的

# ls  /xtrabackup/      //查看

 

==增量备份,周三 ==

date 090300    //更改时间

系统内 添加数据库 数据

#mysql -uroot -p'QianFeng@123'  -e  'insert into testdb.test values (3)'

  

# innobackupex --user=root --password='QianFeng@123' 
 --incremental /xtrabackup/ 
 --incremental-basedir=/xtrabackup/2017-09-02_00-00-26
备份 --> 增量备份---> basedir基于周2的备份,会生成一个今天的。

# ls  /xtrabackup/          //查看

同步...

5-2增量恢复流程

==停止数据库==

# systemctl stop mysqld

== 清理环境==  模拟MySQL数据丢失

rm -rf /var/lib/mysql/*

==周一 ==   准备  /  锁定周一备份

回滚合并:备份   应用日志   只读     周一备份

# innobackupex --apply-log --redo-only /xtrabackup/2020-09-01_00-04-38

==周二 ==  准备 文件

 查看  or 增量

# innobackupex --apply-log --redo-only /xtrabackup/2020-09-01_00-04-38 
 --incremental-dir=/xtrabackup/2020-09-02_00-23-24

==恢复到周二备份==

# innobackupex --copy-back /xtrabackup/2020-09-01_00-04-38  

# chown -R mysql.mysql /var/lib/mysql

# systemctl start mysqld

 数据恢复到第二次备份

   

==想恢复周三,怎么办==

# systemctl stop mysqld
# innobackupex --apply-log --redo-only /xtrabackup/2020-09-01_00-04-38  
   --incremental-dir=/xtrabackup/2020-09-03_00-08-44    //读取(准备)周三备份

恢复过到周二的数据了,恢复周三数据时会恢复周一、二、三的备份,与之前有重复
# rm -rf /var/lib/mysql/*   

 读取了要恢复的备份(周一、二、三)。恢复语句只用周一备份
# innobackupex --copy-back /xtrabackup/2020-09-01_00-04-38 
# chown -R mysql.mysql /var/lib/mysql    恢复的数据属于root授权给MySQL
# systemctl start mysqld       重启服务
# mysql -uroot -p'QianFeng@123' -e 'select * from testdb.test'

 

==请思考,如何一次性把数据,周一,周二,周三恢复出来?==

systemctl stop  mysqld

rm -rf /var/lib/mysql/*

#innobackupex  --apply-log  --redo-only/xtrabackup/2020-09-01_00-04-38

#innobackupex  --apply-log  --redo-only/xtrabackup/2020-09-01_00-04-38

--incremental-dir=/xtrabackup/2020-09-02_00-23-24

# innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04  
--incremental-dir=/xtrabackup/2020-09-03_00-08-44

# innobackupex --copy-back /xtrabackup/2020-09-01_00-04-38

#chown start mysqld

# mysql -uroot -p'QianFeng@1234560'  -e 'select *from testdb.test'

==周四、周五、周六...==

三 实战案例2:   (差异、跳跃)

mysqldump + binlog

1.优势

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

==可用性,一致性==
    锁表机制

2.语法

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

参数说明:

==库的范围==

-A    -all-databases    所有库

shool  数据库

shool stu_info  t1   是指shool数据库的  表stu-info、t1

-B  batabases  bbs  test  mysql多个数据库

==.==

--single-transaction (单一处理)

# innoDB  一致性  服务可用性

--master-data=1 | 2

--master-data=1|2    #该选项将会记录binlog的日志位置与文件名并追加到文件中,或添加注释

==高级选项==

--opt   #同时启动各级高级选项

-R  --routines   #备份储存过程和存储函数

-F   --flush-logs   #备份之前的刷新日志,截断日志。备份之后的新binlog

--triggers   #备份触发器

帮助:mysqldump --help

3.实战备份

先准备两份密码:QianFeng@123456配置到当前数据库     QianFeng@123备用

==准备库1  testdb1.t1==      后续需要test库,清除之前同名库,备用

testdb1.t1

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);

  

 ==执行备份==

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

# mkdir /backup

# mysqldump -p'QianFeng@123' \
  --all-databases --single-transaction \            #所有库一致
  --master-data=2 \                                         #记录二进制日志位置和文件名追加文件中
  --flush-logs \                                                 #备份之前刷新日志(截断)备份之后新的
>  /backup/`date +%F-%H-%M-%S`-mysql-all.sql     //莫忘记重定向符号

==观察备份细节==

vim /backup/2016-11-25-14-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库
切断二进制日志(重启数据库)

 

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

    

4恢复实战

==备份二进制日志文件==       //可用日志恢复

# cp /var/lib/mysql/*bin* ~

   

==停止数据库==

  #  systemctl stop mysqld

==清理环境(模拟损坏)==

# rm -rf /var/lib/mysql/*

==启动数据库==

# systemctl start mysqld
#  grep 'password' /var/log/mysqld.log
找密码,再改一下密码。请使用备用密码

Kyzw;u2dq<mh   //查找到的旧密码
mysqladmin  -uroot   -p'Kyzw;u2dq<mh'  password   'QianFeng@123'    //更改密码

   注意语法要求password后面有空格

==mysql恢复数据      //到之前备份==


#mysql -p'QianFeng@1234' < /backup/2016-12-08-04-mysql-all.sql
# mysql -p'QianFeng@1234' -e 'flush privileges'      //刷新数据库
 请使用备份时密码  登陆并验证数据恢复结果。请思考恢复的数据库有几个?
1个

  

==二进制日志恢复==
 观察二进制截取记录

# vim /backup/2020-09-03-01-mysql-all.sql
CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.0000010', MASTER_LOG_POS=154;

#mysqlbinlog localhost-bin.000002 localhost-bin.000003
 --start-position=154  | mysql -p'QianFeng@123'
    注意后续有多少日志,要跟多少日志名字。

==观察数据==

  
    请思考数据是否恢复完整。
    是完整的。恢复到损坏前的操作

==请思考误删除的问题==
    如何保留testdb3库
        [root@localhost ~]#mysqlbinlog  localhost-bin.00004      ......005.....006...... > 1.txt
        删除1.txt中不需要的at(比如test3库是误操作)
        cat  1.txt | mysql -p'QianFeng@123'  //再让数据库读一遍
    课后题:是否可以通过mysqlbinlog start 和stop 命令解决。

==关于数据恢复时的多余日志==
    方法一
        原因:
            每次还原数据库都会增加日志的体积。但这些都是还原操作。恢复数据库的日志占用了存储空间。

   mysql>  set sql_log_bin =0     //关闭二进制日志
   mysql>  source   /backup/*.sql          

        观察
            二进制日志并没有发生变化。
    方法2
        在备份文件中,加入关闭二进制日志。 

 

mysql建立镜像数据库- - Tag: mysql建立镜像数据库 环境介绍:主库 192.168.0.205 从库 192.168.0.206 mysql版本:4.1.13a 1、主库创建/etc/my.cnf,修改[mysqld]里边的键值增加 server-id=1 log-bin=binlog_name 2、主库增加用户,用于从库读取主库日志。 grant replication slave,reload,super on *.* to 'slave'@'192.168.0.206' identified by '123456' 3、从库连接主库进行测试。 /opt/mysql/bin/mysql -u slave -p -h 192.168.0.205 4、停从库,修改从库/etc/my.cnf,增加选项: [mysqld] server-id=2 master-host=192.168.0.205 master-user=slave master-password=123456 5、启动从库,可以进行主从库数据同步 /opt/mysql/share/mysql/mysql start /opt/mysql/bin/mysql -u root -p mysql>load data from master; 说明:这一步不这么做也可以,用数据库倒入或者直接目录考过来也行。 6、进行测试: 主库创建表, mysql>create database sampdb; mysql>create table new (name char(20),phone char(20)); mysql>insert into new ('lhj','60549391'); 打开从库,察看: /opt/mysql/bin/mysql -u root -p mysql>show database; mysql sampdb test mysql>use sampdb; mysql>show tables; new 说明主从数据库创建成功。 7、主从数据库相关命令: slave stop; slave start ; 开始停止从数据库。 show slave status\G; 显示从库正读取哪一个主数据库二进制日志 purge master logs to 'binlog.000004';C此命令非常小心,删除主数据库没用的二进制日志文件。如果误删除,那么从库就没有办法自动更新了。 change master; 从服务器上修改参数使用。 如果数据库表是myisam类型,并且权限够 grant replication slave,reload,super on *.* to 'slave_user'@'host' identified by 'slave_pass' 也可以用load data from master命令,建立从数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值