0

0

两套mysql备份脚本

php中文网

php中文网

发布时间:2016-06-07 14:56:11

|

1273人浏览过

|

来源于php中文网

原创

数据备份其重要性无需多言,再细想一步,我们至少需要两种备份:一种逻辑备份(mysqldump生成sql文件);一种物理备份(xtrabackup可很好完成)。逻辑备份在出问题时能提供更细粒度的恢复和对比;物理备份在整库范围的数据恢复或者增加从库方面有着更高的效

    数据备份其重要性无需多言,再细想一步,我们至少需要两种备份:一种逻辑备份(mysqldump生成sql文件);一种物理备份(xtrabackup可很好完成)。逻辑备份在出问题时能提供更细粒度的恢复和对比;物理备份在整库范围的数据恢复或者增加从库方面有着更高的效率。


首先看下逻辑备份脚本,比较简单

#!/bin/sh
###每天运行一次

###定义用户 密码 备份目录等信息
user=mysqldump
psd=mysqldump
backup_base=/data/mysql_backup
date=`date +%Y%m%d`
old_date=`date +%Y%m%d -d -30days`    ###保存的天数

###获取库名,排除不需要备份的库
for db in `mysql -u$user -p$psd -s -N -e "show databases"|grep -v -E "(test|percona|information_schema|performance_schema)"`
do
  ###创建备份目录
  if [ ! -d $backup_base/$db ];then
    mkdir $backup_base/$db
  fi
 
  cd $backup_base/$db

  chattr -i ./*    

  rm -f $old_date.sql* &>/dev/null     #删除30天以前的

  mysqldump -u$user -p$psd --events --routines  $db |gzip > $date.sql.gz    ###备份&压缩

  chattr +i ./*    ###这里加了个防误删的属性
done


接下来看基于xtrabackup的物理(整库)备份脚本。相比上面的脚本,这个就有意思点儿了(在生成备份的时候遵循了一个规则,然后在恢复脚本里加逻辑判断实现任意时候都能一键恢复)

    整套功能需要 三个脚本 innobackupex_all.sh、innobackupex_increment.sh、innobackupex_restore.sh

    我们知道xtrabackup可以第一次备份全量数据,之后设置增量备份。Linux crontab以数字0-6表示"周日"-"周六"。所以,我以一周为周期:周日进行全备,存放于0目录;周一至周六增备,存放于1-6目录;下次周日清空目录重新全备。

    上面以0-6这样的目录名存放备份数据,是为了让恢复脚本innobackupex_restore.sh处理起来更方便。无论在周几执行恢复脚本,都能正确的执行xtrabackup的恢复过程

    依percona官方文档。xtrabackup备份至少需要以下权限:GRANT RELOAD, SUPER, LOCK TABLES, REPLICATION CLIENT, CREATE TABLESPACE ON *.* TO 'xtrabackup'@'localhost' identified by xxxx


计划任务设置如下

kgogoprime
kgogoprime

KGOGOMall 是一套采用 Php + MySql 开发的基于 WEB 应用的 B/S 架构的B2C网上商店系统。具有完善的商品管理、订单管理、销售统计、新闻管理、结算系统、税率系统、模板系统、搜索引擎优化,数据备份恢复,会员积分折扣功能,不同的会员有不同的折扣,支持多语言,模板和代码分离等,轻松创建属于自己的个性化用户界面。主要面向企业和大中型网商提供最佳保障,最大化满足客户目前及今后的独立

下载

wKiom1YjllLjfwWHAABUb2Zxa3Q422.jpg


全备脚本 innobackupex_all.sh

#!/bin/sh
###每周日凌晨4点,执行全量备份

base_dir=/ljk/data

rm -rf $base_dir/* 2>> $base_dir/all.log    ###清空base_dir,执行全备

###备份并将日志记录于base_dir下的all.log
/usr/bin/innobackupex --user=xtrabackup --password=xtrabackup $base_dir 2>> $base_dir/all.log

cd $base_dir
#将以'当前时间命名的全备目录'重命名为'0'
mv 20* 0 2>> $base_dir/all.log


增备脚本innobackupex_increment.sh

#!/bin/sh
###周1--周6凌晨4点 增量备份

base_dir=/ljk/data

today=`date +%u`
yesterday=`expr $today - 1`

echo -e "\n===================================\n" >> $base_dir/increment.log    ###增备日志记录于$base_dir/increment.log
/usr/bin/innobackupex --user=xtrabackup --password=xtrabackup --incremental $base_dir --incremental-basedir=$base_dir/$yesterday 2>> $base_dir/increment.log

cd $base_dir
#重命名备份文件,以0 1 2 3 4 5 6 代表周日到 周六
mv 20* $today 2>> $base_dir/increment.log


恢复脚本innobackupex_restore.sh

#!/bin/sh

###检查上次命令执行是否成功的函数
function check {
   if [ $? -ne 0 ];then
        echo -e "\e[1;31m\n $1 exec failed,please check it !\e[0m \n"
        echo "$1 failed,please check it !"
        sleep 1
        exit -1
   fi
}

base_dir=/ljk/data

backup_dir=`ls -l $base_dir|grep -e "^d.*"|awk '{print $NF}'`
echo -e "the backup dir is: $backup_dir \n"
sleep 1

###开始恢复

cd $base_dir

echo -e "------ 准备阶段 0 ------\n"
sleep 1
/usr/bin/innobackupex --apply-log --redo-only $base_dir/0
check "准备阶段 0";

###执行除去 0 和 最后一个目录 之外的其他目录的恢复准备
dir_num=`ls -l $base_dir|grep -e "^d.*"|wc -l`      #取出有几个备份目录

for i in `seq 1 $(($dir_num - 2))`
  do
    echo -e "------ 准备阶段 $i ------ \n"
    sleep 1
    /usr/bin/innobackupex --apply-log --redo-only $base_dir/0 --incremental-dir=$base_dir/$i
    check "准备阶段 $i";
done

###最后一个增量备份
echo -e "------ 准备阶段 $(($dir_num - 1)) ------ \n"
sleep 1
/usr/bin/innobackupex --apply-log $base_dir/0 --incremental-dir=$base_dir/$(($dir_num - 1))
check "准备阶段 $(($dir_num - 1))";

###以上步骤将所有增量备份中记录的变化应用到了最初的全量备份中
echo -e "------ 应用所有变化到$base_dir/0 ------\n"
/usr/bin/innobackupex --apply-log $base_dir/0
check "应用所有变化到$base_dir/0";

###将数据考回数据目录
echo -e "------ 将处理好的数据考回至数据目录 ------\n"
/usr/bin/innobackupex --copy-back $base_dir/0
check "copy-back";


物理备份目录结构截图

wKioL1Yl0YuS9eaIAADKyyzqV00547.jpg

相关专题

更多
Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

37

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

37

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++教程
C++教程

共115课时 | 12.2万人学习

麻省理工大佬Python课程
麻省理工大佬Python课程

共34课时 | 5.1万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号