数据的备份恢复

  • 2019-09-02
  • 0
  • 0

1、备份的类型及策略

类型:

1.冷备:停库,停服务,备份
2.热备:在数据库正常业务时,备份数据,并且能够一致性恢复(只能是innodb),对业务影响非常小。
3.温备:不停库,不停服务,备份,会(锁表)阻止用户的写入

策略:

1.全备,全库备份,备份所有数据
2.增备,备份变化的数据
3.差异备份


数据恢复的思路:

1.停库,避免数据二次伤害.
2.准备一个新环境
3.将全备,发送到新环境中
4.截取binlog,中 全备至数据丢失期间 新数据
5.把新数据发送到新环境
6.将全备,和新数据恢复到新环境
7.测试,功能
8.恢复生产环境,提供服务(选择速度最快的一种方式.)
8.1)导出恢复后的核心业务表,恢复到旧库中
8.2)修改程序代码,程序的配置文件,连库的IP(高可用)vip
8.3)旧主库,解绑vip,新主库绑定vip

2、备份方式及工具

2.1、逻辑备份:基于SQL语句

mysqldump
mysqlbinlog
binlog
replication

2.2、物理备份:基于磁盘数据

xtrabackup(XBK) :percona 第三方   *****
MySQL Enterprise Backup(MEB)

3、常用的逻辑备份和物理备份比较

# mysqldump 
优点:
1、不需要下载安装
2、备份出来的是SQL文件,文本格式,可读性高,便于备份处理、压缩比较高,节省备份的磁盘空间 

缺点: 
1、依赖于数据库引擎,需要从磁盘把数据读出,再转换成SQL进行㽾,耗费资源,数据量大的话效率低 

注意:
    mysqldump是覆盖形式恢复的方法。
建议适用范围:
    100G以内的数据量级,可以使用mysqldump;超过TB以上,我们也可能选择的是mysqldump,配合分布式的系统

# xtrabackup 
优点:1、类似于直接cp数据,不需要管逻辑结构,相对来说性能较高 

缺点:1、可读性差 2、压缩比低。需要更多磁盘空间

(1)对于非Innodb表(比如 myisam)是,锁表cp数据文件,属于一种温备份。
(2)对于Innodb的表(支持事务的),不锁表,拷贝数据页,最终以数据文件的方式保存下来,把一部分redo和undo一并备走,属于热备方式。
建议使用范围:>100G>TB

4、备份工具的使用

4.1、mysqldump

# 参数:
-A:--all-databases 全库备份
-B:--database 指定库备份,可以接多个
-F:备份的同事刷新binlog
-d:备份表结构
-t:备份数据
-R:备份函数,存储过程

--triggers:备份触发器

--master-data=N  (温备)
    N={0,1,2}
    0:不打点备份,关闭
    1:不以注释的形式,保存备份开始时间点的binlog的状态信息
    2:以注释的形式,保存备份开始时间点的binlog的状态信息

--single-transaction:(热备)快照备份
    与--master-data=2,只对非InnoDB表进行锁表备份,InnoDB表进行“热“”备,实际上是实现快照备份。

# 常用的备份组合:
[root@mysql50 ~]# mysqldump -A -R --triggers --master-data=2 --single-transaction|gzip > /tmp/all$(date +%F).sql.gz

4.2、利用binlog日志进行数据的恢复

# 查看binlog日志详细信息:--base64-output=decode-rows  -vvv
[root@mysql50 ~]# mysqlbinlog --base64-output=decode-rows -vvv /usr/local/mysql/data/mysql-bin.000001 

# 截取binlog日志
[root@mysql50 ~]# mysqlbinlog --start-position=120 --stop-position=589  /usr/local/mysql/data/mysql-bin.000001 > /tmp/t1.sql  ----截取日志

# 进入数据库
mysql> set sql_log_bin=0; -----进入数据库,临时设置关闭记录binlog
mysql> source /tmp/t1.sql    -----恢复数据

4.3、xtrabackup

