最近一直在搭建我自己的專業(yè)開發(fā)工具平臺(https://tools.top),一開始做的功能都是靜態(tài)網(wǎng)頁,寫前端代碼,然后把所有前端代碼掛在到阿里云的OSS上就可以了,最多也就是一些跨域的問題要解決,都很Easy。做小工具的過程中陸續(xù)需要用到服務器端了,比如獲取本地的公網(wǎng)出口IP,這個不提供服務器端是不行的。于是上周寫了個簡單的Java服務器端代碼,嵌入到Docker里面,上傳到阿里云的ACR鏡像中心,然后在我的99塊錢的ECS上把鏡像拖下來,運行也很快,基本很順利也沒啥成本。一直到這周,我覺得我提供的功能已經(jīng)非常多了,可以稍微推廣一下了,必須建立一個用戶反饋渠道,必須做一個留言板,讓用戶把不爽的地方提交上來。這樣必須得弄一個數(shù)據(jù)庫保存用戶的留言,我也好對用戶的留言做回復??戳讼掳⒗镌频腞DS,對于我們這樣的小站長還是比較貴的,最便宜的Serverless也需要一塊一小時,每個月好幾百,我一共才幾個用戶。

華山僅剩一條路了,只能辛苦下我的99塊一年的ECS,在上面跑一個MySql的Docker。我本來想自己構建一個Docker,發(fā)現(xiàn)各種艱辛,耗了我好幾個小時沒有搞定,主要原因是我電腦是蘋果芯片,服務器是X86系統(tǒng),然后各種操作系統(tǒng)內(nèi)核版本和MySql社區(qū)版本的兼容問題,很多錯誤它并不拋出來,排查起來也很耗時了,強烈推薦大家用開源的鏡像就好了,別人把坑踩完了,咱們就不要去踩了。用了阿里云的公共鏡像后,一切都很順利,一上午搞定數(shù)據(jù)庫部署,確認數(shù)據(jù)盤落地在宿主機上,并做了數(shù)據(jù)庫的自動備份,備份文件壓縮后自動上傳到OSS上。所有配置在這兒做個分享吧,分享給其他有類似需要的小站長,也給自己留個備份。
1.在阿里云ACR找到官方調(diào)優(yōu)過的MySql鏡像

2.在ECS上寫一個啟動腳本,注意要把數(shù)據(jù)掛在到宿主機上
在本地建立一個文件夾來掛載Mysql的數(shù)據(jù)文件,不然每次Docker重啟數(shù)據(jù)就會丟失:
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.直接在命令行內(nèi)創(chuàng)建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的用戶只能被本機訪問,如果需要被其他服務器訪問,需要修改監(jiān)聽的地址為本機IP地址:
UPDATE user SET host = '192.168.1.35' WHERE user = 'root' AND host = 'localhost';
6.數(shù)據(jù)自動備份到OSS
咱們自己搭建ECS有一個非常大的隱患就是,一旦ECS無端故障,咱們所有數(shù)據(jù)就丟了,這個是站長們完全不能接受的痛,也是自己搭建MySql和購買的MySql一個非常大的Gap。
那么我們自己來寫一個自動備份所有數(shù)據(jù)到OSS的腳本來避免這樣的情況發(fā)生時,我們能有一條退路。
腳本我全部寫好了,也驗證過了,下面列出來給大家參考:
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.上備份腳本,所有細節(jié)我都備注在腳本中了,大家細讀:
#!/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"
# 建議使用配置文件或環(huán)境變量管理密碼,而非直接寫在腳本中
# 創(chuàng)建備份目錄(如果不存在)
mkdir -p $BACKUP_DIR
cd $BACKUP_DIR
# 執(zhí)行備份命令,把我的數(shù)據(jù)庫所有數(shù)據(jù)全部導出到一個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.寫自動備份腳本定時備份數(shù)據(jù)到OSS,避免災難性后果。
好了,我們利用剩余的ECS資源一分錢不花就擁有了一個MySql實例,對于QPS<1的站長是非常足夠的,完全沒有必要去買Serverless實例。