MySQL备份和恢复
Posted 林纳克斯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL备份和恢复相关的知识,希望对你有一定的参考价值。
在实际生产环境中,数据是至关重要的。如何将数据实现安全冗余,在出现意外或灾害时快速恢复数据是挽救一个公司的关键所在。那么,定期备份数据是一个基本的工作。
备份的类型:
根据备份的数据量可分为:
完全备份:备份整个数据集
部分备份:备份部分数据集
增量备份:仅备份最近一次完全备份或增量备份(如果存在的话)以来变化的数据
缺点:由于可能存在多个增量,恢复时较麻烦
差异备份:仅备份最近一次完全备份以来变化的数据
缺点:数据量大的话,比较浪费磁盘空间
根据备份的方式可分为:
物理备份:直接复制数据文件进行备份
逻辑备份:与存储引擎无关,从数据库中“导出”数据另存而进行的备份
根据备份时数据的可用状态可分为:
热备:备份时,数据可读可写
温备:备份时,数据仅可读
冷备:备份时,数据不可读写
备份时需要考虑的要点:
①能容忍最多丢失多少数据
②恢复数据需要的时长
③需要恢复哪些数据
④根据备份的数据量选择合适的工具
⑤mysql的二进制日志至关重要,一定要留存好以便实现基于时间点的还原
接下来将陈述一下基于mysqldump,xtrabackup进行数据备份和恢复。
一、mysqldump
是MySQL自带的适合所有存储引擎的逻辑备份工具,支持完全和部分备份,支持温备,对InnoDB支持热备
mysqldump [options] db_name [tb1_name,...] (不会自动创建数据库) mysqldump [options] --databases db_name ... mysqldump [options] --all-databases
常用的选项:
-uUSERNAME //备份时的用户 -pPASSWORD //备份时用户的密码 -E,--events //备份指定数据库相关的所有事件调度器 -R,--routines //备份指定数据库相关的存储过程和存储函数 --[skip-]triggers //(不)备份相关的触发器 --master-data[=#] 1:记录为不被注释的CHANGE MASTER TO语句; 2.记录为注释的CHANGE MASTER TO语句;(一般用2) --flush-logs //锁定表完成后,执行flush logs命令; //温备的选项,先锁定备份库,再启动备份操作(MyISAM和InnoDB) --lock-all-tables //锁定所有库的所有表(生产环境慎用) --lock-tables //对某个单独数据库的所有表进行锁定 热备的选项 --single-transaction //启动一个巨大的事务
二、xtrabackup
是由Percona提供的支持对InnoDB做热备(物理备份)的工具,可实现完全备份、增量备份。
备份命令:xtrabackup
推荐使用:innobackupex(对xtrabackup做了二次封装的perl script),相对简洁轻量;
创建备份恢复的用户(基于最小权限)
MariaDB [(none)]> CREATE USER ‘backupuser‘@‘192.168.1.102‘ IDENTIFIED BY ‘backuppass‘; MariaDB [(none)]> GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT ON *.* TO ‘backupuser‘@‘192.168.1.102‘; MariaDB [(none)]> FLUSH PRIVILIGES;
①完全备份
innobackupex --user=DBUSE --password=DBUSEPASS /path/to/BACKUP-DIR/
基于完全备份恢复前的整理操作:
innobackupex --apply-log /path/to/Backup-Dir(备份文件所在的目录) //整理无误出现“Completed OK”后,可执行完全备份的恢复操作: innobackupex --copy-back /path/to/Backup-Dir(整理后的备份文件目录) //注意:执行innobackupex --copy-back命令时不需要启动mysql服务,停止之前配置好mysql的数据目录即可。恢复数据成功后不要忘记将数据文件的属主属组改为mysql
②增量备份
innobackupex --incremental /backup --incremental-basedir=BASEDIR /*其中,BASEDIR指的是完全备份所在的目录。 此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录已存放所有的增量备份数据。 另外,执行过增量备份后再次执行时,其--incremental-basedir应该指向上一次的增量备份所在的目录 注意:增量备份仅能应用于InnoDB和XtraDB为存储引擎的表;对于MyISAM表而言,执行增量备份其实进行的是完全备份*/
基于完全备份和增量备份恢复前的整理操作:
/*与完全备份恢复时整理操作的不同: (1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。 (2)基于所有的备份将未提交的事务进行“回滚”。*/ //于是,执行整理的命令: innobackupex --apply-log --redo-only BASE-DIR //接着执行 innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1 //而后是第二个增量: innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2 //其中,BASE-DIR指的是完全备份所在目录,而INCREMENTAL-DIR-1指的是第一次增量备份的目录,INCREMENTAL-DIR-2指的是第二次增量备份的目录,依此类推,如果有多个增量备份,每一次都要执行如上操作。 //整理无误后,执行恢复数据操作: innobackupex --copy-back /path/to/Backup-Dir(整理后的备份文件目录)
以上是关于MySQL备份和恢复的主要内容,如果未能解决你的问题,请参考以下文章