数据备份与恢复
一、mysqldump备份
mysqldump 备份数据会丢失掉从备份点开始的数据,所以需要结合mysqlbinlog的二进制日志增量备份恢复。
【常用的选项】
--all-databases :导出全部数据库。
--add-drop-table :每个数据表创建之前添加drop删表语句,防止恢复时冲突。 (all-databases默认包含)
--add-locks :每个表导出之前增加增加lock tables 之后unlock tables。这就防止在导入数据时,其他用户会对表进行操作。(all-databases默认包含)
--databases:导出多个数据库,参数后的所有名字都被看作数据库名。
全库备份:
mysqldump -h localhost -uroot -p123456 --all-databases >/tmp/qk.sql
多库备份:
mysqldump -h localhost -uroot -p123456 --databases databases1 databases2 >/tmp/dk.sql
单库备份:
#也可以省略--databases 来备份单个库,不过省略后导致的是备份文件名中没有 建表与use语句,所以在恢复时,必须制定一个默认的数据库名,即可以导入任意数据库。
mysqldump -h localhost -uroot -p123456 database >/tmp/dk.sql
备份库中的多个表:
mysqldump -h localhost -uroot -p123456 表名1 表名2 > /tmp/table.sql
2.)mysqldump恢复:
启用*databases选项的恢复:
mysql -uroot -p123456 < /tmp/qk.sql
mysql> source /tmp/qk.sql
普通的单库备份:
mysql -uroot -p123456 database1 < /tmp/dk.sql
mysql> use database1;source /tmp/dk.sql
二、Percona Xtrabackup/innobackupex 的备份与恢复
InnoDB 有个商业的InnoDB Hotbackup,可以对InnoDB引擎的表实现在线热备。而 percona出品的Xtrabackup,是InnoDB Hotbackup的一个开源替代品,可以在线对InnoDB/XtraDB引擎的表进行物理备份,效率很不错。
作用;在线(热)备份整个库的InnoDB、 XtraDB表或增量备份,可以在线对InnoDB/XtraDB引擎的表进行物理备份。
增量备份,工作原理如下:
1.首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。
2.在进程增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN。
1.安装Xtrabackup
安装依赖的包:yum install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL installperl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL rpm -ivh https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.7/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.7-2.el7.x86_64.rpm
或者
配置好yum源,直接yum安装下载好的rpm包,可以自动安装依赖。
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum -y install percona-xtrabackup-24-2.4.7-2.el7.x86_64.rpm
2.备份
创建备份目录:mkdir /opt/backups/full /opt/backups/inc
2.1)进行数据库全备:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/tmp/mysql.sock /opt/backups/full
压缩备份:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/tmp/mysql.sock /opt/backups/full/ --stream=tar | gzip > /opt/backups/full/a.tar.gz
2.2)增量备份:(增量备份的前提是一定要有一个全备)
插入数据,或更改之后,进行增量备份:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/tmp/mysql.sock --incremental /opt/backups/inc --incremental-basedir=/opt/backups/full/2017-10-11_16-02-21 --parallel=2
更改第二次,并执行增量备份:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/tmp/mysql.sock --incremental /opt/backups/inc --incremental-basedir=/opt/backups/inc/2017-10-11_17-12-58 --parallel=2
每次更改后执行的增量备份都是基于上个时间点的增量备份,备份完成后后提示171012 11:00:03 completed OK!并且备份目录中有相应文件即可。
3.备份恢复:
3.1)模拟数据库损坏,全备恢复:
innobackupex --apply-log /opt/backups/full/2017-10-11_16-02-21/ innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /opt/backups/full/2017-10-11_16-02-21/
3.2)增量备份恢复:
1.恢复完全备份
2.恢复增量备份到完全备份(开始恢复的增量备份要添加--redo-only参数,到最后一次增量备份要去掉--redo-only)
3.对整体的完全备份进行恢复,回滚未提交的数据
准备全备:
innobackupex --apply-log --redo-only /opt/backups/full/2017-10-11_16-02-21/
将增量1恢复至全备
innobackupex --apply-log --redo-only /opt/backups/full/2017-10-11_16-02-21 --incremental-dir=/opt/backups/inc/2017-10-11_17-12-58/
将增量2恢复至全备
innobackupex --apply-log /opt/backups/full/2017-10-11_16-02-21 --incremental-dir=/opt/backups/inc/2017-10-11_17-26-22
把所有合在一起的完全备份整体进行一次apply操作,回滚未提交的数据
注意:回滚操作不仅仅是用作于增量备份,当在全备时数据库有执行长事务等操作,会造成备份数据的短缺,此时也需要进行回滚操作,否则会因为数据的短缺造成主从的中断。
innobackupex --apply-log backups/full/2017-10-11_16-02-21
进行全备恢复:
innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /opt/backups/full/2017-10-11_16-02-21/
***注意的是***当执行完增量备份恢复后就无法基于前者做增量了,最好是执行完恢复操作后再次进行全备,并在此基础上进行增量。反之
“xtrabackup: error: The transaction log file is corrupted.
xtrabackup: error: The log was not applied to the intended LSN!”