查阅了很多文章,踩了很多坑,在这里总结一下:
1.先解决不需要密码的SSH登陆
前提:本地服务器:A, 远程服务器:B
1.1 在本地服务器A上生成rsa证书,运行命令:
ssh-keygen -t rsa
这边输入完会有需要填的信息,分别是文件名称,密码和确认密码,可以不填,回车3次
1.2 cp生成rsa公钥证书到远程服务器B
使用scp命令进行远程复制,将A机生成的id_rsa.pub拷贝到远程服务器B的/root/.ssh目录下
scp /root/.ssh/id_rsa.pub.A root@远程服务器ip:/root/.ssh/
这边要确认B服务器上有无/root/.ssh的目录。可以用 ls -a查看。如果没有,可以运行
ssh localhost
上面的scp命令需要输入密码,当把密钥配对完毕之后,以后本地服务器A使用scp命令复制文件到远程服务器B的话,就不需要再次输入密码。
1.3 密钥配对
当上面将服务器A上的id_rsa.pub 文件copy到了服务器B后,现在我们在 B 的/root/.ssh下创建authorized_keys文件,使用如下命令
touch authorized_keys
通过 cat 命令 把id_rsa.pub 追写到 authorized_keys 文件中
cat id_rsa.pub >> authorized_keys
修改authorized_keys文件的权限
chmod 400 authorized_keys
这个步骤已经完成
在服务A上,再次使用刚才的命令,发现已经可以不需要输入密码。
2. shell脚本
#备份文件后缀时间
time=_` date +%Y_%m_%d_%H_%M_%S `
#需要备份的数据库名称
db_name=name
#mysql 用户名
db_user=root
#mysql 密码
db_pass=root
#备份地址
backupdir=/data/backup_mysql/
# 远程备份服务器 gitlab备份文件存放路径
RemoteBackDir=/home/mysql_backup/
# 远程备份服务器 登录账户
RemoteUser=root
# 远程备份服务器 IP地址
RemoteIP=192.1.1.1
#本地备份路径
localBackDir=${backupdir}"backup_mysql"${time}".sql"
#mysqldump命令使用绝对路径
docker exec -i $(docker ps -qf 'name=k8s_mysql-base-container_mysql') mysqldump -u $db_user -p$db_pass $db_name> $localBackDir
scp $localBackDir $RemoteUser@$RemoteIP:$RemoteBackDir
#删除7天之前的备份文件
find $backupdir -name “*.sql” -type f -mtime +7 -exec rm -rf {} \; > /dev/null 2>&1
这里有个坑,sh文件换行code必须是LF,不能是CR+LF,否则会出现拼接的时候被覆盖的问题。用notepad++可以进行替换,操作方法链接:https://blog.csdn.net/siyubaobao1404/article/details/100325601
3. crontab定时任务
安装部分自行百度。主要说一下使用
crontab -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
crontab -r : 删除目前的时程表
crontab -l : 列出目前的时程表
所以只要crontab -e 输入
00 23 * * * /data/backup_mysql/backup_mysql.sh > /dev/null 2>&1
这个代表每天23点执行,> /dev/null 2>&1代表不送邮件,具体可以自行百度crontab相关语法。
还有个坑,脚本内的 docker exec -it $(docker ps -qf 'name=k8s_mysql-base-container_mysql') mysqldump -u $db_user -p$db_pass $db_name> $localBackDir 得改为 docker exec -i。参考:https://blog.csdn.net/weixin_30569153/article/details/99984488