前言
以前都是通过 mysqldump 来备份数据库的,由于是逻辑备份,所以采用这种备份方式数据是很安全的,跨平台、版本都很容易。
凡事有利必有弊,逻辑备份在你数据库比较大时,备份、恢复数据所耗费的时间也是蛮长的,所以要不断改进,使用物理备份。
由于线上数据库表使用的是混合引擎 MyISAM 跟 Innodb ,所以也不能使用 mysqlhotcopy ,这个工具还是蛮好用的,可惜只能备份 MyISAM。
Percona XtraBackup 是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,且是开源项目。
了解到 XtraBackup 工具下有一个 innobackupex 支持 MyISAM 跟 Innodb 的备份,所以来搞一搞。
安装 XtraBackup
二进制包安装(推荐安装方式,不用安装依赖包,非常方便):
下载安二进制包:
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.7/binary/tarball/percona-xtrabackup-2.4.7-Linux-x86_64.tar.gz
解压并创建软连接:
tar zxvf percona-xtrabackup-2.4.7-Linux-x86_64.tar.gz
mv percona-xtrabackup-2.4.7-Linux-x86_64 /usr/local/xtrabackup
ln -s /usr/local/xtrabackup/bin/* /usr/bin/
查看版本:
xtrabackup --version
xtrabackup version 2.4.7 based on MySQL server 5.6.42 Linux (x86_64) (revision id: 6f7a799)
教程
环境
mysql 版本 Server version: 5.6.42-log MySQL Community Server
数据库 data 目录 /data/mysql/
binlog 日志目录 /data/bin_logs/
备份目录 /data/backup/
完全备份脚本
(每日一次,00:10:00 执行)
#!/bin/bash
base_dir=”/data/backup/`date +%F`”
[ -d ${base_dir} ] || mkdir ${base_dir}
[ -d ${base_dir}/full_`date +%F` ] && exit 0
innobackupex –defaults-file=/etc/my.cnf –user=root –password=’123456′ –no-timestamp ${base_dir}/full_`date +%F`
[ $? -eq 0 ] || echo “$(date +”%F_ %T”) 完全备份失败,请重新备份” >> /data/backup/backup.log
增量备份脚本
(每小时一次,xx:30:00 执行)
#!/bin/bash
base_dir=”/data/backup/`date +%F`”
full_dir=”/data/backup/`date +%F`/full_`date +%F`”
inc_dir=”${base_dir}/inc_`date +%H`”
[ -d ${inc_dir} ] && exit 0
innobackupex –defaults-file=/etc/my.cnf –user=root –password=’123456′ –no-timestamp –incremental-basedir=${full_dir} –incremental ${inc_dir} &> /dev/null
[ $? -eq 0 ] || echo “$(date +”%F_ %T”) ${inc_dir}增量备份失败,请重新备份” >> /data/backup/backup.log
一键还原脚本
#!/bin/bash
base_dir=”/data/backup/`date +%F`”
full_dir=”${base_dir}/full_`date +%F`”
inc_dir=”${base_dir}/`ls ${base_dir} | tail -1`”
cp -a ${base_dir} /data/backup/`date +”%F-%T”`_bak
innobackupex –defaults-file=/etc/my.cnf –user=root –apply-log –redo-only ${full_dir}
innobackupex –defaults-file=/etc/my.cnf –user=root –apply-log –redo-only ${full_dir} –incremental-dir=${inc_dir}
service mysqld stop
mv /data/mysql /data/mysql_bak`date +”%F_%T”`
mkdir /data/mysql
innobackupex –defaults-file=/etc/my.cnf –user=root –copy-back ${full_dir}
chown -R mysql.mysql /data/mysql
service mysqld start
###binlog 日志还原
###这里选择的是最后一个 binlog 日志,如果增量备份的一个小时内,有多个 mysql-bin.0000xx 生成,需要手动选择 bin-log 日志;
###还原执行 13:30 点后的所有 sql 命令
Hour=`basename ${inc_dir}|grep -o ‘[0-9]*’`
binlog=`ls /data/bin_logs/|grep [0-9]|tail -1`
mysqlbinlog –start-datetime=”`date +%F` ${Hour}:30:00″ /data/mysql/${binlog} | mysql -uroot -p ‘123456’
###还原执行 13:30-14:10 之间的所有 sql 命令
##mysqlbinlog –start-datetime=”2019-01-01 13:30:00″ –stop-datetime=”2018-12-25 14:10:00″ /data1/log/mysql/mysql-bin.000001 > /tmp/mysql_restore_030915.sql
计划任务
/var/spool/cron/root
10 00 * * * /bin/bash /root/.scripts/full_back.sh
30 * * * * /bin/bash /root/.scripts/inc_back.sh
结语
这样就可以实现自动备份和恢复 MYSQL 了!
© 本站文章随意转载,但请注明出处!
>> 如果您觉得本站文章对您有所帮助,购买 VPS 时候请走本站AFF链接!
>> 某些文章具有时效性,若内容有错误或已失效,欢迎在下方评论区留言向我们反馈.
>> 所有文章均基于分享的原则,所有言论均个人观点,请注意全部都不是推荐,是分享!分享!分享!
>> 所有文章均基于分享的原则,所有言论均个人观点,请注意全部都不是推荐,是分享!分享!分享!
THE END
暂无评论内容