Kesalahan: Tablespace untuk tabel xxx sudah ada. Harap Buang tablespace sebelum IMPOR

Saya cukup baru dalam MySQL dan saya mendapatkan kesalahan yang cukup menarik yang tidak dapat saya temukan bantuannya melalui google dan pencarian stackoverflow.

Saya menjalankan server lokal MySQL 5.6.10 pada MacOS 10.8.3 dan mengelola database saya melalui Navicat essentials for MySQL.

Kesalahan yang saya dapatkan adalah setelah menjalankan dan mengelola database saya dengan baik selama beberapa hari/minggu, ada sesuatu yang memicu untuk (tampaknya tidak lengkap) menghapus beberapa tabel yang saya buat menggunakan kueri dari dalam Navicat.

Ketika saya mencoba menjalankan kueri menggunakan tabel-tabel ini, Navicat kemudian memperingatkan saya bahwa tabel tertentu tidak ada. Sejauh ini bagus - inilah bagian yang bagus:

Ketika saya mencoba untuk CREATE 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 demikian, jika saya mencoba untuk men-drop tabel, atau mencoba membuang tablespace untuk tabel ini, menggunakan

DROP TABLE temp;
ALTER TABLE temp DISCARD TABLESPACE;

Saya mendapatkan pesan kesalahan berikut ini:

Error : Unknown table 'database.temp'
Error : Table 'database.temp' doesn't exist

Jadi itu berarti bahwa saya disarankan untuk membuang ruang tabel tetapi ketika saya mencoba melakukannya, tabel tersebut tidak ada. Apakah mungkin ada beberapa jenis sisa tabel ini di tempat yang berbeda di mana kueri DISCARD tidak diperiksa? Dan apakah ada yang punya ide apa yang bisa memicu semua itu - benar-benar secara acak seperti yang terlihat?

Seperti yang saya katakan, saya masih baru dalam hal ini dan cukup banyak yang tidak tahu apa-apa. Saya menduga bahwa mem-boot ulang laptop saya, yaitu mengatur ulang server MySQL lokal saya, atau mungkin hak izin pengguna mungkin ada hubungannya dengan hal itu, tetapi saya hanya berhipotesis di sini.

Mengomentari pertanyaan (1)

Sedikit terlambat di sini, tetapi umumnya saya telah melihat masalah ini terjadi ketika Anda mendapatkan ' tablespace penuh ' kesalahan saat berjalan dalam mode ' innodb_file_per_table '. Tanpa membahas terlalu banyak detail (lebih lanjut [di sini][1]), tablespace server database ditentukan oleh pengaturan innodb_data_file_file_path dan secara default agak kecil. Bahkan dibuat lebih besar, tablespace yang penuh masih dapat terjadi dengan query yang lebih besar dan semacamnya (banyak non-tabel yang tersimpan di sana, undo log, cache, dll...).

Bagaimanapun, saya menemukan bahwa jika Anda melihat di direktori OS di mana file-per-tabel disimpan, /var/lib/mysql secara default di OSX, /usr/local/var/mysql dengan iirc homebrew, Anda akan menemukan file tablename.ibd yatim piatu tanpa file tablename.frm pendamping normal. Jika Anda memindahkan file .ibd ke lokasi sementara yang aman (hanya untuk amannya saja) itu akan memperbaiki masalahnya.


$ ls /var/lib/mysql

table1.frm
table1.idb
table2.frm
table2.ibd
table3.idb 
Komentar (8)

Xampp dan Mamp Pengguna

Sama-sama memiliki kesalahan saat mengimpor database (setelah pengosongan itu) melalui MySQL. Saya menemukan bahwa saya memiliki namatabel.ibd file yang tersisa saat semua orang lain yang dihapus. Saya dihapus secara manual dari mysql/data/database_name dan kesalahan itu pergi.

Komentar (6)

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

Saya setuju dengan apa yang DangerDave kata dan jadi saya'm membuat jawaban yang tersedia untuk WAMP Pengguna.

Catatan: Pertama-tama, anda harus pergi untuk anda ..\WAMP\Bin\MySQL\MySQL[Versi MySQL Anda]\Data folder.

Sekarang, anda'll melihat folder dari semua database anda

  • Klik dua kali folder database yang telah menyinggung tabel untuk membukanya
  • Seharusnya ada't menjadi sebuah file [Anda menyinggung MySQL table name].frm, bukannya harus ada file [Anda menyinggung MySQL table name].ibd
  • Menghapus [Anda menyinggung MySQL table name].ibd
  • Kemudian, menghapusnya dari Recycle Bin juga
  • Kemudian menjalankan query MySQL pada database dan anda're dilakukan
Komentar (0)

