Tabel MySQL Schrödingers: ada, namun tidak


118

Saya mengalami kesalahan paling aneh dari semuanya.

Terkadang, saat membuat atau mengubah tabel, saya mendapatkan kesalahan 'tabel sudah ada'. Namun, DROP TABLE mengembalikan '# 1051 - tabel tidak dikenal'. Jadi saya mendapat tabel yang tidak bisa saya buat, tidak bisa dijatuhkan.

Ketika saya mencoba untuk menjatuhkan database, mysqld macet. Terkadang membantu membuat db lain dengan nama berbeda, terkadang tidak.

Saya menggunakan DB dengan ~ 50 tabel, semua InnoDB. Masalah ini terjadi dengan tabel yang berbeda.

Saya mengalami ini di Windows, Fedora dan Ubuntu, MySQL 5.1 dan 5.5. Perilaku yang sama, saat menggunakan PDO, PHPMyAdmin atau commandline. Saya menggunakan MySQL Workbench untuk mengelola skema saya - Saya melihat beberapa kesalahan terkait (garis akhir dan lainnya), namun tidak ada yang relevan bagi saya.

Tidak, ini bukan pemandangan, ini adalah meja. Semua nama menggunakan huruf kecil.

Saya mencoba semua yang saya bisa google - membersihkan tabel, memindahkan file .frm dari db ke db, membaca log mysql, tidak ada yang membantu selain menginstal ulang semuanya.

'Tampilkan tabel' tidak menunjukkan apa-apa, 'deskripsikan' tabel mengatakan 'tabel tidak ada,' tidak ada file .frm, namun 'buat tabel' masih diakhiri dengan kesalahan (dan begitu juga 'buat tabel jika tidak ada') dan menjatuhkan database crash mysql

Pertanyaan terkait, namun tidak membantu:

Edit:

mysql> use askyou;
Database changed

mysql> show tables;
Empty set (0.00 sec)

mysql> create table users_has_friends (id int primary key);
ERROR 1050 (42S01): Table '`askyou`.`users_has_friends`' already exists

mysql> drop table users_has_friends;
ERROR 1051 (42S02): Unknown table 'users_has_friends'

Dan yang demikian, semuanya sama: tabel tidak ada, namun tidak dapat dibuat;

mysql> drop database askyou;
ERROR 2013 (HY000): Lost connection to MySQL server during query

Nama berubah, ini bukan satu-satunya tabel / database yang bermasalah dengan saya


2
Bisakah Anda membuka klien MySQL, dan mengetik beberapa perintah yang menunjukkan masalah tersebut, lalu salin dan tempel salinan persis dari perintah dan keluaran di sini. Sangat bagus bahwa Anda telah mendeskripsikan masalah Anda dengan banyak detail, tetapi akan lebih baik jika Anda memposting perintah dan pesan yang tepat.
Mark Byers

Jika pasti tidak ada tampilan dengan nama yang sama, saya berani bertaruh struktur file data MySQL miring.
eggyal

3
Apa yang Anda dapatkan sebagai tanggapan SHOW FULL TABLES IN askyoudan SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA LIKE 'askyou'?
eggyal

1
Apakah Anda menggunakan innodb_file_per_table?
ESG

1
@RafaelBarros: Benar. Salah ketik. Terima kasih telah menjelaskan.
eggyal

Jawaban:


19

Saya telah melihat masalah ini ketika file data hilang di direktori data tetapi file definisi tabel ada atau sebaliknya. Jika Anda menggunakan innodb_file_per_table, periksa direktori data untuk memastikan Anda memiliki .frmfile dan file .ibd untuk tabel yang dimaksud. Jika MYISAM, harus ada a .frm, .MYIdan a.MYD file.

Masalah biasanya dapat diselesaikan dengan menghapus file yatim piatu secara manual.


3
Saya tidak menggunakan innodb_file_per_table; namun, ketika saya menyalakannya dan mencoba membuat ulang tabel, itu hanya membuat .ibdfile. .frmtidak bisa ditemukan. Ini hanya berlaku untuk tabel tertentu (10+ lainnya dibuat dengan file yang benar). Menghapus yatim piatu itu tidak membantu apa pun
Corkscreewe

1
Saya menggunakan innodb_file_per_table; tetapi jika saya menghapus .frm yatim piatu, itu dibuat ulang ketika saya menjalankan pernyataan create (tetapi pernyataan create mengembalikan kesalahan, file .ibd tidak dibuat, dan saya masih tidak bisa menjatuhkannya)
andrew lorien

14

