数据库备份

Mysql数据库备份的方法

Posted by Sun Jianjiao on October 15, 2016

说到数据库备份,那么一定要说数据恢复,因为一旦数据出现问题,只有最好的备份系统是没有用的,还需要一个强大的恢复系统。

规划备份策略时需要考虑:

  • 可以容忍丢失多少数据?
  • 备份时间,复制备份到目的地需要多久?
  • 备份负载,在备份复制到目的地对服务器的性能影响有多大?
  • 恢复时间,把备份从存储位置复制到Mysql服务器,重放二进制日志等,需要多久?

1. 备份方案

《高性能mysql》的备份建议:

  • 在生产实践中,对于大多数数据库来说,物理备份是必须的;逻辑备份太慢并受到资源限制,从逻辑备份中恢复需要很长时间。基于快照的备份,例如Percona XtraBrackup和Mysql Enterprise Backup是最好的选择。对于较小的数据库,逻辑备份也可以很好的胜任。
  • 保留多分备份
  • 定期从备份中抽数数据进行恢复测试
  • 保存二进制日志用于基于故障时间点的恢复。

1.1 逻辑备份还是物理备份

  • 逻辑备份,也叫导出,将数据包含在一种Mysql能够解析的格式中,如SQL。最大的缺点是从mysql中导出数据和通过SQL语句将其加载回去的开销。
  • 物理备份,直接复制原始文件。通常物理备份更加高效,但是物理备份更容易出错。

尽量不要完全依赖物理备份,至少每隔一段时间还是要做一次逻辑备份。混合使用逻辑备份和物理备份。先做物理复制,以此数据启动mysql实例,并且运行mysqlcheck。然后周期性的使用mysqldump执行逻辑备份。这样做可以获得两种方法的优点,不会使生产服务器在导出时有过度负担。

1.2 增量备份

  • 使用Percona XtraBackup或者Mysql Enterprise backup中的增量备份特性。
  • 备份二进制日志。可以在每次备份后使用FLUSH LOGS来开始一个新的二进制日志。这样就只需要备份新的二进制日志。
  • 某些数据不需要备份,例如从其他数据构建大的数据仓库。可以备份构建仓库的数据,而不是数据仓库本身。及时从源数据重建数仓的“恢复”时间较长,避免非分可以节约更多的总时间开销。

增量备份的缺点增加了恢复的复杂性,额外的风险,以及更长的恢复时间。如果可以做全备,考虑到简便性,建议尽量做全备。

不管如何,还是需要经常做全被的——至少一周一次。使用一个月的增量数据进行恢复会带来更多的工作和风险。

1.3 管理和备份二进制文件

服务器的二进制日志是备份的最重要因素之一。他们对于基于时间点的复制恢复是必须的,并且通常比数据要小,所以更容易进行频繁的备份。

经常备份二进制日志是一个好主意。如果不能承受丢失超过30分钟数据的丢失,至少要每30分钟备份一次。也可以用一个配置–log_slave_updat的只读备库,这样可以获得额外的安全性。

Mysql 5.6版本的mysqlbinlog有一个非常方便的特性,可连接到服务器上来实时对二进制进行做镜像。

1.4 总结

每个人都知道需要备份,但是每个人更需要意识到需要的是可恢复的备份。

《高性能Mysql》中提到最喜欢的2种备份方式,一种是通过文件系统或者SAN快种中直接复制数据文件,或者使用Percona XtraBackup做热备份。

同时他也建议备份二进制日志,并且尽可能久的保留多份备份数据和二进制文件。

2. Percona XtraBackup

《高性能Mysql》强烈推荐Percona Xtrabackup, 备份过程中服务器的负载没有明显的上升,对于大数据库的备份,Percona xtrabackup是一个不错的选择。Percona XtraBackup 官方文档

2.1 安装

官方文档安装文档

wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb

sudo percona-release enable-only tools
sudo apt-get update
sudo apt-get install percona-xtrabackup-80

2.2 备份

2.2.1 全量备份

1
2
mkdir -p data/backups/base
sudo xtrabackup --user=${user} --password=${password} --backup --target-dir=/data/backups/

2.2.2 增量备份

1
2
3
4
5
mkdir -p data/backups/base
sudo xtrabackup --user=${user} --password=${password} --backup --target-dir=data/backups/base

mkdir -p data/backups/inc1
sudo xtrabackup --user=root --password=abc-123 --backup --target-dir=data/backups/inc1 --incremental-basedir=data/backups/base

