最近一直在搭建我自己的专业开发工具平台(https://tools.top),一开始做的功能都是静态网页,写前端代码,然后把所有前端代码挂在到阿里云的OSS上就可以了,最多也就是一些跨域的问题要解决,都很Easy。做小工具的过程中陆续需要用到服务器端了,比如获取本地的公网出口IP,这个不提供服务器端是不行的。于是上周写了个简单的Java服务器端代码,嵌入到Docker里面,上传到阿里云的ACR镜像中心,然后在我的99块钱的ECS上把镜像拖下来,运行也很快,基本很顺利也没啥成本。一直到这周,我觉得我提供的功能已经非常多了,可以稍微推广一下了,必须建立一个用户反馈渠道,必须做一个留言板,让用户把不爽的地方提交上来。这样必须得弄一个数据库保存用户的留言,我也好对用户的留言做回复。看了下阿里云的RDS,对于我们这样的小站长还是比较贵的,最便宜的Serverless也需要一块一小时,每个月好几百,我一共才几个用户。
华山仅剩一条路了,只能辛苦下我的99块一年的ECS,在上面跑一个MySql的Docker。我本来想自己构建一个Docker,发现各种艰辛,耗了我好几个小时没有搞定,主要原因是我电脑是苹果芯片,服务器是X86系统,然后各种操作系统内核版本和MySql社区版本的兼容问题,很多错误它并不抛出来,排查起来也很耗时了,强烈推荐大家用开源的镜像就好了,别人把坑踩完了,咱们就不要去踩了。用了阿里云的公共镜像后,一切都很顺利,一上午搞定数据库部署,确认数据盘落地在宿主机上,并做了数据库的自动备份,备份文件压缩后自动上传到OSS上。所有配置在这儿做个分享吧,分享给其他有类似需要的小站长,也给自己留个备份。
1.在阿里云ACR找到官方调优过的MySql镜像
2.在ECS上写一个启动脚本,注意要把数据挂在到宿主机上
在本地建立一个文件夹来挂载Mysql的数据文件,不然每次Docker重启数据就会丢失:
mkdir -p /root/mysql/data
docker stop toptoolsdb
docker run -ti -d --name toptoolsdb --replace \
--privileged="true" \
-v /root/mysql/data:/var/lib/mysql \
--net=host alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/mysql_optimized:20240221-8.0.32-2.3.0 mysql_keentune.sh
3.进入Docker镜像中,修改Root密码
进入docker,找到初始密码
docker exec -it toptoolsdb bash
cat /var/log/mysql/mysqld.log | grep password
2025-08-31T01:55:46.328758Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: lemJGGt6Jw(6
使用刚才找到的初始密码,登录Mysql
mysql -uroot -p
Enter password: (输入刚才找到的临时密码)
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 8.0.32 Source distribution
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
修改root的密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyPassword';
Query OK, 0 rows affected (0.01 sec)
4.直接在命令行内创建DB和Table
修改完密码后,就可以肆意在mysql里面玩耍了,建库建表,搞起。
mysql> create database toptools
-> ;
Query OK, 1 row affected (0.01 sec)
mysql> use toptools
Database changed
mysql> CREATE TABLE message_board (
-> id INT AUTO_INCREMENT PRIMARY KEY,
-> nickname VARCHAR(50) NOT NULL,
-> email VARCHAR(100) NOT NULL,
-> message TEXT NOT NULL,
-> createTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-> reply TEXT,
-> replyTime TIMESTAMP NULL,
-> isRemoved BOOLEAN DEFAULT 0
-> );
Query OK, 0 rows affected (0.04 sec)
mysql> show tables;
+--------------------+
| Tables_in_toptools |
+--------------------+
| message_board |
+--------------------+
1 row in set (0.00 sec)
5. 配置本地MySql可以被其他服务器访问
刚装好的MySql的用户只能被本机访问,如果需要被其他服务器访问,需要修改监听的地址为本机IP地址:
UPDATE user SET host = '192.168.1.35' WHERE user = 'root' AND host = 'localhost';
6.数据自动备份到OSS
咱们自己搭建ECS有一个非常大的隐患就是,一旦ECS无端故障,咱们所有数据就丢了,这个是站长们完全不能接受的痛,也是自己搭建MySql和购买的MySql一个非常大的Gap。
那么我们自己来写一个自动备份所有数据到OSS的脚本来避免这样的情况发生时,我们能有一条退路。
脚本我全部写好了,也验证过了,下面列出来给大家参考:
1.首先我们把ossutil下载好,并且配置好,这块比较简单,我把官方链接给出来,大家自行Try,我也是按照文档一步一步配置好的,一路丝滑,没有坑:https://help.aliyun.com/zh/oss/command-line-tools-ossutil-quickstart?spm=5176.8351553.console-base_help.dexternal.d09f1598H0ekWv&scm=20140722.S_help%40%40%E6%96%87%E6%A1%A3%40%402645016.S_BB1%40bl%2BRQW%40ag0%2BBB2%40ag0%2Bhot%2Bos0.ID_2645016-RL_ossutil%E5%B7%A5%E5%85%B7-LOC_consoleUNDhelp-OR_ser-PAR1_215042b917566155568011181e8e98-V_4-P0_0-P1_0
2.上备份脚本,所有细节我都备注在脚本中了,大家细读:
#!/bin/bash
# 定义变量
BACKUP_DIR="/root/mysql/backup"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
MYSQL_CONTAINER="toptoolsdb"
MYSQL_USER="root"
MYSQL_DATABASE="toptools"
MYSQL_PASSWORD="MyPassWord"
# 建议使用配置文件或环境变量管理密码,而非直接写在脚本中
# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR
cd $BACKUP_DIR
# 执行备份命令,把我的数据库所有数据全部导出到一个sql中
docker exec $MYSQL_CONTAINER mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE > $BACKUP_DIR/backup_$TIMESTAMP.sql
# 压缩备份文件,大家提前yum install zip -y
zip backup_$TIMESTAMP.zip backup_$TIMESTAMP.sql
# 删除非压缩文件
rm backup_$TIMESTAMP.sql -f
# 把压缩备份文件上传到OSS
ossutil cp backup_$TIMESTAMP.zip oss://toptools/backup/backup_$TIMESTAMP.zip
# 把当前目录下七天之前的文件从OSS删除,避免占用太多OSS控件
find ./ -name "*.zip" -type f -mtime +7 | while read -r local_file; do
local_file_cleaned="${local_file#./}"
oss_key="/backup/$(basename "$local_file_cleaned")" # 或另一种方式
ossutil rm "oss://toptools$oss_key"
done
# 删除本地的备份文件,保留最近7天
find ./ -name "*.zip" -type f -mtime +7 -delete
echo "Backup completed at $(date)" >> $BACKUP_DIR/backup.log
到OSS上看下,文件上传上来了,下载下来看一眼也是OK的,然后我们把这个脚本配置到crontab中每天凌晨跑一次就OK了。
小结
通过阿里云的基础设施,我们能快速在ECS上搭建一个可用的MYSQL,按照本教程走,也就半小时就能搞定MYSQL的部署和备份工作:
1.使用官方的MySql镜像,本地跑一份Docker副本,记住把关键文件夹挂载到宿主机上;
2.修改了初始化密码,就可以在Docker里面去使用命令行管理Mysql了;
3.写自动备份脚本定时备份数据到OSS,避免灾难性后果。
好了,我们利用剩余的ECS资源一分钱不花就拥有了一个MySql实例,对于QPS<1的站长是非常足够的,完全没有必要去买Serverless实例。