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ở |