MySQL> Table tidak ada. Tapi itu memang (atau seharusnya)

261

Saya mengubah datadir dari instalasi MySQL dan semua pangkalan bergerak dengan benar kecuali satu. Saya dapat terhubung dan USEdatabase. SHOW TABLESjuga mengembalikan saya semua tabel dengan benar, dan file dari setiap tabel ada di direktori data MySQL.

Namun, ketika saya mencoba SELECTsesuatu dari tabel, saya mendapatkan pesan kesalahan bahwa tabel tersebut tidak ada. Namun, ini tidak masuk akal karena saya bisa menunjukkan tabel yang sama melalui SHOW TABLESpernyataan.

Dugaan saya adalah bahwa SHOW TABLESdaftar keberadaan file tetapi tidak memeriksa apakah file rusak atau tidak. Akibatnya, saya bisa daftar file-file itu tetapi tidak mengaksesnya.

Namun demikian, itu hanyalah dugaan. Saya belum pernah melihat ini sebelumnya. Sekarang, saya tidak bisa me-restart database untuk pengujian, tetapi setiap aplikasi lain yang menggunakannya berfungsi dengan baik. Tapi itu hanya dugaan, saya belum pernah melihat ini sebelumnya.

Adakah yang tahu mengapa ini terjadi?

Contoh:

mysql> SHOW TABLES;
+-----------------------+
| Tables_in_database    |
+-----------------------+
| TABLE_ONE             |
| TABLE_TWO             |
| TABLE_THREE           |
+-----------------------+
mysql> SELECT * FROM TABLE_ONE;
ERROR 1146 (42S02): Table 'database.TABLE_ONE' doesn't exist
John Smith
sumber
sudahkah Anda mengembalikan database dari cadangan? atau Anda baru saja menyalin file db? apakah Anda memiliki akses root ke server mysql?
alinoz
cukup salin file! ya saya punya akses root untuk semuanya
johnsmith
dapatkah Anda mencoba: mysql_fix_privilege_tables
alinoz
4
Apakah tabel innodb ini?
Paul Dixon
1
Ya, semua tabel adalah InnoDB. Saya buruk karena tidak mengatakannya!
johnsmith

Jawaban:

263

Kalau-kalau ada orang yang peduli:

Saya memiliki masalah yang sama setelah menyalin direktori basis data secara langsung menggunakan perintah

cp -r /path/to/my/database /var/lib/mysql/new_database

Jika Anda melakukan ini dengan database yang menggunakan InnoDBtabel, Anda akan mendapatkan kesalahan 'tabel tidak ada' yang disebutkan di atas ini.

Masalahnya adalah bahwa Anda memerlukan ib*file di root dari datadir MySQL (misalnya ibdata1, ib_logfile0dan ib_logfile1).

Ketika saya menyalinnya, itu berhasil untuk saya.

Mike Dacre
sumber
27
Menyelamatkan hidupku! Untuk orang lain, pastikan untuk tidak menimpa file ib * yang ada jika Anda mencoba menyalin ke instalasi baru. Cadangkan mysql / direktori yang ada, ganti dengan yang lama yang ingin Anda pulihkan, mysqldump semuanya, lalu pulihkan mysql / yang baru. Kemudian Anda dapat mengimpor mysqldumps dengan benar.
Matius
1
Di Mac untuk mereplikasi database saya secara lokal, selain menyalin file ibdata (terletak di sebelah dir database) saya harus ke chown _mysql:wheeldir databasename, ibdata, dan semua file dalam dir (gunakan chown -R ...). Demikian pula, izin tidak benar di dalam dir sehingga chmod -R 660 databasenamediperlukan untuk mendapatkan tabel untuk muncul di basis data.
Dylan Valade
4
Terima kasih Mike. Hanya untuk mengklarifikasi Anda perlu me-restart layanan mysql agar ini berfungsi. Setidaknya aku melakukannya, dan syukurlah itu berhasil. Banyak data yang disimpan di sana!
Nick Martin
15
CATATAN: Jangan lupa gunakan chown!!! Jadi, semua setelah cpmenggunakan perintah ini ->chown mysql:mysql /var/lib/mysql/ -R
K-Gun
1
CATATAN 2: Jangan lupa untuk menerapkan izin yang tepat. Dalam kasus saya sudo chmod -R 600 /var/lib/mysql
augusto
45

