felix-cao / Blog

A little progress a day makes you a big success!
31 stars 4 forks source link

MySQL 定时全量备份 #173

Open felix-cao opened 5 years ago

felix-cao commented 5 years ago

本文出自《实战-MySQL定时全量备份(1)》

引言

在产品上线之后,我们的数据是相当重要的,容不得半点闪失,应该做好万全的准备,搞不好哪一天被黑客入侵或者恶意删除,那就 gg 了。所以要对我们的线上数据库定时做全量备份与增量备份。例如:每天做一次增量备份,每周做一次全量备份。以下所涉及的操作系统为 centos7

GitHub 地址:

https://github.com/zonezoen/MySQL_backup

全量备份

mysqldump -uroot -p123456  --lock-all-tables --flush-logs test > /home/backup.sql

如上一段代码所示,其功能是将 test 数据库全量备份。其中 MySQL 用户名为:root 密码为:123456 备份的文件路径为:/home (当然这个路径也是可以按照个人意愿修改的。) 备份的文件名为:backup.sql 参数 --flush-logs:使用一个新的日志文件来记录接下来的日志 参数 --lock-all-tables:锁定所有数据库

以下为我使用的数据库备份脚本文件:

脚本文件功能不是很复杂,首先是各种变量赋值。然后备份数据库,接着是进入到备份文件所在的目录,再将备份文件压缩。其中倒数第三行是使用 nodejs 将备份的数据库文件上传到七牛云中,这里就不在过多的阐述了,与本文主题不符,想看具体实现可以查看 GitHub 源码。其中相应的变量改成自己的值即可拿过来使用。

#!/bin/bash
#在使用之前,请提前创建以下各个目录
#获取当前时间
date_now=$(date "+%Y%m%d-%H%M%S")
backUpFolder=/home/db/backup/mysql
username="root"
password="123456"
db_name="zone"
#定义备份文件名
fileName="${db_name}_${date_now}.sql"
#定义备份文件目录
backUpFileName="${backUpFolder}/${fileName}"
echo "starting backup mysql ${db_name} at ${date_now}."
/usr/bin/mysqldump -u${username} -p${password}  --lock-all-tables --flush-logs ${db_name} > ${backUpFileName}
#进入到备份文件目录
cd ${backUpFolder}
#压缩备份文件
tar zcvf ${fileName}.tar.gz ${fileName}

# use nodejs to upload backup file other place
#NODE_ENV=$backUpFolder@$backUpFileName node /home/tasks/upload.js
date_end=$(date "+%Y%m%d-%H%M%S")
echo "finish backup mysql database ${db_name} at ${date_end}."

恢复全量备份

mysql -h localhost -uroot -p123456 test< bakdup.sql

或者

mysql> source /path/backup/bakdup.sql

嗯,回复全量备份也就这样两句,似乎不用多说什么了。对了,在恢复全量备份之后,要将全量备份之后的增量备份也恢复回数据库中。

定时备份

输入如下命令,进入 crontab 定时任务编辑界面:

crontab -e

添加如下命令,其意思为, 每分钟执行一次备份脚本:

* * * * * sh /usr/your/path/mysqlBackup.sh

每五分钟执行 :

*/5 * * * * sh /usr/your/path/mysqlBackup.sh

每小时执行:

0 * * * * sh /usr/your/path/mysqlBackup.sh

每天执行:

0 0 * * * sh /usr/your/path/mysqlBackup.sh

每周执行:

0 0 * * 0 sh /usr/your/path/mysqlBackup.sh

每月执行:

0 0 1 * * sh /usr/your/path/mysqlBackup.sh

每年执行:

0 0 1 1 * sh /usr/your/path/mysqlBackup.sh

关于 crontab 命令的格式说明如下:

felix-cao commented 5 years ago

每周一的凌晨2点执行如下脚本

0 2 * * 1 ansible-playbook /home/git/prod.yml
felix-cao commented 3 years ago

mysql 备份文件.xb 数据库备份还原

一、下载安装 Xtrabackup

下载地址, 请选择 Percona XtraBackup 2.4.6 及以上的版本,安装介绍请参见 官网文档

安装:

yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum install percona-xtrabackup-24

二、操作步骤

2.1 解包备份文件

使用 xbstream 命令将备份文件解包到目标目录。

xbstream -x -C /home/data < ./test.xb

2.2 解压备份文件

2.2.1 下载安装 qpress 工具

cd /home/software
wget http://www.quicklz.com/qpress-11-linux-x64.tar
tar -xvf qpress-11-linux-x64.tar -C /usr/local/bin
source /etc/profile

3、准备恢复的数据

xtrabackup --prepare  --target-dir=./data

执行后若结果中包含如下输出,则表示 prepare 成功。 image

恢复

service mysql stop
xtrabackup --copy-back --target-dir=./data --datadir=/usr/local/mysql/var/
chown -R mysql:mysql /usr/local/mysql/var/