数据备份与恢复

时间:2022-09-13 23:58:14

一、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!”