Bagi saya di Mac OS (Instalasi MySQL DMG), restart sederhana dari server MySQL memecahkan masalah. Saya menduga hibernasi yang menyebabkannya.

Martin
sumber
Terima kasih telah memperbaiki masalah yang sama untuk saya juga. Milik saya terjadi setelah mesin saya mati karena kehilangan daya secara tiba-tiba. Setelah mesin restart pertama / startup MySQL, saya mendapat kesalahan. Lalu, saya membaca jawaban ini. Saya berhenti / mulai MySQL melalui System Preferences dan sudah diperbaiki.
Jeff Evans
2
sudo /usr/local/mysql/support-files/mysql.server restart
laffuste
Juga. Saya mengalami ini setelah memutakhirkan ke macOS Sierra 10.12.6. Tidak yakin ada tautan sebab akibat, tetapi waktunya tampaknya mencurigakan.
Dave Mulligan
Terima kasih, bekerja sampai batas tertentu; saya me-restart layanan mysql (5.6, windows) lalu menjalankan check table TABLE_ONE;saya mendapat beberapa kesalahan "partisi p2 kembali kesalahan", "idx_blah_1 ditandai sebagai rusak", dan "idx_blah_2 ditandai rusak". Sekarang saya kembali menjalankan optimize table TABLE_ONE;dan mendapatkan kesalahan "Tabel 'database.TABLE_ONE' tidak ada".
Omar
Menjalankan MySLQ di Mojave. Restart melalui panel preferensi sistem tidak berfungsi. Saya harus memulai kembali melalui baris perintah.
Cortex
30

Saya mendapatkan masalah ini ketika kasus untuk nama tabel yang saya gunakan tidak aktif. Jadi tabel disebut 'db' tetapi saya menggunakan 'DB' dalam pernyataan pilih. Pastikan kasingnya sama.

dkinzer
sumber
13
+1 Nama bidang tidak peka huruf besar-kecil, tetapi nama tabelnya. Kesalahan umum, dan sangat menjengkelkan.
GolezTrol
27

Kesalahan ini juga dapat terjadi ketika mengatur lower_case_table_nameske 1, dan kemudian mencoba mengakses tabel yang dibuat dengan nilai default untuk variabel itu. Dalam hal ini Anda dapat mengembalikannya ke nilai sebelumnya dan Anda akan dapat membaca tabel.

golimar
sumber
4
Ini menggigitku. Saya mengembalikan nilainya, me-restart database, mengekspor tabel, mengatur nilainya kembali menjadi 1, me-restart database, mengimpor kembali tabel dan semuanya bekerja kembali.
wmarbut
17
  1. hentikan mysqld
  2. folder mysql cadangan: cp -a /var/lib/mysql /var/lib/mysql-backup
  3. salin folder database dari mesin lama ke /var/lib/mysql
  4. menimpa ib * (ib_logfile *, ibdata) dari database lama
  5. mulai mysqld
  6. dump dabase
  7. mysqldump >dbase.mysql
  8. hentikan layanan mysql
  9. menghapus /var/lib/mysql
  10. ganti nama /var/lib/mysql-backup menjadi/var/lib/mysql
  11. mulai mysqld
  12. buat database
  13. mysqldump < dbase.mysql
