MySQL备份策略与数据恢复简介

杀马特。学长 韩版系。学妹 提交于 2020-01-26 21:26:04

备份的重要性

数据备份是一个程序员,嗯,很重要的操守!想一想,哪天数据库所在的服务器挂了,数据库文件被毁了,哭都来不及啊,或者不小心删库了,更是mmp。
因此,作为一名优秀的程序员,要掌握一定的数据备份技能。它上可按需求转移数据到安全的地方,下可保证数据丢失后便于及时恢复。

备份概况

备份有很多种,按存储方式分为物理备份(备份具体数据)和逻辑备份(备份SQL语句,这个可以通过查看导出的SQL文件看到),按备份过程分为冷备(需要服务停机,这个时候MySQL实例是停止的,再进行数据导出)和热备(服务器不停机)。

冷备

我们一般玩游戏会出现停机维护的情况,一般凌晨3点到8点的样子,大概就是冷备吧,(虽说大多是系统升级,但不排除会这个时候进行数据备份是吧,哈哈)。

对于MySQL而言,可以有物理和逻辑两种:

  1. 物理备份
    物理备份比较暴力,比如直接把整个MySQL服务所有文件copy一份到另一台机子上,也可以只将MySQL服务文件夹下的data文件copy一份到另一台服务器上,不过这样对MySQL版本有要求,最好一致。
  2. 逻辑备份
    重要的是逻辑备份,其实就是将执行的具体SQL语句copy一份,哪天不小心删表了,再执行一下这个SQL文件就可以恢复数据了,棒棒的。
    我们最常用的就是MySQL自带的工具mysqldump,命令如下:
mysqldump -h 192.168.153.128 -u root -p [database_name] > database_name.sql;

一般三步走:

1:flush tables with read lock;//锁住所有表,允许读不允许写
2:mysqldump -h 192.168.153.128 -u root -p [database_name] > database_name.sql;
3:unnlock tables;

数据恢复可以用mysql工具,就是我们命令行访问mysql的那个。命令如下:

mysql -f -h 192.168.153.128 -u root -p [database_name] > database_name.sql;

mysqldump最大的缺陷是备份和恢复速度较慢,如果数据库大于50G,mysqldump备份就不太适合,所以可以用mydumper,mydumper是一个针对MySQL和drizzle的高性能多线程的备份和恢复工具。此工具由来自MySQL、facebook、skysql公司开发人员维护、目前已经有一些大型产品业务测试并使用了该工具。另外,恢复数据库时也可用它的兄弟myloader。
mydumper的主要特性包括:

  • 采用轻量级C语言写的代码;
  • 相比于mysqldump,其速度快了近10倍;
  • 具有事务性和非事务性表一致的快照(适用于V0.2.2+);
  • 可快速进行文件压缩(File compression on-the-fly);
  • 可多线程恢复(适用于0.2.1+);
  • 支持导出binlog;
  • 支持定时备份
  • 可以用守护进程的工作方式,定时扫描和输出连续的二进制日志。
    可选参数命:
· -host,-h:连接的MySQL服务器。 
· -user,-u:用户备份的连接用户。
· -password,-p:用户的密码。
· -port,-P:连接端口。 
· -database,-B:需要备份的数据库。
· -outputdir,-o:输出的目录。
· -socket,-S:连接socket文件。 · -table-list,-T:需要备份的表,用逗号(,)分隔。  · -build-empty-files,-e:默认无数据则只有表结构文件。 · -regex,-x:支持正则表达式,如mydumper-regex'(2l(mysqltest)'。 · -ignore-engines,-i:忽略的存储引擎。 · -no-schemas,-m:不导出表结构。 · -long-query-guard:长查询,默认60s。 · -kill-long-queries,-k:可以设置kill长查询。 · -verbose,-v:0=silent,1=errors,2=warmings,3=info,默认是2。 · -binlogs,-b:导出binlog。口-daemon,-D:启用守护进程模式。 · -snapshot-interval,-I:dump快照间隔时间,默认60s。 · -logfile,-L:mysaqldumper的目志输出,一般在Daemon模式下使用。

怎么下载安装就不说了,简单的命令如下:

 mydumper -h 192.168.153.128 -P 3306 -u root -p root -B [database_name] -o database_name.sql

具体恢复数据用myloader
命令具体参数mydumper和myloader参数说明

myloader -h 192.168.153.128 -P 3306 -u root -p root -B [database_name] -d database_name.sql

热备

热备就是在服务不停机的情况下进行数据备份,这种情况很麻烦,毕竟备份需要时间,而这期间还有用户进行数据读写,不过有成熟的工具了,那就是开源的XtraBackup,是商业备份工具InnoDBHot Backup的一个很好的替代品。
热备一般用于7×24小时不间断的重要核心业务。

请参考 xtrabackup手册 。它既支持全量备份,也支持增量备份,如mysqldump、mydumper只能做全量备份,

它是 Percona 公司(xtraDB存储引擎就是他们公司的)开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl、Percona Server 和 MariaDB,并且全部开源。因为XtraBackup是物理备份,所以其是靠拷贝数据库文件和日志来完成备份,速度更快。
Xtrabackup中主要包含两个工具:
xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
由于innobackupex的功能更为全面完善,所以一般选择innobackupex来进行备份。常用命令参数如下:

   --defaults-file:该选项指定了从哪个文件读取MySQL配置,必须放在命令行第一个选项的位置。
   --host     指定主机
   --user     指定用户名
   --password    指定密码
   --port     指定端口
   --backup    #创建备份并且放入--target-dir目录中
   --target-dir   #指定backup的目的地,如果目录不存在,xtrabakcup会创建。如果目录存在且为空则成功。不会覆盖已存在的文件。
   --databases     指定数据库
   --incremental    创建增量备份
   --incremental-basedir   指定包含完全备份的目录
   --incremental-dir      指定包含增量备份的目录   
   --apply-log        对备份进行预处理操作             
     一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
   --redo-only      不回滚未提交事务
   --copy-back     恢复备份目录

示例:

innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --backup --target-dir=/home/laravel-shop

参考

[1]MySQL入门篇(七)之Xtrabackup备份与恢复
[2]XtraBackup工具详解 Part 9 innobackupex命令总结

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!