table_open_cache(5.1.3 前稱 table_cache)控制表定義緩存與文件描述符緩存大小,直接影響「打開表」系統調用頻率。本文詳細講解緩存機制、關鍵監控指標、科學調優公式、清空操作與分場景配置建議。
open()/close() 系統調用開銷。table_open_cache,但會觸發額外文件句柄佔用。SHOW GLOBAL STATUS LIKE 'Open%tables'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_tables | 919 | -- 當前緩存中打開的表數 | Opened_tables | 1951 | -- 歷史累計打開表數(含緩存未命中) +---------------+-------+ SHOW VARIABLES LIKE 'table_open_cache'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | table_open_cache | 2048 | +------------------+-------+
# 1. 緩存利用率 Open_tables / table_open_cache <= 0.95 -- 安全區,>0.95 需擴容 # 2. 命中率 Open_tables / Opened_tables >= 0.85 -- 健康,<0.85 需擴容 # 3. 保守擴容法則(推薦生產) # 觀察一周高峰期 Opened_tables 增長量 Δ,設 table_open_cache = 當前 Open_tables + Δ * 1.5
| 場景 | 表數量 | 建議 table_open_cache | 配套 open_files_limit |
|---|---|---|---|
| 小型應用 | < 500 | 2048 (默認) | 10000 |
| 中型應用 | 500 - 5000 | 5000 - 10000 | 30000 - 50000 |
| 大型應用 | 5000 - 50000 | 20000 - 50000 | 100000 - 200000 |
| 超大型(分庫分表) | > 50000 | 100000+ | 500000+ (需內核 ulimit 支撐) |
FLUSH TABLES; -- 關閉所有緩存表,釋放文件句柄 FLUSH TABLES WITH READ LOCK; -- 兼備份用,阻塞所有寫入
table_open_cache × (表定義內存 ~ 4-8KB + 文件句柄),超大值擠佔 Buffer Pool,導致頁命中率下降。ulimit -n、MySQL open_files_limit 必須 ≥ table_open_cache × 3(InnoDB file_per_table),否則報 "Too many open files"。Created_tmp_tables)不佔用 table_open_cache,但佔用文件描述符。#!/bin/bash
mysql -uroot -p'xxx' -e "
SHOW GLOBAL STATUS LIKE 'Open%tables';
SHOW VARIABLES LIKE 'table_open_cache';
SHOW VARIABLES LIKE 'open_files_limit';
" | awk '
/Open_tables/ {open=$2}
/Opened_tables/ {opened=$2}
/table_open_cache/ {cache=$2}
/open_files_limit/ {limit=$2}
END {
hit=open/opened*100;
usage=open/cache*100;
printf "Open_tables=%d Opened_tables=%d Cache=%d Limit=%d\n", open, opened, cache, limit;
printf "Hit Rate=%.1f%% Usage=%.1f%%\n", hit, usage;
if (hit < 85) print "WARN: Hit rate < 85%, consider increase table_open_cache";
if (usage > 95) print "WARN: Cache usage > 95%, consider increase table_open_cache";
}'
將巡檢腳本納入每日 Cron,配合 Prometheus 告警,實現「零驚訝」表緩存運維。