pengguna1772382
sumber
Dalam kasus saya, saya juga harus melakukan: 10.5 menghapus direktori <db_name> dari bawah / var / lib / mysql /
Tony the Tech
ini tidak bekerja. :( table 'tablename.wp_posts' tidak ada
Jahirul Islam Mamun
14

Silakan jalankan kueri:

SELECT 
    i.TABLE_NAME AS table_name, 
    LENGTH(i.TABLE_NAME) AS table_name_length,
    IF(i.TABLE_NAME RLIKE '^[A-Za-z0-9_]+$','YES','NO') AS table_name_is_ascii
FROM
    information_schema.`TABLES` i
WHERE
    i.TABLE_SCHEMA = 'database'

Sayangnya MySQL memungkinkan karakter unicode dan non-cetak untuk digunakan dalam nama tabel. Jika Anda membuat tabel dengan menyalin kode buat dari beberapa dokumen / situs web, ada kemungkinan bahwa ia memiliki ruang nol-lebar di suatu tempat.

dev-null-dweller
sumber
posting yang sangat berguna, terima kasih! tetapi semua tabel adalah ASCII dengan panjang nama yang benar
johnsmith
12

Saya baru saja menghabiskan tiga hari di mimpi buruk ini. Idealnya, Anda harus memiliki cadangan yang dapat Anda pulihkan, lalu cukup letakkan tabel yang rusak. Kesalahan semacam ini dapat menyebabkan ibdata1 Anda tumbuh besar (ukuran 100GB + untuk tabel sederhana)

Jika Anda tidak memiliki cadangan baru-baru ini, seperti jika Anda mengandalkan mySqlDump, maka cadangan Anda mungkin secara diam-diam rusak di beberapa titik di masa lalu. Anda perlu mengekspor basis data, yang tentu saja tidak dapat Anda lakukan, karena Anda akan mendapatkan kesalahan kunci saat menjalankan mySqlDump.

Jadi, sebagai solusinya, buka /var/log/mysql/database_name/dan hapus table_name. *

Maka segera cobalah untuk membuang meja; melakukan ini sekarang seharusnya bekerja. Sekarang kembalikan database ke database baru dan bangun kembali tabel yang hilang. Kemudian buang database yang rusak.

Dalam kasus kami, kami juga terus menerima mysql has gone awaypesan secara acak pada semua basis data; setelah database yang rusak dihapus semuanya kembali normal.

Andy
sumber
Terima kasih Andy, saya mendapat petunjuk untuk masalah yang saya hadapi. Saya memindahkan ibdata1 dari suatu tempat di drive C ke drive D untuk menghemat ruang lebih dari drive C. Untungnya saya mendapatkan ibdata1 (bersama dengan file ib_logfile1. Dan ib_logfile0) di drive D saya setelah membaca komentar Anda. Sekarang akan terlihat dari mana saya memindahkan file ini dan mengembalikannya ke sana. Maka semoga meja saya akan kembali.
AKS
Bagaimana Anda "segera mencoba untuk membuang meja"? Saya memiliki masalah yang sama, tidak ada cadangan jadi saya mencari cara untuk mendapatkan struktur tabel setidaknya tetapi jika Anda menghapus file dari direktori maka semuanya hilang begitu saja?
mmvsbg
Ini berhasil! Terima kasih,
jstuardo
11

Saya tidak tahu alasannya tetapi dalam kasus saya, saya menyelesaikan menonaktifkan dan mengaktifkan kunci asing

SET FOREIGN_KEY_CHECKS=0;
SET FOREIGN_KEY_CHECKS=1;
Bruno Caponi
sumber
4
Terima kasih saudara! Dalam kasus saya, saya harus menonaktifkan foreign_key_checks dan menjalankan query pilih pada tabel yang hilang kemudian tabel menjadi normal kembali. Saya pikir ada beberapa pelanggaran kunci asing di baris data karena saya punya program terganggu sebelum masalah ini terjadi.
Egist Li
Saya belum dapat menemukan alasan sebenarnya, tetapi ini juga menyelesaikan masalah saya
Miroslav Glamuzina
11

Saya memiliki masalah yang sama dan saya mencari selama 2-3 hari, tetapi solusi untuk saya benar-benar bodoh.

Mulai ulang mysql

$ sudo service mysql restart

Sekarang tabel menjadi dapat diakses.

Siraj Alam
sumber
1
Benar-benar bekerja untuk saya, walaupun perintah saya sedikit berbeda: $ sudo /usr/local/mysql/support-files/mysql.server restart
KirstieBallance
Ini harus di bagian atas daftar hal yang harus saya coba. Layak dicoba dan dalam kasus saya ini berhasil.
Coroos
7

Ok ini akan terdengar sangat tidak masuk akal, tapi humor saya.
Bagi saya masalah terselesaikan ketika saya mengubah pernyataan saya menjadi ini:

SELECT * FROM `table`

Saya membuat dua perubahan
1.) Membuat huruf kecil nama tabel - Saya tahu !!
2.) Menggunakan simbol kutipan spesifik = ` : Ini adalah kunci di atas TAB Anda

Solusinya memang terdengar tidak masuk akal, tapi berhasil dan ini Sabtu malam dan saya sudah bekerja sejak jam 9 pagi - Jadi saya akan menerimanya :)

Semoga berhasil.

PlanetUnknown
sumber
1
Just FYI - Tabelnya adalah MyISAM dan bukan INNO
Planet Tidak Dikenal
1
Juga `disebut backtick
Gary
7

