在 Ubuntu 机器上备份 mySQL 和 SVN 的便捷方法

在 Ubuntu 机器上备份 mySQL 和 SVN 的便捷方法

我在一家小公司担任开发人员,远非 Linux 专家或管理员。尽管如此,我还是设置了一台 Ubuntu 服务器用于文档目的(带 wiki 的 LAMP)和版本控制(SVN)。

我们的其他环境完全基于 Windows。我想备份 SVN 存储库和 mySQL 数据库。为此,我们的管理员在我们的备份服务器上设置了一个共享。

我想要一种方便且简单的方法来打包所有需要的东西(用于恢复 wiki 和 SVN 东西)并将其放在那个共享目录中(定期备份)。

我需要备份什么?

  • SQL 转储
  • SVN 目录
  • ???

我该怎么做呢?

  • 我当然知道如何创建 SQL 转储并将其保存到目录,但是下一步该做什么?

我如何自动执行这些任务?

  • 我知道如何在 Windows 下操作,但不知道如何在 Linux 下操作

答案1

我建议使用该软件包backupninja- 它基本上是一些用于备份各种服务的自动脚本的包装器。我可以使用(我的偏好) duplicityrdiff-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 编写脚本,因为这是我选择的语言,但您可以使用任何您喜欢的脚本语言。无论您选择用什么编写,您最终都会使用相同的工具:

  1. tar——用于创建档案
  2. mysqldump-用于导出数据库
  3. 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`;

答案3

很难说您还需要备份什么。这真的取决于具体情况。这台 Ubuntu 机器是否只有数据库和 SVN 服务器,还是还提供其他服务?

您可以使用以下方式创建 MySQL 转储mysqldump. 作为备份解决方案,我建议表里不一对你来说。作为一个易于配置的前端,你可以使用兼容性这些工具将帮助您将所有数据备份到(可能是签名和加密的)tar 档案中,然后将其上传到 FTP 空间或将其存储在任何其他地方。

要自动化备份过程,您可以查看计划任务

相关内容