数据库备份

  • 数据是企业非常重要的资源,尤其是数据库相关信息.如果数据量达到TB级别,维护和管理是非常复杂的,尤其对数据库进行备份操作

数据库备份方法及策略

  • MySQL数据库常用备份方法:
    • 直接cp复制
    • sqlhotcopy备份
    • 主从同步复制
    • mysqldump备份
    • xtrabackup备份
  • mysqldump和xtrabackup尽可以备份MySQL数据,以下为mysqldump工具使用方法
  • 通常小于100GB的MySQL数据库可以默认使用mysqldump备份工具进行备份,如果是超过100GB的大数据,由于mysqldump备份方式是采用的逻辑备份,最大的缺陷是备份和恢复速度较慢
  • 基于mysqldump备份耗时会非常长,而且备份期间会锁表,锁表直接导致数据库只能访问select,不能执行insert、update等操作,进而导致Web应用无法写入新数据
  • 如果是myisam引擎表,可以执行参数--lock-tables=false禁用锁表,但是有可能造成数据信息不一致
  • 如果是支持事务的表,例如InnoDB和BDB,--single-transaction参数是更好的选择,因为不锁表,具体应用
mysqldump -uroot -p123456 --all-database --opt --single-transaction > 2020all.sql
  • --opt快捷选项,等同于添加--add-drop-tables --add-locking --create-disable-keys --extended-insert --lock-tables --quick --set-charset选项.该选项能让mysqldump很快的导出数据,并且导出的数据能很快导回.该选项默认开启,但可以使用--skip-opt禁用
  • 如果运行mysqldump没有指定--quick或--opt选项,则会将整个结果集中放在内存中.如果导出大数据库的话可能导致内存溢出而异常退出

xtrabackup

  • MySQL冷备、MySQL热备、mysqldump均不能实现对数据库进行增量备份.在实际环境中增量备份非常的实用,如果数据量小于100GB,存储空间足够,可以每天进行完整备份,如果每天产生的数据量大,需要定制数据备份策略.例如每周日实用完整备份,周一到周六使用增量备份
  • Percona-xtrabackup是为实现增量备份的主流工具,xtrabackup有两个主要工具,分别是xtrabackup、innobackupex
  • xtrabackup只能备份InnoDB和xtraDB两种引擎的表,而不能备份MyISAM数据表,innobackupex则封装了xtrabackup,是一个封装好的脚本,使用该脚本能同时处理InnoDB和MyISAM,但在处理MyISAM时需要加一个读锁
  • xtrabackup备份原理:innobackupex在后台线程不断追踪InnoDB的日志文件,然后复制InnoDB的数据文件.数据文件复制完成之后,日志的复制线程也会结束.这样就得到了数据副本和开始备份以后的事务日志.完成上面的步骤后,就可以使用InnoDB崩溃恢复代码执行事务日志(redo log),以达到数据的一致性.其备份优点如下:
    • 备份速度快,物理备份更加可靠
    • 备份过程不会打断正在执行的事务,无须锁表
    • 能够基于压缩等功能节约磁盘空间和流量
    • 自动备份校验
    • 还原速度快
    • 可以将备份传输到另外一台机器上
    • 节约磁盘空间和网络带宽
  • innobackupex备份过程中首先启动xtrabackup_log后台检测的进程,实时检测MySQL redo的变化,一旦发现redo有新的日志写入,立刻将日志写入到日志文件xtrabackup_log中,并复制InnoDB的数据文件和系统表空间文件idbdatal到备份目录
  • InnoDB引擎备份完毕之后,执行flush table with read lock(将数据库设置为全局读锁,不允许写入新数据)操作进行MyISAM表备份.复制.frm、.myd、.myi文件,并且在这时刻获得binary log的位置,将表进行解锁unlock tables,停止xtrabackup_log进程,完成整个数据库备份
image.png

