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

相关文章

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

Python手搓邮件发送客户端

《Python手搓邮件发送客户端》这篇文章主要为大家详细介绍了如何使用Python手搓邮件发送客户端,支持发送邮件,附件,定时发送以及个性化邮件正文,感兴趣的可以了解下... 目录1. 简介2.主要功能2.1.邮件发送功能2.2.个性签名功能2.3.定时发送功能2. 4.附件管理2.5.配置加载功能2.6.

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

Java读取InfluxDB数据库的方法详解

《Java读取InfluxDB数据库的方法详解》本文介绍基于Java语言,读取InfluxDB数据库的方法,包括读取InfluxDB的所有数据库,以及指定数据库中的measurement、field、... 首先,创建一个Java项目,用于撰写代码。接下来,配置所需要的依赖;这里我们就选择可用于与Infl

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur