MySQL: # 126 - File kunci salah untuk tabel

108

Saya mendapat kesalahan berikut dari kueri MySQL.

#126 - Incorrect key file for table

Saya bahkan belum menyatakan kunci untuk tabel ini, tetapi saya memiliki indeks. Apakah ada yang tahu apa masalahnya?

Brian
sumber
3
Saya mendapatkan ini dengan tampilan juga
Elzo Valugi
4
folder tmp memiliki batas biasanya 2GB, coba df -h untuk melihatnya
Elzo Valugi
Jika Anda telah melakukan REPAIR TABLEdan masih mendapatkan ini, ditambah masih ada ruang, /tmpAnda mungkin ingin mencoba me-reboot server.
icc97

Jawaban:

160

Setiap kali ini terjadi, menurut pengalaman saya, itu adalah disk penuh.

EDIT

Perlu juga dicatat bahwa ini dapat disebabkan oleh ramdisk yang penuh saat melakukan hal-hal seperti mengubah tabel besar jika Anda memiliki ramdisk yang dikonfigurasi. Anda dapat sementara mengomentari baris ramdisk untuk mengizinkan operasi semacam itu jika Anda tidak dapat meningkatkan ukurannya.

Monster X
sumber
4
Saya juga memiliki sekitar 2Gb ruang kosong dan mendapatkan kesalahan ini. Tapi database saya sekitar 1,7 Gb dan database memiliki tabel dengan baris ~ 1,5 juta. Setelah pembersihan, ketika ruang kosong sekitar 3,5-4Gb, kesalahan menghilang.
Sergey
2
Di sistem saya (Fedora 18) /tmpadalah sistem file tmpfs kecil dan mysql kehabisan ruang untuk menulis tabel temp di sana. Saya harus mengatur tmpdirvariabel config seperti yang disebutkan di mysql.com
jcbwlkr
1
Meskipun ini mungkin penyebabnya, ini belum pernah terjadi karena disk penuh untuk saya. Saya mendapatkan kesalahan ini pada instans Amazon RDS yang dialokasikan untuk 10GB yang hanya 1% penuh. Memori rendah juga bisa menjadi alasan.
Cerin
2
Anda dapat mengatur tmpdir = / mysql_tmp atau sesuatu di my.cnf dan itu harus ada di sistem file root (betapapun besarnya)
Kevin Parker
Saya juga mendapat kesalahan yang sama meskipun saya memiliki ruang disk [root @ ADM-PROD-PERCONA-SL-RP-03 percona] # df -h Ukuran Sistem File Digunakan Tersedia Penggunaan% Dipasang di / 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

Pertama-tama, Anda harus tahu bahwa kunci dan indeks adalah sinonim di MySQL. Jika Anda melihat dokumentasi tentang Sintaks CREATE TABLE , Anda dapat membaca:

KEYbiasanya merupakan sinonim untuk INDEX. Atribut kunci PRIMARY KEYjuga dapat ditetapkan seperti yang KEYdiberikan dalam definisi kolom. Ini diimplementasikan untuk kompatibilitas dengan sistem database lain.


Sekarang, jenis kesalahan yang Anda dapatkan bisa disebabkan oleh dua hal:

  • Masalah disk di server MySQL
  • Kunci / tabel rusak

Dalam kasus pertama, Anda akan melihat bahwa menambahkan batas ke kueri Anda mungkin menyelesaikan masalah untuk sementara. Jika itu berhasil untuk Anda, Anda mungkin memiliki tmpfolder yang terlalu kecil untuk ukuran kueri yang Anda coba lakukan. Anda kemudian dapat memutuskan atau tmpmemperbesar, atau membuat kueri Anda lebih kecil! ;)

Terkadang, tmpcukup besar tetapi masih penuh, Anda perlu melakukan pembersihan manual dalam situasi ini.

Dalam kasus kedua, ada masalah aktual dengan data MySQL. Jika Anda dapat memasukkan kembali data dengan mudah, saya akan menyarankan untuk hanya menjatuhkan / membuat ulang tabel, dan memasukkan kembali data. Jika Anda tidak bisa, Anda dapat mencoba memperbaiki meja di tempatnya dengan meja REPAIR . Ini adalah proses yang umumnya panjang dan mungkin akan gagal.


Lihat pesan kesalahan lengkap yang Anda dapatkan:

File kunci salah untuk tabel 'FILEPATH.MYI'; coba perbaiki

Itu menyebutkan dalam pesan bahwa Anda dapat mencoba memperbaikinya. Juga, jika Anda melihat FILEPATH aktual yang Anda dapatkan, Anda dapat mengetahui lebih lanjut:

  • jika itu seperti /tmp/#sql_ab34_23fitu berarti MySQL perlu membuat tabel sementara karena ukuran kueri. Ini menyimpannya di / tmp, dan tidak ada cukup ruang di / tmp Anda untuk tabel sementara itu.

  • jika itu berisi nama tabel sebenarnya, itu berarti tabel ini kemungkinan besar rusak dan Anda harus memperbaikinya.


Jika Anda mengidentifikasi bahwa masalah Anda adalah dengan ukuran / tmp, baca saja jawaban ini untuk pertanyaan serupa untuk perbaikan: MySQL, Kesalahan 126: File kunci salah untuk tabel .

snooze92
sumber
16

Mengikuti petunjuk ini memungkinkan saya membuat ulang direktori tmp saya dan memperbaiki masalah:

Tampilkan semua sistem file dan penggunaan disknya dalam bentuk yang dapat dibaca manusia:

df -h

Temukan proses yang membuka file /tmp

sudo lsof /tmp/**/*

Kemudian umount /tmpdan /var/tmp:

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

Kemudian hapus file partisi yang rusak:

rm -fv /usr/tmpDSK

Kemudian buat yang baru yang bagus:

/scripts/securetmp

Perhatikan bahwa dengan mengedit skrip Perl securetmp Anda dapat mengatur sendiri ukuran direktori tmp secara manual, namun hanya menjalankan skrip tersebut meningkatkan ukuran direktori tmp di server kami dari sekitar 450MB menjadi 4,0GB.

pengguna387049
sumber
9

Kesalahan # 126 biasanya terjadi ketika Anda mendapat tabel yang rusak. Cara terbaik untuk mengatasinya adalah dengan melakukan perbaikan. Artikel ini mungkin bisa membantu:

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

junmats
sumber
Saya menghapus semua kunci saya dan mengoptimalkan. Bisakah saya mendapatkan kesalahan ini jika kueri saya terlalu lambat?
Brian
Saya tidak yakin tetapi berdasarkan pemahaman saya, kesalahan ini bukan disebabkan oleh kueri. Sudahkah Anda mencoba memperbaiki?
junmats
3

Aku punya kesalahan ini ketika saya set ft_min_word_len = 2di my.cnf, yang menurunkan panjang kata minimal dalam indeks teks lengkap untuk 2, dari default 4.

Memperbaiki tabel memperbaiki masalah.

jcampbell1
sumber
Apakah Anda tahu jika ini hanya terjadi ketika Anda pertama kali mengubah pengaturan, atau apakah itu sesuatu yang dapat terjadi karena panjang kata minimum terlalu kecil?
Y0lk
1

Coba gunakan batas dalam kueri Anda. Itu karena disk penuh seperti yang dikatakan oleh @Monsters X.

Saya juga menghadapi masalah ini dan memecahkannya dengan batas permintaan, karena ribuan catatan ada di sana. Sekarang bekerja dengan baik :)

Bajrang
sumber
1

Saya tahu bahwa ini adalah topik lama tetapi tidak ada solusi yang disebutkan berhasil untuk saya. Saya telah melakukan hal lain yang berhasil:

Kamu butuh:

  1. hentikan layanan MySQL:
  2. Buka mysql \ data
  3. Hapus ib_logfile0 dan ib_logfile1.
  4. Mulai ulang layanan
Hyder B.
sumber
1
repair table myschema.mytable;
Ancaman
sumber
1

Saya memperbaiki masalah ini dengan:

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

Semoga membantu

Sean
sumber
Saya dapat memecahkan masalah serupa hanya dengan menggunakan satu langkah, Anda dapat membangun kembali tabel Anda menggunakan mesin tabel Anda saat ini. Yaitu, jika Anda menggunakan myisam gunakan: ALTER IGNORE TABLE table ENGINE = MyISAM;
SeanDowney
1

Pergi ke /etc/my.cnfdan beri komentartmpfs

#tmpdir=/var/tmpfs

Ini memperbaiki masalah.

Saya menjalankan perintah yang disarankan dalam jawaban lain dan meskipun direktorinya kecil, itu kosong, jadi bukan ruang yang menjadi masalah.

/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
Tikungan
sumber
0

Coba jalankan perintah perbaikan untuk setiap tabel yang terlibat dalam kueri.

Gunakan administrator MySQL, buka Katalog -> Pilih Katalog Anda -> Pilih tabel -> Klik tombol Pemeliharaan -> Perbaikan -> Gunakan FRM.

MigDus
sumber
0

Sekarang jawaban lain memecahkannya untuk saya. Ternyata mengganti nama kolom dan indeks dalam kueri yang sama menyebabkan kesalahan.

Tidak bekerja:

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

Pekerjaan (2 pernyataan):

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

Ini ada di MariaDB 10.0.20. Tidak ada kesalahan dengan kueri yang sama di MySQL 5.5.48.

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

Kemudian ada kesalahan:

 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> tabel perbaikan f_scraper_banner_details;

Ini berhasil untuk saya

Ashish Karpe
sumber
0

Masalah saya berasal dari kueri yang buruk. Saya mereferensikan tabel di FROM yang tidak direferensikan di SELECT.

contoh:

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

, users uitulah yang menyebabkan masalah bagi saya. Menghapus itu memecahkan masalah.

Untuk referensi, ini ada di lingkungan dev CodeIgniter.

Lee Cocklin
sumber
0

Saya mendapat pesan ini saat menulis ke tabel setelah mengurangi ft_min_word_len (panjang kata teks lengkap min). Untuk mengatasinya, buat ulang indeks dengan memperbaiki tabel.

Nico Schefer
sumber
0

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

biasanya akan berhasil

Andy
sumber