中小站点简单备份策略
基于drupal的中小行网站,我们可以使用backup_migrate模块,该模块提供了定期备份的功能,备份的时间、保留多少个备份等等设置,设置好之后,定期执行cron即可备份成功。 一般的Drupal小站,我们只需使用svn即可,在服务器端,我们把备份好的数据提交到svn,就可以达到备份的目的。由于Drupal的备份模块可以设置备份保留的文件份数,因此不会造成太多的备份文件,从而导致svn很大。
下面是一个简单的备份脚本,放置到站点根目录,然后加到crontab每天执行即可。
1
2
3
4
5
6
7
8
9
10
11
|
#!/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示例代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
#!/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 $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
此外我们需要把备份的数据还要定期传送到其他服务器上,才会避免服务器崩溃而引发数据丢失。备份及时网站才有保证,这里仅仅只是笔者的一点点操作分享,大家有更好的备份策略,欢迎共享。