MySQL 本身不支援資料庫級磁碟配額,但可利用 Linux 檔案系統 quota 機制,針對資料庫目錄所屬使用者/群組實施硬性限制。本文提供完整實作流程:分區規劃 → quota 啟用 → 目錄遷移 → 符號連結 → 驗證。
/home,啟用 usrquota/grpquotamysql 使用者,以群組區隔)symlink 映射回 /var/lib/mysql/quota 硬/軟限制# /etc/fstab
/dev/sdb1 /home ext4 defaults,usrquota,grpquota 0 2
# 重新掛載
mount -o remount /home
# 掃描建立 quota 檔案
quotacheck -cug /home
quotaon -v /home
# 以資料庫 db1 為例,使用者 foo
mkdir -p /home/foo/dbs
chown mysql:foo /home/foo/dbs
chmod 3755 /home/foo/dbs # SGID 確保新檔案繼承群組 foo
systemctl stop mysqld
# 備份
cp -avr /var/lib/mysql /root/mysql_backup_$(date +%F)
# 移動目標資料庫
mv /var/lib/mysql/db1 /home/foo/dbs/
chown -R mysql:foo /home/foo/dbs
chmod -R 3755 /home/foo/dbs
# 建立符號連結
ln -s /home/foo/dbs/db1 /var/lib/mysql/db1
systemctl start mysqld
# 設定使用者 foo 硬限制 2GB、軟限制 1.8GB
setquota -u foo 1887436 2097152 0 0 /home # 以 KB 為單位
# 或設定群組 foo 限制
setquota -g foo 1887436 2097152 0 0 /home
# 查看配額
quota -u foo
repquota /home
# 模擬寫入超過限制
mysql -e "USE db1; CREATE TABLE test (data BLOB); INSERT INTO test SELECT REPEAT('x', 1000000) FROM information_schema.columns LIMIT 3000;"
# 應報錯:ERROR 1030 (HY000): Got error 122 from storage engine (磁碟寫入失敗)
#!/bin/bash
# create_tenant_db.sh db_name user_name quota_gb
DB=$1; USER=$2; QUOTA_GB=$3
QUOTA_KB=$((QUOTA_GB * 1024 * 1024))
SOFT_KB=$((QUOTA_KB * 9 / 10))
# 系統使用者 (無登入殼層)
useradd -r -s /sbin/nologin -d /home/$USER $USER
mkdir -p /home/$USER/dbs
chown mysql:$USER /home/$USER/dbs
chmod 3755 /home/$USER/dbs
# 建立資料庫目錄
mkdir /home/$USER/dbs/$DB
chown mysql:$USER /home/$USER/dbs/$DB
# 連結
ln -s /home/$USER/dbs/$DB /var/lib/mysql/$DB
# 設定群組配額
setquota -g $USER $SOFT_KB $QUOTA_KB 0 0 /home
echo "Tenant $USER / $DB created with ${QUOTA_GB}GB quota"
| 議題 | 說明 |
|---|---|
| InnoDB 共享表空間 | innodb_file_per_table=ON (預設開啟) 才能按檔案計算大小,否則共享 ibdata1 無法區隔 |
| 備份/複製檔案 | mysqldump 邏輯備份不受配額限制;xtrabackup 物理備份需目標分區有配額餘裕 |
| 暫存檔/日誌 | tmpdir、slow_query_log_file 等若在配額分區外則不計入 |
| XFS 配額 | XFS 原生專案配額 (xfs_quota) 更強大,不需模擬使用者 |
| 容器化部署 | Docker 卷掛載宿主機配額分區,容器內 MySQL 同樣受限 |
Linux quota + 符號連結方案以 零侵入 MySQL 核心 實現資料庫級磁碟配額。關鍵在於:獨立分區 + 檔案級配額 + SGID 目錄繼承群組 + file_per_table。生產環境建議搭配監控告警 (quota_nld 或腳本輪詢 repquota) 於達到 80% 軟限制時通知擴容或清理。
RedHat Linux "command not found" 環境變量修復方案
Nagios 插件執行報錯:缺少 sysstat 套件導致 check_cpu.sh 失效的解決方案
Linux 開機三大法寶:開機磁碟、Loadlin DOS 引導、NT Loader 多重開機完整圖解
Linux sed 指令進階替換技巧:輸出、原地修改、行範圍、模式範圍、多模式並行
VMware Shared Folders 實現 Windows 宿主機與 Linux 客體機檔案互傳完整設定
Linux Tomcat 叢集配置實戰:Apache + Mod_JK 負載均衡與 Session 複製