Kesalahan: Ada ruang tabel untuk tabel xxx. Harap BUANG tablespace sebelum IMPOR

141

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.

MattMirabilis
sumber
Anda dapat memeriksa beberapa solusi untuk jenis kesalahan ini. codespeaker.com/laravel-framework/…
smzapp

Jawaban:

129

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.

$ ls /var/lib/mysql

table1.frm
table1.idb
table2.frm
table2.ibd
table3.idb <- problem table, no table3.frm
table4.frm
table4.idb

$ mkdir /tmp/mysql_orphans
$ mv /var/lib/mysql/table3.ibd /tmp/mysql_orphans/

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.

DangerDave
sumber
5
Saya direktori MySQL-Data pada OS X Yosemite disimpan dalam /usr/local/mysql/databukan /var/lib/mysql/. Jika tidak dengan sempurna memecahkan masalah.
Alex Hoppen
13
dalam kasus saya itu tidak berhasil ... Saya menghapus file idb yatim piatu ... dan ketika saya pergi ke membuat ulang tabel dengan nama yang sama persis saya mendapat pesan yang mengatakan bahwa tabel sudah ada (yang saya hapus .idb file) ... setelah tindakan di atas file .idb yatim piatu baru dibuat di dir ... sangat aneh ... Saya benar-benar tidak tahu harus berasumsi apa.
Dimitris Papageorgiou
4
Saya memiliki masalah yang sama dengan Dimitris - saya harus membuat dump dari database, menjatuhkan database, dan memulihkannya dari dump.
Gerfried
1
@Gerfried Ini berhasil untuk saya selama saya menghentikan & memulai proses MySQL setelah menghapus file.
MER
2
@DimitrisPapageorgiou Ini bekerja untuk saya selama saya menghentikan & memulai proses MySQL setelah menghapus file.
MER
79

Pengguna Xampp dan Mamp

Memiliki kesalahan yang sama saat mengimpor database (setelah mengosongkannya) melalui MySQL. Saya menemukan bahwa saya memiliki tablename.ibdfile yang tersisa sementara yang lainnya dihapus. Saya menghapusnya secara manual dari mysql/data/database_namedan kesalahan itu hilang.

Technotronic
sumber
Apakah jawaban ini membantu orang yang tidak menggunakan XAMPP?
Technotronic
3
jempol dari saya! bekerja dengan baik. Namun, izinkan saya sedikit memperbarui jalur folder untuk saya (bingung mencoba menemukannya): / Applications / XAMPP / xamppfiles / var / mysql
Fenix ​​Aoras
menggunakan ini mengembangkan kesalahan 168 dari mesin penyimpanan di linux mint, tidak menggunakan Xampp atau Mamp (tidak ada kritik, hanya menginformasikan)
Steven
1
berhasil! saya menghapus satu file .ibd yang rusak dan kemudian tabel dapat dibuat lagi. Ubuntu 16, mariadb
waza123
Hal yang sama berlaku untuk Docker (jika buruh pelabuhan mogok atau host restart, Anda mungkin memiliki tanggal mati di dalam folder sinkronisasi Anda yang membuat kesalahan ini)
Sliq
24

Jika Anda membuat .idbulang lagi setelah Anda menghapusnya, baca jawaban ini.

Ini cara kerjanya dengan saya. Saya memiliki .idbfile tanpa itu sesuai .frmdan setiap kali saya menghapus .idbfile, database membuat ulang lagi. dan saya menemukan solusi dalam satu baris dalam dokumentasi MySQL (bagian Tablespace Does Not Exist )

1- Buat file .frm yang cocok di beberapa direktori database lain dan salin ke direktori database tempat tabel orphan berada.

2- Terbitkan DROP TABLE untuk tabel asli. Itu seharusnya berhasil menjatuhkan tabel dan InnoDB akan mencetak peringatan ke log kesalahan bahwa file .ibd hilang.

Saya menyalin .frmfile 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

Akuntan م
sumber
3
Dalam hal ini tidak jelas bagi orang lain: ketika Anda telah membuat file .frm, dan menjatuhkan tabel, file .idb harus dihapus.
Narretz
6
Bisa konfirmasi, langkah-langkahnya harus: 1. delete mysql / path / table_name.idb 2. add table_name.frm 3. DROP table_name
Jeremy Dennen
Ini berhasil untuk saya. Terima kasih. Saya mendapat kesalahan ini saat menghapus FK dan segera setelah itu, saya menghentikan mysql. Saya pikir ini def data tabel saya rusak.
Rodolfo Velasco
ingat untuk me-restart mysql setelah meletakkan file kemudian mencoba untuk menjatuhkannya
Seyed Ali Roshan
Di mysql> data> mysql, ada file .frm yang Saya Butuhkan. Bisakah saya menyalin yang ini?
Timo
23

