1. Resource overload (quá tải tài nguyên)
RAM hoặc disk I/O không đủ.
Khi MySQL đọc/ghi nhiều dữ liệu lớn (3 triệu dòng + thêm mới liên tục) thì:
RAM bị ăn hết → MySQL bị kill bởi hệ thống (OOM – Out Of Memory).
Ổ cứng bị nghẽn (I/O Wait cao) → query treo → timeout → crash.
Cách kiểm tra:
htop
, free -m
, iostat
để xem RAM, CPU, Disk I/O lúc chạy nặng.
Xem log MySQL: thường ở /var/log/mysql/error.log
hoặc /var/log/mysqld.log
.
2. InnoDB corruption (lỗi bảng InnoDB)
Nếu bảng bạn dùng engine InnoDB , việc ghi/đọc dày đặc có thể dẫn đến lỗi corrupt bảng (nhất là nếu trước đó shutdown server không đúng cách).
Khi đó MySQL có thể “chết” hoặc tự restart.
Dấu hiệu:
Log có dòng như InnoDB: corruption detected in table
.
Hoặc báo lỗi Error 2013: Lost connection to MySQL server during query
.
3. Lock conflict (xung đột lock)
Nếu bạn đọc và ghi cùng lúc 1 bảng lớn mà không kiểm soát transaction tốt:
Deadlock (chết lock)
Transaction treo → crash.
Cách kiểm tra:
Xem SHOW ENGINE INNODB STATUS\G
để thấy deadlock report.
4. MySQL config yếu (my.cnf)
Mặc định MySQL cài xong rất yếu, chưa tối ưu cho bảng to và ghi/đọc nhanh.
Các tham số cần để ý:
innodb_buffer_pool_size
(bộ nhớ RAM chứa data InnoDB, nên set 50–70% RAM)
innodb_log_file_size
(file log InnoDB, nên tăng nếu ghi nhiều)
max_connections
, thread_cache_size
, query_cache_size
(tuỳ use case).
5. Ổ cứng đầy hoặc lỗi
Nếu /var/lib/mysql
bị đầy disk hoặc lỗi ổ cứng → ghi không được → crash luôn.
Tóm gọn:
Nếu bạn vừa đọc vừa ghi nhiều → MySQL crash có thể do RAM yếu, I/O nghẽn, deadlock, config yếu hoặc lỗi bảng.
Việc cần làm ngay:
Xem log MySQL (/var/log/mysql/error.log
) ngay sau khi crash.
Monitor server lúc chạy nặng (htop
, iotop
, iostat
, dmesg
).
Kiểm tra config (my.cnf
).
Xem lại cách code insert/check (ví dụ có cần thêm chỉ số index
, hoặc batch insert không).
để giảm thiểu lỗi crash khi bảng MySQL lớn và vừa đọc vừa ghi nhiều, mình gợi ý cho bạn một checklist rõ ràng nhé:
1. Tối ưu cấu hình MySQL (my.cnf
)
Để MySQL “khỏe” hơn khi xử lý bảng lớn:
Tăng innodb_buffer_pool_size
→ Set tầm 60%-70% RAM tổng. Ví dụ RAM 8GB thì: innodb_buffer_pool_size = 5G
Tăng innodb_log_file_size
→ Lớn hơn mặc định (ví dụ 512M hoặc 1G) để ghi nhiều đỡ nghẽn: innodb_log_file_size = 512M
Tối ưu max_connections
, thread_cache_size
→ Nếu nhiều connection cùng lúc.
Disable query_cache_size
nếu MySQL 5.7 (vì cache mà nhiều ghi đọc hỗn hợp sẽ bị hại hơn lợi).
2. Tối ưu bảng
Đảm bảo có Index đúng :
Các cột bạn dùng WHERE , JOIN , ORDER BY thì phải có index .
Không có index → MySQL phải scan 3 triệu dòng → nghẽn server.
Chia nhỏ bảng nếu được : Nếu bảng quá to, bạn có thể “partition” hoặc “sharding” nó theo tháng/năm/loại dữ liệu.
3. Giảm tải ghi/đọc
Batch Insert / Update :
Thay vì insert từng dòng một, gom nhiều bản ghi insert 1 lần (bulk insert).
Ví dụ: INSERT INTO table (col1, col2) VALUES (1, 2), (3, 4), (5, 6);
Dùng Transaction khi hợp lý :
Gói nhiều lệnh INSERT/UPDATE vào 1 transaction (BEGIN ... COMMIT
) để giảm lock.
Hạn chế SELECT nặng :
Nếu đang thêm dữ liệu thì đừng query các SELECT * kiểu không cần thiết.
SELECT cần LIMIT hoặc tối ưu (không SELECT tất cả fields).
4. Giám sát server
Dùng mấy tool như:
htop
, iotop
, dstat
(monitor real-time).
Cảnh báo nếu RAM >90%, Load Average > RAM core.
Cài slow query log: slow_query_log = 1 long_query_time = 1 log_queries_not_using_indexes = 1
→ Để xem query nào chậm, query nào không dùng index.
5. Backup + Kiểm tra lỗi
Backup thường xuyên bằng mysqldump
hoặc xtrabackup
.
Check table định kỳ : CHECK TABLE your_table_name;
Nếu có dấu hiệu corrupt → Repair hoặc dump ra import lại.
6. Nếu nghiêm trọng hơn
Có thể cân nhắc:
Dùng Replication : 1 master để ghi, 1 slave để đọc.
Dùng ProxySQL hoặc HAProxy để cân tải.
Nói gọn lại
Việc cần làm Ý nghĩa Tăng innodb_buffer_pool_size
MySQL đọc nhanh hơn Có đủ index Tránh scan bảng Batch insert Ghi nhanh hơn, đỡ lock Theo dõi server Phát hiện nghẽn sớm Slow query log Biết query nào dở