Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

利用 Linux quota 為 MySQL 實作資料庫級磁碟配額限制

編輯:Linux 教學

MySQL 本身不支援資料庫級磁碟配額,但可利用 Linux 檔案系統 quota 機制,針對資料庫目錄所屬使用者/群組實施硬性限制。本文提供完整實作流程:分區規劃 → quota 啟用 → 目錄遷移 → 符號連結 → 驗證。

架構原理

  • 建立獨立分區掛載於 /home,啟用 usrquota/grpquota
  • 為每個資料庫建立專屬系統使用者 (或共用 mysql 使用者,以群組區隔)
  • 將資料庫目錄移至配額分區,以 symlink 映射回 /var/lib/mysql/
  • 對使用者/群組設定 quota 硬/軟限制

實作步驟

1. 分區與掛載配額

# /etc/fstab
/dev/sdb1  /home  ext4  defaults,usrquota,grpquota  0  2

# 重新掛載
mount -o remount /home

# 掃描建立 quota 檔案
quotacheck -cug /home
quotaon -v /home

2. 建立資料庫專屬目錄與權限

# 以資料庫 db1 為例,使用者 foo
mkdir -p /home/foo/dbs
chown mysql:foo /home/foo/dbs
chmod 3755 /home/foo/dbs  # SGID 確保新檔案繼承群組 foo

3. 遷移現有資料庫 (停機操作)

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

4. 設定磁碟配額

# 設定使用者 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

5. 驗證測試

# 模擬寫入超過限制
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% 軟限制時通知擴容或清理。

Copyright © Windows教程網 All Rights Reserved