Saya memiliki masalah ini setelah memutakhirkan WAMP tetapi tidak memiliki cadangan basis data.

Ini bekerja untuk saya:

  1. Hentikan WAMP baru

  2. Salin direktori database yang Anda butuhkan dan file ibdata1 dari instalasi WAMP lama

  3. Hapus ib_logfile0danib_logfile1

  4. Mulai WAMP

Anda sekarang harus dapat membuat cadangan dari basis data Anda. Namun setelah server Anda restart lagi Anda masih akan mengalami masalah. Jadi sekarang instal ulang WAMP dan impor basis data Anda.

Ya kata Reinstate Monica
sumber
Saya berharap orang-orang akan menunjukkan di mana file yang mereka rujuk berada ...
MagentoAaron
Sampai di sini dari gambar buruh pelabuhan mysql tidak memiliki tabel yang dapat dibaca. Dapat mengkonfirmasi bahwa menghentikan gambar, menghapus file-file ini, dan me-restart memberi akses lagi.
Anthony Harley
7

Cobalah menjalankan kueri sql untuk membuang tablespace sebelum menyalin file idb:

ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

Salin file idb

ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

Mulai ulang MySql

10pan
sumber
Anda telah menyelamatkan saya :)
l00k
@ I0pan saya mencoba langkah yang sama seperti yang disebutkan. Tetapi setelah ALTER TABEL mydatabase.mytable IMPORT TABLESPACE; itu menunjukkan tabel tidak ada. Tapi itu tidak :(
Syed Asad Abbas Zaidi
5

Setelah menginstal ulang MySQL saya punya masalah yang sama, tampaknya selama instalasi, beberapa file konfigurasi yang menyimpan data tentang file log InnoDB, file-file ini ib_logfile * (mereka file log kan?), Ditimpa. Untuk mengatasi masalah ini, saya baru saja menghapus file * ib_logfile.

JCM
sumber
5

Apa yang berhasil bagi saya, hanya menjatuhkan meja, meskipun tidak ada. Kemudian saya membuat tabel dan kembali dari dump sql yang dilakukan sebelumnya.

Pasti ada beberapa metabase nama tabel, dan kemungkinan besar masih ada di sana sampai saya menjatuhkannya.

Zoobra McFly
sumber
Saya telah membuat prosedur, menyadari bahwa itu perlu dilihat. Jadi saya mengganti nama prosedur dengan beberapa zzz di akhir sehingga saya bisa memilikinya untuk referensi dan membuat tampilan dengan nama yang sama. Tidak bisa mendapatkan SELECT untuk melihatnya, mendapatkan kesalahan ini. <br> Menyalin kode ke file teks, menghapus tampilan dan prosedur. Rekreasi pemandangan dan semuanya baik-baik saja. Situs Jadi ya - tujuh tahun kemudian - masih ada semacam aksi nama hantu / cache yang terjadi di beberapa kasus tepi.
Roger Krueger
5

Punya masalah yang sama dengan tabel hantu. Untungnya punya dump SQL dari sebelum kegagalan.

Dalam kasus saya, saya harus:

  1. Hentikan mySQL
  2. Pindahkan file ib * dari /var/mysqlmati ke cadangan
  3. Menghapus /var/mysql/{dbname}
  4. Mulai ulang mySQL
  5. Buat kembali basis data kosong
  6. Kembalikan file dump

CATATAN: Membutuhkan file dump.

Oli Stockman
sumber
Saya kira maksud Anda /var/lib/mysqlalih-alih/var/mysql
knocte
Menghapus direktori basis data dan memulihkan dari cadangan adalah satu-satunya hal yang membantu saya.
Jano
3
  1. Lakukan mysqldump ke basis data:

    mysqldump -u user -ppass dbname > D:\Back-ups\dbname.sql
  2. Pulihkan basis data

    mysql -u user -ppass dbname < D:\Back-ups\dbname.sql

Sekarang semua tabel dalam database telah dipulihkan sepenuhnya. Mencoba..

SELECT * FROM dbname.tablename;
Zaw Htoon
sumber
2

Saya menginstal MariaDB di komputer baru, menghentikan layanan Mysql mengubah nama folder data menjadi data- Saya memecahkan masalah saya menyalin hanya Mysql \ data \ table_folders dan ibdata1 dari crash data folder MySql HD ke folder data mysql yang baru diinstal.

Saya melewatkan ib_logfile0 dan ib_logfile1 (jika tidak, server tidak memulai layanan)

Memulai layanan mysql.

Kemudian server berjalan.

Tony
sumber
2

Tampaknya masalah harus dilakukan (setidaknya di tambang dan beberapa lainnya) dengan file innodb log yang tidak valid (rusak?). Secara umum, mereka hanya perlu diciptakan kembali.

Berikut adalah solusinya, yang sebagian besar membutuhkan restart mysql.

  • Buat kembali file log Anda ( Hapus dan mulai ulang mysql )
  • Ubah ukuran file log Anda (MySql 5.6+ akan membuat ulang file untuk Anda)
  • Jika Anda melakukan beberapa jenis migrasi data, pastikan Anda telah memigrasikan file yang benar dengan benar dan memberinya izin seperti yang telah dinyatakan orang lain.
  • Periksa izin data Anda dan file log, bahwa mysql adalah pemilik keduanya
  • Jika semuanya gagal, Anda mungkin harus membuat ulang basis data
SeanDowney
sumber
2

Berikut adalah skenario lain (peningkatan versi) :

Saya menginstal ulang OS saya (Mac OS El Captain) dan menginstal versi baru mysql (menggunakan homebrew). Versi yang terinstal (5.7) kebetulan lebih baru dari yang sebelumnya. Kemudian saya menyalin tabel, termasuk file ib *, dan me-restart server. Saya bisa melihat tabel di meja kerja mysql tetapi ketika saya mencoba untuk memilih apa pun, saya mendapat "Tabel tidak ada".

Larutan:

  1. hentikan server mysql misalnya mysql.server stop ataubrew services stop mysql
  2. mulai menggunakan server mysqld_safe --user=mysql --datadir=/usr/local/var/mysql/ (ubah jalur seperlunya)
  3. Lari mysql_upgrade -u root -p password (di jendela terminal lain)
  4. matikan server yang berjalan mysqladmin -u root -p password shutdown
  5. restart server dalam mode normal mysql.server startataubrew services start mysql

Dokumen yang relevan ada di sini .

Roman Kutlak
sumber
Sudah banyak mencoba tetapi ini adalah satu-satunya hal yang sangat membantu saya setelah saya pindah ke server baru dengan semua database saya. Terima kasih! (Ubuntu 16.04)
Falk
2

Dalam kasus saya, saya telah menetapkan pemicu pada tabel dan kemudian mencoba memasukkan baris dalam tabel. sepertinya, entah bagaimana pemicu itu salah, dan karenanya memasukkan memberikan kesalahan, tabel tidak ada.

Yogesh Kumar Gupta
sumber
1
Ini bekerja untuk saya! Memeriksa setiap pemicu dan menemukan satu pemicu perlu ditingkatkan dan itu berhasil!
Paresh
1

Mungkin Anda memiliki karakter tersembunyi di nama tabel Anda. Itu tidak muncul ketika Anda melakukan tabel acara. Bisakah Anda melakukan "SHOW CREATE TABLE TABLE_ONE" dan tab lengkapi "TABLE_ONE" dan lihat apakah itu memasukkan karakter tersembunyi. Juga, sudahkah Anda mencoba menjatuhkan dan membuat ulang tabel. Hanya untuk memastikan tidak ada yang salah dengan hak istimewa dan tidak ada karakter tersembunyi.

Hoopdady
sumber
penyelesaian tab tidak membantu dan saya tidak dapat menampilkan tabel buat karena tabel "tidak ada". dari neraka
johnsmith
1

Masalah yang sama persis setelah impor cadangan TimeMachine. Solusi saya adalah menghentikan server MySQL dan memperbaiki izin baca-tulis pada file ib *.

pengguna3415481
sumber
1

Satu jawaban lain yang saya pikir layak diangkat ke sini (karena saya datang ke sini dengan masalah yang sama dan ini ternyata menjadi jawaban bagi saya):

Periksa ulang apakah nama tabel dalam kueri Anda dieja sama persis dengan yang ada di database.

Agak hal yang jelas, pemula, tetapi hal-hal seperti "pengguna" vs "pengguna" dapat membuat orang tersandung dan saya pikir itu akan menjadi jawaban yang bermanfaat untuk ada dalam daftar di sini. :)

