SỰ THẬT
Bạn nói bạn đang sử dụng ext4
. Giới hạn kích thước tệp là 16TB. Như vậy, Sample.ibd
không nên đầy đủ.
Bạn nói innodb_data_file_path
là của bạn ibdata1:10M:autoextend
. Do đó, tệp ibdata1 tự nó không có giới hạn về kích thước của nó ngoại trừ từ HĐH.
Tại sao tin nhắn này đến ở tất cả? Lưu ý thông báo là "Bảng ... đã đầy", không phải "Đĩa ... đã đầy". Bảng điều kiện đầy đủ này là từ một quan điểm hợp lý . Hãy nghĩ về InnoDB. Những tương tác nào đang diễn ra?
Tôi đoán là InnoDB đang cố tải 93GB dữ liệu dưới dạng một giao dịch. Nơi sẽ các Table is Full
thông điệp bắt nguồn từ đâu? Tôi sẽ xem xét ibdata1, không phải về kích thước vật lý của nó (mà bạn đã loại trừ), nhưng về mặt giới hạn giao dịch đang đạt được.
Có gì bên trong ibdata1 khi innodb_file_per_table được bật và bạn tải dữ liệu mới vào MySQL?
Những nghi ngờ của tôi cho tôi biết rằng Nhật ký hoàn tác và / hoặc Nhật ký làm lại là đáng trách.
Những bản ghi này là gì? Theo sách
Chương 10: "Công cụ lưu trữ" Trang 203 Đoạn 3,4 nói như sau:
Công cụ InnoDB giữ hai loại nhật ký: nhật ký hoàn tác và nhật ký làm lại. Mục đích của nhật ký hoàn tác là để khôi phục các giao dịch, cũng như hiển thị các phiên bản cũ hơn của dữ liệu cho các truy vấn đang chạy ở cấp độ cách ly giao dịch yêu cầu nó. Mã xử lý nhật ký hoàn tác có thể được tìm thấy trong Storage / innobase / buf / log / log0log.c .
Mục đích của nhật ký làm lại là lưu trữ thông tin sẽ được sử dụng trong phục hồi sự cố. Nó cho phép quá trình phục hồi thực hiện lại các giao dịch có thể hoặc chưa hoàn thành trước khi xảy ra sự cố. Sau khi thực hiện lại các giao dịch đó, cơ sở dữ liệu được đưa đến trạng thái nhất quán. Mã xử lý nhật ký làm lại có thể được tìm thấy trong Storage / innobase / log / log0recv.c .
PHÂN TÍCH
Có 1023 Nhật ký hoàn tác bên trong ibdata1 (Xem Phân đoạn quay lại và Hoàn tác không gian) . Vì nhật ký hoàn tác giữ các bản sao dữ liệu khi chúng xuất hiện trước khi tải lại, tất cả 1023 Nhật ký hoàn tác đã đạt đến giới hạn. Từ góc độ khác, tất cả 1023 Nhật ký hoàn tác có thể được dành riêng cho một giao dịch tải Sample
bảng.
NHƯNG ...
Có lẽ bạn đang nói "Tôi đang tải một Sample
bàn trống ". Nhật ký hoàn tác có liên quan như thế nào? Trước khi Sample
bảng được tải với 93GB dữ liệu, nó trống. Đại diện cho mỗi hàng không tồn tại phải chiếm một số không gian lưu trữ trong Nhật ký hoàn tác. Việc lấp đầy 1023 Nhật ký hoàn tác có vẻ tầm thường với lượng dữ liệu đổ vào ibdata1
. Tôi không phải là người đầu tiên nghi ngờ điều này:
Từ Tài liệu MySQL 4.1, lưu ý Posted by Chris Calender on September 4 2009 4:25pm
:
Lưu ý rằng trong 5.0 (trước 5.0,85) và trong 5.1 (trước 5.1,38), bạn có thể nhận được lỗi "bảng đầy" đối với bảng InnoDB nếu InnoDB hết các vị trí hoàn tác (lỗi # 18828).
Đây là báo cáo lỗi cho MySQL 5.0: http://bugs.mysql.com/orms.php?id=18828
BỀN VỮNG
Khi bạn tạo mysqldump của Sample
bảng, vui lòng sử dụng --no-autocommit
mysqldump --no-autocommit ... mydb Sample > Sample.sql
Điều này sẽ đặt một rõ ràng COMMIT;
sau mỗi INSERT
. Sau đó, tải lại bảng.
Nếu điều này không hiệu quả ( bạn sẽ không thích điều này ), hãy làm điều này
mysqldump --no-autocommit --skip-extended-insert ... mydb Sample > Sample.sql
Điều này sẽ làm cho mỗi INSERT chỉ có một hàng. Mysqldump sẽ lớn hơn nhiều (lớn hơn 10 lần) và có thể mất 10 đến 100 lần để tải lại.
Trong cả hai trường hợp, điều này sẽ giúp Nhật ký hoàn tác không bị ngập nước.
Hãy thử một lần !!!
CẬP NHẬT 2013-06 / 03 13:05 EDT
BỔ SUNG
Nếu bảng hệ thống InnoDB (còn gọi là ibdata1) đạt giới hạn kích thước tệp và Nhật ký hoàn tác không thể được sử dụng, bạn có thể thêm một không gian bảng hệ thống khác (ibdata2).
Tôi vừa gặp tình huống này chỉ hai ngày trước. Tôi đã cập nhật bài đăng cũ của mình với những gì tôi đã làm: Xem Thiết kế cơ sở dữ liệu - Tạo nhiều cơ sở dữ liệu để tránh sự đau đầu về giới hạn về kích thước bảng
Về bản chất, bạn phải thay đổi innodb_data_file_path để chứa tệp không gian bảng hệ thống mới. Hãy để tôi giải thích làm thế nào:
PHONG CÁCH
Trên đĩa (ext3), máy chủ của khách hàng của tôi có các mục sau:
[root@l*****]# ls -l ibd*
-rw-rw---- 1 s-em7-mysql s-em7-mysql 362807296 Jun 2 00:15 ibdata1
-rw-rw---- 1 s-em7-mysql s-em7-mysql 2196875759616 Jun 2 00:15 ibdata2
Các thiết lập là
innodb_data_file_path=ibdata1:346M;ibdata2:500M:autoextend:max:10240000M
Lưu ý rằng ibdata2
đã tăng lên đến 2196875759616 2145386484M
.
Tôi đã phải nhúng kích thước tập tin ibdata2
vào innodb_data_file_path và thêmibdata3
innodb_data_file_path=ibdata1:346M;ibdata2:2196875759616;ibdata3:10M:autoextend
Khi tôi khởi động lại mysqld, nó hoạt động:
[root@l*****]# ls -l ibd*
-rw-rw---- 1 s-em7-mysql s-em7-mysql 362807296 Jun 3 17:02 ibdata1
-rw-rw---- 1 s-em7-mysql s-em7-mysql 2196875759616 Jun 3 17:02 ibdata2
-rw-rw---- 1 s-em7-mysql s-em7-mysql 32315015168 Jun 3 17:02 ibdata3
Trong 40 giờ, ibdata3
tăng lên 31G. MySQL đã một lần nữa hoạt động.