主页 > Drupal | 数据库技术 > Drupal数据库备份以及MySQL备份策略

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

PDF版本

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

中小站点简单备份策略

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

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

 #!/bin/bash
 
date #start date
DRUSH_PHP=/bin/php #php path
export DRUSH_PHP
 
drush cron
svn st  sites/default/files/backup_migrate/scheduled/ | grep '^!' | awk '{print $2}' | xargs svn delete --force
svn 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

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


声明: 本站所有文章欢迎转载,所有文章未说明,均属于原创,转载均请注明出处。
本文有效链接: http://www.drupal001.com/2012/09/drupal-mysql-backup/
版权所有: Drupal与高性能网站架构 http://www.drupal001.com


,

评论:4

发表评论
  1. avatar
    回复 xiukun.zhou
    12/11/06

    我也写过类似的脚本。但是比你的可能要简单一些。而且backup_migrate这个模块支持drush 备份 drush bam-backup

  2. avatar
    回复 pianist
    12/11/21

    你备份了一堆db

  3. avatar
    回复 king
    13/01/18

    没有用过BACKUP MANAGER?又在造轮子

  4. avatar
    回复 小天
    13/04/08

    drush archive-dump
    这样不更快

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注


+ 五 = 8

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

引用:0

下面所列的是引用到本博客的链接
Drupal数据库备份以及MySQL备份策略 来自 Drupal与高性能网站架构
顶部