2012-04-27 22 views
7

Tôi có một db mysql. Tôi dùng innodb. 0ne bảng của tôi chứa nhiều hơn 10 cột. Cột cuối cùng có một loại LONGTEXT và nó được cho là chứa mã html. Vấn đề là, đối với mỗi bản ghi, trường đó không conatin mã đầy đủ và nó luôn dừng sau cùng một số lượng ký tự. Trọng lượng của các tệp html tôi cố gắng chèn vào khoảng 60KO. Vì vậy, tôi đoán mỗi bản ghi của tôi vượt quá giới hạn kích thước hàng của mysql (66KO). Những gì tôi muốn biết là nếu có một số cách để mở rộng giới hạn đó. Bất kỳ cách giải quyết nào cũng sẽ được đánh giá cao. Cảm ơn trước cho các đầu vào. Chúc mừng. MarcMYSQL - Cách khắc phục giới hạn kích thước hàng 66 KBytes

Trả lời

1

Không có cách nào để mở rộng giới hạn này, vì nó không phụ thuộc vào công cụ lưu trữ nhưng nó là một hard limit on the server:

Mỗi bảng (bất kể công cụ lưu trữ) có kích thước hàng tối đa là 65,535 byte. Động cơ lưu trữ có thể đặt thêm các giới hạn về giới hạn này, giảm kích thước hàng tối đa hiệu quả.

Trong trường hợp này, các giải pháp sẽ xoay quanh trì hoãn việc lưu trữ HTML sang một số nơi khác - trên hệ thống tệp hoặc trên đám mây (S3) và sau đó tham chiếu đến tên tệp trong cột bảng.

+5

Giới hạn này không áp dụng cho các loại 'BLOB' và' TEXT'. http://dev.mysql.com/doc/refman/5.5/en/blob.html – eggyal

+0

xin chào burhan. cảm ơn ý tưởng workarounf (lưu trên hệ thống tập tin). Tôi sẽ làm điều đó nếu tôi không tìm thấy giải pháp khác ... – Marc

+0

Bạn nói đúng, nhưng tôi vẫn đứng theo đề xuất của tôi về việc lưu trữ nội dung "tệp như" bên ngoài cơ sở dữ liệu. –

1

Khi bạn nói "trường đó không chứa mã đầy đủ và nó luôn dừng sau cùng số lượng ký tự", bạn xác định trường chứa gì? Tôi nghi ngờ những gì bạn đang xem đã bị cắt bớt bởi biến số max_allowed_packet.

Như đã nêu trong MySQL manual:

Kích thước tối đa của một BLOB hoặc TEXT đối tượng được xác định theo loại của nó, nhưng giá trị lớn nhất bạn thực sự có thể truyền tải giữa máy khách và máy chủ được xác định bởi số lượng bộ nhớ có sẵn và kích thước của bộ đệm truyền thông. Bạn có thể thay đổi kích thước bộ đệm thư bằng cách thay đổi giá trị của biến số max_allowed_packet, nhưng bạn phải làm như vậy cho cả máy chủ và chương trình khách hàng của mình. Ví dụ: cả hai mysqlmysqldump cho phép bạn thay đổi giá trị phía máy khách max_allowed_packet. Xem Section 8.11.2, “Tuning Server Parameters”, Section 4.5.1, “mysql — The MySQL Command-Line Tool”Section 4.5.4, “mysqldump — A Database Backup Program”. Bạn cũng có thể muốn so sánh kích thước gói và kích thước của các đối tượng dữ liệu bạn đang lưu trữ với các yêu cầu bộ nhớ, xem Section 11.5, “Data Type Storage Requirements”

+0

Xin chào eggyal. Cảm ơn các đầu vào. Tôi sẽ thử điều đó và hoàn nguyên ... – Marc

+0

@Marc: Bạn có may mắn với 'max_allowed_packet' không? – eggyal

6

Giá trị cho (LONG) TEXT (và BLOB) là không phải được lưu trữ "trong hàng" nhưng bên ngoài nó. Vì vậy, kích thước của HTML của bạn không đóng góp vào kích thước của các hàng riêng lẻ.

Từ hướng dẫn:

Các đại diện bên trong của một bảng có kích thước hàng tối đa 65.535 byte, ngay cả khi các công cụ lưu trữ là khả năng hỗ trợ hàng lớn hơn. Con số này không bao gồm BLOB hoặc TEXT cột, mà chỉ đóng góp 9-12 byte đối với kích thước này

Đối với dữ liệu BLOB và TEXT, các thông tin được lưu trữ nội bộ trong một khu vực khác nhau của bộ nhớ hơn so với đệm hàng.

