跳转到帖子
在手机APP中查看

一个更好的浏览方法。了解更多

PHP论坛人

主屏幕上的全屏APP,带有推送通知、徽章等。

在iOS和iPadOS上安装此APP
  1. 在Safari中轻敲分享图标
  2. 滚动菜单并轻敲添加到主屏幕
  3. 轻敲右上角的添加按钮。
在安卓上安装此APP
  1. 轻敲浏览器右上角的三个点菜单 (⋮) 。
  2. 轻敲添加到主屏幕安装APP
  3. 轻敲安装进行确认。

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

精选回复

適用環境

作業系統: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版本






為何使用 full-upgrade 而非 upgrade?

full-upgrade 允許在必要時移除衝突套件,是 Debian 官方建議的升級方式,可避免因依賴衝突導致套件殘留舊版或安裝失敗





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

apt update -y && apt full-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

本帖最后于,由Jack编辑

创建帐户或登录后发表意见

帐户

导航

搜索

搜索

配置浏览器推送通知

Chrome (安卓)
  1. 轻敲地址栏旁的锁形图标。
  2. 轻敲权限 → 通知。
  3. 调整你的偏好。
Chrome (台式电脑)
  1. 点击地址栏中的挂锁图标。
  2. 选择网站设置。
  3. 找到通知选项并调整你的偏好。