MySQL: # 126 - ไฟล์คีย์สำหรับตารางไม่ถูกต้อง


108

ฉันได้รับข้อผิดพลาดต่อไปนี้จากแบบสอบถาม MySQL

#126 - Incorrect key file for table

ฉันยังไม่ได้ประกาศคีย์สำหรับตารางนี้ แต่ฉันมีดัชนี ไม่มีใครรู้ว่าอะไรคือปัญหา?


3
ฉันได้รับสิ่งนี้ด้วยมุมมองเช่นกัน
Elzo Valugi

4
โฟลเดอร์ tmp มีขีด จำกัด โดยปกติคือ 2GB ลอง df -h ดู
Elzo Valugi

หากคุณทำเสร็จแล้วREPAIR TABLEและยังได้รับสิ่งนี้รวมทั้งมีพื้นที่ว่างอยู่/tmpคุณอาจต้องการลองรีบูตเซิร์ฟเวอร์
icc97

คำตอบ:


161

ทุกครั้งที่สิ่งนี้เกิดขึ้นมันเป็นประสบการณ์ของฉันเต็มรูปแบบ

แก้ไข

นอกจากนี้ยังเป็นที่น่าสังเกตว่าอาจเกิดจาก ramdisk แบบเต็มเมื่อทำสิ่งต่างๆเช่นการเปลี่ยนตารางขนาดใหญ่หากคุณกำหนดค่า ramdisk ไว้ คุณสามารถแสดงความคิดเห็นในบรรทัด ramdisk ชั่วคราวเพื่ออนุญาตการดำเนินการดังกล่าวหากคุณไม่สามารถเพิ่มขนาดของมันได้


4
นอกจากนี้ฉันมีพื้นที่ว่างประมาณ 2Gb และได้รับข้อผิดพลาดนี้ แต่ฐานข้อมูลของฉันประมาณ 1.7 Gb และฐานข้อมูลมีตารางที่มีแถว ~ 1.5M หลังจากล้างข้อมูลเมื่อมีพื้นที่ว่างประมาณ 3.5-4Gb ข้อผิดพลาดจะหายไป
Sergey

2
ในระบบของฉัน (Fedora 18) /tmpเป็นระบบไฟล์ tmpfs ขนาดเล็กและ mysql ไม่มีพื้นที่ในการเขียนตารางชั่วคราวที่นั่น ฉันต้องตั้งค่าtmpdirตัวแปร config ตามที่กล่าวไว้ในmysql.com
jcbwlkr

1
แม้ว่านี่อาจเป็นสาเหตุ แต่ก็ไม่เคยเกิดจากดิสก์เต็มสำหรับฉัน ฉันได้รับข้อผิดพลาดนี้ในอินสแตนซ์ Amazon RDS ที่จัดสรรสำหรับ 10GB ซึ่งเต็มเพียง 1% ความจำเหลือน้อยก็อาจเป็นสาเหตุ
Cerin

2
คุณสามารถตั้งค่า tmpdir = / mysql_tmp หรือบางอย่างใน my.cnf และควรอยู่ในระบบไฟล์รูท (ขนาดใหญ่แค่ไหน)
Kevin Parker

ฉันยังได้รับข้อผิดพลาดเหมือนกันแม้ว่าฉันจะมีเนื้อที่ดิสก์ [root @ ADM-PROD-PERCONA-SL-RP-03 percona] # df -h ขนาดระบบไฟล์ที่ใช้ Avail ใช้% ติดตั้งบน / 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

ก่อนอื่นคุณควรทราบว่าคีย์และดัชนีเป็นคำพ้องความหมายใน MySQL หากคุณดูเอกสารเกี่ยวกับCREATE TABLE Syntaxคุณสามารถอ่าน:

KEYINDEXเป็นปกติไวพจน์สำหรับ PRIMARY KEYนอกจากนี้ยังสามารถระบุแอตทริบิวต์ที่สำคัญได้เช่นเดียวกับKEYเมื่อกำหนดในนิยามคอลัมน์ สิ่งนี้ถูกนำไปใช้เพื่อความเข้ากันได้กับระบบฐานข้อมูลอื่น


ตอนนี้ประเภทของข้อผิดพลาดที่คุณได้รับอาจเกิดจากสองสิ่ง:

  • ปัญหาเกี่ยวกับดิสก์บนเซิร์ฟเวอร์ MySQL
  • คีย์ / ตารางที่เสียหาย

