几天前,搭建自己WordPress博客的个人VPS被毁,好在更早前得知Dropbox能运行于Linux VPS上用于备份文件内容,所以本博没有太大损失,除了重搭VPS环境所花的时间。
Dropbox得用https方式来访问,不然的话连接会跟本域名lordong.net一样被重置,另外为了防止域名解析被污染(即DNS污染),建议使用国外的DNS服务器,比如Google的8.8.8.8和8.8.4.4。
Dropbox我就不多说了,通过邀请注册机制可以双方同时增加一定量的免费空间(以前是250MB,现在是500MB),默认是2GB,这是我的邀请:http://db.tt/okeXDNf
因为我已经有了备份,这里主要说我恢复的经过,恢复完了也就完成了备份的准备了。
第一步,通过ssh终端(我用的putty)连到VPS上安装Dropbox,这里是Linux的各个版本:For Linux。如果没有合适的版本或者想直接在VPS上编译安装的话只需要在ssh终端粘帖下面一行即可完成:
[bash]cd ~ && wget -O – “http://www.dropbox.com/download?plat=lnx.x86” | tar xzf -[/bash]
这是32bit的版本,64bit可以在上面的链接找到。
第二步,手动在当前用户的目录下建Dropbox的文件夹,因为我备份的时候是通过目录链接的方式把网站的内容链到Dropbox的同步目录的,所以恢复时需要先链接完再开启同步,这样从Dropbox服务器上恢复的文件直接恢复到网站的目录,命令:
[bash]mkdir ~/Dropbox[/bash]
第三步,使用ln -s命令把网站的目录链到Dropbox目录下,前提是已经安装好网站比如PHP等,我这里的网站部署在/home/www和/home/ssl目录,Dropbox对应的目录是website/www和website/ssl,所以我这样操作:
[bash]cd ~/Dropbox
mkdir website
cd website
ln -s /home/www www
ln -s /home/ssl ssl[/bash]
其它目录也用同样的方法建链接,这样在VPS上不就不会存在多份文件内容了。
第四步,在VPS上第一次运行Dropbox,会在ssh终端上不断的打出一串链接,复制(复制方法是用鼠标选择然后按右键完成拷贝)到本地的浏览器上运行,输入自己Dropbox的帐户和密码完成绑定,绑定成功后按Ctrl+C退出。第一次运行的命令:
[bash]~/.dropbox-dist/dropboxd[/bash]
以后后台运行的命令:
[bash]~/.dropbox-dist/dropbox &[/bash]
第五步,后台运行Dropbox等到数据恢复完成(可以输入top看进程,开始时dropbox进程会占比较多的CPU,等到CPU恢复正常后可以按q退出进程查看界面),进入/home把刚才同步回来的网站目录www和ssl授权给建网站的用户,我这里是www组www用户,使用下面的命令:
[bash]cd /home
chown -R www:www www
chown -R www:www ssl[/bash]
到这里恢复完成,下面补充一下如何自动备份。
第六步,创建自动运行和停止dropbox的bash脚本,把下面的内容写到~/.dropbox-dist/dropbox.sh文件中(我这里是root用户,如果不是这个用户记得改一下对应的目录,没试过相对目录~,不知道行不行):
[bash]#!/bin/sh
start() {
echo starting dropbox
/root/.dropbox-dist/dropbox &
}
stop() {
echo stopping dropbox
pkill dropbox
}
case “$1” in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
esac[/bash]
然后把dropbox.sh设成可以执行:
[bash]chmod +x ~/.dropbox-dist/dropbox.sh[/bash]
第七步,把上面的dropbox.sh添加到计划任务表:
[bash]crontab -e[/bash]
添加的内容:
[bash]30 0 * * * ~/.dropbox-dist/dropbox.sh start >> /dev/null 2>&1
40 0 * * * ~/.dropbox-dist/dropbox.sh stop >> /dev/null 2>&1[/bash]
意思是每天服务器时间0点30分启动dropbox,0点40分停止dropbox,也就是每天只执行一次,每次10分钟,把修改的内容备份就行。
第八步,创建自动备份mysql的数据库脚本,放到需要备份的应用下,比如wordpress目录下,文件名backup.php:
[php]
<?php
header(‘Content-Type:text/html;charset=utf-8’);
header(“Expires: 0″);
header(‘Cache-Control: no-cache, must-revalidate’);
header(‘Pragma: no-cache’);
$host=”localhost”;
$user=”数据库用户名”;
$password=”数据库用户密码”;
$dbname=”数据库名”;
$destination_folder = ‘db/’;
if (!file_exists($destination_folder))
{
mkdir($destination_folder);
}
mysql_connect($host,$user,$password);
mysql_select_db($dbname);
$mysql= “set charset utf8;\r\n”;
$q1=mysql_query(“show tables”);
while($t=mysql_fetch_array($q1)){
$table=$t[0];
$q2=mysql_query(“show create table `$table`”);
$sql=mysql_fetch_array($q2);
$mysql.=$sql[‘Create Table’].”;\r\n\r\n”;
$q3=mysql_query(“select * from `$table`”);
while($data=mysql_fetch_assoc($q3)){
$keys=array_keys($data);
$keys=array_map(‘addslashes’,$keys);
$keys=join(‘`,`’,$keys);
$keys=”`”.$keys.”`”;
$vals=array_values($data);
$vals=array_map(‘addslashes’,$vals);
$vals=join(“‘,'”,$vals);
$vals=”‘”.$vals.”‘”;
$mysql.=”insert into `$table`($keys) values($vals);\r\n”;
}
$mysql.=”\r\n”;
}
$filename=$destination_folder . date(‘YmdH’) . “.sql”;
$fp = fopen($filename, ‘w’);
fputs($fp, $mysql);
fclose($fp);
echo “数据备份成功,生成备份文件” . $filename . “”;
?>
[/php]
第九步,建一个自动运行的cron php脚本,文件名dbcron.php:
[php]
<?php
function doCron($url)
{
if (empty($url))
{
exit(‘请先配置cron.php’);
}
$ch = curl_init($url);
if (isset($_GET[‘echo’]))
{
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
}
if (strstr($url, ‘https://’))
{
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
}
curl_exec($ch);
curl_close($ch);
}
//这里一定要填写正确的地址
doCron(“http://域名/wordpress目录/backup.php”);
?>
[/php]
第十步,把dbcron.php添加到计划任务表,同第七步:
[bash]0 0,12 * * * php /home/www/wordpress目录/dbcron.php >> /dev/null 2>&1[/bash]
意思是服务器时间每天的0点和12点执行一次数据库备份,备份到本地的db目录下,由dropbox同步到Dropbox服务器。
最后,为了安全起见,不允许从外部访问这些备份的sql文件,需要在db目录下新建一个.htaccess文件用于限制浏览器访问,内容如下:
[text]
order allow,deny
deny from all
[/text]
另外,这个db目录下每天会多出两个文件,适当的时候要去删除旧的文件。
Mysql 备份的部分,能不能不导出, 直接把 mysql data 的目录 ln 过来呢?? 备份 mysql data 的目录。 恢复的时候,直接把 mysql data 目录恢复过来,
这样可行吗?
1. 使用mysql做的备份ln到dropbox的备份目录应该可行。
2. data目录直接备份理论上可行,但把data目录的文件还原回去可能mysql不会自动恢复,我觉得应该还有其它相关联的文件,不推荐这样备份。
数据库小,还可以导出备份,数据库大了,导出备份就不现实了~~
现在我想到的: 1 Mysql主从备份(但需要至少2台 VPS)
2 备份 data 目录,不过,备份data目录,不知道会不会出现文件损坏的问题???
WordPress里的数据备份也是用的导出备份的方法,数据量太大了这个方法肯定不太合适,直接通过mysql备份应该不错,最好分开全备份和增量备份,有空了研究一下。
mysql备份的话可以考虑通过计划任务来完成,还是导出到Dropbox的目录下,自动同步就行,不需要增加VPS的。