Saya cukup baru mengenal MySQL dan saya mendapatkan kesalahan yang cukup menarik di mana saya tidak dapat menemukan bantuan apa pun melalui google dan pencarian stackoverflow.
Saya menjalankan server lokal MySQL 5.6.10 di MacOS 10.8.3 dan mengelola database saya melalui hal-hal penting Navicat untuk MySQL.
Kesalahan yang saya dapatkan adalah bahwa setelah menjalankan dan mengelola database saya dengan baik selama beberapa hari / minggu, ada sesuatu yang memicu (tampaknya tidak sepenuhnya) menghapus beberapa tabel yang saya buat menggunakan kueri dari dalam Navicat.
Saat saya mencoba menjalankan kueri menggunakan tabel ini, Navicat kemudian memperingatkan saya bahwa tabel tertentu tidak ada. Sejauh ini bagus - inilah bagian yang bagus:
Ketika saya mencoba untuk MENCIPTAKAN tabel, misalnya bernama "temp", yang sebelumnya ada, saya mendapatkan pesan kesalahan berikut:
Error : Tablespace for table '`database`.`temp`' exists. Please DISCARD the tablespace before IMPORT.
Namun, jika saya mencoba untuk menjatuhkan tabel, atau mencoba membuang tablespace untuk tabel ini, menggunakan
DROP TABLE temp;
ALTER TABLE temp DISCARD TABLESPACE;
Saya mendapatkan pesan kesalahan berikut:
Error : Unknown table 'database.temp'
Error : Table 'database.temp' doesn't exist
Jadi itu berarti saya disarankan untuk membuang ruang meja tetapi ketika saya mencoba untuk melakukannya, tabel tersebut tidak ada. Apakah mungkin ada beberapa jenis sisa dari tabel ini di tempat berbeda di mana kueri DISCARD tidak diperiksa? Dan adakah yang punya ide apa yang bisa memicu semua itu - sepertinya benar-benar acak?
Seperti yang saya katakan, saya baru mengenal subjek ini dan hampir tidak mengerti. Saya menduga bahwa me-boot ulang laptop saya, yaitu mengatur ulang server MySQL lokal saya, atau mungkin hak izin pengguna mungkin ada hubungannya dengan itu, tetapi saya hanya berhipotesis di sini.
sumber
Jawaban:
Agak terlambat di sini tetapi secara umum saya telah melihat masalah ini terjadi ketika Anda mendapatkan kesalahan 'tablespace full' ketika berjalan dalam mode 'innodb_file_per_table'. Tanpa membahas terlalu banyak detail (selengkapnya di sini ), tablespace server database ditentukan oleh pengaturan innodb_data_file_path dan secara default agak kecil. Bahkan dibuat lebih besar, 'tablespace full' masih dapat terjadi dengan kueri yang lebih besar dan semacamnya (banyak 'barang' non-tabel disimpan di sana, batalkan log, cache, dll ...).
Bagaimanapun, saya menemukan bahwa jika Anda melihat di direktori OS tempat file-per-tabel disimpan, / var / lib / mysql secara default di OSX, / usr / local / var / mysql dengan homebrew iirc, Anda akan menemukan file tablename.ibd yatim piatu tanpa file tablename.frm pendamping yang normal. Jika Anda memindahkan file .ibd itu ke lokasi sementara yang aman (hanya untuk berjaga-jaga) yang seharusnya memperbaiki masalah.
Satu peringatan, pastikan apa pun yang menyebabkan masalah aslinya, misalnya kueri yang berjalan lama, tabel terkunci, dll ... telah dihapus. Jika tidak, Anda hanya akan mendapatkan file .ibd yatim piatu saat Anda mencoba untuk kedua kalinya.
sumber
/usr/local/mysql/data
bukan/var/lib/mysql/
. Jika tidak dengan sempurna memecahkan masalah.Pengguna Xampp dan Mamp
Memiliki kesalahan yang sama saat mengimpor database (setelah mengosongkannya) melalui MySQL. Saya menemukan bahwa saya memiliki
tablename.ibd
file yang tersisa sementara yang lainnya dihapus. Saya menghapusnya secara manual darimysql/data/database_name
dan kesalahan itu hilang.sumber
Jika Anda membuat
.idb
ulang lagi setelah Anda menghapusnya, baca jawaban ini.Ini cara kerjanya dengan saya. Saya memiliki
.idb
file tanpa itu sesuai.frm
dan setiap kali saya menghapus.idb
file, database membuat ulang lagi. dan saya menemukan solusi dalam satu baris dalam dokumentasi MySQL (bagian Tablespace Does Not Exist )Saya menyalin
.frm
file tabel lain dan menamainya seperti tabel saya yang hilang, lalu membuat kueri tabel drop normal dan voila, itu berfungsi dan tabel dijatuhkan secara normal!sistem saya adalah XAMPP di windows MariaDB v 10.1.8
sumber
Untuk Pengguna WAMP [Windows 7 Ultimate x64-bit]:
Saya setuju dengan apa yang dikatakan DangerDave dan jadi saya menyediakan jawaban untuk Pengguna WAMP .
Sekarang, Anda akan melihat folder dari semua database Anda
[Your offending MySQL table name].frm
, melainkan harus ada file[Your offending MySQL table name].ibd
[Your offending MySQL table name].ibd
sumber
Dalam kasus saya, satu-satunya solusi kerja adalah:
bad_table
MESIN CREATE TABLE = MyISAM ...bad_table
sumber
Ini persis seperti yang saya lakukan di mariadb 10.2.16 di fedora ketika saya memiliki tabel yang menunjukkan kesalahan yang sama persis di file log yang saya kira ...
2018-07-11 9:43:58 140323764213504 [Note] InnoDB: The file './database_name/innodb_table.ibd' already exists though the corresponding table did not exist in the InnoDB data dictionary. You can resolve the problem by removing the file. 2018-07-11 9:44:29 140323764213504 [Warning] InnoDB: Tablespace 'database_name/innodb_table' exists in the cache with id 2836 != 2918
jarak tempuh dan kesalahan Anda mungkin berbeda tetapi yang utama saya asumsikan adalah
dengan meja drop tidak berfungsi sebaik mengubah tabel ...
MariaDB [database_name]> drop table innodb_table; ERROR 1051 (42S02): Unknown table 'database_name.innodb_table' MariaDB [database_name]> alter table innodb_table discard tablespace; ERROR 1146 (42S02): Table 'database_name.innodb_table' doesn't exist
buat tabel juga gagal seperti ini:
MariaDB [database_name]> create table innodb_table(`id` int(10) unsigned NOT NULL); ERROR 1813 (HY000): Tablespace for table '`database_name`.`innodb_table`' exists. Please DISCARD the tablespace before IMPORT
untuk memperbaikinya, yang saya lakukan adalah yang pertama
create table innodb_table2(`id` int(10) unsigned NOT NULL); Query OK, 0 rows affected (0.07 sec)
kemudian di direktori / var / lib / mysql / database_name saya melakukan hal berikut sebagai root yang mengakui penimpaan innodb_table.ibd yang menyebabkan masalah kami
kemudian kembali ke konsol mysql saya mengeluarkan perintah drop yang berhasil di kedua tabel
MariaDB [database_name]> drop table innodb_table; ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 8 Current database: database_name Query OK, 0 rows affected (0.08 sec) MariaDB [database_name]> drop table innodb_table2; Query OK, 0 rows affected (0.25 sec)
dan semuanya sekarang semuanya persegi dan saya dapat membuat ulang satu tabel ...
MariaDB [database_name]> create table innodb_table (`id` int(10) unsigned NOT NULL); Query OK, 0 rows affected (0.08 sec)
sumber
Dalam kasus saya:
Hapus pertama
tableName.ibd
di direktori database Anda dari Mysql dan jalankan kedua:ALTER TABLE tableName DISCARD TABLESPACE; DROP TABLE tableName;
sumber
Saya mendapat kesalahan yang sama menjalankannya di wampserver saat mencoba membuat tabel pengguna. Saya menemukan file users.ibd dan setelah saya menghapus file ini, saya menjalankan perintah migrasi lagi dan berhasil. File di mesin windows saya terletak di wamp / bin / mysql / mysql5.6.12 / data / myproject.
sumber
Larutan
Namun, opsi yang lebih mudah adalah ini: mulai ulang MySQL, lalu lakukan empat langkah yang sama sebagai berikut:
Dengan cara ini, id tablespace pada kamus data dan file cocok; sehingga mengimpor tablespace berhasil.
Ini dapat memberi Anda kepercayaan diri yang lebih besar dalam menangani beberapa "gotcha" InnoDB selama proses pemulihan atau bahkan transfer file.
ref
sumber
Berikut langkah solusinya:
sumber
Mengalami masalah ini beberapa kali. Jika Anda memiliki DB yang besar dan ingin mencoba menghindari backup / restore (dengan menambahkan tabel yang hilang), coba beberapa kali bolak-balik:
DROP TABLE my_table;
ALTER TABLE my_table DISCARD TABLESPACE;
-dan-
rm my_table.ibd (orphan w / o sesuai my_table.frm) terletak di / var / lib / mysql / my_db / direktori
-lalu-
BUAT TABEL JIKA TIDAK ADA
my_table
(...)sumber
Menghapus / Memindahkan tablename.ibd yakin tidak berhasil untuk saya.
Bagaimana saya menyelesaikannya
Karena saya akan menghapus tabel yang rusak dan tidak ada, saya mengambil cadangan dari tabel lain dengan membuka phpmyadmin-> database-> ekspor-> tabel yang dipilih ke backup-> ekspor (sebagai .sql).
Setelah itu saya memilih ikon database di sebelah nama database dan kemudian menjatuhkannya. Membuat database baru. Pilih database baru Anda-> impor-> Pilih file yang Anda unduh sebelumnya-> klik impor. Sekarang saya memiliki tabel kerja lama saya dan tabel yang rusak dihapus. Sekarang saya baru saja membuat tabel yang tadi membuang error.
Kemungkinan saya memiliki cadangan sebelumnya dari tabel yang rusak.
sumber
Galat ini terjadi saat Anda menangguhkan beberapa fungsi. Seperti menjalankan kueri di bawah ini dengan kunci asing yang salah.
set foreign_key_checks=0
sumber
Punya masalah yang persis sama; Saya akan membuat tambah
[email protected]
(setelah sebelumnya memiliki 5,5).Bir default untuk 5.6
innodb_file_per_table=1
sedangkan di 5.5 merekainnodb_file_per_table=0
.ibdata1
File Anda yang sudah ada (gabungan data innodb) akan tetap memiliki referensi ke tabel yang Anda coba buat / jatuhkan. Ubahinnodb_file_per_table
kembali ke 0, atau hapus file data ibdata1 ( ini akan kehilangan semua data Anda, jadi pastikan Anda mysqldump terlebih dahulu atau sudah memiliki dump .sql ).[email protected]
Default minuman lain yang menggigit saya adalah kurangnya port, jadi jaringan secara default menggunakan soket unix, dan klien mysql terus melaporkan:Saya menambahkan
<string>--port=3306</string>
ke.plist
array, tetapi Anda juga bisa menentukanport=3306
di filemy.cnf
Jalankan
brew services stop [email protected]
buat perubahan Andabrew services start [email protected]
sumber
Mencoba melepaskan tablespace dapat menghasilkan kesalahan lain. Bagi saya, saya mendapat kesalahan berikut:
DROP TABLESPACE `tablename` Error Code: 1478. Table storage engine 'InnoDB' does not support the create option 'TABLESPACE or LOGFILE GROUP'
Solusi saya adalah menjatuhkan database. Ini akan menghapus semua ruang tabel yang terkait dengannya dan memungkinkan Anda membuat tabel lagi.
sumber
rm -r
. Ini menjengkelkan, tapi juga tidak bisa berhenti.Jika Anda memiliki server lain dengan versi bagus dari tabel yang sama, Anda dapat membuat salinan (table_copy), transfer table_copy ke server masalah. Kemudian hapus tabel masalah dan ganti nama table_copy menjadi tabel.
sumber
Bagi saya itu membantu hanya pergi ke direktori MYSQL DATA di bawah / var / lib / mysql / {db_name} (linux) dan jatuhkan file {table_name} .ibd yang sama dengan nama folder.
sumber
Saya hanya menghapus DB lama saya yang terletak di localhost saya langsung dari wamp, Hentikan semua layanan, Pergi ke wamp / bin / mysql / mysql [versi] / data dan saya menemukan DB dengan masalah, saya menghapusnya dan mulai lagi wamp semua layanan, buat lagi database Anda dan selesai, Sekarang Anda dapat mengimpor tabel Anda,
sumber
Cara yang saya temukan untuk "memecahkan" masalah ini cukup mengganggu, tetapi ada skrip yang menanganinya.
Pada dasarnya, Anda memerlukan file
ibdata1
danib_logfile*
untuk dihapus (berisi pemetaan kunci asing, antara lain). Satu-satunya cara yang aman untuk melakukannya adalah dengan mengekspor semua database Anda, menghentikan mysql, menghapus file, memulai mysql, lalu mengimpor file.Skrip yang membantu mengatasi masalah ini adalah https://github.com/uberhacker/shrink-ibdata1 , meskipun tujuan yang dinyatakan dari skrip ini berbeda, hal itu menyelesaikan masalah.
sumber
Satu-satunya cara itu berhasil bagi saya adalah:
sumber
jika Anda memiliki masalah ini dan Anda tidak memiliki opsi lain, ubah mesin ke mesin lain seperti 'myisam', maka coba buat tabel.
disclaimer: ini bukan jawaban yang valid karena Anda mungkin memiliki batasan kunci asing yang tidak akan didukung oleh mesin penyimpanan lain. Setiap mesin penyimpanan memiliki spesialisasi mereka sendiri untuk menyimpan dan mengakses data, poin-poin ini juga harus diperhitungkan.
sumber
Harap BUANG tablespace sebelum IMPOR
Saya mendapat solusi masalah yang sama di bawah
Pertama, Anda harus menghapus nama database Anda. jika database Anda tidak menghapus Anda memiliki flow me. Untuk sistem Windows direktori Anda akan menjadi C: / xampp / mysql / data / yourdabasefolder hapus "yourdabasefolder"
Sekali lagi Anda harus membuat database baru dan mengimpor file sql lama Anda. Ini akan berhasil
Terima kasih
sumber
Saya harus mencari direktori data MySQL saya:
TAMPILKAN VARIABEL DI MANA Variabel_Name SEPERTI "% dir"
Kemudian paksa hapus database itu:
sudo rm -rf
sumber
Anda dapat menjalankan kueri berikut sebagai pengguna root mysql
drop tablespace `tableName`
sumber