Untuk Pengguna WAMP [Windows 7 Ultimate x64-bit]:

Saya setuju dengan apa yang dikatakan DangerDave dan jadi saya menyediakan jawaban untuk Pengguna WAMP .

Catatan: Pertama-tama, Anda harus masuk ke folder .. \ WAMP \ Bin \ MySQL \ MySQL [Versi MySQL Anda] \ Data .

Sekarang, Anda akan melihat folder dari semua database Anda

  • Klik dua kali folder database yang memiliki tabel yang melanggar untuk membukanya
  • Seharusnya tidak ada file [Your offending MySQL table name].frm, melainkan harus ada file[Your offending MySQL table name].ibd
  • Hapus [Your offending MySQL table name].ibd
  • Kemudian, hapus juga dari Recycle Bin
  • Kemudian jalankan kueri MySQL Anda di database dan selesai
Harshul Vijay
sumber
8

Dalam kasus saya, satu-satunya solusi kerja adalah:

  1. bad_tableMESIN CREATE TABLE = MyISAM ...
  2. rm bad_table.ibd
  3. DROP TABLE bad_table
Andrey Radomanov
sumber
Bekerja untuk saya! [ERROR] InnoDB: File './dbname/tablename.ibd' sudah ada meskipun tabel terkait tidak ada dalam kamus data InnoDB. Sudahkah Anda memindahkan file InnoDB .ibd tanpa menggunakan perintah SQL HAPUS TABLESPACE dan IMPOR TABLESPACE, atau apakah mysqld crash di tengah-tengah CREATE TABLE? Anda dapat mengatasi masalah ini dengan menghapus file './dbname/tablename.ibd' di bawah 'datadir' MySQL.
PAdrian
1
Tidak dapat membuat tabel karena Tablespace ada.
Liam Mitchell
itu tidak berhasil untuk saya. ibd file terus muncul setelah saya ingin membuat ulang tabel dengan mesin yang sama.
Fajar Rukmo
8

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

...already exists though the corresponding table did not exist in the InnoDB data dictionary...

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

cp -a innodb_table2.frm innodb_table.frm
cp -a innodb_table2.ibd innodb_table.ibd
systemctl restart mariadb

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)

EDIT: Saya akan menambahkan file

restorecon -Rv /var/lib/mysql/database_name 

perintah setelah menyalin database untuk mendapatkan semua konteks selinux sebagaimana mestinya, meskipun kami segera menghapusnya dari database, tetapi sebagai alternatif Anda bisa menambahkan opsi --archive atau -a ke dua cp perintah, jadi ya sebenarnya opsi arsip mempersingkat ini:

cp innodb_table2.frm innodb_table.frm
cp innodb_table2.ibd innodb_table.ibd
chown mysql:mysql innodb_table.frm innodb_table.ibd
chmod 660 innodb_table.frm innodb_table.ibd
restorecon -Rv /var/lib/mysql/database_name
systemctl restart mariadb

hanya berikut ini yang menurut saya lebih baik dan mempertahankan konteks selinux yang diatur untuk tabel yang sudah dibuat.

cp -a innodb_table2.frm innodb_table.frm
cp -a innodb_table2.ibd innodb_table.ibd
systemctl restart mariadb

Saya telah mengganti daftar perintah yang lebih panjang di atas untuk daftar yang lebih pendek yang masih dapat dipersingkat dengan *

Chris
sumber
Ini bekerja dengan baik untuk saya di CentOS MariaDB 10.2.31. Saya sedang mencari solusi yang tidak memerlukan restart layanan MySQL dan ini dia. Kuncinya adalah membuat kumpulan file innodb_table2 bersih (innodb_table2.frm dan innodb_table2.ibd) dan menempatkan keduanya di atas file innodb_table.
Justin
7

Dalam kasus saya:

Hapus pertama tableName.ibddi direktori database Anda dari Mysql dan jalankan kedua:

ALTER TABLE tableName DISCARD TABLESPACE;
DROP TABLE tableName;
jcarlosweb.dll
sumber
Terima kasih, Dalam kasus saya, saya telah 1) menghentikan server database (layanan mysql stop) 2) menghapus file idb 3) memulai server database (layanan mysql start) Tidak menjalankan permintaan perubahan dan jatuhkan
lemk0
Direktori database Anda di Windows ada di C: \ ProgramData \ MySQL secara default
Rodin10
4

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.

morgan
sumber
4

Larutan

