[mysql] MySQL> 테이블이 존재하지 않습니다. 그러나 그것은 (또는해야한다)

MySQL 설치의 datadir을 변경했으며 모든 기본을 제외하고 올바르게 이동했습니다. 연결할 수 USE있고 데이터베이스가 있습니다. SHOW TABLES또한 모든 테이블을 올바르게 반환하며 각 테이블의 파일은 MySQL 데이터 디렉토리에 있습니다.

그러나 SELECT테이블에서 무언가를 시도 하면 테이블이 존재하지 않는다는 오류 메시지가 나타납니다. 그러나 SHOW TABLES진술을 통해 동일한 테이블을 표시 할 수 있었기 때문에 이것은 의미가 없습니다 .

내 생각에 SHOW TABLES파일이 존재하지만 파일이 손상되었는지 여부는 확인하지 않습니다. 결과적으로 해당 파일을 나열 할 수는 있지만 액세스 할 수는 없습니다.

그럼에도 불구하고, 그것은 단지 추측 일뿐입니다. 나는 이것을 전에 본 적이 없다. 이제 테스트를 위해 데이터베이스를 다시 시작할 수 없지만 데이터베이스를 사용하는 다른 모든 응용 프로그램은 제대로 실행되고 있습니다. 그러나 그것은 단지 추측입니다. 나는 이것을 전에 본 적이 없습니다.

왜 이런 일이 일어나는지 아십니까?

예:

mysql> SHOW TABLES;
+-----------------------+
| Tables_in_database    |
+-----------------------+
| TABLE_ONE             |
| TABLE_TWO             |
| TABLE_THREE           |
+-----------------------+
mysql> SELECT * FROM TABLE_ONE;
ERROR 1146 (42S02): Table 'database.TABLE_ONE' doesn't exist



답변

누군가가 여전히 걱정하는 경우를 대비하여 :

명령을 사용하여 데이터베이스 디렉토리를 직접 복사 한 후 동일한 문제가 발생했습니다.

cp -r /path/to/my/database /var/lib/mysql/new_database

InnoDB테이블 을 사용하는 데이터베이스 로이 작업을 수행하면 위에서 언급 한이 미친 ‘테이블이 존재하지 않습니다’오류가 발생합니다.

문제는 당신이 필요로한다는 것입니다 ib*MySQL의 DATADIR의 루트에 파일을 (예를 들어 ibdata1, ib_logfile0ib_logfile1).

내가 그것들을 복사했을 때 그것은 나를 위해 일했습니다.


답변

Mac OS (MySQL DMG 설치)에서 MySQL 서버를 간단히 다시 시작하면 문제가 해결되었습니다. 최대 절전 모드가 원인이라고 생각합니다.


답변

사용중인 테이블 이름에 대한 사례가 꺼져있을 때이 문제가 발생합니다. 따라서 테이블은 ‘db’라고하지만 select 문에서 ‘DB’를 사용했습니다. 사례가 동일한 지 확인하십시오.


답변

설정할 때이 오류가 발생할 수 있습니다 lower_case_table_names1, 그리고 그 변수에 대한 기본값으로 생성 된 테이블에 액세스하려고합니다. 이 경우 이전 값으로 되돌릴 수 있으며 테이블을 읽을 수 있습니다.


답변

  1. mysqld를 중지
  2. 백업 mysql 폴더 : cp -a /var/lib/mysql /var/lib/mysql-backup
  3. 이전 컴퓨터에서 데이터베이스 폴더로 데이터베이스 폴더 복사 /var/lib/mysql
  4. 이전 데이터베이스에서 ib * (ib_logfile *, ibdata)를 대체하십시오.
  5. mysqld를 시작
  6. 덤프베이스
  7. mysqldump >dbase.mysql
  8. MySQL 서비스 중지
  9. 없애다 /var/lib/mysql
  10. 이름 바꾸기 /var/lib/mysql-backup/var/lib/mysql
  11. mysqld를 시작
  12. 데이터베이스를 작성하십시오
  13. mysqldump < dbase.mysql

답변

쿼리를 실행하십시오 :

SELECT
    i.TABLE_NAME AS table_name,
    LENGTH(i.TABLE_NAME) AS table_name_length,
    IF(i.TABLE_NAME RLIKE '^[A-Za-z0-9_]+$','YES','NO') AS table_name_is_ascii
FROM
    information_schema.`TABLES` i
WHERE
    i.TABLE_SCHEMA = 'database'

불행히도 MySQL은 테이블 이름에 유니 코드 및 인쇄 할 수없는 문자를 사용할 수 있도록합니다. 일부 문서 / 웹 사이트에서 작성 코드를 복사하여 테이블을 작성하면 너비가 0 인 공간이있을 수 있습니다.


답변

나는이 악몽에 3 일을 보냈다. 이상적으로는 복원 할 수있는 백업이 있어야하며 손상된 테이블을 삭제하면됩니다. 오류가 이러한 종류의 당신을 ibdata1 성장을 일으킬 수 거대한 (겸손 테이블의 크기 100기가바이트 +를)

mySqlDump를 사용하는 등의 최근 백업이없는 경우 백업이 과거 어느 시점에서 자동으로 중단되었을 수 있습니다. mySqlDump를 실행하는 동안 잠금 오류가 발생하기 때문에 물론 데이터베이스를 내 보내야합니다.

따라서 해결 방법으로 /var/log/mysql/database_name/table_name으로 이동하여 제거하십시오. *

그런 다음 즉시 테이블을 덤프하십시오. 이렇게하면 이제 작동합니다. 이제 데이터베이스를 새 데이터베이스로 복원하고 누락 된 테이블을 다시 빌드하십시오. 그런 다음 손상된 데이터베이스를 덤프하십시오.

우리의 경우에도 mysql has gone away모든 데이터베이스에서 임의의 간격으로 메시지를 지속적으로 받고있었습니다 . 손상된 데이터베이스가 제거되면 모든 것이 정상으로 돌아 왔습니다.