我在一家小公司担任开发人员,远非 Linux 专家或管理员。尽管如此,我还是设置了一台 Ubuntu 服务器用于文档目的(带 wiki 的 LAMP)和版本控制(SVN)。
我们的其他环境完全基于 Windows。我想备份 SVN 存储库和 mySQL 数据库。为此,我们的管理员在我们的备份服务器上设置了一个共享。
我想要一种方便且简单的方法来打包所有需要的东西(用于恢复 wiki 和 SVN 东西)并将其放在那个共享目录中(定期备份)。
我需要备份什么?
- SQL 转储
- SVN 目录
- ???
我该怎么做呢?
- 我当然知道如何创建 SQL 转储并将其保存到目录,但是下一步该做什么?
我如何自动执行这些任务?
- 我知道如何在 Windows 下操作,但不知道如何在 Linux 下操作
答案1
我建议使用该软件包backupninja
- 它基本上是一些用于备份各种服务的自动脚本的包装器。我可以使用(我的偏好) duplicity
、rdiff-backup
刻录 DVD ISO 等。
sudo apt-get install backupninja rdiff-backup
为了帮助您入门(将指导您设置各个部分):
sudo ninjahelper
这也允许您在备份时添加随机路径。从拯救几台机器的备份中,我发现能够复制已知的 /etc、/srv/http(我保存 web 内容的地方)和数据库转储非常方便。
一旦完成后,唯一的问题是 ninjahelper 坚持要求您在远程机器上设置 root 密码 - 或者手动传输 SSH 密钥(如果您进行远程备份的话):
在本地机器上:
sudo ssh-keygen
sudo scp /root/.ssh/id_dsa.pub [email protected]:backup_key
Ubuntu 默认自带一个备份用户,因此我们添加 SSH 密钥以允许远程登录:
sudo mkdir -p /var/backup/.ssh
sudo mv backup_key /var/backup/.ssh/authorized_keys
sudo chown backup:backup /var/backup/.ssh/authorized_keys
(这是根据记忆写的,所以我可能对具体的命令有点误解……)
答案2
您将需要备份 Wiki 和 SVN 以及数据库的文件。我强烈建议您保留多个备份。如果您只有一个备份,并且每天都要覆盖它,那么一旦数据出现问题,您最终很容易用损坏的数据替换您唯一的备份。我建议采用滚动 7 天备份策略,例如使用周一、周二等备份。这样,在您用损坏的数据替换上一个好的备份之前,您有一周的时间来注意到问题。
到目前为止,最简单的做法是编写自己的备份脚本,然后由 root 的 cron 每晚调用该脚本。我个人使用 Perl 编写脚本,因为这是我选择的语言,但您可以使用任何您喜欢的脚本语言。无论您选择用什么编写,您最终都会使用相同的工具:
- tar——用于创建档案
- mysqldump-用于导出数据库
- SCP/SFTP/rsync - 一旦您使用 tar 和 mysqldump 编译了所需的内容,您就需要这些工具之一将数据推送到另一台机器。
如果有帮助的话,这是我的一个备份脚本的匿名版本:
#!/usr/bin/perl
use strict;
#
# Set up variables
#
my $dbname = 'xxxxx';
my $dbuser = 'xxxxxxx';
my $dbpass = 'xxxxxxx';
my $uploadsDir = '/xxxxxx/blog/wp-content/uploads/';
my $backupLocal = '/home/xxxxx/backup/blog/';
my $baseFolderName = 'blogBackup';
my $backupRemote = 'user@server:~/backup/blog/';
#
# Should never have to edit anything below here
#
#
# Step 1 - get the day of the week and set up the folder to use for the backup
#
my @weekDays = qw(Sun Mon Tue Wed Thu Fri Sat Sun);
my @time = localtime();
my $dayOfWeek = $weekDays[$time[6]];
my $backupFolder = "$baseFolderName-$dayOfWeek";
# if the folder exists, delete it
my $ignore;
if(-e "$backupLocal$backupFolder"){
$ignore = `/bin/rm -rf $backupLocal$backupFolder`;
}
# create the folder
$ignore = `/bin/mkdir $backupLocal$backupFolder`;
#
# Step 2 - do the DB backup
#
$ignore = `/usr/bin/mysqldump -u $dbuser --password=$dbpass $dbname > $backupLocal$backupF
older/database.sql`;
#
# Step 3 - do the uploads dir backup
#
$ignore = `/bin/tar -pczf $backupLocal$backupFolder/uploads.tar.gz $uploadsDir`;
#
# Step 4 - scp the backup to the remote location
#
$ignore = `/usr/bin/scp -r $backupLocal$backupFolder $backupRemote`;