MySQL: # 126 - Tệp khóa không chính xác cho bảng


108

Tôi gặp lỗi sau từ truy vấn MySQL.

#126 - Incorrect key file for table

Tôi thậm chí còn chưa khai báo khóa cho bảng này, nhưng tôi có các chỉ mục. Có ai biết những gì có thể là vấn đề?


3
Tôi có được điều này với tầm cũng
Elzo Valugi

4
thư mục tmp có một giới hạn thường 2GB, hãy thử df -h để xem nó
Elzo Valugi

Nếu bạn đã thực hiện REPAIR TABLEvà vẫn nhận được điều này, cộng với dung lượng còn trống /tmpthì bạn có thể muốn thử khởi động lại máy chủ.
icc97

Câu trả lời:


160

Mỗi khi điều này xảy ra, theo kinh nghiệm của tôi, đó là một đĩa đầy đủ.

BIÊN TẬP

Cũng cần lưu ý rằng điều này có thể do đĩa ram đầy khi thực hiện những việc như thay đổi một bảng lớn nếu bạn đã định cấu hình đĩa ram. Bạn có thể tạm thời nhận xét dòng đĩa ram để cho phép các hoạt động như vậy nếu bạn không thể tăng kích thước của nó.


4
Ngoài ra tôi có khoảng 2Gb dung lượng trống và gặp lỗi này. Nhưng cơ sở dữ liệu của tôi khoảng 1,7 Gb và cơ sở dữ liệu có một bảng với ~ 1,5 triệu hàng. Sau khi dọn dẹp, khi dung lượng trống khoảng 3.5-4Gb, lỗi sẽ biến mất.
Sergey

2
Trên hệ thống của tôi (Fedora 18) /tmplà một hệ thống tệp tmpfs nhỏ và mysql đã hết dung lượng để viết một bảng tạm thời ở đó. Tôi đã phải đặt tmpdirbiến cấu hình như đã đề cập trên mysql.com
jcbwlkr

1
Mặc dù đây có thể là một nguyên nhân, điều này chưa bao giờ là do đầy đĩa đối với tôi. Tôi gặp lỗi này trên phiên bản Amazon RDS được phân bổ cho 10GB chỉ đầy 1%. Bộ nhớ thấp cũng có thể là một lý do.
Cerin

2
bạn có thể đặt tmpdir = / mysql_tmp hoặc một cái gì đó trong my.cnf và nó nên được trên hệ thống tập tin gốc (tuy nhiên lớn đó là)
Kevin Parker

Tôi cũng gặp lỗi tương tự mặc dù tôi có dung lượng ổ đĩa [root @ ADM-PROD-PERCONA-SL-RP-03 percona] # df -h Kích thước hệ thống tệp đã sử dụng Tính sẵn có% Mounted on / dev / xvda1 7.8G 1.6G 6.1G 21% / devtmpfs 61G 80K 61G 1% / dev tmpfs 61G 0 61G 0% / dev / shm / dev / md0 3.0T 1.8T 1.2T 61% / mnt
Ashish Karpe

35

Trước hết, bạn nên biết rằng khóa và chỉ số là những từ đồng nghĩa trong MySQL. Nếu bạn xem tài liệu về Cú pháp TẠO BẢNG , bạn có thể đọc:

KEYthường là một từ đồng nghĩa với INDEX. Thuộc tính khóa PRIMARY KEYcũng có thể được chỉ định giống như KEYkhi được đưa ra trong định nghĩa cột. Điều này đã được thực hiện để tương thích với các hệ thống cơ sở dữ liệu khác.


Bây giờ, loại lỗi bạn đang gặp phải có thể do hai nguyên nhân:

  • Sự cố đĩa trên máy chủ MySQL
  • Khóa / bảng bị hỏng

Trong trường hợp đầu tiên, bạn sẽ thấy rằng việc thêm giới hạn vào truy vấn của mình có thể giải quyết vấn đề tạm thời. Nếu điều đó phù hợp với bạn, có thể bạn có một tmpthư mục quá nhỏ so với kích thước của các truy vấn mà bạn đang cố gắng thực hiện. Sau đó, bạn có thể quyết định hoặc làm tmplớn hơn hoặc thu nhỏ các truy vấn của bạn! ;)