pisau cukur
sumber
1

Dalam kasus saya, ketika saya mengimpor file sql yang diekspor, saya mendapatkan kesalahan seperti tabel tidak ada untuk permintaan tabel buat.

Saya menyadari bahwa ada garis bawah pada nama basis data saya dan mysql sedang meletakkan karakter pelarian sebelum itu.

Jadi saya menghapus garis bawah dalam nama database, semuanya berhasil.

Semoga ini bisa membantu orang lain juga.

Onur Kucukkece
sumber
1

Meja saya entah bagaimana telah diubah namanya menjadi ' Customers'yaitu dengan ruang terdepan

Ini artinya

a) permintaan terputus

b) meja tidak muncul di tempat yang diharapkan dalam urutan abjad tabel saya, yang dalam kepanikan saya berarti saya tidak bisa melihatnya!

RENAME TABLE ` Customer` TO `Customer`;
zzapper
sumber
1

Dalam kasus saya itu adalah SQLCA.DBParmparameter.

Saya menggunakan

SQLCA.DBParm = "Databse = "sle_database.text""

tetapi harus demikian

SQLCA.DBParm = "Database='" +sle_database.text+ "'"

Penjelasan:

Anda akan menggabungkan tiga string:

 1. Database='              -  "Database='"

 2. (name of the database)  - +sle_database.text+

 3. '                       - "'" (means " ' "  without space)