Jika anda mendapatkan .idb diciptakan lagi setelah anda menghapusnya, kemudian membaca jawaban ini.

Ini bagaimana hal itu bekerja dengan saya. Aku punya .idb file tanpa itu's sesuai .frm dan setiap kali saya hapus .idb file, database menciptakan itu lagi. dan saya menemukan solusi dalam satu baris di MySQL dokumentasi (Tablespace Tidak Ada bagian)

1 - Membuat pencocokan .frm file di beberapa direktori database dan salin ke direktori database di mana anak yatim tabel tersebut berada.

2 - Masalah DROP TABEL untuk tabel asli. Yang harus berhasil menjatuhkan meja dan InnoDB harus mencetak sebuah peringatan error log yang .ibd file yang hilang.

Saya menyalin tabel yang lain .frm file dan nama itu seperti saya hilang meja, kemudian membuat normal drop table query dan voila, bekerja dan tabel turun biasanya!

sistem saya adalah XAMPP pada windows MariaDB v 10.1.8

Komentar (7)

Dalam kasus saya hanya bekerja solusi:

  1. CREATE TABLE bad_table ENGINE=MyISAM ...
  2. rm bad_table.ibd
  3. DROP TABLE bad_table
Komentar (2)

Ini adalah persis apa yang saya lakukan di mariadb 10.2.16 pada fedora ketika saya punya tabel yang menunjukkan persis sama kesalahan dalam log file 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 anda dan kesalahan dapat bervariasi, tapi yang utama saya asumsikan adalah

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

dengan drop table tidak bekerja serta alter table...

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

membuat tabel juga gagal seperti:

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

dalam rangka untuk memperbaiki kesalahan ini, apa yang saya lakukan pertama kali

create table  innodb_table2(`id` int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.07 sec)

kemudian di /var/lib/mysql/database_name direktori yang saya lakukan berikut sebagai root mengakui timpa innodb_table.ibd menyebabkan kita masalah

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

kemudian kembali di konsol mysql saya mengeluarkan berhasil menjatuhkan perintah pada 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 semua persegi dan saya bisa menciptakan satu meja...

MariaDB [database_name]> create table  innodb_table (`id` int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.08 sec)

EDIT: saya akan tambahkan di

restorecon -Rv /var/lib/mysql/database_name

perintah setelah menyalin database untuk mendapatkan semua selinux konteks cara mereka seharusnya, meskipun kita menghapus mereka dari database hampir segera, tetapi dalam alternatif anda bisa menambahkan --arsip atau -sebuah opsi untuk dua cp perintah, jadi ya sebenarnya pilihan arsip yang lebih pendek 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

untuk berikut yang saya pikir adalah yang lebih baik dan itu membuat selinux konteks yang ditetapkan untuk yang sudah dibuat tabel.

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

aku telah diganti atas lagi daftar perintah untuk daftar pendek yang bisa dipersingkat masih dengan *

Komentar (0)

Solusi

Namun, pilihan yang lebih mudah adalah: restart MySQL, kemudian lakukan empat langkah yang sama seperti 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; dengan demikian, impor tablespace berhasil.

Hal ini dapat memberi Anda kepercayaan diri yang lebih besar dalam menangani beberapa InnoDB "gotcha's" selama proses pemulihan atau bahkan transfer file.

ref

Komentar (2)

Aku punya kesalahan yang sama berjalan pada wampserver saat mencoba untuk membuat tabel pengguna. Aku menemukan pengguna.ibd file dan setelah saya menghapus file ini, aku berlari bermigrasi perintah lagi dan itu berhasil. File pada mesin windows saya berada di wamp/bin/mysql/mysql5.6.12/data/myproject.

Komentar (0)

Dalam kasus saya:

Pertama menghapus namatabel.ibd di dalam direktori database dari Mysql dan menjalankan kedua:

ALTER TABLE tableName DISCARD TABLESPACE;
DROP TABLE tableName;
Komentar (2)

di Sini adalah solusi langkah-langkah:

  1. backup database (struktur dengan pilihan drop dan data)
  2. stop mysql layanan mesin
  3. hapus direktori database secara manual dari dalam mysql/data
  4. start mysql mesin
  5. membuat database baru dengan nama yang berbeda dari database rusak
  6. membuat satu tabel dengan nama rusak tabel di dalam database baru (ini rahasia). dan itu lebih baik untuk membuat tabel dengan struktur yang sama.
  7. ubah nama database yang lama rusak database
  8. mengembalikan backup dan meja anda akan bekerja dengan baik.
Komentar (0)

Kesalahan ini terjadi bila anda menunda beberapa fungsi. Seperti menjalankan query di bawah ini dengan benar foreign key.

