Schrödingers MySQL 테이블 : 존재하지만 존재하지 않습니다.


118

나는 가장 이상한 오류가 있습니다.

때로는 테이블을 만들거나 변경할 때 '테이블이 이미 있습니다'오류가 발생합니다. 그러나 DROP TABLE은 '# 1051-unknown table'을 반환합니다. 그래서 나는 만들 수없고, 떨어 뜨릴 수없는 테이블을 얻었다.

데이터베이스를 삭제하려고하면 mysqld가 충돌합니다. 때로는 다른 이름으로 다른 db를 만드는 것이 도움이되지만 때로는 그렇지 않습니다.

~ 50 개의 테이블이있는 DB, 모두 InnoDB를 사용합니다. 이 문제는 다른 테이블에서 발생합니다.

Windows, Fedora 및 Ubuntu, MySQL 5.1 및 5.5에서 이것을 경험했습니다. PDO, PHPMyAdmin 또는 명령 줄을 사용할 때 동일한 동작입니다. MySQL Workbench를 사용하여 스키마를 관리합니다. 관련 오류 (엔드 라인 및 항목)를 보았지만 관련 오류는 없었습니다.

아니요,보기가 아니라 테이블입니다. 모든 이름은 소문자입니다.

나는 내가 할 수있는 모든 것을 시도했습니다.

'테이블 표시'는 아무것도 표시하지 않고 '설명'테이블은 '테이블이 존재하지 않습니다'라고 표시되며 .frm 파일이 없지만 '테이블 만들기'는 여전히 오류로 끝납니다 ( '존재하지 않는 경우 테이블 만들기'도 마찬가지 임). 데이터베이스를 삭제하면 mysql이 충돌합니다.

관련이 있지만 도움이되지 않는 질문 :

편집하다:

mysql> use askyou;
Database changed

mysql> show tables;
Empty set (0.00 sec)

mysql> create table users_has_friends (id int primary key);
ERROR 1050 (42S01): Table '`askyou`.`users_has_friends`' already exists

mysql> drop table users_has_friends;
ERROR 1051 (42S02): Unknown table 'users_has_friends'

그리고 모두 동일합니다. 테이블은 존재하지 않지만 생성 될 수 없습니다.

mysql> drop database askyou;
ERROR 2013 (HY000): Lost connection to MySQL server during query

이름 변경, 이것이 내가 문제를 겪은 유일한 테이블 / 데이터베이스가 아닙니다.


2
MySQL 클라이언트를 열고 문제를 보여주는 몇 가지 명령을 입력 한 다음 여기에 명령과 출력 의 정확한 사본 을 복사하여 붙여 넣을 수 있습니까? 문제를 상세하게 설명 해주셔서 감사합니다.하지만 정확한 명령과 메시지를 게시하면 더 좋을 것입니다.
Mark Byers

확실히 같은 이름을 볼 수 없다면 MySQL의 데이터 파일 구조가 불안정 할 것입니다.
eggyal

3
SHOW FULL TABLES IN askyou과 에 대한 응답으로 무엇을 얻 SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA LIKE 'askyou'습니까?
eggyal

1
innodb_file_per_table을 사용하고 있습니까?
ESG

1
@RafaelBarros : 맞습니다. 오식. 명확히 해주셔서 감사합니다.
eggyal

답변:


19

데이터 디렉터리에 데이터 파일이 없지만 테이블 정의 파일이 있거나 그 반대 일 때이 문제를 보았습니다. innodb_file_per_table을 사용하는 경우 데이터 디렉터리를 확인 .frm하여 해당 테이블에 대한 파일과 .ibd 파일 이 모두 있는지 확인하십시오 . MYISAM 인 경우 .frm, .MYI.MYD파일 이 있어야 합니다.

문제는 일반적으로 분리 된 파일을 수동으로 삭제하여 해결할 수 있습니다.


3
나는 사용하지 않는다 innodb_file_per_table; 그러나 내가 그것을 켜고 테이블을 다시 만들려고하면 .ibd파일 만 생성 됩니다. .frm찾을 수 없습니다. 이것은 특정 테이블에만 적용됩니다 (10 개 이상의 다른 테이블이 올바른 파일로 생성됨). 그 고아 IBD를 삭제하면 어쨌든 도움이 아무것도하지 않는
Corkscreewe

1
innodb_file_per_table을 사용하고 있습니다. 내가 고아 .FRM을 삭제하는 경우 그러나, 그것은 내가 만들 문을 실행할 때 다시 만들어집니다 (그러나이 오류는있는 .ibd 파일이 생성되지 않은 문 수익을 생성하고 난 여전히 그것을 삭제할 수 없습니다)
앤드류 로리엔

14

