SAE数据库完美备份(自动备份+发送邮件+数量可控)

2024-02-23 08:32

本文主要是介绍SAE数据库完美备份(自动备份+发送邮件+数量可控),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原来博客的数据是用插件备份的,移植过来后,却没有发现一个完美的数据备份方法,我所说的完美,要求也不高,就是能够实现以下三点:(1)定时自动备份;(2)备份内容发送邮件附件;(3)存储到服务器上的备份数量可控。第一点是基本需求,第二点是防患未然,第三点是个人喜好,不然一天一个备份,一年下来都好几百了,看着碍眼、放着无用且浪费资源。最后,既然网上没找到完全中意的方法,就参考着文档和搜索到的一些信息摸索着实现了,和大家分享下。

1、在需要备份的应用里面创建一个单独用于存储备份的Storage,命名随意,比如:dbbackup;

2、在网站代码的任意目录下新建一个php文件,命名随意,比如dbbackup.php,内容就不能随意了,需根据情况修改,参考下面:

<?php
/********************************************************************
** database backup for sae, code from xhhjin (http://xuhehuan.com) **
********************************************************************/
define('DB_DOMAIN','dbbackup');      //备份域
define('DB_BACKUP_PATH','backup');    //备份路径和文件名
define('DB_BACKUP_NUMBER', 20);      //备份数目限制,不超过900
define('DB_MAIL_SMTP', 'smtp.163.com');    //smtp服务器
define('DB_MAIL_PORT', 25);        //smtp端口
define('DB_MAIL_SENDEMAIL', '*******@163.com');  //发送邮件帐号
define('DB_MAIL_PASSWORD', '*******');    //发送邮件密码
define('DB_MAIL_TOEMAIL', '*******@qq.com');  //收信邮件帐号
header('Content-Type: text/html; charset=UTF-8');
$stor = new SaeStorage();
$attr = array('private'=>false);
$ret = $stor->setDomainAttr(DB_DOMAIN, $attr);
$date = date('Y-m-d');
$pathname = DB_BACKUP_PATH.'/'.$date.'.sql.zip';  //按日期命名
//备份数据库+发邮件
$dj = new SaeDeferredJob();
$taskID =$dj->addTask("export","mysql",DB_DOMAIN,$pathname,SAE_MYSQL_DB,"","");
$dbbackup_url = $stor->getUrl(DB_DOMAIN,$pathname);
$mail = new SaeMail();
if($taskID===false){echo("数据库备份失败, errno:".$dj->errno().", errmsg: " .$dj->errmsg()."。 <br>");$ret = $mail->quickSend( DB_MAIL_TOEMAIL , '数据库备份失败' , '数据库备份失败! errno:'.$dj->errno().', errmsg:'.$dj->errmsg().'.', DB_MAIL_SENDEMAIL , DB_MAIL_PASSWORD, DB_MAIL_SMTP, DB_MAIL_PORT ); //邮箱通知
}else{do {$ret = $dj->getStatus($taskID);} while ( $ret==='waiting' || $ret==='inqueue' || $ret==='excuting' );echo("数据库备份成功, taskID($taskID, $ret)。 <br>");$attachdata = file_get_contents($dbbackup_url);$mail->setAttach( array("db-$date.sql.zip.txt" => $attachdata));    //发送数据库附件,支持的文件后缀参考SAE文档,大小不超过1M$ret = $mail->quickSend( DB_MAIL_TOEMAIL , '数据库备份成功' , '数据库备份成功!'.' 备份地址:'.$dbbackup_url, DB_MAIL_SENDEMAIL , DB_MAIL_PASSWORD, DB_MAIL_SMTP, DB_MAIL_PORT ); //邮箱通知
}
//清理多余的备份文件
$domain = DB_DOMAIN;
$path = DB_BACKUP_PATH;
$limitNum = DB_BACKUP_NUMBER;
do {      //循环获取指定路径文件$fileArray = $stor->getListByPath($domain, $path, $limitNum+100, 0 );$fileList = $fileArray['files'];      // 文件名字列表数组$totalFileNum = $fileArray['fileNum'];    // 文件数目if($totalFileNum<=$limitNum) {    break;                      //路径下文件数目不大于限制数目,跳出循环}foreach($fileList as $key => $value){$fileTime[$key] = $value['uploadTime'];}array_multisort($fileTime, SORT_DESC, $fileList); // 按照文件上传时间降序排列//print_r($fileList);echo "<br>该目录总共有($totalFileNum)个文件! <br>";for($i=0;$i<$limitNum;++$i){$file = $fileList[$i]['fullName'];}//清理限制数目之外的文件for($i=$limitNum;$i<$totalFileNum;$i++){$file = $fileList[$i]['fullName'];$stor->delete($domain,$file);$fileNum = count($fileList);}
} while ( $totalFileNum>$limitNum );
//显示清理路径结果
echo "Domain($domain)的路径($path)中只保留了最新上传的($limitNum)个文件,其余文件已被清除!";
$attr = array('private'=>true);
$ret = $stor->setDomainAttr(DB_DOMAIN, $attr); //设置domain为private,保护数据
?>


