OCS sessions 資料表設定異動

網路與網站相關議題和知識
回覆文章
dtchang
Site Admin
文章: 143
註冊時間: 2017-01-22, 16:54

OCS sessions 資料表設定異動

文章 dtchang » 2025-07-27, 21:11

OCS sessions 資料表設定異動.
由於使用者的session資料儲存太頻繁,對於 SSD 的損傷比較大.
將 sessions 的 engine 由預設的 MyISAM 改成 memory.
一則加速運行速度, 一則 sessions 資料使用量小,佔不了多少記憶體. DB 重啟而造成 sessions 資料丟失也無妨.
針對 sessions 的 SELECT 和 UPDATE 在 ocs 中很頻繁.

雖然網站的訪客少/用戶少, 故運行了7年, SSD 的life time 還有 84%. 機器要換新時, SSD 依然似乎可以再拼一個世代, 但設備老了,還是要換新的才安穩.

修正 sessions 改用 engine=MEMORY 後產生錯誤(16 MB的空間過小):
The tables 'sessions' is full.
由於 my.ini 中並未設定 max_heap_table_size, MySQL 5.7/8.0 預設為 16M, 而使用memory的資料表大小由 MIN(max_heap_table_size, tmp_table_size)
所決定,故試行修改為如下:

代碼: 選擇全部

max_heap_table_size = 128 M
tmp_table_size = 256 M
新增 event schedule, 每日清理

代碼: 選擇全部

DELIMITER $$
DROP EVENT IF EXISTS auto_clean_ocs_sessions;
CREATE EVENT `auto_clean_ocs_sessions`
ON SCHEDULE
    EVERY 1 DAY STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 3 HOUR)
ON COMPLETION PRESERVE
ENABLE
COMMENT '自動清理ocs schema中超過1小時未活動的sessions'
DO
BEGIN
    DELETE FROM `ocs`.`sessions` 
    WHERE `last_used` < UNIX_TIMESTAMP() - 3600;
END$$

DELIMITER ;

--------------

代碼: 選擇全部

2025-07-27T13:11:41.785370Z	   10 Prepare	INSERT INTO sessions
				(session_id, ip_address, user_agent, created, last_used, remember, data)
...
2025-07-27T13:11:41.952373Z	   10 Prepare	UPDATE sessions
				SET
					user_id = ?,
					ip_address = ?,
					user_agent = ?,
					created = ?,
					last_used = ?,
					remember = ?,
					data = ?
				WHERE session_id = ?
...

回覆文章