set foreign_key_checks=0
Komentar (0)

Menghapus/Memindahkan tablename.ibd yakin tidak bekerja untuk saya.

Bagaimana saya soal itu

Karena saya akan menghapus rusak dan tak ada meja, aku mengambil cadangan dari tabel lain dengan masuk ke phpmyadmin->database->ekspor->tabel yang dipilih untuk backup->ekspor(seperti .sql).

Setelah itu saya memilih database ikon di samping nama database dan kemudian menjatuhkannya. Buat sebuah database baru. Pilih database baru anda->impor-> Pilih file yang anda download tadi->klik impor. Sekarang saya telah lama saya di meja kerja dan meja rusak dihapus. Sekarang saya hanya membuat tabel yang melempar kesalahan.

Mungkin aku punya cadangan yang sebelumnya rusak meja.

Komentar (0)

Punya masalah ini beberapa kali. Jika anda memiliki besar DB dan ingin mencoba menghindari backup/restore (dengan menambahkan meja hilang), mencoba beberapa kali bolak-balik:

DROP TABLE my_table;

ALTER TABLE my_table MEMBUANG TABLESPACE;

-dan-

rm my_table.ibd (yatim piatu w/o yang sesuai my_table.frm) yang terletak di /var/lib/mysql/my_db/ direktori

-dan kemudian-

CREATE TABLE IF NOT EXISTS my_table (...)

Komentar (0)

Jika anda memiliki sebuah server yang lain dengan versi yang baik dari tabel yang sama anda dapat membuat salinan(table_copy), transfer table_copy untuk masalah server. Kemudian menghapus masalah tabel dan mengubah nama table_copy ke meja.

Komentar (0)

Mencoba untuk melepaskan tablespace dapat memberikan Anda kesalahan lain. Bagi saya, saya mendapatkan 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 dengan menghapus basis data. Ini akan menghapus semua tablespace yang terkait dengannya dan memungkinkan Anda untuk membuat tabel lagi.

Komentar (5)

Punya masalah yang sama persis; aku'd menyeduh ditambahkan mysql@5.6 (setelah sebelumnya mengalami 5.5).

Minuman default untuk 5.6 adalah innodb_file_per_table=1 sedangkan dalam 5.5 mereka're innodb_file_per_table=0.

Ada ibdata1 file (gabungan innodb data) masih akan memiliki referensi untuk tabel anda're mencoba untuk membuat/drop. Baik perubahan innodb_file_per_table kembali ke 0, atau menghapus ibdata1 file data (ini akan kehilangan semua data anda, jadi pastikan anda mysqldump pertama kali atau sudah memiliki .sql dump).

Lainnya minuman mysql@5.6 default yang sedikit saya adalah kurangnya port, sehingga jaringan default ke soket unix, dan mysql klien terus pelaporan:

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

Saya menambahkan <string>--port=3306</string> ke .plist array, tapi anda juga bisa menentukan port=3306 anda saya.cnf

Menjalankan minuman layanan berhenti mysql@5.6 membuat perubahan anda kemudian minuman jasa mulai mysql@5.6

Komentar (0)

Bagi saya itu membantu hanya pergi ke MYSQL DATA direktori di bawah /var/lib/mysql/{db_name} (linux) dan drop {table_name}.ibd file yang sama dengan nama folder.

Komentar (0)

Aku hanya menghapus tua saya DB terletak di localhost langsung dari wamp, Stop semua layanan, Pergi ke wamp/bin/mysql/mysql[versi]/data dan aku menemukan DB dengan problemas, saya menghapus dan mulai lagi wamp semua layanan, buat lagi database anda dan hal itu dilakukan, Sekarang anda dapat mengimpor tabel,

Komentar (0)

Cara yang saya temukan untuk "memecahkan" ini masalah yang cukup menjengkelkan, tapi ada script yang menangani itu.

Pada dasarnya, anda perlu ibdata1 dan ib_logfile* file untuk pergi (mengandung pemetaan kunci asing, antara lain). Satu-satunya safe cara untuk melakukan ini adalah untuk mengekspor database anda, stop mysql, menghapus file, mulai mysql, dan kemudian impor file.

Script yang membantu memecahkan masalah ini adalah https://github.com/uberhacker/shrink-ibdata1 meskipun menyatakan tujuan dari script ini adalah berbeda, hal ini tidak memecahkan masalah.

Komentar (0)

Satu-satunya cara itu bekerja untuk saya adalah:

  1. Membuat meja yang sama
  2. Menyalin .frm dan .idb file baru mirip tabel untuk nama korup meja.
  3. Fix permissions
  4. Restart MariaDB
  5. Drop korup meja
Komentar (0)