生产环境使用xtrabackup备份MySQL
1.前提条件
需要机器上有如下二进制文件:
xbstream
xtrabackup
qpress
并且加入到环境变量
本文章解决的问题:
1.需要定时全量备份数据库
2.需要在线把主库的数据导出来,做一个从库。
2.备份脚本
#!/bin/sh
passwd=$(printf "%s" MTIzNDU2YQ== | base64 -d)
date_dir=`date +%Y%m%d`
echo "---------------------------`date`------------begin----"
xtrabackup --default-files=/etc/my.cnf --safe-slave-backup --slave_info --parallel=4 --user='root' --password=$passwd --datadir=/data02/mysql_data --socket=/data02/mysql/tmp/mysql.sock --backup --stream=xbstream --compress --compress-threads=2 > /data02/backup/backup_data/$date_dir.stream
echo "---------------------------`date`-------------end---"
find /data02/backup/backup_data -type f -mtime +7 -exec rm {} \;
3.脚本解释
-
passwd 由于安全,不可以出现明文密码,所以写成base64加密后的。
image.png -
date_dir 备份的时间,方便按照时间来查看备份文件
-
--default-files 使用的my.cnf配置文件
-
--slave-info:该选项表示对slave进行备份的时候使用,打印出master的名字和binlogpos,同样将这些信息以change master的命令写入xtrabackup_slave_info文件。可以通过基于这份备份启动一个从库。
-
--safe-slave-backup:该选项表示为保证一致性复制状态,这个选项停止SQL线程并且等到show status中的slave_open_temp_tables为0的时候开始备份,如果没有打开临时表,bakcup会立刻开始,否则SQL线程启动或者关闭知道没有打开的临时表。如果slave_open_temp_tables在--safe-slave-backup-timeount(默认300秒)秒之后不为0,从库sql线程会在备份完成的时候重启。
-
--parallel 并发备份
-
--user备份用户
最好创建一个专门备份的用户,避免使用高权限的root
mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 's3cret';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO
'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;
- --datadir 数据库的目录
- --socket 本地localhost连接的socket文件位置
- --backup 代表是在备份
- --stream=xbstream 流式备份
- --compress --compress-threads=2 压缩备份,2个线程压缩
- find /data02/backup/backup_data -type f -mtime +7 -exec rm {} ;找到文件时间在七天前的,并删除掉,保证全量备份只保留7天。
4.恢复文件
恢复需要如下步骤:
- 停止MySQL进程
- 删除MySQL数据文件目录(生产环境最好是mv到其他目录,当然要保证磁盘空间要够。例如你的数据库目录叫mysql_data 可以为:mv mysql_data mysql_data_bak ,),共享表空间,数据表空间,undo log ,redo log, binlog, relay log(假如是从库)
- 开始进行解压备份的文件,上述例子备份的文件名为20201203.qpress
xbstream解压
xbstream -x < 20201203.stream -C /data01/backup/data
解压到指定目录
decompress 解压
xtrabackup --decompress --parallel=10 --remove-original --target-dir=/data01/backup/data
prepare 准备数据(回放redo log)
xtrabackup --prepare --use-memory=2GB --target-dir=/data01/backup/data
把数据拷贝到数据库数据目录
xtrabackup --default-files=/data01/mysql/etc/3306/my.cnf --copy-back --target-dir=/data01/backup/data --datadir=/data01/mysql/data/3306
-
用户及用户组:一般都会使用mysql用户来执行mysql的进程,chown -R mysql:mysql /data01/mysql/data/3306
-
假如是备份的文件是要做一个从库,则需要如下操作:
在备份的目录找到如下文件:
cat xtrabackup_binlog_info
里面会有GITD(一般生产现在都修改为GTID复制的模式了)
启动数据库后,进去修改为GTID_PURGED为上面cat到的GITD
reset master
set global GTID_PURGED='fhhsh-sgs726464-bdgajdgdg4:1-101'
change master to ...............
这一步非常重要!!
因为这个是告诉数据库从那个GITD开始进行复制。
- 启动MySQL:记得查看错误日志,假如没有报错 那基本就是可以使用。