Đôi khi, tmpđủ lớn nhưng vẫn bị đầy, bạn sẽ cần phải dọn dẹp thủ công trong những trường hợp này.

Trong trường hợp thứ hai, có những vấn đề thực tế với dữ liệu của MySQL. Nếu bạn có thể chèn lại dữ liệu một cách dễ dàng, tôi khuyên bạn chỉ nên thả / tạo lại bảng và chèn lại dữ liệu. Nếu bạn không thể, bạn có thể thử sửa chữa bảng tại chỗ với bảng REPAIR . Đó là một quá trình thường kéo dài và rất có thể thất bại.


Xem thông báo lỗi hoàn chỉnh mà bạn nhận được:

Tệp khóa không chính xác cho bảng 'FILEPATH.MYI'; cố gắng sửa chữa nó

Nó đề cập trong thông báo rằng bạn có thể cố gắng sửa chữa nó. Ngoài ra, nếu bạn nhìn vào FILEPATH thực tế mà bạn nhận được, bạn có thể tìm hiểu thêm:

  • nếu nó giống như /tmp/#sql_ab34_23fvậy có nghĩa là MySQL cần tạo một bảng tạm thời vì kích thước truy vấn. Nó lưu trữ nó trong / tmp và không có đủ dung lượng trong / tmp của bạn cho bảng tạm thời đó.

  • nếu nó chứa tên của một bảng thực thay thế, điều đó có nghĩa là bảng này rất có thể bị hỏng và bạn nên sửa chữa nó.


Nếu bạn xác định rằng sự cố của bạn là với kích thước / tmp, chỉ cần đọc câu trả lời này cho một câu hỏi tương tự để khắc phục: MySQL, Lỗi 126: Tệp khóa không chính xác cho bảng .


16

Làm theo các hướng dẫn này cho phép tôi tạo lại thư mục tmp của mình và khắc phục sự cố:

Hiển thị tất cả các hệ thống tệp và việc sử dụng đĩa của chúng ở dạng con người có thể đọc được:

df -h

Tìm các quy trình có tệp đang mở /tmp

sudo lsof /tmp/**/*

Sau đó, umount /tmp/var/tmp:

umount -l /tmp
umount -l /var/tmp

Sau đó, xóa tệp phân vùng bị hỏng:

rm -fv /usr/tmpDSK

Sau đó, tạo một cái mới đẹp:

/scripts/securetmp

Lưu ý rằng bằng cách chỉnh sửa tập lệnh securetmp Perl, bạn có thể tự đặt kích thước của thư mục tmp theo cách thủ công, tuy nhiên chỉ cần chạy tập lệnh đã tăng kích thước của thư mục tmp trên máy chủ của chúng tôi từ khoảng 450MB lên 4,0GB.


9

Lỗi # 126 thường xảy ra khi bạn có một bảng bị hỏng. Cách tốt nhất để giải quyết điều này là tiến hành sửa chữa. Bài viết này có thể giúp:

http://dev.mysql.com/doc/refman/5.0/en/repair-table.html


Tôi đã xóa tất cả các khóa của mình và tối ưu hóa. Tôi có thể gặp lỗi này nếu truy vấn của tôi quá chậm?
Brian

Tôi không chắc chắn nhưng dựa trên sự hiểu biết của tôi, lỗi này không phải do truy vấn gây ra. Bạn đã thử sửa chữa chưa?
junmats

3

Tôi gặp lỗi này khi đặt ft_min_word_len = 2trong my.cnfđó, điều này làm giảm độ dài từ tối thiểu trong chỉ mục văn bản đầy đủ xuống 2, từ mặc định là 4.

Sửa chữa bảng đã khắc phục sự cố.


Bạn có biết điều này chỉ xảy ra khi bạn thay đổi cài đặt lần đầu hay là điều có thể xảy ra do độ dài từ tối thiểu quá nhỏ?
Y0lk

1

Cố gắng sử dụng giới hạn trong truy vấn của bạn. Đó là vì đĩa đầy như đã nói bởi @Monsters X.

Tôi cũng đã đối mặt với vấn đề này và giải quyết theo giới hạn trong truy vấn, bởi vì hàng nghìn bản ghi đã ở đó. Hiện đang hoạt động tốt :)


1

Tôi biết rằng đây là một chủ đề cũ nhưng không có giải pháp nào được đề cập phù hợp với tôi. Tôi đã làm một cái gì đó khác có hiệu quả:

