Linux本地异地备份mysql数据

本文记载了 Linux本地异地备份mysql数据 ,使用的是明文存储账号密码,在生产环境中是不安全的做法。建议采用更安全的方式来管理凭据,这里我为了省事,直接把账号密码写到脚本里面,实际生产环境应该使用环境变量或者配置文件来管理账号密码。我用的是root账户,所以不存在权限问题,如遇到权限问题,请查阅相关资料

前置依赖下载(适用于Centos 7)

1
2
3
4
5
sudo yum update
sudo yum install mysql -y
sudo yum install gzip -y
sudo yum install sshpass -y
sudo yum install openssh-clients -y

新建mysql.sh脚本命令

1
vi mysql.sh

粘贴脚本内容

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
#!/bin/bash

# 备份位置
backup_dir='本地备份位置'
# 获取当前时间
current_time=$(date +'%Y-%m-%d_%H%M%S')
# 将 backup_dir 和时间组合起来,再加个后缀
filepath="$backup_dir${current_time}_数据库名称.sql.gz"

# 数据库信息,配置数据库账号密码
s_ip='本地数据库ip'
username='用户名'
password='密码'
source_database='数据库名称'

# 远程服务器信息
remote_ip='远程数据库ip'
remote_username='用户名'
remote_password='密码'
remote_dir='远程备份位置'

# 日志文件
log_file='本地日志存储位置/backup.log'

# 记录日志函数
log() {
echo "$(date +%F%r) $1" | tee -a "$log_file"
}

# 操作开始
log "----------------------- 操作开始 --------------------------------"

# 开始备份
log "开始进行数据备份..."
if mysqldump -h"$s_ip" -P3306 -u "$username" -p"$password" "$source_database" | gzip > "$filepath" 2>/dev/null; then
log "数据备份成功,文件路径: $filepath"
else
log "数据备份失败,请检查配置和网络连接"
exit 1
fi

# 传输备份文件
log "开始传输备份文件到远程服务器..."
if echo "$remote_password" | sshpass -p "$remote_password" scp -o StrictHostKeyChecking=no "$filepath" "${remote_username}@${remote_ip}:${remote_dir}"; then
log "文件传输成功"
else
log "文件传输失败,请检查网络连接和权限"
exit 1
fi

# 完成同步
log "完成同步..."

ps:请确保本地备份位置、远程备份位置和日志存放目录存在

授权脚本权限

1
chmod +x mysql.sh

设置定时器

1
crontab -e

这里会打开一个文件,每一行就是一个定时器,添加mysql备份定时器

1
0 2 * * * 脚本存放位置/mysql.sh   #表示每天凌晨2点执行

cron 在线编辑器

保存并退出

  • 如果你使用的是 vi,按 Esc 键,然后输入 :wq 并按 Enter 保存并退出。
  • 如果你使用的是 nano,按 Ctrl+O 保存文件,然后按 Ctrl+X 退出编辑器。

查看定时器

1
crontab -l

手动执行脚本

1
./mysql.sh

ps:如果你的脚本执行失败,请检查你的脚本是否正确,是否正确配置了数据库账号密码,是否正确配置了备份位置,是否正确配置了远程服务器信息,是否正确配置了日志文件位置,是否正确配置了定时器。如果都正常,请检查是否开放端口访问!