本文记载了 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 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:请确保本地备份位置、远程备份位置和日志存放目录存在
授权脚本权限
设置定时器
这里会打开一个文件,每一行就是一个定时器,添加mysql备份定时器
1
| 0 2 * * * 脚本存放位置/mysql.sh #表示每天凌晨2点执行
|
cron 在线编辑器
保存并退出
- 如果你使用的是
vi
,按 Esc
键,然后输入 :wq
并按 Enter
保存并退出。
- 如果你使用的是
nano
,按 Ctrl+O
保存文件,然后按 Ctrl+X
退出编辑器。
查看定时器
手动执行脚本
ps:如果你的脚本执行失败,请检查你的脚本是否正确,是否正确配置了数据库账号密码,是否正确配置了备份位置,是否正确配置了远程服务器信息,是否正确配置了日志文件位置,是否正确配置了定时器。如果都正常,请检查是否开放端口访问!