一、Xtrbackup备份机制说明
xtrabackup备份就是数据文件的物理备份,简单流程如下:
- 备份时开启redo线程,数据变化不再刷新到磁盘的数据文件,而是写入到redo日志。
- 数据库数据目录的文件不再变化,开始进行数据文件的备份。
- 锁定表,只允许读
- 备份最后一个binlog
- 备份redo日志,b_logfile0,b_logfile1这样
二、xtrabackup备份需要指定的参数
根据上述的备份流程,xtrabackup备份数据需要的条件有:
1、连接mysql,进行redo进程的开启和关闭
方法1:可以通过主机(--host)、端口(--port)、用户(--user)、密码(--password)进行连接
方法2:可以通过socket文件、用户(--user)、密码(--password)进行连接。
socket文件位置,可以通过多种途径获取:
- 通过配置文件获取
- xtrabackup默认按顺序读取配置文件:/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
- 指定mysql配置文件:--defaults-file
- 通过--socket参数指定。
使用容器运行mysql实例时,通过配置文件读取到的socket文件位置都是容器中的,而不是宿主机内的,xtrabackup备份会出错。
建议使用 【方法1】 进行连接。
2、获取要备份mysql实例的数据目录
方法1:通过配置文件获取
- xtrabackup默认按顺序读取配置文件:/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
- 指定mysql配置文件:--defaults-file
方法2:通过 --datadir 参数指定
使用容器运行mysql实例时,通过配置文件datadir数据目录位置 都是容器中的,而不是宿主机内的,xtrabackup备份会出错。
所以容器mysql 建议使用【方法2】,指定宿主机中的数据目录,当然数据目录要挂载到宿主机才可以。
3、默认说明
下面的操作说明为了通用(宿主机运行、容器运行),统一使用:
- 主机(--host)、端口(--port)、用户(--user)、密码(--password)进行msyql连接,
- 使用--datadir指定数据目录。
三、全量备份和还原
1、全量备份
mkdir -p /bak/xtrabackup/mysql_ins_name/full_$(date +%Y%m%d) xtrabackup --datadir=/data/mysql_dev_cis --user=root --password='' --host=127.0.0.1 --port=3308 --backup --target-dir=/bak/xtrabackup/mysql_ins_name/full_$(date +%Y%m%d)
- --backup:进行备份操作
- --datadir:指定mysql数据目录
- --target-dir:指定备份的位置(目录要求为空)
--databases:指定要备份 数据库(dbname)或表(dbname.tablename)的列表,以空格分割。
--databases-file:指定文件来说明 需备份数据库(dbname)或表(dbname.tablename),以行来分割。
2、还原数据
(1)备份文件预处理-prepare
一般情况下,在备份完成后,数据尚且不能用于恢复操作。
因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务,此时数据文件仍处理不一致状态。
“prepare”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
xtrabackup --prepare --target-dir=/bak/xtrabackup/mysql_ins_name/full_$(date +%Y%m%d)
(2)还原数据
- 停止需要还原的数据库.
可以还原到其他数据库,也可以还原到原有数据库。
- 清空需要还原数据库数据目录。(建议备份)
rm -rf /data/mysql_dev_cis_3309
- 进行还原
xtrabackup --datadir=/data/mysql_dev_cis_3309 --copy-back --target-dir=/bak/xtrabackup/mysql_ins_name/full_$(date +%Y%m%d)
- --copy-back:进行还原操作
- --target-dir:备份文件位置
- --datadir:需还原数据库数据目录
全量备份还原,会将源数据库的用户信息也进行备份还原。
四、增量备份和还原
1、增量备份
(1)全量备份
mkdir -p /bak/xtrabackup/mysql_ins_name/full_$(date +%Y%m%d) xtrabackup --datadir=/data/mysql_dev_cis --user=root --password='' --host=127.0.0.1 --port=3308 --backup --target-dir=/bak/xtrabackup/mysql_ins_name/full_$(date +%Y%m%d)
(2)增量备份(第一次)
mkdir -p /bak/xtrabackup/mysql_ins_name/incre_1 xtrabackup --datadir=/data/mysql_dev_cis --user=root --password='' --host=127.0.0.1 --port=3308 --backup --target-dir=/bak/xtrabackup/mysql_ins_name/incre_1 --incremental-basedir=/bak/xtrabackup/mysql_ins_name/full_$(date +%Y%m%d)
--target-dir:增量备份的目录位置。
--incremental-basedir:首次增量备份基于某一次全量备份。
(3)增量备份(第二次)
mkdir -p /bak/xtrabackup/mysql_ins_name/incre_2 xtrabackup --datadir=/data/mysql_dev_cis --user=root --password='' --host=127.0.0.1 --port=3308 --backup --target-dir=/bak/xtrabackup/mysql_ins_name/incre_2 --incremental-basedir=/bak/xtrabackup/mysql_ins_name/incre_1
--target-dir:增量备份的目录位置。
--incremental-basedir:非首次增量备份基于上一次增量备份。
2、还原数据
(1)备份文件预处理-prepare
- prepare全量备份
xtrabackup --prepare --apply-log-only --target-dir=/bak/xtrabackup/mysql_ins_name/full_$(date +%Y%m%d)
--apply-log-only:除了最后一次增量备份的prepare不需要加--apply-log-only,前面的prepare都要加此参数。
- prepare第一次增量备份
xtrabackup --prepare --apply-log-only --target-dir=/bak/xtrabackup/mysql_ins_name/full_$(date +%Y%m%d) --incremental-dir=/bak/xtrabackup/mysql_ins_name/incre_1
- prepare最后一次增量备份
xtrabackup --prepare --target-dir=/bak/xtrabackup/mysql_ins_name/full_$(date +%Y%m%d) --incremental-dir=/bak/xtrabackup/mysql_ins_name/incre_2
注意:最后一次增量备份的prepare不需要加--apply-log-only
(2)还原数据
- 停止需要还原的数据库.
可以还原到其他数据库,也可以还原到原有数据库。
- 清空需要还原数据库数据目录。(建议备份)
rm -rf /data/mysql_dev_cis_3309
- 进行还原
经过prepare之后,只需要还原全量备份
xtrabackup --datadir=/data/mysql_dev_cis_3309 --copy-back --target-dir=/bak/xtrabackup/mysql_ins_name/full_$(date +%Y%m%d)
- --copy-back:进行还原操作
- --target-dir:备份文件位置
- --datadir:需还原数据库数据目录