附錄:MySQL 安裝與配置
本文件說明如何在 Ubuntu 上安裝並配置 MySQL 資料庫以供 AppFuse 應用系統使用。
安裝 MySQL
# 安裝 MySQL Server
sudo apt update
sudo apt install mysql-server -y
# 檢查安裝版本
sudo apt policy mysql-server
預期輸出:
mysql-server:
Installed: 8.0.35-0ubuntu0.22.04.1
Candidate: 8.0.35-0ubuntu0.22.04.1
初始化配置
重要:MySQL 8.x 以後,
lower_case_table_names參數必須在初始化前設定,無法事後變更。
步驟 1:停止 MySQL 並清除資料
sudo systemctl stop mysql
sudo rm -rf /var/lib/mysql/*
步驟 2:修改配置檔
編輯 /etc/mysql/mysql.conf.d/mysqld.cnf,加入以下設定:
[mysqld]
# table identifier 不區分大小寫
lower_case_table_names = 1
# transaction isolation level(與 Oracle 相同預設值)
transaction-isolation = READ-COMMITTED
# 字元編碼(支援完整 UTF-8,包含 4-byte 字元)
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 網路傳輸封包大小(與資料大小相關)
max_allowed_packet = 256M
# 最大連線數(與同時線上人數相關)
max_connections = 200
步驟 3:重新初始化 MySQL
sudo mysqld --defaults-file=/etc/mysql/mysql.conf.d/mysqld.cnf --initialize --user=mysql
步驟 4:啟動 MySQL 並取得暫時密碼
# 啟動 MySQL
sudo systemctl start mysql
# 從日誌取得暫時密碼
sudo grep 'temporary password' /var/log/mysql/error.log
輸出範例:
2024-01-01T00:00:00.000000Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Ab1#Cd2$Ef3%
安全配置
使用暫時密碼執行安全配置:
sudo mysql_secure_installation
依照提示進行設定:
| 設定項目 | 建議值 | 說明 |
|---|---|---|
| Set the password for root | 輸入新密碼 | 設定 root 密碼 |
| VALIDATE PASSWORD component | No | 不啟用密碼驗證套件 |
| Change the password for root | No | 已設定新密碼,不需再改 |
| Remove anonymous users | Yes | 移除匿名使用者 |
| Disallow root login remotely | No | 允許 root 遠端登入(視需求) |
| Remove test database | Yes | 移除測試資料庫 |
| Reload privilege tables | Yes | 重新載入權限表 |
配置遠端連線(選用)
允許遠端連線
編輯 /etc/mysql/mysql.conf.d/mysqld.cnf,註解或移除 bind-address:
# bind-address = 127.0.0.1
建立遠端存取的 root 帳戶
-- 連線 MySQL
mysql -u root -p
-- 建立遠端 root 帳戶
CREATE USER 'root'@'%' IDENTIFIED BY 'your-password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
重啟 MySQL
sudo systemctl restart mysql
建立應用程式資料庫
-- 連線 MySQL
mysql -u root -p
-- 建立資料庫(指定編碼)
CREATE DATABASE appdb
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 建立應用程式專用帳戶
CREATE USER 'appfuse'@'localhost' IDENTIFIED BY 'your-app-password';
GRANT ALL PRIVILEGES ON appdb.* TO 'appfuse'@'localhost';
-- 如需遠端存取
CREATE USER 'appfuse'@'%' IDENTIFIED BY 'your-app-password';
GRANT ALL PRIVILEGES ON appdb.* TO 'appfuse'@'%';
FLUSH PRIVILEGES;
驗證配置
檢查關鍵參數
-- 檢查 table identifier 大小寫設定
SHOW VARIABLES LIKE 'lower_case_table_names';
-- 預期:1
-- 檢查 transaction isolation level
SELECT @@GLOBAL.transaction_isolation;
-- 預期:READ-COMMITTED
-- 檢查字元編碼
SHOW VARIABLES LIKE 'character_set_server';
-- 預期:utf8mb4
-- 檢查排序規則
SHOW VARIABLES LIKE 'collation_server';
-- 預期:utf8mb4_unicode_ci
-- 檢查封包大小
SHOW VARIABLES LIKE 'max_allowed_packet';
-- 預期:268435456 (256MB)
-- 檢查最大連線數
SHOW VARIABLES LIKE 'max_connections';
-- 預期:200
檢查資料庫編碼
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'appdb';
預期結果:
+----------------------------+------------------------+
| DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+----------------------------+------------------------+
| utf8mb4 | utf8mb4_unicode_ci |
+----------------------------+------------------------+
繁體中文相容性測試
-- 建立測試表
CREATE TABLE test_chinese (
id INT AUTO_INCREMENT PRIMARY KEY,
content VARCHAR(100)
) ENGINE=InnoDB;
-- 插入含罕用字的測試資料
INSERT INTO test_chinese (content) VALUES ('大林里𩻸魚堀56-1號');
-- 查詢確認
SELECT * FROM test_chinese;
-- 清理
DROP TABLE test_chinese;
如果「𩻸」顯示正常(非亂碼或問號),表示 UTF-8 4-byte 字元支援正確。
服務管理
# 啟動 MySQL
sudo systemctl start mysql
# 停止 MySQL
sudo systemctl stop mysql
# 重啟 MySQL
sudo systemctl restart mysql
# 檢查狀態
sudo systemctl status mysql
# 設定開機啟動
sudo systemctl enable mysql
# 停用開機啟動
sudo systemctl disable mysql
防火牆設定(選用)
如需允許遠端連線,開放 MySQL 埠號:
sudo ufw allow 3306/tcp
sudo ufw reload
常見問題
問題:忘記 root 密碼
# 停止 MySQL
sudo systemctl stop mysql
# 以 skip-grant-tables 模式啟動
sudo mysqld_safe --skip-grant-tables &
# 連線並重設密碼
mysql -u root
mysql> FLUSH PRIVILEGES;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-password';
mysql> EXIT;
# 重啟 MySQL
sudo systemctl restart mysql
問題:無法連線
- 確認 MySQL 服務已啟動
- 檢查 bind-address 設定
- 確認防火牆允許 3306 埠號
- 確認使用者帳戶和權限
問題:中文亂碼
- 確認資料庫編碼為
utf8mb4 - 確認 JDBC 連線字串包含
characterEncoding=UTF-8 - 確認
use_nationalized_character_data=false