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.
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), 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 <- 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 yang menyebabkan masalah awalnya, misalnya kueri yang berjalan lama, tabel terkunci, dll... telah dihapus. Jika tidak, Anda hanya akan berakhir dengan file .ibd yatim piatu lainnya ketika Anda mencoba untuk kedua kalinya.
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.
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
[Anda menyinggung MySQL table name].frm
, bukannya harus ada file [Anda menyinggung MySQL table name].ibd
[Anda menyinggung MySQL table name].ibd
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
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 *
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.
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.
di Sini adalah solusi langkah-langkah:
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.
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
(...)
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.
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.
Punya masalah yang sama persis; aku'd menyeduh ditambahkan [email protected]
(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 [email protected]
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 [email protected]
membuat perubahan anda kemudian minuman jasa mulai [email protected]
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,
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.