ฐานข้อมูลขนาดใหญ่เติบโตเรื่อยๆ ทำให้ดิสก์เต็มและประสิทธิภาพลดลง วิธีแก้: ลบข้อมูลเก่า, แยก Database, เพิ่มดิสก์, หรือ Compress/Defrag Tables
InnoDB: Compression & Optimization
ปัญหา ibdata1 และ ib_log เติบโตไม่รู้จบ
เพิ่มใน my.cnf:
innodb_file_per_table = 1
ขั้นตอนย้ายข้อมูล (ต้อง Backup ก่อน):
mysqldump -u user -p dbname > dump.sql(ทุก DB ยกเว้น mysql, performance_schema)systemctl stop mariadb- เพิ่ม
innodb_file_per_table=1ใน my.cnf - ลบ
ibdata1และib_logfile* systemctl start mariadbmysql -u user -p dbname < dump.sql
ผล: แต่ละ Table จะมีไฟล์ .ibd แยกต่างหาก ibdata1 จะไม่เติบโตเร็ว
บีบอัดตาราง InnoDB (Table Compression)
# ดูขนาดตาราง
SELECT table_name AS "Table", ROUND(((data_length + index_length)/1024/1024),2) AS "Size (MB)"
FROM information_schema.TABLES WHERE table_schema = "your_db" ORDER BY (data_length+index_length) DESC;
# บีบอัด (ต้องเป็น Barracuda File Format)
ALTER TABLE `table_name` ROW_FORMAT=COMPRESSED;
# หรือ KEY_BLOCK_SIZE=8 (สำหรับ Page Compression)
ALTER TABLE `table_name` ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
ตัวอย่าง: ตาราง b_crm_event_relations ลดจาก 26 MB → 11 MB (CPU Load เพิ่มเล็กน้อย)
MyISAM Table Compression
ใช้ myisampack (Read-only หลังบีบอัด):
myisampack -b /var/lib/mysql/test/modx_session
# -b = Backup ตารางเดิมเป็น .OLD
# หลังบีบอัด ต้องรัน: myisamchk -rq /var/lib/mysql/test/modx_session
ผล: 25 MB → 18 MB (Compression ~30%)
Optimize / Defragment Tables
หาตารางที่มี Free Space มาก (Fragmented)
SELECT table_name, ROUND(data_length/1024/1024) AS data_mb, ROUND(data_free/1024/1024) AS free_mb
FROM information_schema.tables
WHERE ROUND(data_free/1024/1024) > 50
ORDER BY free_mb DESC;
รัน OPTIMIZE TABLE
OPTIMIZE TABLE `table1`, `table2`, `table3`;
หรือใช้ mysqlcheck:
mysqlcheck -o database_name -u root -p # Optimize all tables in DB
mysqlcheck -o --all-databases -u root -p # Optimize all DBs
ผลลัพธ์
Free Space → 0, ขนาดตารางลดลง 3-4 เท่า, ขนาด Database รวมลดจาก 2.5 GB → 1.7 GB
ข้อควรระวัง
- Backup ก่อนทุกครั้ง
- OPTIMIZE TABLE จะ Lock Table (ใช้
pt-online-schema-changeสำหรับ Production) - Compression เพิ่ม CPU Load – ใช้เมื่อ Disk เป็นจุดคอขวด
- MyISAM หลัง myisampack จะ Read-only ต้อง Unpack ก่อนเขียนได้