Melakukan tebakan liar di sini, tetapi sepertinya innodb masih memiliki entri untuk tabel Anda di tablespace, mungkin di ibdata. Jika Anda benar - benar tidak membutuhkan data apa pun , atau jika Anda memiliki cadangan, coba yang berikut ini:

  1. Hapus semua skema (tidak termasuk mysql)
  2. matikan database
  3. Pastikan semua folder di direktori data Anda telah dihapus dengan benar (sekali lagi, tidak termasuk mysql)
  4. hapus ibdata dan file log
  5. restart database. Ini harus membuat ulang tablespace dan log dari awal.

2
Fantastis: Menghentikan mysql, menghapus 'ibdata1', 'ib_logfile1', 'ib_logfile0' dan memulai ulang mysql memecahkan masalah saya. Terima kasih banyak!
Meilo

4

Cara mengatasinya ternyata mudah; setidaknya apa yang saya berhasil, berhasil untuk saya. Buat tabel "zzz" pada instance MySQL lain, di mana zzz adalah nama tabel masalahnya. (yaitu jika tabel disebut schrodinger, gantikan dengan zzz setiap kali ditulis.) Tidak masalah apa definisi tabel tersebut. Ini adalah boneka sementara; Salin file zzz.frm ke direktori database di server tempat tabel seharusnya berada, pastikan kepemilikan dan izin file pada file tersebut masih benar. Di MySQL, Anda sekarang dapat melakukan "show tables;", dan tabel zzz akan ada di sana. mysql> jatuhkan tabel zzz; ... sekarang harus bekerja. Hapus semua file zzz.MYD atau ZZZ.MYI di direktori jika perlu.


Sebenarnya solusi ini menyelamatkan hidup saya, terima kasih! Saya memang menyalin file FRM dan IDB dari database lain tetapi di server yang sama (versi MySQL yang sama dll ...) dan tampaknya berfungsi dengan baik.
Pierre

Saya mengonfirmasi, ini adalah cara untuk menyalin .frmfile dari instance lain (master / slave) dan memasukkannya ke direktori, drop table dan Anda akan dapat membuat tabel lagi.
juliangonzalez

3

Saya ragu ini adalah jawaban langsung untuk kasus pertanyaan di sini, tetapi di sini adalah bagaimana saya memecahkan masalah yang dirasakan secara tepat ini pada sistem OS X Lion saya.

Saya sering membuat / menjatuhkan tabel untuk beberapa pekerjaan analitik yang telah saya jadwalkan. Pada titik tertentu, saya mulai mendapatkan kesalahan tabel sudah ada di tengah-tengah skrip saya. Restart server biasanya menyelesaikan masalah, tetapi itu solusi yang terlalu mengganggu.

Kemudian saya perhatikan di file log kesalahan lokal baris khusus ini:

[Warning] Setting lower_case_table_names=2 because file system for /usr/local/mysql/data/ is case insensitive

Ini memberi saya gagasan bahwa mungkin jika tabel saya berisi huruf kapital, MySQL akan tertipu dengan berpikir bahwa tabel itu masih ada bahkan setelah saya menjatuhkannya. Ternyata itu masalahnya dan beralih ke hanya menggunakan huruf kecil untuk nama tabel membuat masalah hilang.

Ini kemungkinan hasil dari beberapa kesalahan konfigurasi dalam kasus saya, tetapi semoga kasus kesalahan ini akan membantu seseorang membuang waktu lebih sedikit untuk mencoba menemukan solusi.


3

Ini adalah pertanyaan lama tetapi saya baru saja menemukan masalah yang sama dan jawaban di salah satu masalah terkait yang ditautkan di bagian atas adalah yang saya butuhkan dan jauh lebih drastis daripada menghapus file, tabel, mematikan server, dll.

mysqladmin -uxxxxxx -pyyyyy flush-tables

1

Dalam kasus saya, masalah diselesaikan dengan mengubah kepemilikan direktori data mysql ke pengguna yang menjalankan aplikasi. (Dalam kasus saya itu adalah aplikasi Java yang menjalankan server web Jetty.)

Meskipun mysql sedang berjalan dan aplikasi lain dapat menggunakannya dengan benar, aplikasi ini bermasalah dengan itu. Setelah mengubah kepemilikan direktori data dan menyetel ulang sandi pengguna, semuanya berfungsi dengan baik.


1

Jika Anda memiliki stok dengan kesalahan 1051 ini dan Anda hanya ingin menghapus database dan mengimpor ini lagi, lakukan langkah-langkah ini dan semua akan baik-baik saja ....

