테이블을 만들 수 없지만 테이블이 존재하지 않습니다


11

이 단계를 사용하여 my_user이미 존재하지만 어떻게 든 데이터베이스에서 사라지는 테이블을 만듭니다 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)

# mysqladmin flush-tables위의 단계를 시도 하고 반복했지만 도움이되지 않았습니다. 또한 mysql서비스를 다시 시작 했지만 좋지 않습니다.

어떤 아이디어? 구글은 지금까지 실패했다. 감사.

추가 정보 :

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")

1
어딘가에 오타가 없습니까? 당신은 당신이 테이블을 만들고 있다고 말하지만 my_user오류는 my_db.user...
mustaccio

@mustaccio, yep는 테이블 이름을 my_user (원본이 더 길고 혼란스러운 이름을 가짐)로 단축 할 때 오타를 만들었습니다. 실제로 CREATE TABLE코드는 Doctrine ORM 라이브러리 (PHP)에 의해 생성됩니다.
noisebleed

그래서, 이것은 실제 이름이 아닙니다, 당신은 우리를 놀리는 것입니다.
mustaccio

InnoDB 사전에서 레코드를 버린 경우 동일한 이름으로 테이블을 만들 수 없습니다. 귀하의 경우처럼 보이지만 추가 조사가 필요합니다. 가짜 my_user.frm 및 my_user.ibd를 넣고 테이블을 삭제하십시오.
akuzminsky

실제 테이블 이름에 영숫자가 아닌 이상한 문자가 있습니까? 숫자 나 이상한 문자로 시작합니까?
ypercubeᵀᴹ

답변:


7

InnoDB 아키텍처

InnoDB 아키텍처

분석

  • 어떻게 든, 당신은 잃어버린 my_user.frmmy_user.ibd파일을. 데이터 사전에는 여전히 해당 테이블에 대한 항목이 있습니다.
  • DROP TABLE my_user;mysqld가 my_user.frm첫 번째를 찾기 때문에 실행할 수 없습니다 . 이 값이 아니므 my_user.frm로 테이블을 삭제할 수 없습니다.
  • 하지만 my_user.frm존재하지 않는, 당신은 실행할 수 없습니다 CREATE TABLE my_user ...mysqld가는 스토리지 엔진에 테이블하지만 연기를 만들려면 확인이라고 생각하기 때문이다. InnoDB는 "이미 my_user의 tablespace_id가 등록되어 있습니다"라고 말합니다.

MyISAM을 사용하여 테이블을 만들면이 이벤트 시퀀스를 증명할 수 있습니다. mysqld가 허용합니다. InnoDB로 전환하면 데이터 딕셔너리로 ​​돌아가서 해당 항목에 결함이 있습니다.

두 가지 제안이 있습니다

제안 # 1

그 이름으로 더 이상 테이블을 만들지 마십시오. 다른 테이블 이름을 사용하십시오.

