Saya menggunakan langkah-langkah ini untuk membuat tabel my_user
, yang sudah ada tetapi entah bagaimana lenyap dari database saya my_db
:
mysql> USE my_db;
mysql> DROP TABLE my_user;
mysql> ERROR 1051 (42S02): Unknown table 'my_user'
mysql> CREATE TABLE my_user (id INT AUTO_INCREMENT NOT NULL, username VARCHAR(255), group_id VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
mysql> ERROR 1005 (HY000): Can't create table 'my_db.my_user' (errno: -1)
Mencoba # mysqladmin flush-tables
dan mengulangi langkah-langkah di atas tetapi tidak membantu. Juga, restart mysql
layanan, tetapi tidak bagus.
Ada ide? Google telah mengecewakan saya sejauh ini. Terima kasih.
Informasi tambahan:
mysql> SHOW engine innodb STATUS;
------------------------
LATEST FOREIGN KEY ERROR
------------------------
140703 15:15:09 Error in foreign key constraint of table my_db/my_user
there is no index in the table which would contain
the columns as the first columns, or the data types in the
table do not match the ones in the referenced table
or one of the ON ... SET NULL columns is declared NOT NULL. Constraint:
,
CONSTRAINT "FK_CFBD431E285FAC6D" FOREIGN KEY ("group_id") REFERENCES "my_group" ("id")
my_user
tetapi kesalahannya adalah tentangmy_db.user
...CREATE TABLE
kode ini dihasilkan oleh perpustakaan ORM Doctrine (PHP).Jawaban:
Arsitektur InnoDB
ANALISIS
my_user.frm
danmy_user.ibd
file. Kamus data masih memiliki entri untuk tabel itu.DROP TABLE my_user;
karena mysqld mencari yangmy_user.frm
pertama. Karena ini tidakmy_user.frm
, tabel tidak dapat dijatuhkan.my_user.frm
tidak ada, Anda tidak dapat menjalankanCREATE TABLE my_user ...
karena mysqld berpikir tidak masalah untuk membuat tabel tetapi kemudian beralih ke mesin penyimpanan. InnoDB mengatakan "Saya sudah memiliki tablespace_id dari my_user terdaftar".Urutan acara ini dapat dibuktikan jika Anda membuat tabel menggunakan MyISAM. mysqld akan mengizinkannya. Setelah Anda beralih ke InnoDB, langsung kembali ke kamus data, yang salah pada satu entri itu.
Saya punya dua saran
SARAN # 1
Jangan membuat tabel dengan nama itu lagi. Gunakan nama tabel yang berbeda
Ini akan mengakibatkan Anda mengubah nama tabel dalam kode aplikasi Anda
SARAN # 2
Saya telah berurusan dengan masalah ini sebelumnya di tabel InnoDB posting saya SELECT return ERROR 2006 (HY000): Server MySQL telah hilang (setelah listrik padam)
sumber
ib_logfile0
danib_logfile1
(bersamaan denganibdata1
). Setelah impor saya bisa membuatmy_user
tabel tanpa masalah. Rolando terima kasih!DROP TABLE
. Sesuatu yang salah sedang terjadi.Hanya untuk menambahkan solusi saya karena saya punya masalah yang sama.
TL; DR
Detail
Saya mengalami situasi yang tidak menyenangkan di mana pernyataan ALTER TABLE gagal karena kunci asing tidak dijatuhkan sebelumnya. Hal ini menyebabkan beberapa ketidakkonsistenan dalam kamus data InnoDB (mungkin karena http://bugs.mysql.com/bug.php?id=58215 ).
Pertanyaan terkait di sini: /programming/16857451/error-in-foreign-key-constraint-on-a-droped-table
Kesalahan saat mengubah nama './db/#sql-482c_8448f' menjadi './db/visits' (errno: 150)
Karena saya tidak dapat memulihkan tabel # sql-482c_8448f menjadi kunjungan, saya memutuskan untuk menggantinya dari cadangan yang dilakukan tepat sebelum perubahan. Namun ini gagal. Sedang diselidiki:
SQL / Kesalahan
Mencoba membuat ulang tabel tanpa kunci asing menyebabkan kesalahan 150
Mencoba membuatnya dengan menyebabkan kesalahan 121
Akhirnya saya menggunakan nama kunci asing baru. Saya tidak berharap ini berfungsi tetapi memungkinkan tabel dibuat.
Cukup dengan menjatuhkan tabel setelah itu menghapus catatan yang salah di INFORMATION_SCHEMA.INNODB_SYS_FOREIGN, memungkinkan impor dengan nama kunci asing asli.
sumber
Ada satu cara sederhana untuk mengatasi hal ini, walaupun harus diakui, dalam keadaan tertentu Anda mungkin tidak ingin melakukan ini. Karena masalah ini berasal dari referensi internal InnoDB, Anda cukup membuat tabel ini dengan nama yang sama, kolom yang sama, hanya menggunakan mesin penyimpanan yang berbeda. Saya menemukan ini pada slave MySQL, dan meskipun master yang saya replikasi adalah InnoDB, saya membuat ulang tabel ini dengan MyISAM dan dapat bangkit kembali dan berjalan. Saya secara khusus memilih InnoDB untuk mesin penyimpanan saya pada master, dan pada beberapa tabel, itu akan menjadi penting pada slave juga, tetapi dalam kasus ini, itu tidak berdampak pada slave ini untuk tabel yang satu ini, jadi itu cara cepat untuk mengatasi masalah ini. Menjatuhkan seluruh basis data akan menjadi proyek yang jauh lebih besar.
sumber
Apa yang berhasil untuk saya adalah:
mysqlfrm
dari Oraclemysql-utitilies
** (karena saya tidak punya salinan / cadangan dari struktur) misalnya:/usr/bin/mysqlfrm --diagnostic /tmp/tablebackup/MyTable.frm
MyTable
maka sekarang saya membuat tabelMyTableB
dengan struktur tabel asli)RENAME TABLE `MyTableB` TO `MyTable`;
(catatan bahwa ini hanya bekerja jika Anda tidak memilikiinnodb_force_recovery
diatur dalam Andamy.cnf
)ALTER TABLE `MyTable` DISCARD TABLESPACE;
.ibd
file asli (hanya file .ibd, bukan file .frm) kembali ke dir database mysql tempat asalnya dipindahkan (seharusnya tidak ada file .ibd yang ada saat ini karena itu akan dihapus olehDISCARD TABLESPACE
perintah)ALTER TABLE `MyTable` IMPORT TABLESPACE;
* Saya memulai kembali mysql setelah langkah ini tetapi tidak yakin ini diperlukan
** mysql-utilities mungkin perlu menginstal
mysql-connector-python
terlebih dahulusumber
Anda kehilangan data tabel, tetapi catatan tentang tabel ini masih ada di "mysql / data / ibdata1". Solusi termudah adalah membuat tabel ini di beberapa database lain dan kemudian salin file:
untuk Anda sendiri:
sumber