Skip to content
View in the app

A better way to browse. Learn more.

PHP论坛人

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Debian 13 安裝 MariaDB 11.8、VPS 2C/2G 優化

Featured Replies

適用環境

作業系統:Debian 13

網頁伺服器:Nginx

PHP版本:PHP 8.3.x

VPS規格:2 vCPU / 2GB RAM


-------------
前言
-------------

為何選用 MariaDB 11.8?

MariaDB 11.8 是目前最新的長期支援版本(LTS),相較於 10.11 引入了以下關鍵改進:

改進的 Performance Schema:記憶體用量更低,在 2GB 環境下更為友好

更完善的 JSON 與視窗函數支援:現代 PHP 論壇框架受益明顯

注意:Debian 13 (Trixie) 套件庫內建的 MariaDB 版本仍可能落後官方,強烈建議使用MariaDB 官方 Repository 以確保安裝最新LTS版本










-------------------------------
更新系統並安裝必要工具
-------------------------------

apt update -y && apt upgrade -y


apt install -y curl gnupg lsb-release ca-certificates




-------------------------------------
加入 MariaDB 官方 Repository
-------------------------------------

建立目錄
mkdir -p /etc/apt/keyrings




下載 MariaDB GPG 金鑰

以下這2行一起貼上

curl -fsSL https://mariadb.org/mariadb_release_signing_key.asc \
  | gpg --dearmor -o /etc/apt/keyrings/mariadb.gpg






驗證 GPG 金鑰指紋 (重要,不可跳過)
gpg --show-keys --with-fingerprint /etc/apt/keyrings/mariadb.gpg




預期輸出 (應包含以下指紋)
pub   rsa4096 2016-03-30 [SC]
      177F 4010 FE56 CA33 3630  0305 F165 6F24 C74C D1D8
uid                      MariaDB Signing Key <signing-key@mariadb.org>
sub   rsa4096 2016-03-30 [E]



安全提醒:請將輸出的指紋與 [MariaDB 官方網站](https://mariadb.org/download/) 公告的指紋比對

若指紋不符,請立即停止安裝,該金鑰可能已遭竄改

金鑰驗證是防範供應鏈攻擊 (Supply Chain Attack) 的關鍵步驟,務必執行



-------------------------------------
加入 MariaDB 11.8 Repository 
-------------------------------------

以下這3行一起貼上

echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/mariadb.gpg] \
https://mirror.mariadb.org/repo/11.8/debian trixie main" \
> /etc/apt/sources.list.d/mariadb.list





確認 Repository 設定內容
cat /etc/apt/sources.list.d/mariadb.list




預期輸出:deb [arch=amd64 signed-by=/etc/apt/keyrings/mariadb.gpg] https://mirror.mariadb.org/repo/11.8/debian trixie main








----------------------------------------------------------
鎖定 MariaDB 官方 Repository 優先權(關鍵步驟)
----------------------------------------------------------

這是確保安裝到正確版本最關鍵的步驟,不可略過

若不設定,apt 可能安裝 Debian 內建的舊版本



Pin: origin 的值須與 sources.list.d/mariadb.list 中的鏡像網域一致

本文使用 mirror.mariadb.org,若改用 deb.mariadb.org,請對應修改 Pin 的值



編輯
vi /etc/apt/preferences.d/mariadb.pref



貼上以下內容


Package: *
Pin: origin mirror.mariadb.org
Pin-Priority: 1000




儲存檔案並離開vi編輯器
按 Esc,輸入 :wq,按 Enter





-------------------------------------------
安裝前驗證版本來源 (關鍵步驟)
-------------------------------------------

apt update -y


apt-cache policy mariadb-server



預期輸出 (請確認 Candidate 欄位指向 11.8.x 且來源為 MariaDB 官方 Repository)