Bạn cần phải:

  1. dừng dịch vụ MySQL:
  2. Mở dữ liệu mysql \
  3. Loại bỏ cả ib_logfile0 và ib_logfile1.
  4. Khởi động lại dịch vụ


1

Tôi đã khắc phục sự cố này với:

ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;

Có thể giúp


Tôi đã có thể giải quyết một vấn đề tương tự chỉ bằng một bước, bạn có thể xây dựng lại bảng của mình bằng cách sử dụng công cụ bảng hiện tại của mình. Tức là, nếu bạn sử dụng myisam, hãy sử dụng: ALTER IGNORE TABLE table ENGINE = MyISAM;
SeanDowney

1

Đi tới /etc/my.cnfvà bình luậntmpfs

#tmpdir=/var/tmpfs

Điều này khắc phục sự cố.

Tôi đã chạy lệnh được đề xuất trong một câu trả lời khác và trong khi thư mục nhỏ, nó trống, vì vậy không gian không phải là vấn đề.

/var/tmp$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vzfs              60G   51G  9.5G  85% /
none                  1.5G  4.0K  1.5G   1% /dev
tmpfs                 200M     0  200M   0% /var/tmpfs
/var/tmpfs$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vzfs              60G   51G  9.5G  85% /
none                  1.5G  4.0K  1.5G   1% /dev
tmpfs                 200M     0  200M   0% /var/tmpfs

0

Cố gắng chạy lệnh sửa chữa cho từng bảng có liên quan đến truy vấn.

Sử dụng quản trị viên MySQL, vào Danh mục -> Chọn Danh mục của bạn -> Chọn bảng -> Nhấp vào nút Bảo trì -> Sửa chữa -> Sử dụng FRM.


0

Bây giờ các câu trả lời khác đã giải quyết nó cho tôi. Hóa ra việc đổi tên một cột và một chỉ mục trong cùng một truy vấn đã gây ra lỗi.

Không làm việc:

-- rename column and rename index
ALTER TABLE `client_types`
    CHANGE `template_path` `path` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    DROP INDEX client_types_template_path_unique,
    ADD UNIQUE INDEX `client_types_path_unique` (`path` ASC);

Tác phẩm (2 câu):

-- rename column
ALTER TABLE `client_types`
    CHANGE `template_path` `path` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;
-- rename index
ALTER TABLE `client_types`
    DROP INDEX client_types_template_path_unique,
    ADD UNIQUE INDEX `client_types_path_unique` (`path` ASC);

Đây là trên MariaDB 10.0.20. Không có lỗi nào với cùng một truy vấn trên MySQL 5.5.48.


0
mysql> set global sql_slave_skip_counter=1; start slave; show slave status\G

Sau đó, có lỗi tồn tại:

 Error 'Table './openx/f_scraper_banner_details' is marked as crashed and should be repaired' on query. Default database: 'openx'. Query: 'INSERT INTO f_scraper_banner_details(job_details_id, ad_id, client_id, zone_id, affiliateid, comments, pct_to_report, publisher_currency, sanity_check_enabled, status, error_code, report_date) VALUES (10274859, 321264, 0, 31926, 0, '', -1, 'USD', 1, 'FAILURE', 'INACTIVE_BANNER', '2016-06-28 04:00:00')'

mysql> sửa chữa bảng f_scraper_banner_details;

Điều này đã làm việc cho tôi


0

Vấn đề của tôi đến từ một truy vấn sai. Tôi đã tham chiếu một bảng trong FROM, không được tham chiếu trong SELECT.

thí dụ:

   SELECT t.*,s.ticket_status as `ticket_status`
   FROM tickets_new t, ticket_status s, users u

, users ulà những gì đã gây ra vấn đề cho tôi. Xóa đã giải quyết được vấn đề.

Để tham khảo, điều này nằm trong môi trường nhà phát triển CodeIgniter.


0

Tôi nhận được thông báo này khi ghi vào bảng sau khi giảm ft_min_word_len (độ dài từ tối thiểu của toàn văn bản). Để giải quyết nó, hãy tạo lại chỉ mục bằng cách sửa chữa bảng.


0

mysqlcheck -r -f -uroot -p --use_frm db_name

thường sẽ làm thủ thuật

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.