data/backups/inc1/包含了基于data/backups/base的增量数据。

2.2.3 压缩

1
sudo xtrabackup --compress --user=${user} --password=${password} --backup --target-dir=data/backups/

2.3 备份数据处理(Preparing a backup)

通过 –backup 备份后,我们需要通过 prepare 选项对数据进行处理后,才能重新恢复它。否则数据是不一致的,因为他们在不同的时间被拷贝,并且可能在改变的时候正好被复制了。

1
xtrabackup prepare --target-dir=/data/backups/

如果是增量备份,需要增加 –apply-log-only

1
2
3
4
xtrabackup prepare --apply-log-only --target-dir=/data/backups/base

 xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \
--incremental-dir=/data/backups/inc1

2.4 数据恢复

通过xtrabackup进行恢复

1
2
3
4
sudo service mysql stop
sudo xtrabackup --copy-back --target-dir=/data/backups/
sudo chown -R mysql:mysql /var/lib/mysql
sudo service mysql start

通过rsync 进行恢复

如果恢复的机器上没有装xtrabackup, 可以通过rsync进行恢复

1
2
3
4
$ sudo service mysql stop
$ sudo rsync -avrP /data/backup/ /var/lib/mysql/
$ sudo chown -R mysql:mysql /var/lib/mysql
$ sudo service mysql start

3. 二进制日志

3.1 基于flush logs方式实现binlog文件切换

通过last_binlog_pos.txt文件记录上一次备份的位置点信息,下一次备份基于该位置点信息进行增量备份。如果是首次备份(last_binlog_pos.txt文件不存在,则全量备份binlog);通过flush logs的方式强行切换binlog文件(只备份到次新的binlog文件),避免备份binlog过程中,MySQL仍对其进行写入操作;备份每个binlog文件对其生产侧和备份侧的binlog文件md5值进行校验,校验不通过通过配置重传次数$num,超过重传次数仍md5值校验不通过的话,放弃该binlog备份并记录到日志。

3.2 实时备份

通过mysqlbinlog的–read-from-remote-server、 –stop-never参数实现异地binlog实时备份。通过while死循环的方式,避免由于网络等异常造成的断连。 查看有哪些日志文件:

show binary logs

执行远程备份:

mysqlbinlog --read-from-remote-server --raw --host=${ip} --port=${port} --user=${user-name} --password=${password} --stop-never binlog.000010
  • –read-from-remote-server:用于备份远程服务器的binlog。如果不指定该选项,则会查找本地的binlog。
  • –raw:binlog日志会以二进制格式存储在磁盘中,如果不指定该选项,则会以文本形式保存。
  • –user:复制的MySQL用户,只需要授予REPLICATION SLAVE权限。
  • –stop-never:mysqlbinlog可以只从远程服务器获取指定的几个binlog,也可将不断生成的binlog保存到本地。指定此选项,代表只要远程服务器不关闭或者连接未断开,mysqlbinlog就会不断的复制远程服务器上的binlog。

  • binlog.000010:代表从哪个binlog开始复制。

3.3 总结

第一种方式,可以通过验证md5值的方式确保备份同生产的一致性。备份的逻辑简单,便于理解。 第二种方式,可以实现binlog实时备份功能。 所以,基于以上的优缺点分析,选择哪种备份策略,仍需要根据生产环境的实际需要进行抉择。如果数据安全级别很高,也可以考虑2种方式同时使用。

4. 备份到远程的服务器

4.1 通过rsync进行备份

1
rsync -avr ${user-name}@${ip}:${src-path} ${target-path}

4.1.1 权限控制

访问方向

最好是备份服务器通过一个权限比较低的用户,只有只读权限访问备份文件,定时从数据库服务器拉取。

如果是从数据库服务器直接写到备份服务器,那么数据库服务器就有了备份服务器的写权限,如果黑客入侵了数据库服务器,就有了备份服务器的写权限,他可以同时破坏备份的数据。

4.1.2 通过cron进行定时执行

1
2
3
4
# crontab -e

# m  h  dom mon dow   command  
  30 *   *   *   *    rsync -avr ${user-name}@${ip}:${src-path} ${target-path}

每隔30分钟执行一次。也通过cron进行定时备份。

4.1.3 通过ssh key免密钥登录

参考文档 免密码访问ssh远程linux

5. 总结

通过Percona XtraBackup和binlog的备份,应该可以解决绝大多数情况下需要的数据的备份。