mariadb-server:
  Installed: (none)
  Candidate: 1:11.8.7+maria~deb13
  Version table:
     1:11.8.7+maria~deb13 1000
       1000 https://mirror.mariadb.org/repo/11.8/debian trixie/main amd64 Packages
     1:11.8.6+maria~deb13 1000
       1000 https://mirror.mariadb.org/repo/11.8/debian trixie/main amd64 Packages
     1:11.8.6-0+deb13u1 500
        500 http://ftp.sg.debian.org/debian trixie/main amd64 Packages





注意:若 Candidate 顯示的仍是 Debian 內建版本(優先權非 1000),表示 Pin 設定或 Repository 設定有誤,請重新檢查,不要繼續安裝




---------------------------
安裝 MariaDB Server
---------------------------

apt install -y mariadb-server mariadb-client




安裝過程中若出現以下提示

Enable the Feedback plugin and submit anonymous usage information? <Yes> /<No>

請選擇 <No>,正式環境不建議啟用匿名回報,並減少不必要的外部連線





---------------------
確認安裝版本
---------------------


確認版本,預期輸出 11.8.7-MariaDB
mariadb -V



-------------------
安全初始化設定
-------------------

安裝完成後,務必執行安全初始化腳本,移除預設的高風險設定


進行安全性設定

mariadb-secure-installation






Enter current password for root (enter for none)

按 Enter,首次安裝尚未設定密碼





Switch to unix_socket authentication [Y/n] 

切換到 unix_socket 身份驗證 [Y/n]

選 Y,本機連線更安全,即使知道密碼也無法從遠端登入root






Change the root password? [Y/n] 

更改root密碼? [Y/n] 

選 Y,設定一組高強度密碼 (建議20字元以上,含大小寫、數字、符號)








Remove anonymous users? [Y/n] 

移除匿名用戶? [Y/n] 

選 Y,移除匿名用戶,避免未授權存取







Disallow root login remotely? [Y/n] 

禁止root遠端登入? [Y/n] 

選 Y,即使需要遠端管理,也應另建立具有最小必要權限的帳號,而非直接用 root 遠端連線








Remove test database and access to it? [Y/n] 

移除 test 資料庫? [Y/n] 

選 Y,移除測試資料庫,減少攻擊面






Reload privilege tables now? [Y/n] 

立即重新載入權限表? [Y/n] 

選 Y,讓所有變更立即生效





完成後應顯示

All done!  If you've completed all of the above steps, your MariaDB installation should now be secure.

Thanks for using MariaDB!







-----------------
驗證 root 登入
-----------------

初始化完成後,確認可以本機登入


以密碼方式登入
mariadb -u root -p


說明:以 root 系統使用者身份執行時,unix_socket 驗證優先生效,密碼驗證會被略過(不需要輸入密碼)

在  一般使用者  (非 root)身份下,unix_socket 驗證失敗後,才會要求輸入密碼

這比純密碼登入更安全,因為攻擊者即使知道密碼也無法從遠端直接登入 root 帳號




以 unix_socket 免密碼登入(推薦)
sudo mariadb






成功後應顯示 MariaDB [(none)]>   提示符



輸入exit 離開
exit








--------------------------------
MariaDB Client 用戶端設定
--------------------------------

/etc/mysql/mariadb.conf.d/50-client.cnf 是 MariaDB 用戶端 (client) 的設定檔

影響所有透過命令列工具 (mysql、mysqldump、mysqlcheck 等) 發起的連線行為

它不影響 MariaDB 伺服器本身的效能,但正確設定能避免備份失敗、字元集錯誤、連線逾時等常見問題




編輯
vi /etc/mysql/mariadb.conf.d/50-client.cnf



完整替換 為以下內容




# ========================================
# /etc/mysql/mariadb.conf.d/50-client.cnf
# ========================================

[client]

# ── 連線基本設定 ────────────────────────
# 標準 TCP 連接埠 (保持預設即可,除非有多實例需求)
port     = 3306

# 優先使用 Unix Socket (本機連線效能較 TCP 好且更安全)
# 若應用程式與 MariaDB 在同一台機器,請保留此設定
socket = /var/run/mysqld/mysqld.sock