di Unix envoriment AS root :

  • rm -rf / var / lib / mysql / YOUR_DATABASE;
  • OPSIONAL -> mysql_upgrade --force
  • mysqlcheck -uUSER -pPASS YOUR_DATABASE
  • mysqladmin -uUSER -pPASS jatuhkan YOUR_DATABASE
  • mysqladmin -uUSER -pPASS buat YOUR_DATABASE
  • mysql -uUSER -pPASS YOUR_DATABASE <IMPORT_FILE

Salam, Christus


0

Saya mengalami masalah ini dan berharap menghapus file IBD akan membantu seperti yang diposting di atas tetapi tidak ada bedanya. MySQL hanya membuat ulang file IBD baru. Dalam kasus saya, sebenarnya ada tabel serupa di database lain dalam contoh MySQL yang sama. Karena file FRM hilang, saya menyalin file FRM dari tabel serupa di database lain, memulai ulang MySQL dan tabel berfungsi dengan benar.


0

Saya mengalami kesalahan ini setelah saya membuat tabel dan menghapusnya, lalu ingin membuatnya lagi. Dalam kasus saya, saya memiliki file dump mandiri jadi saya menjatuhkan skema saya, membuatnya kembali dan mengimpor tabel dan data menggunakan file dump.


0

Ini terjadi di situs kami (tetapi jarang) biasanya ketika sebuah "peristiwa" terjadi saat menjalankan skrip tertentu yang melakukan banyak pembangunan kembali. Peristiwa termasuk pemadaman jaringan atau masalah daya.
Apa yang saya lakukan untuk ini pada kesempatan yang sangat jarang terjadi - saya menggunakan pendekatan tangan-berat:

  • Saya hanya perlu menyingkirkan-dan-membangun kembali tabel tertentu. Saya biasanya dalam posisi bahwa ini OK karena tabel sedang dibangun. (Situasi Anda mungkin berbeda jika Anda perlu memulihkan data)
  • Sebagai admin, masuk ke instalasi mysql (di windows mungkin "... program files / mysql / MySQL Server xx / data / <schemaname>
  • Temukan file yang melanggar dengan nama tabel di folder <schemaname> - dan hapus.
  • Periksa file sementara yatim piatu dan hapus juga. # ... frm file jika kebetulan ada di sana.
  • MySQL akan membiarkan Anda MENCIPTAKAN tabel lagi

Saya mengalami masalah ini pada beberapa database yang berbeda dalam waktu yang lama (bertahun-tahun). Itu gagap karena pesan yang bertentangan. Pertama kali saya melakukan variasi dari menghapus / membangun kembali / mengganti nama database seperti yang dijelaskan dalam jawaban lain dan berhasil menyelesaikan semuanya, tetapi pasti membutuhkan waktu lebih lama seperti itu. Beruntung bagi saya itu selalu terjadi pada tabel referensi yang sedang dibangun kembali - DROP dan CREATEd - biasanya di pagi hari. Jarang mendapat masalah tetapi kemudian mengakuinya sebagai kasus unik khusus. (Saya akan menyatakan kembali: jika Anda perlu memulihkan tampilan data ke solusi lain.)

  • itu bukan tabel milik pengguna lain, atau dalam database lain
  • ini bukan masalah besar / kecil, saya menggunakan semua huruf kecil, tapi itu masalah yang menarik!
  • sangat membuat frustrasi melihat tanggapan dengan variasi "itu pasti <there / not-there / some-other-user-table-case> dan Anda tidak melakukannya dengan benar" :)
  • tabel tidak muncul di "tampilkan tabel"
  • meja itu (selalu pernah) tabel INNODB.
  • mencoba DROP tabel memberikan pesan kesalahan bahwa tabel tidak ada.
  • tetapi mencoba MENCIPTAKAN tabel memberikan pesan kesalahan bahwa tabel sudah ada.
  • menggunakan mysql 5.0 atau 5.1
  • PERBAIKAN tidak efektif untuk masalah ini

-1

Saya mengalami masalah ini dengan satu tabel tertentu. Membaca solusi yang mungkin saya lakukan beberapa langkah seperti:

  • Cari file yatim: tidak ada siapa pun;
  • mengeksekusi:: show full tables in database;tidak melihat yang bermasalah;
  • mengeksekusi describe table;:: dikembalikantable doesn't exist ;
  • mengeksekusi SELECT * FROM information_schema.TABLES WHERE TABLE_NAME='table';:: dikembalikanEmpty set ;
  • Cari menurut phpMyAdmin secara manual, kueri di atas: tidak ada;

Dan, setelah langkah-langkah itu, saya periksa lagi dengan show tables;dan ... vualá! tabel yang bermasalah telah hilang. Saya dapat membuatnya dan menjatuhkannya dengan nama bermasalah yang sama tanpa masalah, dan saya bahkan tidak perlu me-restart server! Aneh...

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.