Jangan gunakan spasi di quatermarks. Terima kasih kepada kolega saya Jan.

Marek
sumber
1

Pergi ke: xampp\mysql\data\dbname
di dalam dbname ada file tablename.frm dan tablename.ibd.
hapus dan restart mysql dan coba lagi.

Abu Sufian
sumber
1

Salin hanya ibdata1file dari direktori data lama Anda. Jangan menyalin ib_logfile1atau ib_logfile0file. Itu akan menyebabkan MySQL tidak mulai lagi.

Plabon Dutta
sumber
1

Datang lintas masalah yang sama hari ini. Ini adalah masalah mysql "Identifier Case Sensitivity".

Silakan periksa file data yang sesuai. Sangat mungkin bahwa nama file dalam huruf kecil pada sistem file tetapi nama tabel yang tercantum dalam perintah "show tables" dalam huruf besar. Jika variabel sistem " lower_case_table_names" adalah 0, kueri akan mengembalikan "tabel tidak ada" karena perbandingan nama adalah case-sensitive ketika " lower_case_table_names" adalah 0.

Hudson Liang
sumber
1

Saya memiliki masalah yang sama di windows. Selain menyalin file ib * dan direktori mysql di bawah direktori data thd, saya juga harus mencocokkan file my.ini.

File my.ini dari instalasi saya sebelumnya tidak memiliki baris berikut:

innodb-page-size=65536

Tetapi instalasi baru saya lakukan. Mungkin karena saya tidak memiliki opsi itu di installer yang lebih lama. Saya menghapus ini dan memulai kembali layanan dan tabel berfungsi seperti yang diharapkan. Singkatnya, pastikan bahwa file my.ini baru adalah replika yang lama, dengan satu-satunya pengecualian adalah datadir, plugin-dir dan port #, tergantung pada instalasi baru Anda.

Rajesh Thennan
sumber