# ── 字元集設定 ─────────────────────────
# utf8mb4 支援完整 Unicode,包含 Emoji (論壇必備)
default-character-set = utf8mb4

[client-mariadb]







儲存檔案並離開vi編輯器
按 Esc,輸入 :wq,按 Enter




-----------------------------------------------
建立慢查詢日誌目錄 (必須在重啟前執行)
-----------------------------------------------

若啟用 slow_query_log,需確保目錄存在且權限正確

務必在重啟 MariaDB 之前執行,否則服務會因無法寫入日誌而啟動失敗



mkdir -p /var/log/mysql


chown mysql:adm /var/log/mysql


chmod 750 /var/log/mysql



注意:此處群組建議使用 adm (Debian慣例的日誌讀取群組),讓一般管理員帳號可透過 adm 群組讀取日誌,而無須使用 root

若無此需求,也可使用 mysql:mysql






--------------------
Server 效能調校
--------------------

以下設定針對 2 vCPU / 2GB RAM VPS 優化,適用於論壇網站


先備份原始設定檔
cp /etc/mysql/mariadb.conf.d/50-server.cnf /etc/mysql/mariadb.conf.d/50-server.cnf.bak


備份後,若調校後出現問題可快速還原

cp /etc/mysql/mariadb.conf.d/50-server.cnf.bak \
    /etc/mysql/mariadb.conf.d/50-server.cnf
systemctl restart mariadb




----------------------------
編輯 Server 設定檔
----------------------------


編輯
vi /etc/mysql/mariadb.conf.d/50-server.cnf



完整替換  為以下內容




# =======================================
# /etc/mysql/mariadb.conf.d/50-server.cnf
# 適用環境:VPS 2 vCPU / 2GB RAM,論壇網站
# =======================================

[server]

[mariadbd]

# ===== 字元集設定 =====
character_set_server = utf8mb4
collation_server = utf8mb4_unicode_ci

# ===== 基本設定 =====
port        = 3306
user        = mysql
pid-file   = /run/mysqld/mysqld.pid
basedir  = /usr
datadir  = /var/lib/mysql
tmpdir   = /tmp

# 關閉反向 DNS 解析,提升連線速度
# 注意:若資料庫帳號是以 hostname 建立 (而非IP),請勿啟用
skip-name-resolve = ON

# 僅允許 localhost 本機連線 (正式環境標準做法)
# 如需遠端連線,請改為 0.0.0.0,並搭配防火牆限制來源IP
bind-address = 127.0.0.1

# ===== 連線與執行緒調校 =====

# 最大同時連線數
# 每條連線約佔 1~2 MB 記憶體
# 2GB 環境建議 80~100;超過後應用端會收到 Too many connections 錯誤
# 搭配連線池 (如 PHP PDO persistent connection) 可有效降低此需求
max_connections = 80

# 連線錯誤次數上限 (超過後該IP暫時被封鎖,執行 FLUSH HOSTS 可解鎖)
max_connect_errors = 100

# 執行緒快取,減少建立/銷毀執行緒的開銷
thread_cache_size = 50

# 開啟檔案數上限 (需與 systemd LimitNOFILE 一致)
open_files_limit = 65535

# 閒置連線超時 (秒):超時後自動斷開,釋放資源
# 設為 8小時 (28800 秒),避免論壇長時間無人使用時連線數堆積
wait_timeout         = 28800
interactive_timeout  = 28800


# ===== 緩衝區設定 =====

# MyISAM 索引緩衝 (純InnoDB環境影響有限)
key_buffer_size = 32M

# 單次封包最大允許大小 (大型資料庫匯入或備份時可視需求提高)
max_allowed_packet = 256M

# 資料表快取數量
table_open_cache = 2048

