小型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
此外我们需要把备份的数据还要定期传送到其他服务器上,才会避免服务器崩溃而引发数据丢失。备份及时网站才有保证,这里仅仅只是笔者的一点点操作分享,大家有更好的备份策略,欢迎共享。