一、MySQL数据备份方式(物理备份、逻辑备份)
对于数据库的备份重要性不必多言,为了防止数据以各种方式丢失、损坏,所以必须对数据库进行定期备份。
首先,应考虑数据备份时对数据库业务的影响情况,选择相应备份场景:
热备:读写操作均可正常进行的状态下进行备份(多数情形下都是场景);
温备:可读但不可写状态下进行的备份;
冷备:读写操作均不可进行的状态下所做的备份。
其次,如果定期进行备份,每次都进行全量备份,显然一部分数据是重复,而且浪费大量磁盘空间,选择合适备份方式:
完全备份:每次备份数据库中全量数据;
差异备份:仅备份自上一次完全备份以来变化的那部分数据,是按完全备份那一刻的备份数据为起点,进行备份;
增量备份:仅备份自上一次完全备份或增量备份以来变化的那部分数据,是按上一次备份那一刻的备份数据为起点,进行备份。
备份数据两种方法:
物理备份:复制数据文件进行备份,即通过cp或scp等shell命令,或第三方软件,如:xtrabackup,cp或scp等shell命令将数据存储目录下:ibdata1、ib_logfile0、ib_logfile1文件拷贝,此方法效率比较低,对数据库运行影响低一些;
逻辑备份:从数据库中导出数据到文件中,可选择需要备份的数据库,备份粒度更精细,此备份方法会存在数据差异。
逻辑备份使用mysql自带的命令:mysqldump进行逻辑备份,例:mysqldump -uroot -p -B db1 db2 > /tmp/mysql/dump.sql
二、物理备份方法:xtrabackup工具,对 Innodb引擎的表可进行热备,增量备份,但对MyISAM引擎就不支持这些特性了,
1、安装xtrabackup工具,安装成功后使用:innobackupex命令:
innobackupex常用选项:
--host 指定主机
--user 指定用户名
--password 指定密码
--port 指定端口
--databases 指定数据库
--incremental 创建增量备份
--incremental-basedir 指定包含完全备份的目录
--incremental-dir 指定包含增量备份的目录
--apply-log 对备份进行预处理操作,一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。
因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
--redo-only 不回滚未提交事务
--copy-back 恢复备份目录
#yum install percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm #yum安装rpm包
#rpm -qa |grep percona-xtrabackup #查看安装是否成功
2、先通过innobackupex命令进行全量备份:
mysql> grant reload,lock tables,replication client on *.* to 'cxq'@'localhost' identified by '123456'; #授权用户、密码进行数据备份
mysql> flush privileges;(可选操作)
1)数据备份操作:
#innobackupex --defaults-file=/etc/my.cnf --user=cxq --password="123456" --backup /tmp/mysql/backup/ #执行备份操作,报以下错误,提示是缺少PROCESS权限,并且--defaults-file=/etc/my.cnf必须放在innobackupex命令后面
mysql> grant process on *.* to 'cxq'@'localhost'; #赋予权限后再执行,问题解决
2)apply-log对备份进行预处理操作:
#innobackupex --apply-log /tmp/mysql/backup/2019-04-18_16-46-25/ #使相关数据性文件保持一致性状态
3)测试,登录数据库,执行删除操作:
4)停止mysql服务,若没有线停止服务,后面无法使用命令重启数据库:
#/etc/init.d/mysqld stop
5)数据恢复,使用--copy-back参数:
将前面备份的数据导入到数据库指定存储目录,注:此时数据库存储目录必须为空方可执行数据恢复工作:
#mv /usr/local/mysqldata /opt/mysql #将mysql数据库目录移走,也就是清空该目录
#innobackupex --defaults-file=/etc/my.cnf --copy-back /tmp/mysql/backup/2019-04-18_16-46-25/
#chown -R mysql.mysql /usr/local/mysql/data/ #记得修改mysql数据库所有者、所属组为mysql用户
清空数据库存储目录,再执行数据恢复动作,成功:
6)启动mysql服务:
#/etc/init.d/mysld start
7)验证,查看数据恢复是否成功。
三、Xtrabackup增量备份与恢复:
#需要注意的是,增量备份仅能应用于InooDB或XtraDB表,对于MyISAM表,增量与全备相同。
mysql> select * from test; #查看数据被删除前的数据明细
1、创建用于增量备份的数据,用来模拟删除掉了全备后的数据,能否通过增量备份文件来恢复:
# innobackupex --defaults-file=/etc/my.cnf --user=cxq --password=123456 --incremental /backup/ --incremental-basedir=/tmp/mysql/backup/2019-04-18_16-46-25/
#--incremental /backup/ #指定增量备份文件备份的目录
#--incremental-basedir #指定上一次全备或增量备份的目录
#ll /backup/2019-04-19_11-49-24/ #检查备份目录下的文件
#cd /backup/2019-04-18_17-48-20/
#cat xtrabackup_binlog_info
#catt xtrabackup_checkpoints 注:这些文件需要开启bin-log日志才会生成
2、删除一条数据来测试增量恢复:
mysql> delete from test where age=17; #执行删除操作
mysql> select * from test; #已把age=17的数据删除
3、停止mysql服务:
#/etc/init.d/mysqld stop
4、增量恢复操作过程如下:
#innobackupex --apply-log --redo-only /tmp/mysql/backup/2019-04-18_16-46-25/ #保持数据一致性,不回滚未提交事务
#innobackupex --apply-log --redo-only /tmp/mysql/backup/2019-04-18_16-46-25/ --incremental-dir=/backup/2019-04-18_17-48-20/ #将增量备份目录拷贝到全量备份目录下
#innobackupex --defaults-file=/etc/my.cnf --copy-back /tmp/mysql/backup/2019-04-18_16-46-25/ #恢复全部数据,同理,需要将mysql数据库目录清空
#chown -R mysql.mysql /usr/local/mysql/data/ 注:数据恢复后,数据目录所有者、所属组均为root用户,切记修改所有者所属组
5、启动mysql服务:
/etc/init.d/mysqld start
6、验证删除的数据是否恢复成功。
总结全库备份与恢复步骤:
a、innobackupex全量备份,并指定备份目录路径;
b、停止mysql服务;
c、在恢复前,需要使用--apply-log参数先进行合并数据文件,确保数据的一致性要求;
d、恢复时,直接使用--copy-back参数进行恢复,需要注意的是,需将mysql数据库目录清空并修改mysql数据库目录所有者、所属组为mysql用户;
e、启动mysql服务并验证数据是否成功恢复。
补充:
如在数据恢复前,没有先停止mysql服务,等执行数据恢复命令后,再重启mysql会报以下错误。所以数据恢复前应先停止mysql服务,待数据恢复后,再启动mysql服务。
迫不得已用粗暴的方法:kill -6 pid 停止mysql服务,
然后能使用:/etc/init.d/mysqld start|restart 都能正常使用了。