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

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

때로는 테이블을 만들거나 변경할 때 ‘테이블이 이미 있습니다’오류가 발생합니다. 그러나 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

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



답변

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

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


답변

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

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

답변

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


답변

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

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

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

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

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

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


답변

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

mysqladmin -uxxxxxx -pyyyyy flush-tables


답변

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

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


답변

이 오류 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