# 每個session的排序緩衝 (勿設定過大,會乘以連線數佔用記憶體)
sort_buffer_size         = 768K
read_buffer_size         = 768K
read_rnd_buffer_size     = 512K
net_buffer_length        = 8K

# MyISAM 排序緩衝
myisam_sort_buffer_size  = 8M

# 記憶體內暫存表上限
# 若 Created_tmp_disk_tables 數值偏高,可適度調大
tmp_table_size       = 64M
max_heap_table_size  = 64M

explicit_defaults_for_timestamp = ON

# 預設儲存引擎
default_storage_engine = InnoDB

# ===== Binary Log (啟用 PITR / Replication) =====
# Binary Log (binlog) 記錄所有資料變更操作,是主從複製和時間點還原 (PITR) 的基礎
# 若不需要上述功能,可將以下四行全部註解掉,以節省磁碟 I/O 和空間
# 啟用後請務必設定 binlog_expire_logs_seconds,避免磁碟空間耗盡
log_bin = mysql-bin
binlog_format = ROW

# ROW 模式記錄每一列的實際變更,適合主從複製與 PITR,資料一致性最高
# 完整記錄每列所有欄位(before/after),便於 PITR 精確還原
binlog_row_image = FULL
server-id = 1
binlog_expire_logs_seconds = 604800
#過期時間 7天 = 604800 秒

# ===== 錯誤日誌 =====
# 預設由 systemd journald 處理 (journalctl -u mariadb)
# 如需獨立日誌檔案,取消下列註解,並確認目錄已建立且權限正確
# log_error = /var/log/mysql/error.log

# ===== 慢查詢日誌 (效能監控必開) =====
# 記錄執行時間超過 long_query_time (秒) 的查詢,用於找出效能瓶頸
# 目錄 /var/log/mysql 必須在重啟前建立
slow_query_log = ON
slow_query_log_file = /var/log/mysql/mariadb-slow.log
long_query_time = 2

# 同時記錄未使用索引的查詢 (即使執行時間未超過 long_query_time)
log_queries_not_using_indexes = ON
log_slow_verbosity  = query_plan,explain

# ===== 安全設定 =====
# 禁止伺服器向客戶端請求本地檔案,防止資料洩漏
local-infile = 0

# ===== InnoDB 調校 (最重要部分)=====
# Galera Cluster / 多來源複製必須設為 2;單機保持 2 亦無妨
innodb_autoinc_lock_mode = 2

# InnoDB 緩衝池大小 (最重要的效能參數)
# 建議值:實體記憶體的 50%~70%
# 2GB RAM:建議 768M (其餘留給 OS、Nginx、PHP-FPM)
# 設定過大可能導致系統 OOM (記憶體耗盡),請謹慎評估
innodb_buffer_pool_size = 768M

# Redo log
# MariaDB 11.8.x 在此修改為手動管理
# 一般生產環境 256M ~ 1G
innodb_log_file_size = 256M

# Redo log 寫入前的記憶體緩衝 (大量寫入時可適度調大)
innodb_log_buffer_size = 16M

# 交易提交刷寫策略
#   1 = 最安全 (每次交易都刷寫磁碟,正式環境建議值,ACID 完整)
#   2 = 效能較佳 (每秒刷寫一次,斷電可能遺失最後 1 秒的資料)
innodb_flush_log_at_trx_commit = 1

# 減少雙重緩衝,提升 I/O 效能 (SSD優化)
innodb_flush_neighbors = 0

# I/O 容量設定 (依實際SSD規格調整;一般 VPS SSD 建議 200~800)
innodb_io_capacity = 200
innodb_io_capacity_max = 400

# 鎖定等待超時 (超過後自動回滾,避免 Deadlock 長時間佔用資源)
innodb_lock_wait_timeout = 50

