由於使用者的session資料儲存太頻繁,對於 SSD 的損傷比較大.
將 sessions 的 engine 由預設的 MyISAM 改成 memory.
一則加速運行速度, 一則 sessions 資料使用量小,佔不了多少記憶體. DB 重啟而造成 sessions 資料丟失也無妨.
針對 sessions 的 SELECT 和 UPDATE 在 ocs 中很頻繁.
雖然網站的訪客少/用戶少, 故運行了7年, SSD 的life time 還有 84%. 機器要換新時, SSD 依然似乎可以再拼一個世代, 但設備老了,還是要換新的才安穩.
修正 sessions 改用 engine=MEMORY 後產生錯誤(16 MB的空間過小):
由於 my.ini 中並未設定 max_heap_table_size, MySQL 5.7/8.0 預設為 16M, 而使用memory的資料表大小由 MIN(max_heap_table_size, tmp_table_size)The tables 'sessions' is full.
所決定,故試行修改為如下:
代碼: 選擇全部
max_heap_table_size = 128 M
tmp_table_size = 256 M
代碼: 選擇全部
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 = ?
...