第一章|老朋友與新挑戰
在這台正式機上,我的老朋友 MariaDB 5.x 已經陪伴多年。雖然穩定,但隨著專案成長,舊版本的限制愈來愈明顯:
- SQL 語法部分不支援新特性
- 配置文件和現代框架相容性差
- 安全性與效能更新落後
同時,官方已經出到 MariaDB 10/11,而我們的 CentOS 系統又太舊,直接升級 OS 風險高。我必須找到一條安全、可靠的升級路徑。
我決定:容器化 Docker + 升級 MariaDB。這不只是升級,是一次正式機的重生冒險。第二章|盤點與備份
正式機上的資料庫數據多年累積,稍有差錯就可能造成災難。第一步,必須完整備份:
- 移動 ibdata1 檔案到備份主機:
sudo scp /var/lib/mysql/ibdata1 root@192.168.1.100:/root/backup/
- 導出所有資料庫 SQL:
mysqldump -uroot -p --all-databases > full_backup.sql
這一步像是整理舊房子,把寶貴家具打包存放,才能放心進行改造。
第三章|Docker 與 CentOS 的挑戰
老舊 CentOS 無法直接安裝最新 Docker,於是我踩了幾個坑:
- 安裝必要工具:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 添加 Docker 官方倉庫:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安裝最新 Docker:
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
docker --version
Docker Compose 也必須升級到 2.20,老版本 1.18.0 已經不支援很多新語法。安裝新版本後,我發現:
docker-compose --version
# 仍然顯示舊版本
原來是 PATH 的魔法在作怪!最後用符號鏈接解決:
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version # 確認 2.20.0
第四章|建立新 MariaDB 容器
選擇 MariaDB 10.6 作為新容器版本,兼顧舊資料相容性與新功能。
建立資料夾與自訂設定檔:
[mysqld]
innodb_file_per_table = 1
innodb_buffer_pool_size = 1G
innodb_file_format = Barracuda
innodb_strict_mode = OFF
innodb_log_file_size = 512M
啟動容器:
docker run -v /var/docker/mariadb10/data:/var/lib/mysql \
-v /var/docker/mariadb10/config:/etc/mysql/conf.d/ \
-d --name mariadb10.6 \
-e MYSQL_ROOT_PASSWORD=^yhn5tgB \
-p 3306:3306 \
mariadb:10.6.10
第五章|資料導入的挑戰
第一次匯入 SQL,就遇到困難:
mysql -uroot -p -h127.0.0.1 projectdb < backup_20240810.sql > error_log.txt
# plan_apply_file1 報錯
原來,舊 SQL 與新 InnoDB 設定衝突。
解法分三步:
- 使用 INSERT IGNORE 跳過已存在資料:
sed 's/INSERT INTO/INSERT IGNORE INTO/g' backup_20240810.sql > backup_fixed.sql
- 關閉嚴格模式 並增加 log file 大小:
innodb_strict_mode = OFF
innodb_log_file_size = 512M
- 強制匯入:
mysql -uroot -p -h127.0.0.1 projectdb --force < backup_fixed.sql > all_output_log.txt 2>&1
經過兩個小時,資料終於順利匯入。就像搬家完成,舊家具被完好安置在新房裡。
第六章|建立帳號與測試
匯入完成後,建立資料庫帳號並測試應用程式:
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER ON `projectdb`.* TO 'projectdb_user'@'192.168.1.100' IDENTIFIED BY 'your_password';
FLUSH PRIVILEGES;
測試網站連線一切正常,舊 MariaDB 服務停止自啟動,避免衝突。
第七章|心得與建議
- 舊系統 + 舊資料庫 → Docker 容器化 + MariaDB 10,既安全又可控
- 備份與測試是升級的核心,不可省略
- SQL 匯入錯誤常與 InnoDB 設定或舊語法有關,先調整容器設定再匯入
- PATH 與符號鏈接是 Docker Compose 升級中容易忽略的小坑
- 容器化後,資料庫管理、備份、還原都方便許多
這次升級像一場冒險:舊系統的重量很重,但容器化讓我既保護了資料,又能享受現代化管理的便利。