여기에 대단한 추측이 있지만 innodb에는 여전히 테이블 공간, 아마도 ibdata. 당신이 경우 정말 필요하지 않은 모든 데이터 또는 백업이있는 경우, 다음을 시도하십시오

  1. 모든 스키마 삭제 (mysql 제외)
  2. 데이터베이스 종료
  3. 데이터 디렉토리의 모든 폴더가 제대로 제거되었는지 확인하십시오 (mysql 제외).
  4. ibdata 및 로그 파일 삭제
  5. 데이터베이스를 다시 시작하십시오. 테이블 스페이스와 로그를 처음부터 다시 만들어야합니다.

2
환상적 : mysql을 중지하고 'ibdata1', 'ib_logfile1', 'ib_logfile0'을 삭제하고 mysql을 다시 시작하면 문제가 해결되었습니다. 감사합니다!
Meilo

4

수정은 쉬운 것으로 판명되었습니다. 적어도 내가 일한 것은 나를 위해 일했습니다. 다른 MySQL 인스턴스에 "zzz"테이블을 생성합니다. 여기서 zzz는 문제 테이블 이름입니다. (즉, 테이블이 schrodinger라고 불린다면, 쓰여진 zzz 대신 그것을 대체하십시오.) 테이블의 정의가 무엇인지는 중요하지 않습니다. 임시 더미입니다. zzz.frm 파일을 테이블이 있어야하는 서버의 데이터베이스 디렉토리에 복사하여 파일 소유권과 권한이 파일에 대해 올바른지 확인하십시오. MySQL에서는 이제 "show tables;"를 수행 할 수 있으며 테이블 zzz가 거기에있을 것입니다. mysql> 드롭 테이블 zzz; ... 이제 작동해야합니다. 필요한 경우 디렉토리에서 zzz.MYD 또는 ZZZ.MYI 파일을 지 웁니다.


사실이 솔루션이 제 생명을 구했습니다. 감사합니다! FRM 및 IDB 파일을 다른 데이터베이스에서 복사했지만 동일한 서버 (동일한 MySQL 버전 등)에 복사했는데 정상적으로 작동하는 것 같습니다.
Pierre

이것이 .frm다른 인스턴스 (마스터 / 슬레이브)에서 파일을 복사 하여 디렉토리에 넣고 테이블을 삭제 하는 방법임을 확인 합니다. 그러면 테이블을 다시 생성 할 수 있습니다.
juliangonzalez

3

이것이 여기의 질문에 대한 직접적인 대답인지 의심 스럽지만 여기 에 내 OS X Lion 시스템에서 정확히 인식 된 문제 를 해결 한 방법 있습니다.

예약 한 일부 분석 작업에 대한 테이블을 자주 생성 / 삭제합니다. 어느 시점에서 스크립트 중간에 테이블이 이미 존재하는 오류가 발생하기 시작했습니다. 일반적으로 서버를 다시 시작하면 문제가 해결되었지만 해결 방법이 너무 짜증났습니다.

그런 다음 로컬 오류 로그 파일에서이 특정 줄을 발견했습니다.

[Warning] Setting lower_case_table_names=2 because file system for /usr/local/mysql/data/ is case insensitive

이것은 내 테이블에 대문자가 포함되어 있다면 MySQL은 내가 그들을 떨어 뜨린 후에도 여전히 거기에 있다고 생각하도록 속일 것이라는 생각을주었습니다. 그것이 사실로 밝혀졌고 테이블 이름에 소문자 만 사용하도록 전환하면 문제가 해결되었습니다.

제 경우에는 구성이 잘못되었을 가능성이 있지만이 오류 사례가 누군가가 해결책을 찾는 데 시간을 낭비하는 데 도움이되기를 바랍니다.


3

이것은 오래된 질문이지만 방금 동일한 문제에 부딪 혔고 상단에 연결된 관련 문제 중 하나에 대한 답변 은 파일, 테이블 삭제, 서버 종료 등의 것보다 훨씬 덜 과감한 것이 었습니다.

mysqladmin -uxxxxxx -pyyyyy flush-tables

1

제 경우에는 mysql 데이터 디렉토리의 소유권을 응용 프로그램을 실행 한 사용자로 변경하여 문제가 해결되었습니다. (제 경우에는 Jetty 웹 서버를 실행하는 Java 애플리케이션이었습니다.)

mysql이 실행 중이고 다른 앱이 제대로 사용할 수 있지만이 앱에는 문제가있었습니다. 데이터 디렉토리 소유권을 변경하고 사용자의 비밀번호를 재설정 한 후 모든 것이 제대로 작동했습니다.


1

이 오류 1051이있는 재고가 있고 데이터베이스를 삭제하고이를 다시 가져 오려면이 단계를 수행하면 모두 괜찮습니다 ....

