MySQL> 테이블이 존재하지 않습니다. 그러나 그것은 (또는해야한다)
MySQL 설치의 datadir을 변경했으며 몇 가지 단계를 수행하면 정상적으로 작동합니다. 내가 가진 모든 기지는 정확히 하나만 움직였다.
SHOW TABLES조차도 모든 테이블을 올바르게 반환하고 각 테이블의 파일이 mysql 데이터 디렉토리에 존재합니다. 그러나 거기에서 무언가를 선택하려고하면 테이블이 존재하지 않는다고 말합니다. 그러나 테이블이 존재하며 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_logfile0
및 ib_logfile1
).
내가 그것들을 복사했을 때 그것은 나를 위해 일했습니다.
Mac OS (MySQL DMG 설치)에서 MySQL 서버를 간단히 다시 시작하면 문제가 해결되었습니다. 최대 절전 모드가 원인이라고 생각합니다.
사용중인 테이블 이름에 대한 사례가 꺼져있을 때이 문제가 발생합니다. 따라서 테이블은 'db'라고하지만 select 문에서 'DB'를 사용했습니다. 사례가 동일한 지 확인하십시오.
설정할 때이 오류가 발생할 수 있습니다 lower_case_table_names
에 1
, 그리고 그 변수에 대한 기본값으로 생성 된 테이블에 액세스하려고합니다. 이 경우 이전 값으로 되돌릴 수 있으며 테이블을 읽을 수 있습니다.
- mysqld를 중지
- 백업 mysql 폴더 :
cp -a /var/lib/mysql /var/lib/mysql-backup
- 이전 컴퓨터에서 데이터베이스 폴더로 데이터베이스 폴더 복사
/var/lib/mysql
- 이전 데이터베이스에서 ib * (ib_logfile *, ibdata)를 대체하십시오.
- mysqld를 시작
- 덤프베이스
mysqldump >dbase.mysql
- MySQL 서비스 중지
- 없애다
/var/lib/mysql
- 이름 바꾸기
/var/lib/mysql-backup
로/var/lib/mysql
- mysqld를 시작
- 데이터베이스를 작성하십시오
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
모든 데이터베이스에서 임의의 간격으로 메시지를 지속적으로 받고있었습니다 . 손상된 데이터베이스가 제거되면 모든 것이 정상으로 돌아 왔습니다.
나는 같은 문제가 있었고 2-3 일 동안 검색했지만 나를위한 해결책은 정말 어리 석었습니다.
mysql을 재시작
$ sudo service mysql restart
이제 테이블에 액세스 할 수있게됩니다.
이건 꽤 터무니없는 소리가 나지만 유머러스합니다.
나를 위해 내 진술을 다음과 같이 변경하면 문제가 해결되었습니다.
SELECT * FROM `table`
나는 두 가지를 변경했다
. 1) 테이블 이름을 소문자로 만들었다.
2.) 특정 인용 부호를 사용했습니다 = ` : TAB 위의 키입니다.
해결책은 터무니없이 들리지만 효과가 있으며 토요일 저녁이며 오전 9 시부 터 일하고 있습니다.
행운을 빕니다.
이유를 모르지만 제 경우에는 외래 키 검사를 비활성화하고 활성화하는 것만으로 해결했습니다.
SET FOREIGN_KEY_CHECKS=0;
SET FOREIGN_KEY_CHECKS=1;
idb-file을 복사하기 전에 SQL 쿼리를 실행하여 테이블 스페이스를 삭제하십시오.
ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;
IDB 파일 복사
ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;
MySql을 다시 시작하십시오.
WAMP를 업그레이드 한 후 데이터베이스 백업이없는 경우이 문제가 발생했습니다.
이것은 나를 위해 일했다 :
새 WAMP 중지
이전 데이터베이스 설치에서 필요한 데이터베이스 디렉토리 및 ibdata1 파일을 복사하십시오.
삭제
ib_logfile0
및ib_logfile1
WAMP 시작
이제 데이터베이스를 백업 할 수 있습니다. 그러나 서버가 다시 시작된 후에도 여전히 문제가 있습니다. 이제 WAMP를 다시 설치하고 데이터베이스를 가져 오십시오.
MySQL을 다시 설치 한 후에도 이와 같은 문제가 발생했지만 설치 중에 InnoDB 로그 파일에 대한 데이터를 저장하는 일부 구성 파일 인 ib_logfile * (로그 파일이 올바 릅니까?) 파일을 덮어 쓴 것 같습니다. 이 문제를 해결하기 위해 ib_logfile * 파일을 삭제했습니다.
고스트 테이블과 비슷한 문제가있었습니다. 고맙게도 실패 전에 SQL 덤프가있었습니다.
제 경우에는 다음을 수행해야했습니다.
- mySQL 중지
- ib * 파일을
/var/mysql
백업에서 백업으로 이동 - 지우다
/var/mysql/{dbname}
- mySQL을 다시 시작하십시오.
- 빈 데이터베이스를 다시 만듭니다
- 덤프 파일 복원
참고 : 덤프 파일이 필요합니다.
나를 위해 일한 것은 테이블이 존재하지 않더라도 테이블을 삭제하는 것이 었습니다. 그런 다음 테이블을 다시 만들고 이전에 수행 한 SQL 덤프에서 다시 채 웁니다.
테이블 이름의 메타베이스가 있어야하며 삭제 할 때까지 여전히 존재합니다.
새 컴퓨터에 MariaDB를 설치하고 MySQL 서비스를 중지하여 데이터 폴더의 데이터 이름을 데이터로 바꿨습니다. Mysql \ data \ table_folders 및 ibdata1 만 충돌하는 HD MySql 데이터 폴더에서 새로 설치된 mysql 데이터 폴더로 복사하는 문제를 해결 했습니다.
ib_logfile0 및 ib_logfile1을 건너 뛰었 습니다 (그렇지 않으면 서버가 서비스를 시작하지 않았습니다)
mysql 서비스를 시작했습니다.
그런 다음 서버가 실행 중입니다.
문제가 유효하지 않은 (부패하지 않은) innodb 로그 파일로 (적어도 내 것과 다른 몇 가지)해야 할 것으로 보입니다. 일반적으로 간단히 말해서 재생성하면됩니다.
다음은 솔루션이며, 대부분 mysql을 다시 시작해야합니다.
- 로그 파일을 재 작성하십시오 ( mysql 삭제 및 재시작 ).
- 로그 파일 크기 조정 (MySql 5.6 이상이 파일을 재생성합니다)
- 일부 유형의 데이터 마이그레이션을 수행하는 경우 올바른 파일을 올바르게 마이그레이션하고 다른 사용자가 이미 언급 한대로 권한을 부여했는지 확인하십시오.
- mysql이 두 소유자의 데이터인지 로그 파일의 권한을 확인하십시오.
- 다른 모든 방법이 실패하면 데이터베이스를 다시 만들어야 할 것입니다
다른 시나리오 (버전 업그레이드)는 다음과 같습니다 .
OS (Mac OS El Captain)를 다시 설치하고 새로운 버전의 mysql (homebrew 사용)을 설치했습니다. 설치된 버전 (5.7)이 이전 버전보다 최신 버전이었습니다. 그런 다음 ib * 파일을 포함한 테이블을 복사하고 서버를 다시 시작했습니다. mysql workbench에서 테이블을 볼 수는 있지만 아무것도 선택하려고하면 "테이블이 없습니다"라는 메시지가 나타납니다.
해결책:
- MySQL 서버를 중지하십시오. 예
mysql.server stop
또는brew services stop mysql
mysqld_safe --user=mysql --datadir=/usr/local/var/mysql/
(필요에 따라 경로 변경)을 사용하여 서버를 시작하십시오.- 실행
mysql_upgrade -u root -p password
(다른 터미널 창에서) - 실행중인 서버를 종료
mysqladmin -u root -p password shutdown
- 정상 모드에서 서버를 다시 시작
mysql.server start
하거나brew services start mysql
관련 문서가 있습니다 .
제 경우에는 테이블에서 트리거를 정의한 다음 테이블에 행을 삽입하려고했습니다. 어떻게 든 트리거가 잘못되어 삽입에 오류가 발생하여 테이블이 존재하지 않는 것 같습니다.
데이터베이스에 mysqldump를 수행하십시오.
mysqldump -u user -ppass dbname > D:\Back-ups\dbname.sql
데이터베이스 복원
mysql -u user -ppass dbname < D:\Back-ups\dbname.sql
이제 데이터베이스의 모든 테이블이 완전히 복원되었습니다. 시험..
SELECT * FROM dbname.tablename;
테이블 이름에 숨겨진 문자가있을 수 있습니다. 쇼 테이블을 수행 할 때 표시되지 않습니다. "SHOW CREATE TABLE TABLE_ONE"을 수행하고 "TABLE_ONE"을 탭하여 숨겨진 문자가 있는지 확인하십시오. 또한 테이블 삭제 및 재 작성을 시도했습니다. 권한에 문제가없고 숨겨진 문자가 없는지 확인하십시오.
TimeMachine 백업 가져 오기 후에도 동일한 문제가 발생합니다. 내 솔루션은 MySQL 서버를 중지하고 ib * 파일에 대한 읽기 / 쓰기 권한을 수정하는 것이 었습니다.
내가 생각하는 또 다른 대답은 여기에 제기 할 가치가 있습니다 (왜냐하면 내가 같은 문제로 여기에 왔기 때문에 이것이 대답이었습니다).
쿼리의 테이블 이름 이 데이터베이스에있는 것과 정확히 동일한 철자를 확인하십시오 .
명백하고 초보자 인 것들이지만 "사용자"대 "사용자"와 같은 것들이 사람들을 놀라게 할 수 있으며, 여기에있는 목록이 도움이 될 것이라고 생각했습니다. :)
필자의 경우 내 보낸 sql 파일을 가져올 때 테이블 만들기 쿼리에 대해 table이 존재하지 않는 것과 같은 오류가 발생했습니다.
내 데이터베이스 이름에 밑줄이 있고 mysql이 바로 앞에 이스케이프 문자를 넣고 있음을 깨달았습니다.
그래서 데이터베이스 이름에서 밑줄을 제거하면 모든 것이 해결되었습니다.
그것이 다른 누군가에게도 도움이되기를 바랍니다.
내 테이블은 어떻게 든로 이름이 변경되었다 ' Customers'
로모그래퍼 즉 선행 공백
이것은 의미
a) 쿼리가 중단되었습니다
b) 테이블이 알파벳 순서대로 테이블의 알파벳 순서대로 표시되지 않아 공황 상태 에서 볼 수 없었습니다!
RENAME TABLE ` Customer` TO `Customer`;
내 경우에는 SQLCA.DBParm
매개 변수 였습니다 .
나는 사용했다
SQLCA.DBParm = "Databse = "sle_database.text""
그러나 그것은해야합니다
SQLCA.DBParm = "Database='" +sle_database.text+ "'"
설명 :
세 개의 문자열을 결합하려고합니다.
1. Database=' - "Database='"
2. (name of the database) - +sle_database.text+
3. ' - "'" (means " ' " without space)
쿼터 마크에는 공백을 사용하지 마십시오. 내 동료 Jan에게 감사합니다.
:로 이동 xampp\mysql\data\dbname
내 DBNAME 유무 tablename.frm 및 tablename.ibd 파일.
그것을 제거하고 mysql을 다시 시작하고 다시 시도하십시오.
ibdata1
기존 데이터 디렉토리의 파일 만 복사 하십시오. 복사 ib_logfile1
하거나 ib_logfile0
파일을 보내지 마십시오 . 그러면 MySQL이 더 이상 시작되지 않습니다.
오늘도 같은 문제를 겪었습니다. 이것은 mysql "식별자 대 / 소문자 구분"문제입니다.
해당 데이터 파일을 확인하십시오. 파일 시스템에서 파일 이름이 소문자 일 가능성이 높지만 "show tables"명령에 나열된 테이블 이름은 대문자입니다. 시스템 변수 " lower_case_table_names
"가 0이면 " "가 0 일 때 이름 비교가 대소 문자를 구분하므로 쿼리는 "테이블이 존재하지 않습니다"를 반환합니다 lower_case_table_names
.
나는 같은 문제가 있었지만 숨겨진 캐릭터 나 "슈뢰딩거의 테이블"때문이 아닙니다. 복원 프로세스 후에 문제가 발생했습니다 (정확히 위에서 언급 한대로). MySQL 관리자 버전 1.2.16을 사용하고 있습니다. 복원을 수행해야하는 경우 ORIGINAL
대상 스키마에서 선택 을 해제 하고 드롭 상자에서 데이터베이스 이름을 선택 해야합니다 . 그 후 문제가 해결되었습니다. 적어도 그것이 내 데이터베이스의 이유였습니다.
참고 : https://stackoverflow.com/questions/7759170/mysql-table-doesnt-exist-but-it-does-or-it-should
'Programing' 카테고리의 다른 글
switch 문에서 instanceof 연산자를 사용할 수 있습니까? (0) | 2020.04.08 |
---|---|
Web.config 변환을 사용하여 appSettings 섹션에서 속성 값을 변경하는 방법 (0) | 2020.04.08 |
iPhone 및 Android에서 JavaScript를 통해 손가락 스 와이프 감지 (0) | 2020.04.08 |
GNU 화면에서 스크롤 휠 사용 (0) | 2020.04.08 |
특정 사용자의 그룹을 찾는 방법은 무엇입니까? (0) | 2020.04.08 |