跳至主要内容

附錄: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 componentNo不啟用密碼驗證套件
Change the password for rootNo已設定新密碼,不需再改
Remove anonymous usersYes移除匿名使用者
Disallow root login remotelyNo允許 root 遠端登入(視需求)
Remove test databaseYes移除測試資料庫
Reload privilege tablesYes重新載入權限表

配置遠端連線(選用)

允許遠端連線

編輯 /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

問題:無法連線

  1. 確認 MySQL 服務已啟動
  2. 檢查 bind-address 設定
  3. 確認防火牆允許 3306 埠號
  4. 確認使用者帳戶和權限

問題:中文亂碼

  1. 確認資料庫編碼為 utf8mb4
  2. 確認 JDBC 連線字串包含 characterEncoding=UTF-8
  3. 確認 use_nationalized_character_data=false

相關文件