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

相关文章

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad

postgresql数据库基本操作及命令详解

《postgresql数据库基本操作及命令详解》本文介绍了PostgreSQL数据库的基础操作,包括连接、创建、查看数据库,表的增删改查、索引管理、备份恢复及退出命令,适用于数据库管理和开发实践,感兴... 目录1. 连接 PostgreSQL 数据库2. 创建数据库3. 查看当前数据库4. 查看所有数据库

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(