问题描述
本地数据库一旦所在的当前服务器受损,可能面临无法取回的风险,即使你备份在了本地也没有用。所以我们要想办法将服务器的本地数据库备份并定时传输到另外一个安全的地方,这样做会大大提升数据库的安全性。
业务比较小的情况下,没必要为数据库单独购买一台数据库服务器。如果手头有一台以上闲置或者资源利用率不高的服务器,那么可以按照本文方法充当远程数据库备份盘的角色,一来节约了成本,二来也提升了服务器本地数据库的安全性。
解决方法
在开始之前,为了更好的区分,我们定义一个概念:
- 本地服务器:数据库所在服务器
- 远程服务器:将数据库备份完成后传输的目标服务器,用于备份作用的服务器
思路是这样的:我们做一个计划任务,可以每天或每小时执行(执行频率视情况自行确定),在服务器上备份本地数据库,并将最新的数据库备份文件远程传输给另外一台服务器即可。这样一来,只要两台服务器不同时故障,数据库就100%不会丢失。
注意,这里不建议大家将两台服务器都选择一个供应商甚至一个机房,比如失火了,那么整个机房都遭殃,你如果两台服务器都在一个机房,那么还是有大概率发生数据库丢失事件。这两台服务器如果在不同地区会大大降低同时发生故障的概率。
基于以上思路,我们将借助宝塔,分为以下几步完成计划任务的制作:
1、建立两台服务器的安全连接。
我们推荐使用sshpass工具,具体使用如下,在本地服务器安装sshpass:
apt-get install sshpass # 对于 Debian/Ubuntu 系统
# 或
yum install sshpass # 对于 CentOS/RHEL 系统
2、ssh密钥认证。
生成密钥对(如果还没有生成过),按提示操作,生成公钥和私钥。
ssh-keygen -t rsa -b 2048
将公钥复制到目标服务器,注意,此处的username和0.0.0.0请换成你远程服务器的用户名和IP。按提示输入密码后,公钥将会被复制到目标服务器的 ~/.ssh/authorized_keys 文件中。
ssh-copy-id username@0.0.0.0
3、安装rsync工具。
本地服务器和远程服务器都要安装。先检查服务器是否安装过此工具,如果显示版本则可以跳过。
rsync --version
如果没有安装,请执行以下命令,安装完成后可以再检查一下版本确认是否安装成功:
apt-get update
apt-get install rsync
yum install rsync
sudo -u root bash -c '#!/bin/bash
# 这里是你的备份计划任务存备份文件的目录
SOURCE_DIR="/www/backup/database/mysql/crontab_backup/xxxxx/"
# 改成远程服务器用户名和IP
REMOTE_SERVER="username@0.0.0.0"
# 这里是你要存到的远程数据库的目标文件目录
REMOTE_DIR="/www/backup/xxxxxxxx/"
LOG_FILE="/www/sync_backup.log"
# 找到最新的备份文件
LATEST_BACKUP=$(ls -t "$SOURCE_DIR" | head -n 1)
# 检查是否找到备份文件
if [ -z "$LATEST_BACKUP" ]; then
echo "[$(date +"%F %T")] 没有找到备份文件。" | tee -a "$LOG_FILE"
exit 1
fi
# 完整路径的最新备份文件
LATEST_BACKUP_PATH="${SOURCE_DIR}${LATEST_BACKUP}"
# 将备份文件传输到远程服务器
echo "[$(date +"%F %T")] 开始传输备份文件 ${LATEST_BACKUP} 到远程服务器..." | tee -a "$LOG_FILE"
rsync -avz "$LATEST_BACKUP_PATH" "$REMOTE_SERVER":"$REMOTE_DIR"
if [ $? -eq 0 ]; then
echo "[$(date +"%F %T")] 备份文件传输成功。" | tee -a "$LOG_FILE"
else
echo "[$(date +"%F %T")] 备份文件传输失败。" | tee -a "$LOG_FILE"
exit 1
fi
'