(tôi nhấn mạnh)

http://dev.mysql.com/doc/refman/5.5/en/storage-requirements.html

15

Câu trả lời được chấp nhận là sai (hoặc ít nhất là khá khăng khăng) - Cá nhân tôi không muốn dữ liệu được lưu trữ bên ngoài của cơ sở dữ liệu của tôi, vì nó tạo ra các biến chứng về thủ tục sao lưu và truy vấn giao dịch.

Như những người khác đã chỉ ra, hướng dẫn liên tục nói rằng các cột BLOB và TEXT không được tính vào tổng kích cỡ hàng, nhưng không may, với cài đặt cấu hình mặc định, điều đó không đúng và bạn sẽ gặp phải lỗi này- thông điệp. (Thông báo lỗi không có ý nghĩa gì vì nó cho bạn biết sử dụng TEXT thay vì VARCHAR để giải quyết vấn đề - mà bạn đã có.)

Lý do giới hạn này là cơ chế lưu trữ mặc định, Antelope, mà các cửa hàng của 768 byte đầu tiên của cột chiều dài thay đổi ở hàng - và một giải pháp khả thi là sử dụng InnoDB và chuyển sang cơ chế lưu trữ của bạn để cơ chế Barracuda lưu trữ thay thế:

SET GLOBAL innodb_file_format=Barracuda; 

này sẽ không có hiệu lực ngay lập tức, vì cài đặt này là mặc định cho các tệp cơ sở dữ liệu mới - vì vậy bạn sẽ cần phải thả và tạo lại toàn bộ cơ sở dữ liệu của mình.

Ngoài ra, chuyển sang Barracuda (như trên) và sau đó (ngoài) chuyển sang chiến lược tập tin mỗi bảng:

SET GLOBAL innodb_file_per_table=ON; 

Một lần nữa, điều này sẽ không có hiệu lực ngay lập tức, bởi vì cả hai thiết lập được giá trị mặc định cho các bảng mới - vì vậy một lần nữa, bạn sẽ cần phải thả và tạo lại bảng.

Nếu bạn nhìn vào thư mục dữ liệu MySQL sau khi thực hiện việc này, bạn có thể xác nhận rằng các tệp riêng biệt đã được tạo, ví dụ: cho một cơ sở dữ liệu có tên là "dữ liệu" và một bảng có tên là "test", bạn sẽ thấy một tệp có tên "data/test/bigtable.ibd".

Nếu bạn không thích thay đổi cài đặt chung trong MySQL, hãy thử SET SESSION thay vì SET GLOBAL, ví dụ: ngay trước khi chạy câu lệnh CREATE TABLE của bạn.

+1

Đây phải là câu trả lời được chấp nhận, đáng lưu ý rằng bạn có thể 'ALTER' các bảng đã được tạo của bạn để sử dụng bộ nhớ tệp. [docs] (http://dev.mysql.com/doc/refman/5.5/en/innodb-compression-usage.html) – tonyjmnz

+0

Có thể đáng để chỉnh sửa câu trả lời của bạn để bao gồm lý do tại sao cài đặt cấu hình mặc định hoạt động theo cách họ làm. Từ tài liệu MySQL ở đây (http://dev.mysql.com/doc/refman/5.5/en/innodb-row-format-antelope.html), lý do là (ít nhất là bây giờ) định dạng tệp INNODB mặc định là Antelope lưu trữ 768 byte đầu tiên của các cột có độ dài biến đổi trong hàng. Nếu định dạng mặc định bao giờ thay đổi cách giải quyết này có thể không còn cần thiết nữa. – nextgentech

0

Chúng tôi đã giải quyết nó bằng các bước dưới đây.

Bước 1: Chạy các truy vấn bên dưới vào MySql để đặt các biến chung.

  • SET GLOBAL innodb_file_format = Barracuda;
  • SET GLOBAL innodb_file_per_table = ON;

Bước 2: Chọn bảng mà từ đó lỗi xảy ra khi bạn cố gắng lưu dữ liệu lớn vào một hàng.

Bước 3: Chuyển đến Thao tác

Bước 4: Chọn COMPRESSED từ ROW_FORMAT. (Theo mặc định COMPACT và REDUNDANT sẽ ở đó khi bạn đặt biến toàn cầu innodb_file_format và innodb_file_per_table bạn có thể tìm thấy một tùy chọn khác như COMPRESSED và DYNAMIC)

Bước 5: Nhấp vào Go.

:)

Các vấn đề liên quan