# 全文索引最小字數 (論壇搜尋功能)
# ft_min_word_len 適用 MyISAM 引擎
# innodb_ft_min_token_size 適用 InnoDB 引擎
# 設為 2:索引長度 ≥ 2 的詞彙 (中文環境建議設為 2)
# 注意:修改此值後,必須重建所有 FULLTEXT 索引才會生效
# ALTER TABLE your_table DROP INDEX ft_idx, ADD FULLTEXT INDEX ft_idx (col);
ft_min_word_len = 2
innodb_ft_min_token_size = 2

# ===== Performance Schema =====
# 若資源充足可開啟 (額外佔用約 5~10% 記憶體)
# 2GB 環境若資源已緊繃,可視情況保持關閉,改用慢查詢日誌
# performance_schema = ON


# ===== 工具設定 =====

[mariadb-dump]
quick
max_allowed_packet = 256M
# 單次匯出封包最大值,大型資料庫時可視需求提高

[myisamchk]
key_buffer_size  = 20M
sort_buffer_size = 20M
read_buffer      = 2M
write_buffer     = 2M






儲存檔案並離開vi編輯器
按 Esc,輸入 :wq,按 Enter








---------------------------------------
啟用 systemd OOM 保護 (建議)
---------------------------------------

建立 systemd override,降低 MariaDB 在系統記憶體不足時被 OOM Killer 強制終止的機率


建立目錄
mkdir -p /etc/systemd/system/mariadb.service.d


建立
vi /etc/systemd/system/mariadb.service.d/override.conf


貼入以下內容


[Service]

# 降低 MariaDB 被 Linux OOM Killer 殺死的機率
# 分數範圍:-1000(完全豁免)~ 1000(最優先被殺)
# -900 = 高度保護(建議值,保留 -1000 給核心關鍵程序)
OOMScoreAdjust=-900


# 確保檔案描述符上限與 open_files_limit 一致
LimitNOFILE=65535





儲存檔案並離開vi編輯器
按 Esc,輸入 :wq,按 Enter







-------------------------
套用 systemd 設定
-------------------------

套用設定
systemctl daemon-reload




--------------------
驗證設定檔語法
--------------------

在啟動前務必驗證設定檔語法,可避免因語法錯誤導致服務啟動失敗



停止服務  後驗證
systemctl stop mariadb




驗證語法 (MariaDB 10.x / 11.x 均可)
mariadbd --help --verbose > /dev/null



輸出說明:

無任何輸出 → 設定檔完全正確,可以啟動服務

顯示 [Warning] → 有警告,需確認是否影響運作

顯示 [ERROR] → 有錯誤,不可啟動服務,須先修正




確認無誤後再啟動
systemctl start mariadb



確認狀態
systemctl status mariadb






-------------------
確認生效的設定
-------------------

顯示目前生效的所有設定
mariadbd --print-defaults

改為這樣,比較好讀
mariadbd --print-defaults 2>/dev/null | tr ' ' '\n' | grep '^--'





查看所有載入的設定檔路徑
mariadbd --help --verbose 2>/dev/null | grep -A 5 "Default options"




------------------------------------
建立 logrotate (避免日誌爆硬碟)
------------------------------------

若不設定 logrotate,慢查詢日誌在高流量環境下可能在數週內耗盡磁碟空間


建立
vi /etc/logrotate.d/mariadb


貼上以下內容


/var/log/mysql/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 640 mysql adm
    sharedscripts

    postrotate
        if /usr/bin/test -x /usr/bin/mariadb-admin && \
           /usr/bin/mariadb-admin --defaults-extra-file=/etc/mysql/debian.cnf ping &>/dev/null
        then
            /usr/bin/mariadb-admin --defaults-extra-file=/etc/mysql/debian.cnf flush-logs
        fi
    endscript
}






儲存檔案並離開vi編輯器
按 Esc,輸入 :wq,按 Enter



說明:/etc/mysql/debian.cnf 是Debian套件安裝時自動生成的維護帳號憑證,logrotate 透過它執行 flush-logs,無需手動輸入密碼




-------------------------------------------
測試 logrotate 設定 (dry run)
-------------------------------------------

測試 logrotate 設定

