企业级数据库备份实战,一网打尽

随着互联网不断的发展,企业对运维人员的能力要求也越来越高,尤其是要求运维人员能处理各种故障、专研自动化运维技术、云计算机、虚拟化等,满足公司业务的快速发展。

本章向读者介绍数据库备份方法、数量量2T及以上级别数据库备份方案、xtrabackup企业工具案例演示、数据库备份及恢复实战等。

01

01.企业级数据库备份实战

在日常的运维工作中,数据是公司非常重要的资源,尤其是数据库的相关信息,如果数据丢了,少则损失几千元,高则损失上千万。所以在运维工作中要及时注意网站数据的备份,尤其要及时对数据库进行备份。

企业中如果数据量上T级别,维护和管理是非常复杂的,尤其是对数据库进行备份操作。

02

02.数据库备份方法及策略

企业中MySQL数据库备份最常用的方法如下:

  • 直接cp备份
  • Sqlhotcopy
  • 主从同步复制
  • Mysqldump备份
  • Xtrabackup备份

Mysqldump和Xtrabackup均可以备份MYSQL数据,如下为Mysqldump工具使用方法:

通常小于100G的MYSQL数据库可以使用默认Mysqldump备份工具进行备份,如果超过100G的大数据,由于Mysqldump备份方式是采用的逻辑备份,最大的缺陷是备份和恢复速度较慢。

基于Mysqldump备份耗时会非常长,而且备份期间会锁表,锁表直接导致数据库只能访问Select,不能执行Insert、Update等操作,进而导致部分WEB应用无法写入新数据。

如果是Myisam引擎表,当然也可以执行参数–lock-tables=false禁用锁表,但是有可能造成数据信息不一致。

如果是支持事务的表,例如InnoDB和BDB,–single-transaction参数是一个更好的选择,因为它不锁定表。

mysqldump -uroot -p123456 –all-databases –opt –single-transaction > 2017all.sql

本选项能让 Mysqldump 很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用–skip-opt 禁用。其中–opt快捷选项,等同于添加–add-drop-tables –add-locking –create-option –disable-keys –extended-insert –lock-tables –quick –set-charset选项。

如果运行 Mysqldump没有指定–quick 或 –opt 选项,则会将整个结果集放在内存中。如果导出大数据库的话可能会导致内存溢出而异常退出。

03

03.Xtrabackup企业实战

Mysql冷备、Mysqldump、Mysql热拷贝均不能实现对数据库进行增量备份,在实际环境中增量备份非常的实用,如果数据量小于100G,存储空间足够,可以每天进行完整备份,如果每天产生的数据量大,需要定制数据备份策略例如:每周日使用完整备份,周一到周六使用增量备份,或者每周六完整备份,周日到周五使用增量备份。

Percona-xtrabackup是为实现增量备份而生一款主流备份工具,Xtrabackup有两个主要的工具,分别为:xtrabackup、innobackupex。

Percona XtraBackup是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl、Percona Server及MariaDB,开源免费,是目前互联网数据库备份最主流的工具之一。

Xtrabackup只能备份InnoDB和XtraDB两种数据引擎的表,而不能备份MyISAM数据表,Innobackupex-1.5.1则封装了Xtrabackup,是一个封装好的脚本,使用该脚本能同时备份处理innodb和Myisam,但在处理Myisam时需要加一个读锁。

XtraBackup备份原理,Innobackupex在后台线程不断追踪InnoDB的日志文件,然后复制InnoDB的数据文件。数据文件复制完成之后,日志的复制线程也会结束。这样就得到了不在同一时间点的数据副本和开始备份以后的事务日志。完成上面的步骤之后,就可以使用InnoDB崩溃恢复代码执行事务日志(Redo log),以达到数据的一致性。其备份优点如下:

  • 备份速度快,物理备份更加可靠;
  • 备份过程不会打断正在执行的事务,无需锁表;
  • 能够基于压缩等功能节约磁盘空间和流量;
  • 自动备份校验;
  • 还原速度快;
  • 可以流传将备份传输到另外一台机器上;
  • 节约磁盘空间和网络带宽。

Innobackupex工具的备份过程原理,如图16-1所示:

图16-1 Innobackupex备份过程

Innobackupex备份过程中首先启动Xtrabackup_log后台检测的进程,实时检测Mysql redo的变化,一旦发现Redo有新的日志写入,立刻将日志写入到日志文件Xtrabackup_log中,并复制Innodb的数据文件和系统表空间文件idbdata1到备份目录。

Innode引擎表备份完之后,执行Flush table with read lock操作进行MyIsam表备份。拷贝.frm .myd .myi文件,并且在这一时刻获得binary log的位置,将表进行解锁unlock tables,停止Xtrabackup_log进程,完整整个数据库的备份。

04

04.Percona-xtrabackup备份实战

基于Percona-xtrabackup备份,需要如下几个步骤:

官网下载Percona-Xtrabackup

Percona官方wiki使用帮助:

Percona-xtrabackup软件安装方法,cp innobackupex、xtrabackup、xtrabackup_51 xtrabackup_55工具到/usr/bin目录下,

代码如下:

http://www.percona.com/docs/wiki/percona-xtrabackup:start

wget http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-2.0.0/binary/Linux/x86_64/percona-xtrabackup-2.0.0.tar.gz

tar zxvf percona-xtrabackup-2.0.0.tar.gz

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

MYSQL数据库全备份,如图16-2(a)、16-2(b)所示:Percona-xtrabackup

innobackupex –user=root –password=123456 /data/backup/mysql/

图16-2(a) Innobackupex完整备份



图16-2(b) Innobackupex完整备份

  1. Innobackupex数据库恢复,恢复前先保证数据一致性,执行如下命令,如图16-3所示:

innobackupex –defaults-file=/etc/my.cnf –user=root –password=123456 –apply-log /data/backup/mysql/2014-12-20_00-10-24

图16-3 Innobackupex apply-log恢复


通常数据库备份完成后,数据尚不能直接用于恢复操作,因为备份的数据时是一个过程,在备份过程中,有任务会写入数据,可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。

因此此时数据文件仍处理不一致状态,基于–apply-log可以通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态,方可进行恢复数据。

Apply-log过程可以在任何机器上运行,没有强制在线上或者备份库上运行,可以把备份复制在闲置的服务器上去运行,以此来降低备份库的压力,必须保证backup和apply-log所使用的mysqlbackup的版本要一致。

  1. 删除原数据目录/var/lib/mysql数据,使用参数–copy-back恢复完整数据,授权mysql用户给所有的数据库文件,如图16-4所示:

rm -rf /var/lib/mysql/*

innobackupex –defaults-file=/etc/my.cnf –user=mysql –password=123456 –copy-back /data/backup/mysql/2014-12-20_00-10-24/

chown –R mysql:mysql /var/lib/mysql/

图16-4 Innobackupex 数据恢复


查看数据库恢复信息,数据完全恢复,如图16-5所示:


图16-5 Innobackupex 数据恢复

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();