Docker Mysql备份推送至Gitee
文章摘要
文章针对服务器因MySQL、Redis、Docker弱密码被黑导致数据库被删的问题,提出了通过生成SSH密钥、配置Gitee私有仓库、编写备份脚本并设置定时任务,实现数据库自动备份到Gitee的解决方案,以确保数据安全。
大家好,我是**陌溪** 最近,在群里经常看到小伙伴的服务器被黑,数据库被删留下一串索要 **某币** 的信息 目前,无非就是下面几种情况,容易导致服务器被入侵 * **MySQL**:**3306** 端口,设置弱密码,比如 root root、root 123456 * **Redis**:**6379** 端口,不设置密码,或弱密码 * **Docker**:**2375** 端口,不加证书,直接暴露公网 以上几种情况,是目前小白最容易犯的错误,然后导致植入恶意脚本,被挖矿或者删除数据库。 每次看到群友被删库了,陌溪都会默默的打开 **Sqlyog**,然后对数据库文件进行一次人肉的备份 ![](https://oss.120120.top/blog/2024/01/08/7371676a246343b09a28d8d91909480d.png) 蘑菇人肉备份 今天一看,好家伙,已经备份了快 **40** 次了!也就是在这几年的时间里,目睹了快 **40** 个小伙伴的数据库被删了! 设置密钥 ---- 为了防止蘑菇重蹈覆辙,陌溪决定给蘑菇博客做一个定时备份功能 至于备份的数据存哪里呢?开始想到的是通过邮件发送到自己的邮箱 突然想想这个数据库文件可能比较大,最后可能也不给上传。。 最后,打算将备份好的数据脚本,能够上传到 **Gitee** 私有仓库中(单个仓库有 **500** MB空间) 首先,就需要创建秘钥,用于配置服务器的无密提交,通过下面命令创建秘钥 ```java ssh-keygen -t rsa -C "1595833114@qq.com" ``` 按几次回车,完成秘钥的生成 ![](https://oss.120120.top/blog/2024/01/08/cc0786c6aa1a468d902aa665ae681d57.png) 生成秘钥 然后到ssh目录,查看刚刚生成的秘钥 ```java cd ~/.ssh ``` 看下日期, 23:18分,没错就是刚刚生成的 ![](https://oss.120120.top/blog/2024/01/08/74c7b41f748147db98ebe5f9a2562ee2.png) 获取秘钥 然后我们把 **id\_rsa.pub** 文件的内容拷贝,打开 **Gitee** 网站 ```java https://gitee.com/profile/sshkeys ``` 添加生成的 **public key** 添加到仓库中 ![](https://oss.120120.top/blog/2024/01/08/b265bf3725654559bbbc0ab560b9a025.png) 配置秘钥 添加完成后,保存即可,然后回到服务器中,使用下面的命令,测试自己刚刚添加是否成功 ```java ssh -T git@gitee.com ``` 首次使用需要确认并添加主机到本机 **SSH** 可信列表,回复 **yes** 即可 ![](https://oss.120120.top/blog/2024/01/08/65e9f8a4b000436a84f188b7e9f970aa.png) 建立可信访问 然后就会提示成功完成校验,并输出自己的 **Gitee** 昵称 同时,细心的同学可能还注意到了后面的一句话 ```java but GITEE.COM does not provide shell access. ``` 这是啥意思呢?为了解答大家的疑惑,陌溪特意去搜素了一下 大致意思是:**Gitee** 不提供 **shell(ssh)**访问/接入权限。**ssh -T** 选项的意思为,不分配伪终端。 当你在使用 **ssh** 协议连接到自己或者其他服务器时,本地终端会显示命令提示符,你可以在上面操作输入命令 **Is** 等。 所以,这句提示并不是一个错误,而是 **Gitee** 输出的一句提示语。同样你可以在本地使用 **ssh** 协议进行 **git** 相关操作,并提交到 **Gitee**,没有任何影响。 创建私有仓库 ------ 配置完秘钥后,就可以创建我们的私有仓库了,取名 **MoguBak** > tip:千万记得设置成私有仓库!!不然数据库直接暴露了 ![](https://oss.120120.top/blog/2024/01/08/d77e94c646bd4d1ea492c576317661f8.png) 创建备份仓库 配置完成后,选择 **SSH** 的方式 ![](https://oss.120120.top/blog/2024/01/08/d0b530dbfd4243308a8d68c5efe2a96a.png) SSH方式拉取仓库 然后,按照上面的步骤 首先在服务器中,配置我们的 **Git** 全局信息【上方的信息复制即可】 ```java git config --global user.name "陌溪" git config --global user.email "1595833114@qq.com" ``` 下载脚本 ---- 然后开始下载陌溪的写的备份文件 **mysqlBak.zip** > 链接:https://pan.baidu.com/s/1vA7SnfpZuBqpNXm5kJjasg > 提取码:rgh9 解压后得到如下内容 ![](https://oss.120120.top/blog/2024/01/08/2347c89b167c433483285ea7f55b6636.png) 备份脚本 * **mysqlbackup.sh** 备份脚本,用来从 **docker** 镜像中备份数据 * **pushGitee.sh** 脚本是用来推送数据到 **Gitee** 的 * **bak** 目录,存储备份的 **SQL** 脚本 把刚刚下载好的文件,通过xftp工具,丢到 **/root/docker-compose/data** 目录下 给命令配置执行权限 ```java # 配置执行权限 chmod +x mysqlbackup.sh chmod +x pushGitee.sh ``` 因为蘑菇的 **mysql** 是运行在 **docker** 容器中的,所以我们需要把 **mysqlBak** 这个目录挂载到 **mysql** 容器中 ```java # 编辑mysql.yml 文件 /root/docker-compose/yaml/mysql.yml ``` 然后把 **mysqlBak** 挂载到容器中 ```java 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** 目录中 ```java cd /root/docker-compose/data/mysqlBak ``` 执行下面命令,初始化仓库 ```java # 初始化仓库 git init  # 将仓库与远程仓库进行关联 git remote add origin git@gitee.com:moxi159753/mogu-bak.git ``` 完事后,执行下面的命令,即可开始进行数据库备份了,同时推送到我们的 **Gitee** 上 ```java sh pushGitee.sh ``` pushGitee.sh 代码如下 ```java #!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 进行备份数据库 ```java #!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** 目录进行完整的推送到服务器,从而完成数据的备份 ![](https://oss.120120.top/blog/2024/01/08/183afd8b24c44942ad1dfa10b3898ebf.png) 同步到Gitee 然后去 **Gitee** 仓库中,即可看到刚刚备份的内容了 ![](https://oss.120120.top/blog/2024/01/08/a9a2c002fb3942538479f5d54c2bd635.png) 同步Gitee成功 最后,点开 **bak** 目录,可以看到我们所要备份的脚本 ![](https://oss.120120.top/blog/2024/01/08/2f6fa81d89ef44249a141bb99743e042.png) 备份成功后的数据库脚本 设置定时任务 ------ 最后一步,只需要开启每天定时同步任务即可,这里就需要用到 **crontabs** **crond** 是 **linux** 下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与 **windows** 下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动 **crond** 进程,**crond** 进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。 用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 **crontab** 工具来定制自己的计划任务。所有用户定义的 **crontab** 文件都被保存在 **/var/spool/cron** 目录中。其文件名与用户名一致。 下面是 **crond** 的常用命令 ```java # 安装 yum install crontabs # crond启动命令 systemctl start crond # 关闭 systemctl stop crond #开启自启 systemctl enable crond ``` 那么介绍就到这里了,下面我们需要开始创建定时任务了! 首先使用 **crontab -e** 命令 ,会打开一个创建定时任务的 **vi** 窗口,在上面输入需要执行脚本的命令, ```java 10 2 * * * sh /root/docker-compose/data/mysqlBak/pushGitee.sh > /root/bak.log  2>&1 & ``` 设置就是每天 **2点10分**,执行 **pushGitee.sh** 文件夹下的定时备份脚本,同步我们的数据库到 **Gitee** 中,再也不怕被删库了 好了,本期的数据库备份教程就到这里了 ### Docker使用mysqldump命令备份导出mysql容器中的数据 1、查看Docker中运行的容器 \[root@instance-0pk09gjj ~\]# docker ps ![](https://oss.120120.top/blog/2024/01/08/88c75f5dbed64361a06347ef87f9b08b.png) 2、使用mysqldump命令备份导出数据库中的所有表结构和数据 \[root@instance-0pk09gjj home\]# mkdir bak ![](https://oss.120120.top/blog/2024/01/08/c8cf227e29eb4ac388cbd2bdc51cf915.png) \[root@instance-0pk09gjj /\]# docker exec -it mysql01 mysqldump -uroot -proot demo > /home/bak/demo.sql ![](https://oss.120120.top/blog/2024/01/08/417beb37ed7442be8dd674f15cd6fa0a.png) 3、使用mysqldump只导出数据不导出表结构 \[root@instance-0pk09gjj /\]# docker exec -it mysql01 mysqldump --opt -t -uroot -proot demo > /home/bak/demo2.sql ![](https://oss.120120.top/blog/2024/01/08/69ab4f4a9ad94c2f8464909e4bda7756.png) 4、使用mysqldump只导出表结构不导出数据 \[root@instance-0pk09gjj /\]# docker exec -it mysql01 mysqldump --opt -d -uroot -proot demo > /home/bak/demo1.sql ![](https://oss.120120.top/blog/2024/01/08/e422392b13524ad6a5218b874ea920ad.png) 5、使用mysqldump导出特定表的结构 \[root@instance-0pk09gjj /\]# docker exec -it mysql01 mysqldump -uroot -proot -B demo --table playmath\_user > /home/bak/playmath\_user.sql ![](https://oss.120120.top/blog/2024/01/08/2ed5a170a7d54df39e919c12b80cd2be.png) Docker执行导入(恢复)数据库命令: \[root@instance-0pk09gjj ~\]# docker exec -i mysql01 mysql -uroot -proot playmath\_sso < /home/bak/playmath\_sso.sql ![](https://oss.120120.top/blog/2024/01/08/277800abf2eb489b9811ae0cfd6d9de6.png) docker exec -it mysql\_2 mysqldump -uroot -p123456 admin > /home/bak/admin.sql ```java 导出数据库,表结构和数据 mysqldump -u root -p admin > C:\kakeiinput.sql 导出存储过程和函数 mysqldump -R -ndt admin -u root -p > C:\prorandfunc.sql 导出事件 mysqldump -E -ndt admin -u root -p > C:\events.sql 导出触发器 mysqldump -triggers admin -u root -p > C:\triggers.sql ``` admin 库名 导出的.sql文件直接导入时会报错,打开.sql文件,将开头两行删去既可 导出单个表的数据 ```java docker exec -it mysql mysqldump -uroot -pertfdswf359s3F15s2 accountsdb --table accountsinfo > /home/admin.sql ``` 本文转自 [https://blog.csdn.net/muriyue6/article/details/82848358](https://blog.csdn.net/muriyue6/article/details/82848358),如有侵权,请联系删除。 本文转自 [https://mp.weixin.qq.com/s/fK4\_\_GPFv2gSSj58xVozgg](https://mp.weixin.qq.com/s/fK4__GPFv2gSSj58xVozgg),如有侵权,请联系删除。
作者头像
admin
分享技术与生活
打赏作者

评论

暂无评论,快来抢沙发吧~