[mysql] 오류 : 테이블 xxx에 대한 테이블 공간이 존재합니다. IMPORT 전에 테이블 스페이스를 삭제하십시오

나는 MySQL을 처음 접했고 Google과 stackoverflow 검색을 통해 도움을 찾을 수 없다는 꽤 흥미로운 오류가 발생합니다.

MacOS 10.8.3에서 MySQL 5.6.10의 로컬 서버를 실행 중이며 MySQL의 Navicat Essentials를 통해 데이터베이스를 관리합니다.

내가 얻는 오류는 데이터베이스를 실행하고 며칠 / 주간 괜찮게 관리 한 후에 Navicat 내에서 쿼리를 사용하여 만든 일부 테이블을 삭제 (불완전하게 표시됨)하는 것입니다.

이 테이블을 사용하여 쿼리를 실행하려고하면 Navicat은 특정 테이블이 존재하지 않는다고 경고합니다. 여태까지는 좋았습니다-여기에 좋은 부분이 있습니다.

예를 들어 “temp”라는 테이블을 만들려고하면 이전에 다음과 같은 오류 메시지가 나타납니다.

Error : Tablespace for table '`database`.`temp`' exists. Please DISCARD the tablespace before IMPORT.

그러나 테이블을 삭제 하거나이 테이블의 테이블 공간을 삭제하려고하면

DROP TABLE temp;
ALTER TABLE temp DISCARD TABLESPACE;

다음과 같은 오류 메시지가 나타납니다.

Error : Unknown table 'database.temp'
Error : Table 'database.temp' doesn't exist

따라서 테이블 스페이스를 버리는 것이 좋지만 그렇게 할 때 테이블이 존재하지 않습니다. DISCARD 쿼리가 확인하지 않는 다른 장소 에이 테이블의 잔재 유형이있을 수 있습니까? 그리고 아무도 완전히 무작위로 보일 수있는 아이디어가 있습니까?

내가 말했듯이, 나는 주제에 익숙하지 않으며 거의 ​​단서가 없습니다. 랩톱 재부팅, 즉 로컬 MySQL 서버 재설정 또는 사용자 권한과 관련이 있다고 생각하지만 여기서는 가설을 세웁니다.



답변

여기서 조금 늦었지만 일반적으로 ‘innodb_file_per_table’모드에서 실행할 때 ‘tablespace full’오류가 발생하면이 문제가 발생하는 것을 보았습니다. 너무 많은 세부 사항 (자세한으로 가지 않고 여기 ), 데이터베이스 서버의 테이블은 innodb_data_file_path에 설정에 의해 정의되며 기본적으로 작은 편이다. 더 커진 경우에도 ‘tablespace full’은 더 큰 쿼리로 발생할 수 있습니다 (테이블이 아닌 많은 것들이 거기에 저장되고 로그, 캐시 등을 취소합니다).

어쨌든, 테이블 당 파일이 저장된 OS 디렉토리, OSX에서 기본적으로 / var / lib / mysql, homebrew iirc가있는 / usr / local / var / mysql을 보면 일반 companion tablename.frm 파일이없는 분리 된 tablename.ibd 파일. 해당 .ibd 파일을 안전한 임시 위치 (안전하게)로 옮기면 문제가 해결됩니다.

$ ls /var/lib/mysql

table1.frm
table1.idb
table2.frm
table2.ibd
table3.idb <- problem table, no table3.frm
table4.frm
table4.idb

$ mkdir /tmp/mysql_orphans
$ mv /var/lib/mysql/table3.ibd /tmp/mysql_orphans/

그러나 한 가지주의 할 사항은 오래 실행되는 쿼리, 잠긴 테이블 등과 같이 원래 문제를 일으킨 원인이 지워 졌는지 확인하십시오. 그렇지 않으면 두 번째 시도 할 때 다른 고아 .ibd 파일로 끝납니다.


답변

Xampp 및 Mamp 사용자

데이터베이스를 비우고 난 후 MySQL을 통해 가져 오는 동안 동일한 오류가 발생했습니다. tablename.ibd다른 모든 파일이 삭제되는 동안 파일이 남아 있음을 발견했습니다 . 수동으로 삭제 mysql/data/database_name했는데 오류가 사라졌습니다.


답변

WAMP [Windows 7 Ultimate x64 비트] 사용자의 경우 :

DangerDave의 말에 동의하므로 WAMP 사용자 에게 답변을 제공하고 있습니다 .

참고 : 우선, .. \ WAMP \ Bin \ MySQL \ MySQL [My MySQL Version] \ Data 폴더로 이동해야합니다.

이제 모든 데이터베이스의 폴더가 표시됩니다

  • 문제가있는 테이블이있는 데이터베이스 폴더를 두 번 클릭하여 엽니 다.
  • 파일 [Your offending MySQL table name].frm이 없어야 합니다 . 대신 파일 이 있어야합니다.[Your offending MySQL table name].ibd
  • 삭제 [Your offending MySQL table name].ibd
  • 그런 다음 휴지통에서도 삭제하십시오.
  • 그런 다음 데이터베이스에서 MySQL 쿼리를 실행하면 완료됩니다.

답변