CREATE TABLE my_usertable (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;

이로 인해 응용 프로그램 코드에서 테이블 이름이 변경됩니다.

제안 # 2

내 포스트 InnoDB 테이블에서 SELECT가 ERROR 2006 (HY000)을 반환 하기 전에이 문제를 처리했습니다 .


# 1 훌륭한 답변, 자세한 내용에 감사드립니다. # 2 Mysqldump (ed), mysqld를 중지하고 ibdata1을 제거한 다음 다시 시작했지만 데몬을 다시 시작할 수 없습니다. 무슨 일이 일어나고 있는지 더 잘 이해해야합니다.
noisebleed

좋아, 모든 것이 지금 작동합니다. ib_logfile0ib_logfile1(와 함께 ibdata1) 도 제거해야했습니다 . 가져 오기 후 my_user문제없이 테이블을 만들 수 있습니다 . 롤란도 감사합니다!
noisebleed

나는 다른 두 테이블을 잃어 버렸습니다. 실행 된 모든 쿼리를 기록하고 있으며 해당 테이블을 사용하여 제거하지 않았습니다 DROP TABLE. 문제가 발생했습니다.
noisebleed

감사. 똑같은 문제가 있습니다. 데이터베이스에 테이블 1 개가 없어서 테이블을 만들 수 없으므로 백업에서 복원 할 수 없습니다.
Gigih Aji Ibrahim

5

비슷한 문제가있어서 솔루션을 추가하기 만하면됩니다.

TL; DR

  • 외래 키 사양은 같지만 이전에 테이블에서 보유한 것과 다른 이름으로 테이블을 다시 만듭니다.
  • 결과 테이블을 삭제하십시오 (원래 고아 외래 키도 삭제함).
  • 원래 또는 외래 키가없는 테이블을 다시 만듭니다.

세부 묘사

외래 키가 일찍 떨어지지 않아 ALTER TABLE 문이 실패한 불쾌한 상황에 부딪 쳤습니다. 이로 인해 InnoDB 데이터 딕셔너리에 일부 불일치가 발생했습니다 ( http://bugs.mysql.com/bug.php?id=58215 로 인해 ).

관련 질문 : https : //.com/questions/16857451/error-in-foreign-key-constraint-on-a-droped-table

mysql> ALTER TABLE `visits` CHANGE COLUMN `variation_visitor_id` `variation_visitor_id` INT(11) NOT NULL  ;

'./db/#sql-482c_8448f'의 이름을 './db/visits'로 바꾸는 오류 (errno : 150)

mysql> SHOW ENGINE INNODB STATUS;

Error in foreign key constraint of table db/visits:
 FOREIGN KEY (`variation_visitor_id`) REFERENCES `variations_visitors` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html 
for correct foreign key definitippon.

# sql-482c_8448f 테이블을 방문으로 복구 할 수 없으므로 변경 직전에 수행 된 백업에서 테이블을 다시 가져 오기로 결정했습니다. 그러나 이것은 실패했습니다. 조사 중 :

  • INFORMATION_SCHEMA.TABLE_CONSTRAINTS 및 INFORMATION_SCHEMA.STATISTICS에서 제한 조건이 제거되었습니다.
  • 그러나 제약 조건은 여전히 ​​INFORMATION_SCHEMA.INNODB_SYS_FOREIGN에서 볼 수있었습니다.
  • 테이블이 존재하지 않으므로 외래 키를 삭제할 수 없습니다
  • 오류없이 테이블을 만들 수 없습니다

SQL / 오류

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN WHERE ID='db/fk_visits_variations_visitors1';

+-----------------------------------+-----------+------------------------+--------+------+
| ID                                | FOR_NAME  | REF_NAME               | N_COLS | TYPE |
+-----------------------------------+-----------+------------------------+--------+------+
| db/fk_visits_variations_visitors1 | db/visits | db/variations_visitors |      1 |   48 |
+-----------------------------------+-----------+------------------------+--------+------+

외래 키없이 테이블을 다시 만들려고하면 오류 150이 발생했습니다.

mysql>

SET UNIQUE_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 0;

CREATE TABLE `visits` (
  `id` INT(11) NOT NULL AUTO_INCREMENT  ,
  `variation_visitor_id` INT(11) NOT NULL  ,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

SET FOREIGN_KEY_CHECKS = 1;
SET UNIQUE_CHECKS = 1;

ERROR 1005 (HY000) at line 26: Can't create table 'db.visits' (errno: 150)

mysql> SHOW ENGINE INNODB STATUS;

Error in foreign key constraint of table db/visits:
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_visits_variations_visitors1" FOREIGN KEY ("variation_visitor_id") REFERENCES "variations_visitors" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION

121을 (를) 생성하려고 시도하면 오류가 발생했습니다

mysql>

SET UNIQUE_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 0;

CREATE TABLE `visits` (
  `id` INT(11) NOT NULL AUTO_INCREMENT  ,
  `variation_visitor_id` INT(11) NOT NULL  ,
  PRIMARY KEY (`id`),
  KEY `fk_visits_variations_visitors1` (`variation_visitor_id`),
  CONSTRAINT `fk_visits_variations_visitors1` FOREIGN KEY (`variation_visitor_id`) REFERENCES `variations_visitors` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

SET FOREIGN_KEY_CHECKS = 1;
SET UNIQUE_CHECKS = 1;

ERROR 1005 (HY000) at line 26: Can't create table 'db.visits' (errno: 121)

mysql> SHOW ENGINE INNODB STATUS;

Error in foreign key constraint creation for table `db`.`visits`.
A foreign key constraint of name `db`.`fk_visits_variations_visitors1`
already exists. (Note that internally InnoDB adds 'databasename'
in front of the user-defined constraint name.)
Note that InnoDB's FOREIGN KEY system tables store
constraint names as case-insensitive, with the
MySQL standard latin1_swedish_ci collation. If you
create tables or databases whose names differ only in
> the character case, then collisions in constraint
names can occur. Workaround: name your constraints
explicitly with unique names.

결국 새로운 외래 키 이름을 사용했습니다. 나는 이것이 작동하지 않을 것이라고 생각했지만 테이블을 만들 수있었습니다.

mysql>

SET UNIQUE_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 0;

CREATE TABLE `visits` (
  `id` INT(11) NOT NULL AUTO_INCREMENT  ,
  `variation_visitor_id` INT(11) NOT NULL  ,
  PRIMARY KEY (`id`),
  KEY `fk_visits_variations_visitors2` (`variation_visitor_id`),
  CONSTRAINT `fk_visits_variations_visitors2` FOREIGN KEY (`variation_visitor_id`) REFERENCES `variations_visitors` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

SET FOREIGN_KEY_CHECKS = 1;
SET UNIQUE_CHECKS = 1;

그 후 테이블을 삭제하면 INFORMATION_SCHEMA.INNODB_SYS_FOREIGN에서 잘못된 레코드가 제거되어 원래 외래 키 이름으로 가져올 수 있습니다.


1

물론, 특정 상황에서는이 작업을 원하지 않을 수도 있습니다. 이 문제는 InnoDB 내부 참조에서 비롯되므로 다른 스토리지 엔진을 사용하는 경우에만 동일한 이름, 동일한 열로이 테이블을 생성 할 수 있습니다. MySQL 슬레이브 에서이 문제가 발생했지만 복제 한 마스터가 InnoDB 였지만 MyISAM을 사용 하여이 테이블 하나를 다시 만들고 백업하고 실행할 수있었습니다. 나는 마스터의 스토리지 엔진으로 InnoDB를 선택했으며 일부 테이블에서는 슬레이브에서도 중요하지만이 경우이 하나의 테이블 에서이 슬레이브에 영향을 미치지 않았으므로 빠른 방법이었습니다. 이 문제를 해결하기 위해. 전체 데이터베이스를 삭제하는 것이 훨씬 더 큰 프로젝트였습니다.


0

나를 위해 일한 것은 다음과 같습니다.

  • 먼저 .frm 및 .ibd 파일을 다른 디렉토리로 이동하십시오 (예 : / tmp / tablebackup *).
  • 이제 mysqlfrm오라클의 mysql-utitilies**를 사용하여 .frm 파일에서 테이블 구조를 추출합니다 (구조 의 다른 사본 / 백업이 없기 때문에)./usr/bin/mysqlfrm --diagnostic /tmp/tablebackup/MyTable.frm
  • 원래 테이블 구조로 이름이 다른 새 테이블을 만듭니다 (예 : 문제가 MyTable있는 테이블 MyTableB이 이제 원래 테이블 구조 로 테이블 을 만들었습니다 ).
  • 다음 mysql을 내에서 원래의 이름으로 테이블의 이름을 변경, 예를 들면 : RENAME TABLE `MyTableB` TO `MyTable`;(이 단지 당신이 작동하는 경우 유의 하지 않은 innodb_force_recovery사용자 설정 my.cnf)
  • 이제 mysql에서 다음을 실행하십시오. ALTER TABLE `MyTable` DISCARD TABLESPACE;
  • 그런 다음 원래 .ibd파일 ( .frm 파일이 아닌 .ibd 파일 만 )을 원래 이동 한 mysql 데이터베이스 디렉토리로 다시 복사 하십시오 ( 이 시점에서 기존 .ibd 파일이 없어야합니다. DISCARD TABLESPACE명령)
  • 그리고 지금 실행 ALTER TABLE `MyTable` IMPORT TABLESPACE;

* 이 단계 후에 mysql을 다시 시작했지만 이것이 필요한지 확실하지 않습니다.

** mysql-utilities는 mysql-connector-python먼저 설치가 필요할 수 있습니다


0

테이블 데이터가 손실되었지만이 테이블에 대한 레코드는 여전히 "mysql / data / ibdata1"에 있습니다. 가장 쉬운 해결책은 다른 데이터베이스에서이 테이블을 만든 다음 파일을 복사하는 것입니다.

mysql/data/**dummy_database**/my_user.frm

mysql/data/**dummy_database**/my_user.ibd

당신 자신에게 :

mysql/data/**yours_database**/my_user.frm

mysql/data/**yours_database**/my_user.ibd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.