logrotate -d /etc/logrotate.d/mariadb


-d 為 dry run 模式,不會實際輪替,僅顯示操作預覽,確認設定無誤




----------------------
確認日誌使用方式
----------------------


確認是否有獨立日誌檔案
ls -lah /var/log/mysql/


查看 systemd journal 日誌
journalctl -u mariadb



說明:若 /var/log/mysql/ 目前是空的,表示 MariaDB 主要使用 journald 記錄日誌,logrotate 設定暫時無效 (等慢查詢日誌有內容後即會生效)



-----------------------
開機自動啟動
-----------------------

開機自動啟動
systemctl enable mariadb


重新啟動
systemctl restart mariadb


檢查狀態,應顯示 Active: active (running)
systemctl status mariadb




-------------------
重開機驗證
-------------------


重開機
reboot



完成所有設定後,重開機是最可靠的驗證方式,確認所有服務能自動恢復正常運作


確認服務狀態,確認狀態為 active (running)
systemctl status mariadb



確認記憶體使用情況 (重要:確保沒有 OOM)
free -h



確認 MariaDB 進程記憶體佔用
ps aux | grep mariadb



確認 MariaDB 監聽的連接埠,應僅顯示 127.0.0.1:3306  (現在不會有監聽,論壇還沒設置)
ss -tlnp | grep mysql





-------------------
資料庫內部驗證
-------------------

登入資料庫
sudo mariadb



在 MariaDB 提示字元下執行



檢查 InnoDB 緩衝池大小(應顯示 805306368,即 768MB)
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';



檢查字元集設定 (均應顯示 utf8mb4)
SHOW VARIABLES LIKE 'character_set%';


SHOW VARIABLES LIKE 'collation%';



確認 Redo log 管理狀態 (手動管理,顯示值 268435456 也就是 256M)
SHOW VARIABLES LIKE 'innodb_log_file_size';




檢查最大連線數(應顯示 80)
SHOW VARIABLES LIKE 'max_connections';



檢查目前連線數
SHOW STATUS LIKE 'Threads_connected';



檢查歷史最大連線數 (用於調整 max_connections 的依據)
SHOW STATUS LIKE 'Max_used_connections';



確認 local-infile 已關閉 (應顯示 OFF)
SHOW VARIABLES LIKE 'local_infile';



確認 skip_name_resolve 已啟用 (應顯示 ON)
SHOW VARIABLES LIKE 'skip_name_resolve';



確認 binlog 已啟用 (若有設定,應顯示 ON)
SHOW VARIABLES LIKE 'log_bin';



確認 bind_address 設定 (應顯示 127.0.0.1)
SHOW VARIABLES LIKE 'bind_address';




離開資料庫
exit





--------------------------------------
安裝 mysqltuner 效能分析工具
--------------------------------------


安裝
apt install -y mysqltuner



執行分析
mysqltuner


使用建議:系統運行  24小時後  再執行分析,數據更具參考價值


mysqltuner 可分析:Buffer Pool 是否不足、查詢效能、臨時表、索引問題、連線數、慢查詢 等



------------------
常見問題與排除
------------------


問題:連線被拒絕 (Connection refused)

可能原因:
bind-address 設定為 127.0.0.1(遠端連線時)
防火牆阻擋
連線數超過限制

解決方法:

檢查 bind-address 設定
grep bind-address /etc/mysql/mariadb.conf.d/50-server.cnf




檢查目前連線數

sudo mariadb -e "SHOW STATUS LIKE 'Threads_connected';"

sudo mariadb -e "SHOW STATUS LIKE 'Max_used_connections';"








問題:密碼錯誤 / 無法登入

解決方法:

以 root 身份免密碼登入
sudo mariadb


重設密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼';
FLUSH PRIVILEGES;
exit



解決方法二:緊急模式(連 sudo mariadb 也無法登入時)

警告:--skip-grant-tables 模式下無任何安全驗證,此期間任何人都可以無密碼登入,操作完畢後務必立即重啟服務