당신이 얻을 경우 .idb당신이 그것을 삭제 한 후 다시 다시,이 대답을 읽어 보시기 바랍니다.

이것이 나와 함께 일한 방식입니다. 해당 .idb파일이없는 파일을 가지고 있었고 파일을 .frm삭제할 때마다 .idb데이터베이스가 다시 만듭니다. MySQL 문서 에서 한 줄로 솔루션을 찾았습니다 ( 테이블 공간이 존재하지 않습니다 )

1- 다른 데이터베이스 디렉토리에 일치하는 .frm 파일을 작성하여 고아 테이블이있는 데이터베이스 디렉토리에 복사하십시오.

2- 원래 테이블에 대해 DROP TABLE을 발행하십시오. 성공적으로 테이블을 삭제하고 InnoDB는 .ibd 파일이 없다는 오류 로그에 경고를 인쇄해야합니다.

다른 테이블 .frm파일을 복사 하여 누락 된 테이블처럼 이름을 지정한 다음 일반 드롭 테이블 쿼리 및 짜잔을 만들고 작동했으며 테이블은 정상적으로 삭제되었습니다!

내 시스템은 Windows MariaDB v 10.1.8의 XAMPP입니다.


답변

제 경우에는 유일한 해결책은 다음과 같습니다.

  1. 테이블 bad_table엔진 생성 = MyISAM …
  2. rm bad_table.ibd
  3. 드롭 테이블 bad_table

답변

이것은 내가 로그 파일에 정확히 같은 오류를 보여준 테이블이있을 때 fedora의 mariadb 10.2.16에서했던 일입니다 …

2018-07-11  9:43:58 140323764213504 [Note] InnoDB: The file './database_name/innodb_table.ibd' already exists though the corresponding table did not exist in the InnoDB data dictionary. You can resolve the problem by removing the file.
2018-07-11  9:44:29 140323764213504 [Warning] InnoDB: Tablespace 'database_name/innodb_table' exists in the cache with id 2836 != 2918

마일리지와 오류는 다를 수 있지만 가장 중요한 것은

...already exists though the corresponding table did not exist in the InnoDB data dictionary...

테이블 삭제뿐만 아니라 드롭 테이블이 작동하지 않습니다 …

MariaDB [database_name]> drop table innodb_table;
ERROR 1051 (42S02): Unknown table 'database_name.innodb_table'

MariaDB [database_name]> alter table innodb_table discard tablespace;
ERROR 1146 (42S02): Table 'database_name.innodb_table' doesn't exist

테이블 생성도 실패합니다.

MariaDB [database_name]> create table  innodb_table(`id` int(10) unsigned NOT NULL);
ERROR 1813 (HY000): Tablespace for table '`database_name`.`innodb_table`' exists. Please DISCARD the tablespace before IMPORT

이 문제를 해결하기 위해 내가 한 일은 처음이었습니다.

create table  innodb_table2(`id` int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.07 sec)

그런 다음 / var / lib / mysql / database_name 디렉토리에서 루트로 다음을 수행하여 문제를 일으킨 innodb_table.ibd의 덮어 쓰기를 승인했습니다.

cp -a innodb_table2.frm innodb_table.frm
cp -a innodb_table2.ibd innodb_table.ibd
systemctl restart mariadb

그런 다음 mysql 콘솔로 돌아가서 두 테이블 모두에서 성공적인 drop 명령을 발행했습니다.

MariaDB [database_name]> drop table innodb_table;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    8
Current database: database_name

Query OK, 0 rows affected (0.08 sec)

MariaDB [database_name]> drop table innodb_table2;
Query OK, 0 rows affected (0.25 sec)

이제 모든 것이 정사각형이며 하나의 단일 테이블을 다시 만들 수 있습니다 …

MariaDB [database_name]> create table  innodb_table (`id` int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.08 sec)

편집 : 나는에 추가하려고했다

restorecon -Rv /var/lib/mysql/database_name 

데이터베이스를 복사 한 후 명령은 데이터베이스에서 거의 즉시 삭제하더라도 모든 selinux 컨텍스트를 가져와야합니다. 대신에 –archive 또는 -a 옵션을 두 개의 cp에 추가 할 수 있습니다 예, 실제로 아카이브 옵션은 이것을 단축시킵니다 :

cp innodb_table2.frm innodb_table.frm
cp innodb_table2.ibd innodb_table.ibd
chown mysql:mysql innodb_table.frm innodb_table.ibd
chmod 660 innodb_table.frm innodb_table.ibd
restorecon -Rv /var/lib/mysql/database_name
systemctl restart mariadb

내가 생각하는 것이 더 좋으며 이미 만들어진 테이블에 설정된 selinux 컨텍스트를 유지합니다.

cp -a innodb_table2.frm innodb_table.frm
cp -a innodb_table2.ibd innodb_table.ibd
systemctl restart mariadb

위의 더 긴 명령 목록을 *로 단축 할 수있는 짧은 목록으로 바꿨습니다.


답변

나의 경우에는:

먼저 tableName.ibdMysql에서 데이터베이스 디렉토리를 제거한 다음 두 번째를 실행하십시오.

ALTER TABLE tableName DISCARD TABLESPACE;
DROP TABLE tableName;