4.3.1、基本介绍

# 参数
    --no-timestamp: 不加时间戳
# 备份前提:
    被恢复的目录是空的
    被恢复的数据库实例是关闭的

# 常用命令组合 执行全备
[root@mysql50 mysql]# innobackupex --user=root --password=123  --no-timestamp /backup/all

# 全备份的恢复
## 前提:1、被恢复的目录为空   2、数据库实例是关闭状态
#  准备工作
# 将redo进行重做,已提交的写到数据文件,未提交的使用undo回滚掉。模拟CSR的过程
[root@mysql51 ~]# innobackupex --apply-log  /backup/all

[root@mysql50 mysql]# innobackupex --copy-back /backup/all
# 使用xtrabackup会多出来几个文件说明:
-rw-r----- 1 root root       24 Jun 29 09:59 xtrabackup_binlog_info
-rw-r----- 1 root root      119 Jun 29 09:59 xtrabackup_checkpoints
-rw-r----- 1 root root      489 Jun 29 09:59 xtrabackup_info
-rw-r----- 1 root root     2560 Jun 29 09:59 xtrabackup_logfile

# xtrabackup_binlog_info :(备份时刻的binlog位置)
[root@mysql51 all]# cat xtrabackup_binlog_info 
mysql-bin.000003    536749
79de40d3-5ff3-11e9-804a-000c2928f5dd:1-7
记录的是备份时刻,binlog的文件名字和当时的结束的position,可以用来作为截取binlog时的起点。

# xtrabackup_checkpoints :
backup_type = all-backuped
from_lsn = 0            上次所到达的LSN号(对于全备就是从0开始,对于增量有别的显示方法)
to_lsn = 160683027      备份开始时间(ckpt)点数据页的LSN    
last_lsn = 160683036    备份结束后,redo日志最终的LSN
compact = 0
recover_binlog_info = 0

#(1)备份时刻,立即将已经commit过的,内存中的数据页刷新到磁盘(CKPT).开始备份数据,数据文件的LSN会停留在to_lsn位置。
#(2)备份时刻有可能会有其他的数据写入,已备走的数据文件就不会再发生变化了。
#(3)在备份过程中,备份软件会一直监控着redo的undo,如果一旦有变化会将日志也一并备走,并记录LSN到last_lsn。从to_lsn  ----》last_lsn 就是,备份过程中产生的数据变化.

4.3.2、增量备份

备份的方式:

  • 基于上一次的备份
  • 无法单独恢复,基于全备
  • 增量按顺序合并到全备中

备份

# 首先全备
[root@mysql50 ~]# innobackupex --user=root --password=123 --no-timestamp /backup/all

# 增量备份
[root@mysql50 ~]# innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/all /backup/add1
参数说明:
--incremental:开启增量备份功能
--incremental-basedir:上一次备份的路径

增量的数据恢复
只有最后一次 redo和undo都做,前几次只做redo
步骤
1、add1—>all
2、add2—>all

# stp1:在全备中apply-log时,只应用redo,不应用undo
[root@mysql51 ~]# innobackupex --apply-log --redo-only /backup/all/

# stp2:并add1合并到all中,并且apply-log,只应用redo,不应用undo
[root@mysql51 ~]# innobackupex --apply-log --redo-only --incremental-dir=/backup/add1/ /backup/all/

# stp3:合并add2合并到all中,redo和undo都应用
[root@mysql51 ~]# innobackupex --apply-log --incremental-dir=/backup/add2/ /backup/all/

# stp4:整体all执行apply-log,redo和undo都应用
[root@mysql51 mysql]# innobackupex --apply-log /backup/all/
copy-back

# stp5: 恢复数据
[root@mysql51 ~]# innobackupex --copy-back /backup/all/
[root@mysql51 ~]# chown -R mysql.mysql /usr/loacal/mysql/data/
[root@mysql51 ~]# systemctl restart mysqld

评论

还没有任何评论,你来说两句吧

提供支持 - 友情链接 - 衫小寨