ในกรณีแรกคุณจะเห็นว่าการเพิ่มขีด จำกัด ในแบบสอบถามของคุณอาจช่วยแก้ปัญหาได้ชั่วคราว หากเป็นเช่นนั้นคุณอาจมีtmpโฟลเดอร์ที่เล็กเกินไปสำหรับขนาดของข้อความค้นหาที่คุณพยายามทำ จากนั้นคุณสามารถตัดสินใจหรือขยายtmpใหญ่ขึ้นหรือทำให้ข้อความค้นหาของคุณเล็กลง! ;)

บางครั้งtmpมีขนาดใหญ่พอ แต่ก็ยังเต็มอยู่คุณจะต้องทำการล้างข้อมูลด้วยตนเองในสถานการณ์เหล่านี้

ในกรณีที่สองมีปัญหาจริงกับข้อมูลของ MySQL หากคุณสามารถแทรกข้อมูลใหม่ได้อย่างง่ายดายฉันขอแนะนำให้เพียงแค่วาง / สร้างตารางใหม่แล้วใส่ข้อมูลเข้าไปใหม่ ถ้าคุณไม่สามารถที่คุณสามารถลองซ่อมตารางในสถานที่ที่มีตารางการซ่อมแซม เป็นกระบวนการที่ยาวโดยทั่วไปซึ่งอาจล้มเหลวได้เป็นอย่างดี


ดูข้อความแสดงข้อผิดพลาดทั้งหมดที่คุณได้รับ:

ไฟล์คีย์ไม่ถูกต้องสำหรับตาราง 'FILEPATH.MYI'; ลองซ่อมดู

ระบุไว้ในข้อความว่าคุณสามารถลองซ่อมแซมได้ นอกจากนี้หากคุณดู FILEPATH จริงที่คุณได้รับคุณสามารถหาข้อมูลเพิ่มเติมได้:

  • หากเป็นเช่น/tmp/#sql_ab34_23fนั้นหมายความว่า MySQL จำเป็นต้องสร้างตารางชั่วคราวเนื่องจากขนาดแบบสอบถาม มันเก็บไว้ใน / tmp และมีพื้นที่ไม่เพียงพอใน / tmp ของคุณสำหรับตารางชั่วคราวนั้น

  • หากมีชื่อของตารางจริงแทนแสดงว่าตารางนี้มีโอกาสเสียหายมากและคุณควรซ่อมแซม


หากคุณระบุว่าปัญหาของคุณกับขนาดของ tmp / เพียงแค่อ่านคำตอบนี้จะเป็นคำถามที่คล้ายกันสำหรับการแก้ไข: MySQL, ข้อผิดพลาด 126: ไฟล์ที่สำคัญที่ไม่ถูกต้องสำหรับตาราง


16

การทำตามคำแนะนำเหล่านี้ทำให้ฉันสามารถสร้างไดเร็กทอรี tmp ของฉันใหม่และแก้ไขปัญหาได้:

แสดงระบบไฟล์ทั้งหมดและการใช้ดิสก์ในรูปแบบที่มนุษย์อ่านได้:

df -h

ค้นหากระบวนการที่มีไฟล์เปิดอยู่ /tmp

sudo lsof /tmp/**/*

จากนั้น umount /tmpและ/var/tmp:

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

จากนั้นลบไฟล์พาร์ติชันที่เสียหาย:

rm -fv /usr/tmpDSK

จากนั้นสร้างใหม่ที่ดี:

/scripts/securetmp

โปรดทราบว่าด้วยการแก้ไขสคริปต์ securetmp Perl คุณสามารถกำหนดขนาดของไดเร็กทอรี tmp ด้วยตนเองได้ด้วยตัวคุณเองอย่างไรก็ตามการเรียกใช้สคริปต์จะเพิ่มขนาดของไดเร็กทอรี tmp บนเซิร์ฟเวอร์ของเราจากประมาณ 450MB เป็น 4.0GB


9

ข้อผิดพลาด # 126 มักเกิดขึ้นเมื่อคุณได้รับตารางที่เสียหาย วิธีที่ดีที่สุดในการแก้ไขปัญหานี้คือทำการซ่อมแซม บทความนี้อาจช่วยได้:

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


ฉันลบคีย์ทั้งหมดและปรับให้เหมาะสม ฉันจะได้รับข้อผิดพลาดนี้หรือไม่หากข้อความค้นหาของฉันช้าเกินไป
Brian

ฉันไม่แน่ใจ แต่จากความเข้าใจของฉันข้อผิดพลาดนี้ไม่ได้เกิดจากข้อความค้นหา คุณลองซ่อมหรือยัง?
junmats

