2年目睹40次删库场景,我决定给蘑菇写一个备份脚本
大家好,我是陌溪
最近,在群里经常看到小伙伴的服务器被黑,数据库被删留下一串索要 某币 的信息
目前,无非就是下面几种情况,容易导致服务器被入侵
MySQL:3306 端口,设置弱密码,比如 root root、root 123456
Redis:6379 端口,不设置密码,或弱密码
Docker:2375 端口,不加证书,直接暴露公网
以上几种情况,是目前小白最容易犯的错误,然后导致植入恶意脚本,被挖矿或者删除数据库。
每次看到群友被删库了,陌溪都会默默的打开 Sqlyog,然后对数据库文件进行一次人肉的备份
今天一看,好家伙,已经备份了快 40 次了!也就是在这几年的时间里,目睹了快 40 个小伙伴的数据库被删了!
设置密钥
为了防止蘑菇重蹈覆辙,陌溪决定给蘑菇博客做一个定时备份功能
至于备份的数据存哪里呢?开始想到的是通过邮件发送到自己的邮箱
突然想想这个数据库文件可能比较大,最后可能也不给上传。。
最后,打算将备份好的数据脚本,能够上传到 Gitee 私有仓库中(单个仓库有 500 MB空间)
首先,就需要创建秘钥,用于配置服务器的无密提交,通过下面命令创建秘钥
ssh-keygen -t rsa -C "1595833114@qq.com"
按几次回车,完成秘钥的生成
然后到ssh目录,查看刚刚生成的秘钥
cd ~/.ssh
看下日期, 23:18分,没错就是刚刚生成的
然后我们把 id_rsa.pub 文件的内容拷贝,打开 Gitee 网站
https://gitee.com/profile/sshkeys
添加生成的 public key 添加到仓库中
添加完成后,保存即可,然后回到服务器中,使用下面的命令,测试自己刚刚添加是否成功
ssh -T git@gitee.com
首次使用需要确认并添加主机到本机 SSH 可信列表,回复 yes 即可
然后就会提示成功完成校验,并输出自己的 Gitee 昵称
同时,细心的同学可能还注意到了后面的一句话
but GITEE.COM does not provide shell access.
这是啥意思呢?为了解答大家的疑惑,陌溪特意去搜素了一下
大致意思是:Gitee 不提供 shell(ssh)访问/接入权限。ssh -T 选项的意思为,不分配伪终端。
当你在使用 ssh 协议连接到自己或者其他服务器时,本地终端会显示命令提示符,你可以在上面操作输入命令 Is 等。
所以,这句提示并不是一个错误,而是 Gitee 输出的一句提示语。同样你可以在本地使用 ssh 协议进行 git 相关操作,并提交到 Gitee,没有任何影响。
创建私有仓库
配置完秘钥后,就可以创建我们的私有仓库了,取名 MoguBak
tip:千万记得设置成私有仓库!!不然数据库直接暴露了
配置完成后,选择 SSH 的方式
然后,按照上面的步骤
首先在服务器中,配置我们的 Git 全局信息【上方的信息复制即可】
git config --global user.name "陌溪"
git config --global user.email "1595833114@qq.com"
下载脚本
然后开始下载陌溪的写的备份文件 mysqlBak.zip
链接:https://pan.baidu.com/s/1vA7SnfpZuBqpNXm5kJjasg
提取码:rgh9
解压后得到如下内容
mysqlbackup.sh 备份脚本,用来从 docker 镜像中备份数据
pushGitee.sh 脚本是用来推送数据到 Gitee 的
bak 目录,存储备份的 SQL 脚本
把刚刚下载好的文件,通过xftp工具,丢到 /root/docker-compose/data 目录下
给命令配置执行权限
# 配置执行权限
chmod +x mysqlbackup.sh
chmod +x pushGitee.sh
因为蘑菇的 mysql 是运行在 docker 容器中的,所以我们需要把 mysqlBak 这个目录挂载到 mysql 容器中
# 编辑mysql.yml 文件
/root/docker-compose/yaml/mysql.yml
然后把 mysqlBak 挂载到容器中
version: '3.1'
services:
mysql:
image: registry.cn-shenzhen.aliyuncs.com/mogublog/mysql
restart: always
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: mogu2018
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
ports:
- 3306:3306
volumes:
- ../data/mysql_data:/var/lib/mysql
- ./mysql/init/:/docker-entrypoint-initdb.d/
- ../data/mysqlBak/:/mysqlBak/
networks:
- mogu
networks:
mogu:
external: true
最后,回到 mysqlBak 目录中
cd /root/docker-compose/data/mysqlBak
执行下面命令,初始化仓库
# 初始化仓库
git init
# 将仓库与远程仓库进行关联
git remote add origin git@gitee.com:moxi159753/mogu-bak.git
完事后,执行下面的命令,即可开始进行数据库备份了,同时推送到我们的 Gitee 上
sh pushGitee.sh
pushGitee.sh 代码如下
#!bin/sh
echo start backup mysql
docker exec -i mysql /mysqlBak/mysqlbackup.sh
echo "start push gitee"
# 将全部信息添加到暂存区
git add *
# 提交
git commit -m "commit"
# push到远程层库
git push -u origin master
首先会调用 运行mysql 容器中的 mysqlbackup.sh 脚本,从而开始执行 mysqldump 进行备份数据库
#!bin/bash
dt_now=`date +%Y%m%d`
cd /mysqlBak/bak
mkdir $dt_now
find /mysqlBak/bak/ -mtime +21 -exec rm -rf {} \;(删除超过21天的备份)
echo "start backup mysql" #(备份两个数据库)
mysqldump -uroot -pmogu2018 mogu_blog_business > /mysqlBak/bak/$dt_now/mogu_blog_business.sql
mysqldump -uroot -pmogu2018 mogu_picture > /mysqlBak/bak/$dt_now/mogu_picture.sql
最终将结果输出到容器的 /mysqlBak/bak 目录
同步到Gitee仓库
而刚刚我们已经将容器中的 /mysqlBak 目录挂载到 /root/docker-compose/data/mysqlBak 目录了
所以,最终我们将 mysqlBak 目录进行完整的推送到服务器,从而完成数据的备份
然后去 Gitee 仓库中,即可看到刚刚备份的内容了
最后,点开 bak 目录,可以看到我们所要备份的脚本
设置定时任务
最后一步,只需要开启每天定时同步任务即可,这里就需要用到 crontabs
crond 是 linux 下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与 windows 下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动 crond 进程,crond 进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的 crontab 文件都被保存在 /var/spool/cron 目录中。其文件名与用户名一致。
下面是 crond 的常用命令
# 安装
yum install crontabs
# crond启动命令
systemctl start crond
# 关闭
systemctl stop crond
#开启自启
systemctl enable crond
那么介绍就到这里了,下面我们需要开始创建定时任务了!
首先使用 crontab -e 命令 ,会打开一个创建定时任务的 vi 窗口,在上面输入需要执行脚本的命令,
10 2 * * * sh /root/docker-compose/data/mysqlBak/pushGitee.sh > /root/bak.log 2>&1 &
设置就是每天 2点10分,执行 pushGitee.sh 文件夹下的定时备份脚本,同步我们的数据库到 Gitee 中,再也不怕被删库了
好了,本期的数据库备份教程就到这里了
我是陌溪,我们下期再见
往期推荐
博主就职于字节跳动商业化部门,一直在维护校招笔记仓库 LearningNote「在Gitee上已有 4.5k star,仓库地址 https://gitee.com/moxi159753/LearningNotes」,公众号上的文章也会在此同步更新,欢迎各位小伙伴一起交流学习,回复 「PDF」获取PDF笔记。
同时,想要丰富项目经验的小伙伴,可以参考我维护的开源微服务博客项目:蘑菇博客「 Gitee 官方推荐项目,博客类搜索排名第一,在 Gitee 已有 4.1K star,仓库地址:https://gitee.com/moxi159753/mogu_blog_v2 」。
本公众号申请较晚,暂时没有开通留言功能,欢迎小伙伴们添加我的私人微信 coder_moxi【备注:加群】,我将邀请你加入到蘑菇博客交流群中,欢迎小伙伴们找陌溪一块聊天唠嗑,共同学习进步。最后,如果你觉得本文对你有所帮助,麻烦小伙伴们动动手指给文章点个「赞」和「在看」,非常感谢大家的支持。
点个在看你最好看