Unix 환경에서 루트로 :

  • rm -rf / var / lib / mysql / YOUR_DATABASE;
  • 선택 사항-> mysql_upgrade --force
  • mysqlcheck -uUSER -pPASS YOUR_DATABASE
  • mysqladmin -uUSER -pPASS 드롭 YOUR_DATABASE
  • mysqladmin -uUSER -pPASS YOUR_DATABASE 생성
  • mysql -uUSER -pPASS YOUR_DATABASE <IMPORT_FILE

감사합니다, Christus


0

나는이 문제가 있었고 IBD 파일을 삭제하면 위에 게시 된 것처럼 도움이되기를 바랐지만 아무런 차이가 없었다. MySQL은 새 IBD 파일 만 다시 만들었습니다. 제 경우에는 동일한 MySQL 인스턴스의 다른 데이터베이스에 실제로 유사한 테이블이 있습니다. FRM 파일이 없어서 다른 데이터베이스의 유사한 테이블에서 FRM 파일을 복사하고 MySQL을 다시 시작하면 테이블이 올바르게 작동했습니다.


0

테이블을 생성하고 삭제 한 후 다시 생성하고 싶을 때이 오류가 발생했습니다. 제 경우에는 자체 포함 된 덤프 파일이 있었기 때문에 스키마를 삭제하고 다시 만들고 덤프 파일을 사용하여 테이블과 데이터를 가져 왔습니다.


0

우리 사이트에서 (드물게) 일반적으로 많은 재 구축을 수행하는 특정 스크립트를 실행하는 동안 "이벤트"가 발생할 때 발생합니다. 이벤트에는 네트워크 중단 또는 전원 문제가 포함됩니다.
매우 드문 경우에 이것을 위해 수행하는 작업-나는 무거운 손을 사용합니다.

  • 단순히 특정 테이블을 제거하고 다시 작성해야했습니다. 나는 보통 테이블이 만들어지고 있기 때문에 이것이 괜찮다는 입장에 있습니다. (데이터 복구가 필요한 경우 상황이 다를 수 있습니다)
  • 관리자로서 mysql 설치로 이동합니다 (Windows에서는 "... program files / mysql / MySQL Server xx / data / <schemaname> 일 수 있습니다.
  • <schemaname> 폴더에서 테이블 이름으로 문제가되는 파일을 찾아 삭제합니다.
  • 분리 된 임시 파일을 확인하고 삭제하십시오. # ... frm 파일이있을 경우.
  • MySQL을 사용하면 테이블을 다시 만들 수 있습니다.

나는 오랫동안 (년) 두 개의 다른 데이터베이스 에서이 문제를 겪었습니다. 모순되는 메시지 때문에 그루터기였습니다. 처음에는 다른 답변에서 설명한대로 데이터베이스 삭제 / 재 구축 / 이름 바꾸기를 변경하고 일을 처리했지만 그 방법은 확실히 더 오래 걸립니다. 운 좋게도 일반적으로 아침에 재 구축되는 참조 테이블 (DROP 및 CREATEd)이 항상 발생합니다. 드물게 문제가 발생했지만 특별한 기발한 사례로 인식하게되었습니다. (다시 말씀 드리겠습니다. 데이터를 복구해야하는 경우 다른 솔루션을 찾으십시오.)

  • 다른 사용자 또는 다른 데이터베이스에 속한 테이블이 아닙니다.
  • 대문자 / 소문자 문제가 아닙니다. 모두 소문자를 사용하지만 흥미로운 문제였습니다!
  • "확실히 <there / not-there / some-other-user-table-case> 였고 당신은 제대로하고 있지 않습니다.":)
  • 테이블이 "쇼 테이블"에 표시되지 않았습니다.
  • 테이블은 항상 INNODB 테이블이었습니다.
  • 테이블 을 DROP 하려고 하면 테이블이 존재하지 않는다는 오류 메시지가 나타납니다.
  • 그러나 테이블 을 생성 하려고 시도 하면 테이블이 이미 존재한다는 오류 메시지가 나타납니다.
  • mysql 5.0 또는 5.1 사용
  • REPAIR 는이 문제에 대해 효과가 없습니다.

-1

하나의 특정 테이블 에서이 문제가 발생했습니다. 가능한 해결책을 읽으면서 다음과 같은 단계를 수행했습니다.

  • 고아 파일 검색 : 아무도 존재하지 않았습니다.
  • execute : show full tables in database;: 문제가있는 것을 보지 못했습니다.
  • 실행 : describe table;: 반환 됨 table doesn't exist;
  • 실행 : SELECT * FROM information_schema.TABLES WHERE TABLE_NAME='table';: 반환 됨 Empty set;
  • 위의 쿼리를 수동으로 phpMyAdmin으로 검색 : did n't exist;

그리고 그 단계가 끝나면 다시 확인 show tables;하고 ... vualá! 문제가있는 테이블이 사라졌습니다. 문제없이 동일한 이름으로 생성하여 드롭 할 수 있으며 서버를 다시 시작할 필요도 없었습니다! 기묘한...

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