3

ผมได้รับข้อผิดพลาดนี้เมื่อฉันตั้งft_min_word_len = 2ในmy.cnfซึ่งช่วยลดความยาวของคำขั้นต่ำในดัชนีข้อความเต็ม 2 จากค่าเริ่มต้นของ 4

การซ่อมแซมโต๊ะช่วยแก้ปัญหาได้


คุณรู้หรือไม่ว่าสิ่งนี้เกิดขึ้นเฉพาะเมื่อคุณเปลี่ยนการตั้งค่าครั้งแรกหรืออาจเกิดขึ้นได้เนื่องจากความยาวขั้นต่ำของคำน้อยเกินไป
Y0lk

1

พยายามใช้ขีด จำกัด ในแบบสอบถามของคุณ เป็นเพราะดิสก์เต็มตามที่ @Monsters X.

ฉันประสบปัญหานี้เช่นกันและแก้ไขได้ด้วยขีด จำกัด ในแบบสอบถามเนื่องจากมีบันทึกหลายพันรายการอยู่ที่นั่น ตอนนี้ทำงานได้ดี :)


1

ฉันรู้ว่านี่เป็นหัวข้อเก่า แต่ไม่มีวิธีแก้ปัญหาใดที่กล่าวถึงได้ผลสำหรับฉัน ฉันได้ทำอย่างอื่นที่ได้ผล:

คุณต้อง:

  1. หยุดบริการ MySQL:
  2. เปิด mysql \ data
  3. ลบทั้ง ib_logfile0 และ ib_logfile1
  4. เริ่มบริการใหม่


1

ฉันแก้ไขปัญหานี้ด้วย:

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

อาจช่วยได้


ฉันสามารถแก้ปัญหาที่คล้ายกันได้โดยใช้ขั้นตอนเดียวคุณสามารถสร้างตารางใหม่โดยใช้เครื่องมือตารางปัจจุบันของคุณ เช่นถ้าคุณใช้ myisam ให้ใช้: ALTER IGNORE TABLE table ENGINE = MyISAM;
SeanDowney

1

ไปที่/etc/my.cnfและแสดงความคิดเห็นtmpfs

#tmpdir=/var/tmpfs

วิธีนี้ช่วยแก้ปัญหาได้

ฉันรันคำสั่งที่แนะนำในคำตอบอื่นและในขณะที่ไดเร็กทอรีมีขนาดเล็ก แต่ก็ว่างเปล่าดังนั้นพื้นที่ว่างจึงไม่ใช่ปัญหา

/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

พยายามเรียกใช้คำสั่งซ่อมแซมสำหรับแต่ละตารางที่เกี่ยวข้องกับแบบสอบถาม

ใช้ผู้ดูแลระบบ MySQL ไปที่ Catalog -> เลือก Catalog ของคุณ -> เลือกตาราง -> คลิกปุ่ม Maintenance -> Repair -> ใช้ FRM


0

ตอนนี้คำตอบอื่น ๆ แก้ไขให้ฉันแล้ว ปรากฎว่าการเปลี่ยนชื่อคอลัมน์และดัชนีในแบบสอบถามเดียวกันทำให้เกิดข้อผิดพลาด

ไม่ทำงาน:

-- 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);

งาน (2 คำสั่ง):

-- 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);

นี่คือบน MariaDB 10.0.20 ไม่มีข้อผิดพลาดกับแบบสอบถามเดียวกันบน MySQL 5.5.48


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

จากนั้นมีข้อผิดพลาด:

 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> ตารางซ่อม f_scraper_banner_details;

สิ่งนี้ได้ผลสำหรับฉัน


0

ปัญหาของฉันมาจากข้อความค้นหาที่ไม่ถูกต้อง ฉันอ้างอิงตารางใน FROM ที่ไม่ได้อ้างถึงใน SELECT

ตัวอย่าง:

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

, users uคือสิ่งที่ทำให้เกิดปัญหาสำหรับฉัน การลบนั้นช่วยแก้ปัญหาได้

สำหรับการอ้างอิงสิ่งนี้อยู่ในสภาพแวดล้อมการพัฒนา CodeIgniter


0

ฉันได้รับข้อความนี้เมื่อเขียนลงในตารางหลังจากลดft_min_word_len (ข้อความเต็มความยาวคำต่ำสุด) ในการแก้ปัญหาให้สร้างดัชนีใหม่โดยซ่อมแซมตาราง


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.