Namun, opsi yang lebih mudah adalah ini: mulai ulang MySQL, lalu lakukan empat langkah yang sama sebagai berikut:

1) created a dummy table in the database;
2) discarded its tablespace;
3) moved the .ibd file into the database folder on the system;
4) attached the tablespace back to the table

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

Bhavin Rana
sumber
7
Ini bukanlah jawaban yang berdiri sendiri.
Nathaniel Ford
3

Berikut langkah solusinya:

  1. backup database Anda (struktur dengan opsi drop dan data)
  2. hentikan layanan mesin mysql
  3. hapus direktori database secara manual dari dalam mysql / data
  4. mulai mesin mysql
  5. buat database baru dengan nama apa pun yang berbeda dari database Anda yang rusak
  6. buat tabel tunggal dengan nama tabel yang rusak di dalam database baru (ini rahasianya). dan lebih baik membuat tabel dengan struktur yang persis sama.
  7. ganti nama database ke database lama yang rusak
  8. pulihkan cadangan Anda dan tabel Anda akan berfungsi dengan baik.
Mahmoud Rabea
sumber
2

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(...)

Nerko
sumber
2

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.

GoalsAndGambles
sumber
2

Galat ini terjadi saat Anda menangguhkan beberapa fungsi. Seperti menjalankan kueri di bawah ini dengan kunci asing yang salah.

set foreign_key_checks=0
zeddarn.dll
sumber
2

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=1sedangkan di 5.5 mereka innodb_file_per_table=0.

ibdata1File Anda yang sudah ada (gabungan data innodb) akan tetap memiliki referensi ke tabel yang Anda coba buat / jatuhkan. Ubah innodb_file_per_tablekembali 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:

ERROR 2013 (HY000): Lost connection to MySQL server at 'sending authentication information', system error: 32

Saya menambahkan <string>--port=3306</string>ke .plistarray, tetapi Anda juga bisa menentukan port=3306di filemy.cnf

Jalankan brew services stop [email protected]buat perubahan Andabrew services start [email protected]

jaygooby
sumber
1

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.

Aris
sumber
20
Sayangnya itu seperti mengatakan 'Saya punya sekrup, dan menggunakan palu mengembalikan kesalahan ini, jadi solusi saya adalah menjatuhkan batu di atasnya'. Nilai sebenarnya adalah mencari cara untuk memperbaiki tabel yang satu ini tanpa nuking seluruh database.
Jason
Doh! Saya berharap ini akan menjadi solusi alternatif untuk pertanyaan saya (dan saya mempostingnya sebagai jawaban), tetapi saya sudah setengah jalan melalui proses mengganti nama tabel / menjatuhkan database. Saya agak benci InnoDB sekarang.
NobleUplift
Tapi saya nuked database, membuatnya kembali, dan masih memiliki masalah ini!
TRiG
@ TRiG apakah Anda merestart server?
Aris
1
Saya rasa saya akan mengajukan pertanyaan terpisah, @Aris. Dalam kasus saya, ini ada di desktop Ubuntu. Saya telah memulai ulang tidak hanya MySQL, tetapi seluruh mesin, beberapa kali. Juga menghapus folder database dengan tangan dengan file rm -r. Ini menjengkelkan, tapi juga tidak bisa berhenti.
TRiG
1

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.

pengguna3524152
sumber
1

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.

Yura Galavay
sumber
0

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,

XMaster
sumber
0

Cara yang saya temukan untuk "memecahkan" masalah ini cukup mengganggu, tetapi ada skrip yang menanganinya.

Pada dasarnya, Anda memerlukan file ibdata1dan ib_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.

Glen Solsberry
sumber
0

Satu-satunya cara itu berhasil bagi saya adalah:

  1. Buat tabel serupa
  2. Salin file .frm dan .idb dari tabel baru yang serupa ke nama tabel yang rusak.
  3. Perbaiki izin
  4. Mulai ulang MariaDB
  5. Jatuhkan tabel yang rusak
avibrazil
sumber
-1

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.

Ankit Vishwakarma
sumber
-1

Harap BUANG tablespace sebelum IMPOR

Saya mendapat solusi masalah yang sama di bawah

  1. 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"

  2. Sekali lagi Anda harus membuat database baru dan mengimpor file sql lama Anda. Ini akan berhasil

Terima kasih

F5 Sobat
sumber
-1

Saya harus mencari direktori data MySQL saya:

TAMPILKAN VARIABEL DI MANA Variabel_Name SEPERTI "% dir"

Kemudian paksa hapus database itu:

sudo rm -rf

GarethReid
sumber
-1

Anda dapat menjalankan kueri berikut sebagai pengguna root mysql

drop tablespace `tableName`
Saroj
sumber