其中第一部分的宏定义是需要根据实际情况修改的,主要是storage、路径和邮箱的设置,具体内容可以参考代码里面的对应说明。这里假设的是将数据文件备份到一个叫dbbackup的storage中的backup文件夹里,并且只保留最新的20个备份;邮件部分则是在执行备份时将最新的数据备份文件发送到你的设定邮箱里,测试中我用的发送邮箱是163的,接收邮箱是126的。需要说明的是,测试时SAE的邮件服务不是很稳定,有时可能会收不到邮件,并且邮件发送的附件大小限制在1M以内,不支持zip的文件后缀,所以你的数据备份文件不超过1M时可以完美的使用本方法,超过的话附件就接收不到了,正常接收到的附件名字类似:db-2014-07-22.sql.zip.txt,下载下来后将.txt去掉即可。

3、在网站代码根目录的config.yaml文件中添加一个cron任务,让备份可以自动定时执行:

cron:
- description: database backupurl: /实际目录/dbbackup.phpschedule: every day of month 03:00
handle:
- hostaccess: if( path ~ "/实际目录/dbbackup.php" ) allow "127.0.0.1"


代码里需替换下正确的目录名字;schedule: every day of month 03:00表示每天凌晨3点开始自动备份,如果发现收不到邮件,很可能是被邮箱判断为垃圾邮件或者被系统退信了,毕竟没有几个人会在凌晨3点发邮件的,这时只要把03:00改成其他的时间(比如23:30)就可以;想更改成每周或每月等等时间备份的可以通过Cron配置生成工具生成后替换修改:http://saetools.sinaapp.com/cron.html;

另外,由于备份中用的了DeferredJob,并且SAE限制DeferredJob每天只能添加10个任务,所以有了这一条:

1 - hostaccess: if( path ~ "/实际目录/dbbackup.php" ) allow "127.0.0.1"

它表示只允许内网访问dbbackup.php文件,这样就可以让Cron服务正常运行并且有效防止了外部的无意或恶意点击,当然,你也可以将自己的IP添加进去测试用,不然直接访问是会403 Forbidden的,修改可以用Appconfig 配置生成工具:http://saetools.sinaapp.com/appconfig.html。

转载自:http://xuhehuan.com/1834.html

这篇关于SAE数据库完美备份(自动备份+发送邮件+数量可控)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/738054

相关文章

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

mysql数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们

Spring Boot 整合 MyBatis 连接数据库及常见问题

《SpringBoot整合MyBatis连接数据库及常见问题》MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,下面详细介绍如何在SpringBoot项目中整合My... 目录一、基本配置1. 添加依赖2. 配置数据库连接二、项目结构三、核心组件实现(示例)1. 实体类2. Ma

使用Python实现网络设备配置备份与恢复

《使用Python实现网络设备配置备份与恢复》网络设备配置备份与恢复在网络安全管理中起着至关重要的作用,本文为大家介绍了如何通过Python实现网络设备配置备份与恢复,需要的可以参考下... 目录一、网络设备配置备份与恢复的概念与重要性二、网络设备配置备份与恢复的分类三、python网络设备配置备份与恢复实

电脑提示找不到openal32.dll文件怎么办? openal32.dll丢失完美修复方法

《电脑提示找不到openal32.dll文件怎么办?openal32.dll丢失完美修复方法》openal32.dll是一种重要的系统文件,当它丢失时,会给我们的电脑带来很大的困扰,很多人都曾经遇到... 在使用电脑过程中,我们常常会遇到一些.dll文件丢失的问题,而openal32.dll的丢失是其中比较

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.