請在安全的環境下操作,切勿在有外部流量的情況下執行


systemctl stop mariadb


以跳過權限表的方式啟動(僅允許本機 socket 連線)
mariadbd --skip-grant-tables --skip-networking &


等待 2 秒讓服務啟動
sleep 2

mariadb -u root



FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼';
exit



停止緊急模式實例,改由 systemd 正常啟動
kill $(pgrep -f skip-grant-tables)
systemctl start mariadb










問題:Too many connections 錯誤

可能原因:
max_connections 設定過低
應用程式未使用連線池
連線未正常關閉(Sleep 連線堆積)



解決方法:

暫時調高連線數 (立即生效,重啟後失效)
sudo mariadb -e "SET GLOBAL max_connections = 150;"



查看所有連線(含 Sleep 狀態)
sudo mariadb -e "SHOW PROCESSLIST;"



批次結束閒置過久的連線
sudo mariadb -e "SHOW PROCESSLIST;" | grep Sleep | awk '{print "KILL "$1";"}' | sudo mariadb



永久調整:修改設定檔 50-server.cnf 中的 max_connections 值,並重啟服務


提示:應用端建議實作連線池(如 PHP PDO persistent connection),可大幅降低連線開銷,

一般論壇在連線池下 max_connections = 80  已綽綽有餘















問題:效能未明顯提升

可能原因:
innodb_buffer_pool_size 設定不足
索引缺失
查詢未最佳化



解決方法:

確認 buffer pool 設定
sudo mariadb -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
sudo mariadb -e "SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';"



計算 Buffer Pool 命中率:

命中率 = (Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads)
         / Innodb_buffer_pool_read_requests × 100%


理想值應大於 99%。若低於此值,表示 Buffer Pool 不足,可考慮增加 innodb_buffer_pool_size(前提是系統有足夠的空閒記憶體)



動態啟用慢查詢日誌 (重啟後失效,建議在設定檔中永久啟用)
sudo mariadb -e "SET GLOBAL slow_query_log = ON;"
sudo mariadb -e "SET GLOBAL long_query_time = 2;"


安裝 pt-query-digest 分析慢查詢
apt install -y percona-toolkit


分析慢查詢日誌
pt-query-digest /var/log/mysql/mariadb-slow.log










問題:設定檔改了但未生效

可能原因:
編輯錯誤的設定檔
未重新啟動服務
設定檔語法錯誤被忽略


解決方法:

確認目前生效的設定
mariadbd --print-defaults

改為這樣,比較好讀
mariadbd --print-defaults 2>/dev/null | tr ' ' '\n' | grep '^--'



找出所有載入的設定檔
mariadbd --help --verbose | grep -A 1 "Default options"


驗證語法 (MariaDB 10.x / 11.x 均可)
mariadbd --help --verbose > /dev/null




強制重新載入
systemctl daemon-reload

systemctl restart mariadb


確認特定參數
sudo mariadb -e "SHOW VARIABLES LIKE '參數名稱';"










------------------------
常用指令速查
------------------------

啟動 MariaDB
systemctl start mariadb


停止 MariaDB
systemctl stop mariadb


重新啟動 MariaDB
systemctl restart mariadb


查看服務狀態
systemctl status mariadb


設定開機自動啟動
systemctl enable mariadb


查看最近 100 行系統日誌
journalctl -u mariadb -n 100



驗證語法 (MariaDB 10.x / 11.x 均可)
mariadbd --help --verbose > /dev/null










顯示目前生效的所有設定
mariadbd --print-defaults


改為這樣,比較好讀
mariadbd --print-defaults 2>/dev/null | tr ' ' '\n' | grep '^--'



以 root 免密碼登入資料庫 (unix_socket)
sudo mariadb


以密碼登入資料庫
mariadb -u root -p


執行安全初始化
mariadb-secure-installation

Edited by Jack

Create an account or sign in to comment

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.