Drupal数据库备份以及MySQL备份策略

浏览:112

数据备份是非常重要的事情,一个站点如果没有及时备份数据,那么一旦服务器出现故障,造成的后果将是不可想象的。因此,作为生产站点,一定要及时的备份,以免出现不可挽回的损失。 笔者在这里共享一下drupal小型站点的备份策略和大型站点MySQL的备份策略。


中小站点简单备份策略


基于Drupal的中小行网站,我们可以使用backup_migrate模块,该模块提供了定期备份的功能,备份的时间、保留多少个备份等等设置,设置好之后,定期执行cron即可备份成功。 一般的Drupal小站,我们只需使用svn即可,在服务器端,我们把备份好的数据提交到svn,就可以达到备份的目的。由于Drupal的备份模块可以设置备份保留的文件份数,因此不会造成太多的备份文件,从而导致svn很大。


下面是一个简单的备份脚本,放置到站点根目录,然后加到crontab每天执行即可。





 #!/bin/bash date #start dateDRUSH_PHP=/bin/php #php pathexport DRUSH_PHP
 
drush cronsvn st  sites/default/files/backup_migrate/scheduled/ | grep '^!' | awk '{print $2}' | xargs svn delete --forcesvn add sites/default/files/backup_migrate/scheduled/*svn ci  sites/default/files/backup_migrate/scheduled/ -m 'add backup files'date #end date

crontab的设置如下





0  0 * * * cd /www/web/html/ && bash cron.sh > cron.log 2>&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'); function trimw($str) {
  $str = str_replace(array("\n", "\r", "\t", " ", "\o", "\xOB"), '', $str);
  return $str;} if (!file_exists($mycnf)) {
  mail($to, "No .my.cnf exists on $hostname", "MySQL cannot dump because .my.cnf is missing on $hostname .")  ;
  exit("cant get user creds");} $myconf = file_get_contents($mycnf) or die( "Failed to open bmesh_admin's .my.cnf" ); preg_match( "/\buser(.*)/", $myconf, $matches ) or die( mail($to, "No username in .my.cnf on $hostname", "MySQL cannot dump on $hostname")); $usr = (explode('=', $matches[0]));$user = trimw($usr[1]); preg_match( "/\bpassword(.*)/", $myconf, $matches ) or die( mail($to, "No password in .my.cnf on $hostname", "MySQL cannot dump on $hostname")); $pass = (explode('=', $matches[0]));$password = trimw($pass[1]); mysql_connect("localhost",$user,$password) or die ("could not connect: " . mysql_error());mysql_select_db("mysql");$result = mysql_query("show databases"); $bpath  = "/home/robbin/backup/mysql";$btime  = date("Y-m-d H: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 .= "chmod 644 $myFile ; ";//$bldCmd .= "chown root:root $myFile ; ";$bldCmd .= "gzip -9 $myFile";print "Backing up $myDb\n";print "Securing $myDb\n";$out = `$bldCmd`;}$out = `chmod 700 $bpath/$byear`;print "$out\n";print "Backups are in $bpath\n";

crontab的设置





0  1 * * * /home/robbin/bin/mysql_backup.php

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




top