Percona-xtrabackup备份

  • 基于Percona-xtrabackup备份

    1. 官网下载Percona-xtrabackup
    wget http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-2.0.0/binary/Linux/x86_64/percona-xtrabackup-2.0.0.tar.gz
    
    1. 安装并复制命令到/usr/bin
    mv percona-xtrabackup-2.0.0.tar.gz  /usr/src
    cd /usr/src
    tar xf percona-xtrabackup-2.0.0.tar.gz -C /usr/local/
    cd /usr/local/
    
    cp percona-xtrabackup-2.0.0/bin/innobackupex /usr/bin/innobackupex
    cp percona-xtrabackup-2.0.0/bin/xtrabackup /usr/bin/xtrabackup 
    cp percona-xtrabackup-2.0.0/bin/xtrabackup_51 /usr/bin/xtrabackup_51
    cp percona-xtrabackup-2.0.0/bin/xtrabackup_55 /usr/bin/xtrabackup_55
    
    1. MySQL数据库全备份
    innobackupex --user=root --password=123456 /data/backup
    
    1. innobackupex数据库恢复,恢复前先保证数据一致性
      • 通常数据库备份完成后,数据尚不能直接用于恢复操作,因为备份数据是一个过程,,在备份过程中,有任务会写入数据,可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务
      • 因此此时数据文件仍处于不一致状态,基于--apply-log可以通过回滚未提交的事务及同步已经提交的事务至数据文件是数据文件处于一致性状态,方可进行恢复数据
      • apply-log过程可以在任何机器上运行,没有强制在线上或者备份库上运行,可以把备份复制在闲置的服务器上去运行,以此来降低备份库的压力,但必须保证backup和apply-log所使用的的mysqlbackup的版本要一致
    innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log /data/backup/2020-03-25_00-10-24
    
    cat /etc/my.cnf|grep datadir
    datadir=/data/mysql/data
    
    1. 删除原数据目录/data/mysql/data数据,使用参数--copy-back恢复完整数据,授权MySQL用户给所有的数据库文件
    rm -rf /data/mysql/data/*
    innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --copy-back /data/backup/2020-03-25_00-10-24
    chown -R mysql.mysql /data/mysql/data/
    
    1. 进入数据库查看database

innobackupex增量备份

  • 增量备份仅能应用于InnoDB或xtraDB表,对于MyISAM表而言,执行增量备份时实际进行的是完全备份
  1. 增量备份之前必须进行完全备份
innobackupex --user=root --password=123456 --databases=test /data/backup
# 生成/data/backup/2020-03-25_12-07-34
  1. 执行第一次增量备份
    • 增量备份完后,会在/data/backup目录下生成新的备份目录/data/backup/2020-03-25_13-07-31
    • incremental(增量)
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --databases=test --incremental /data/backup --incremental-basedir=/data/back/2020-03-25_00-10-24
  1. 数据库插入新数据
mysql -uroot -p
use test
insert into t1 values(1,'maomao');
  1. 执行第二次增量备份
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --databases=test --incremental /data/backup --incremental-basedir=/data/back/2020-03-25_13-07-31

MySQL增量备份恢复

  • 删除原数据库表中及数据记录信息

  • MySQL增量备份数据恢复方法为

    1. 基于apply-log确保数据一致性
    innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log  --redo-only /data/backup/2020-03-25_12-07-34
    
    1. 执行第一次增量数据恢复
    innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log  --redo-only /data/backup/2020-03-25_12-07-34  --incremental-dir=/data/back/2020-03-25_00-10-24
    
    1. 执行第二次增量数据恢复
    innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log  --redo-only /data/backup/2020-03-25_12-07-34  --incremental-dir=/data/back/2020-03-25_13-07-31
    
    1. 执行完整数据恢复
    innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --copy-back /data/backup/2020-03-25_12-07-34
    
    1. 测试数据库已经完全恢复

今天居然被手机砸到脸,真疼

你可能感兴趣的:(数据库备份)