小型Drupal数据库备份以及大型站点MySQL备份策略分享
中小站点简单备份策略
基于drupal的中小行网站,我们可以使用backup_migrate模块,该模块提供了定期备份的功能,备份的时间、保留多少个备份等等设置,设置好之后,定期执行cron即可备份成功。一般的Drupal小站,我们只需使用svn即可,在服务器端,我们把备份好的数据提交到svn,就可以达到备份的目的。由于Drupal的备份模块可以设置备份保留的文件份数,因此不会造成太多的备份文件,从而导致svn很大。
下面是一个简单的备份脚本,放置到站点根目录,然后加到crontab每天执行即可。
#!/bin/bash
date#startdate
DRUSH_PHP=/bin/php#phppath
exportDRUSH_PHP
drushcron
svnstsites/default/files/backup_migrate/scheduled/|grep'^!'|awk'{print$2}'|xargssvndelete--force
svnaddsites/default/files/backup_migrate/scheduled/*
svncisites/default/files/backup_migrate/scheduled/-m'addbackupfiles'
date#enddate
crontab的设置如下
0 0***cd/www/web/html/&&bashcron.sh>cron.log2>&1
大型站点MySQL备份策略
如果是数据库稍大的站点,使用svn临时备份就略显单薄,这时需要使用MySQL备份策略,一般情况下我们需要把整个数据库都备份压缩,然后定期转移到备份数据库或者放到其他的云服务器,这里给出一个简单的PHP示例代码。
#!/usr/bin/php-q
<?php
$to="gaoxinzhao@gmail.com";
$hostname=exec('/bin/hostname');
$mycnf="/home/robbin/.my.cnf";
$ignore=array('information_schema','test','mysql','wdcpdb');
functiontrimw($str){
$str=str_replace(array("n","r","t","","o","xOB"),'',$str);
return$str;
}
if(!file_exists($mycnf)){
mail($to,"No.my.cnfexistson$hostname","MySQLcannotdumpbecause.my.cnfismissingon$hostname.");
exit("cantgetusercreds");
}
$myconf=file_get_contents($mycnf)ordie("Failedtoopenbmesh_admin's.my.cnf");
preg_match("/buser(.*)/",$myconf,$matches)ordie(mail($to,"Nousernamein.my.cnfon$hostname","MySQLcannotdumpon$hostname"));
$usr=(explode('=',$matches[0]));
$user=trimw($usr[1]);
preg_match("/bpassword(.*)/",$myconf,$matches)ordie(mail($to,"Nopasswordin.my.cnfon$hostname","MySQLcannotdumpon$hostname"));
$pass=(explode('=',$matches[0]));
$password=trimw($pass[1]);
mysql_connect("localhost",$user,$password)ordie("couldnotconnect:".mysql_error());
mysql_select_db("mysql");
$result=mysql_query("showdatabases");
$bpath="/home/robbin/backup/mysql";
$btime=date("Y-m-dH:i:s");
$bstamp=strtotime($btime);
$byear=date("Y",$bstamp);
$bmonth=date("m",$bstamp);
$bday=date("d",$bstamp);
$btod=date("H-i-s",$bstamp);
while($res=mysql_fetch_array($result))
{
$myDb=$res["Database"];
if(in_array($myDb,$ignore))continue;
$mdir="$bpath/$byear/$bmonth/$bday/$btod/$myDb";
$out=`mkdir-p$mdir`;
$myFile=$myDb.".sql";
$bldCmd="cd$mdir;";
$bldCmd.="mysqldump-u$user-p$password--single-transaction--add-drop-table-R-c-Q$myDb>$myFile;";
//$bldCmd.="chmod644$myFile;";
//$bldCmd.="chownroot:root$myFile;";
$bldCmd.="gzip-9$myFile";
print"Backingup$myDbn";
print"Securing$myDbn";
$out=`$bldCmd`;
}
$out=`chmod700$bpath/$byear`;
print"$outn";
print"Backupsarein$bpathn";
crontab的设置
01***/home/robbin/bin/mysql_backup.php
此外我们需要把备份的数据还要定期传送到其他服务器上,才会避免服务器崩溃而引发数据丢失。备份及时网站才有保证,这里仅仅只是笔者的一点点操作分享,大家有更好的备份策略,欢迎共享。