萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> 小型Drupal數據庫備份以及大型站點MySQL備份策略教程

小型Drupal數據庫備份以及大型站點MySQL備份策略教程

為了防止web服務器出現故障而引起的數據丟失,數據庫備份顯得非常重要,以免出現重大損失。本文分析研究一下小型的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 = "[email protected]";
$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 $myDbn";
        print "Securing $myDbn";
        $out = `$bldCmd`;
}
$out = `chmod 700 $bpath/$byear`;
print "$outn";
print "Backups are in $bpathn";



crontab的設置

 代碼如下 復制代碼
0  1 * * * /home/robbin/bin/mysql_backup.php



此外我們需要把備份的數據還要定期傳送到其他服務器上,才會避免服務器崩潰而引發數據丟失。備份及時網站才有保證,這裡僅僅只是筆者的一點點操作分享,大家有更好的備份策略,歡迎共享。

copyright © 萬盛學電腦網 all rights reserved