programing

오류: 테이블 xxx에 대한 테이블스페이스가 존재합니다.가져오기 전에 테이블스페이스를 폐기하십시오.

newsource 2022. 9. 18. 12:47

오류: 테이블 xxx에 대한 테이블스페이스가 존재합니다.가져오기 전에 테이블스페이스를 폐기하십시오.

MySQL을 처음 사용하는데 구글이나 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 설정에 의해 정의되며 기본적으로는 다소 작습니다.더 크게 해도 더 큰 쿼리와 같은 쿼리에서 '테이블스페이스 가득'이 발생할 수 있습니다(테이블 이외의 '스탭'이 많이 저장되어 로그, 캐시 실행 취소 등).

어쨌든 테이블당 files-per-table이 저장되어 있는 OS 디렉토리(OSX의 디폴트로는 /var/lib/mysql, homebrew iirc가 있는 /usr/local/var/mysql)를 보면 tablename.ibd 파일이 일반 companion tablename frm 파일 없이 고립되어 있음을 알 수 있습니다.이 .ibd 파일을 안전한 임시 위치(단, 안전을 위해)로 이동하면 문제가 해결됩니다.

$ ls /var/lib/mysql

table1.frm
table1.idb
table2.frm
table2.idb
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오류가 사라졌습니다.

이 경우.idb삭제 후 다시 작성한 다음 이 답변을 읽습니다.

나한텐 이런 식이었어저는....idb대응하지 않는 파일.frm그리고 내가 삭제 할 때마다.idb파일이 다시 생성됩니다.MySQL 문서(테이블스페이스가 존재하지 않는 부분)에서 한 줄에 솔루션을 찾았습니다.

1- 다른 데이터베이스 디렉토리에 일치하는 .frm 파일을 생성하여 원본 테이블이 있는 데이터베이스 디렉토리에 복사합니다.

2- 원래 테이블에서 드롭 테이블을 발행합니다.그러면 테이블이 정상적으로 드롭되고 InnoDB는 오류 로그에 .ibd 파일이 없다는 경고를 출력합니다.

다른 테이블을 복사했습니다..frm내 누락된 테이블처럼 파일링하고 이름을 지어준 다음 일반 드롭 테이블 쿼리를 만들고 voila를 만듭니다. 작동했고 테이블은 정상적으로 드롭됩니다.

Windows MariaDB v10.1.8에서는 시스템이 XAMPP입니다.

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

DangerDave가 말한 것에 동의하기 때문에 WAMP 사용자에게 답변을 제공하고 있습니다.

주의: 먼저, 에 액세스 할 필요가 있습니다.\WAMP\Bin\MySQL\MySQL[MySQL 버전]\데이터 폴더

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

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

내 경우:

첫 번째 제거tableName.ibd데이터베이스 디렉토리에서 Mysql과 두 번째 실행:

ALTER TABLE tableName DISCARD TABLESPACE;
DROP TABLE tableName;

이것은 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/syslog/syslog_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)

EDIT: 제가 추가하려고 했던 것은

restorecon -Rv /var/lib/mysql/database_name 

데이터베이스 복사 후 명령어는 모든 selinux 콘텍스트를 원래대로 가져오도록 합니다.단, 데이터베이스에서 거의 즉시 삭제할 수 있지만, 대신 두 cp 명령어에 --selinux 또는 -a 옵션을 추가할 수도 있습니다.따라서 archive 옵션에서는 다음과 같이 단축할 수 있습니다.

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

위의 긴 명령어 목록을 단축할 수 있는 짧은 목록으로 *로 대체했습니다.

제 경우 유일한 작업 솔루션은 다음과 같습니다.

  1. 테이블 작성bad_table엔진=마이ISAM...
  2. rm bad_table.ibd
  3. 드롭 테이블bad_table

tablename.ibd를 삭제/이동하는 것은 확실히 효과가 없었습니다.

해결 방법

파손된 테이블과 존재하지 않는 테이블을 삭제할 예정이었기 때문에 phpmyadmin->database->export-> selected table to backup->export(.sql)로 이동하여 다른 테이블을 백업했습니다.

그 후 데이터베이스 이름 옆에 있는 데이터베이스 아이콘을 선택한 후 삭제했습니다.새 데이터베이스를 작성했습니다.새 데이터베이스를 선택합니다.-> Import -> 이전에 다운로드한 파일을 선택합니다.-> Import를 클릭합니다.이전 작업 테이블과 손상된 테이블이 삭제되었습니다.이제 오류를 발생시킨 테이블을 만듭니다.

아마 망가진 테이블을 미리 백업한 것 같아요.

사용자 테이블을 작성하려고 할 때 wampserver에서 실행 중 동일한 오류가 발생했습니다.users.ibd 파일을 찾았는데 이 파일을 삭제한 후 migrate 명령을 다시 실행했더니 작동했습니다.윈도 머신의 파일은 wamp/bin/mysql/mysql5.6.12/data/myproject에 있습니다.

솔루션

그러나 보다 쉬운 옵션은 다음과 같습니다. MySQL을 재시작한 후 다음과 같은 4단계를 수행합니다.

1) created a dummy table in the database;
2) discarded its tablespace;
3) moved the .ibd file into the database folder on the system;
4) attached the tablespace back to the table

이렇게 하면 데이터 사전의 테이블 영역 ID와 파일이 일치하므로 테이블 영역 가져오기가 성공했습니다.

이를 통해 복구 프로세스 또는 파일 전송 중에 일부 InnoDB "gotcha"에 대처할 수 있는 자신감을 높일 수 있습니다.

레퍼런스

이 문제가 여러 번 발생했습니다.큰 DB를 가지고 있고 (누락된 테이블이 추가된 상태에서) 백업/복원을 피하고 싶다면, 앞뒤로 여러 번 시도해 보십시오.

테이블 my_table 드롭;

테이블 my_table 폐기 테이블스페이스 변경;

-그리고...

rm my_table.ibd(my_table.frm에 대응하는 my_table.frm 포함)는 /var/lib/my_db/ 디렉토리에 있습니다.

-그리고...

테이블이 없는 경우 작성my_table(...)

솔루션 단계는 다음과 같습니다.

  1. 데이터베이스 백업(드롭 옵션 및 데이터 포함)
  2. stop mysql 엔진서비스
  3. 데이터베이스 디렉토리를 mysql/data 내부로부터 수동으로 삭제
  4. start mysql 엔진
  5. 손상된 데이터베이스와 다른 이름으로 새 데이터베이스 생성
  6. 새 데이터베이스 내에 파손된 테이블의 이름을 가진 단일 테이블을 만듭니다(이것은 비밀입니다).똑같은 구조로 표를 만드는 것이 좋습니다.
  7. 데이터베이스 이름을 이전 손상된 데이터베이스로 변경
  8. 백업을 복원하면 테이블이 정상적으로 작동합니다.

똑같은 문제를 겪었으니까, 양조할 수도 있고mysql@5.6(이전 버전 5.5 이후).

5.6의 brew 기본값은 다음과 같습니다.innodb_file_per_table=1반면 5.5에서는innodb_file_per_table=0.

기존 사용자ibdata1파일(결합된 innodb 데이터)에는 작성/폐기하려는 테이블에 대한 참조가 남아 있습니다.어느쪽이든 변경innodb_file_per_table0으로 되돌리거나 ibdata1 데이터 파일을 삭제합니다(모든 데이터가 손실되므로 먼저 mysqldump하거나 이미 .sql 덤프가 있는지 확인하십시오).

다른 양조림mysql@5.6디폴트에서는 포트가 없기 때문에 네트워킹은 unix 소켓으로 디폴트 설정되어 있으며 mysql 클라이언트는 계속 다음과 같이 보고하고 있습니다.

ERROR 2013 (HY000): Lost connection to MySQL server at 'sending authentication information', system error: 32

나는 덧붙였다.<string>--port=3306</string>에게.plist어레이를 지정할 수도 있습니다.port=3306당신의 안에서my.cnf

달려.brew services stop mysql@5.6그때 변경하다brew services start mysql@5.6

이 오류는 일부 기능을 일시 중단할 때 발생합니다.예를 들어 잘못된 외래 키로 아래 쿼리를 실행합니다.

set foreign_key_checks=0

저도 같은 문제가 있었어요.데이터베이스 이름을 변경하여 Import합니다.그럼 효과가 있군요.

간단히: 데이터베이스 이름 변경만 하면 됩니다.바로 그겁니다.

문제는 기존 데이터베이스 이름에 폴더에 일부 항목이 있다는 것입니다.그게 문제예요.관련 항목을 모두 삭제하거나 데이터베이스 이름을 쉽게 변경해야 합니다.

테이블스페이스를 드롭하려고 하면 다른 오류가 발생할 수 있습니다.저는 다음 오류가 발생했습니다.

DROP TABLESPACE `tablename`

Error Code: 1478. Table storage engine 'InnoDB' does not support the create option 'TABLESPACE or LOGFILE GROUP' 

내 해결책은 데이터베이스를 삭제하는 것이었다.그러면 관련된 테이블스페이스가 모두 삭제되고 테이블을 다시 만들 수 있습니다.

같은 테이블의 정상적인 버전을 가진 다른 서버가 있는 경우 복사(table_copy)할 수 있습니다.table_copy를 문제가 있는 서버로 전송합니다.그런 다음 문제 테이블을 삭제하고 table_copy의 이름을 table로 변경합니다.

이 기능을 사용하면 /var/lib/mysql/{db_name}(linux) 아래의 MYSQL DATA 디렉토리로 이동하여 폴더 이름과 동일한 {table_name.ibd 파일을 삭제할 수 있습니다.

wamp, Stop all services, Go to wamp/bin/mysql/mysql[ version ]/data에서만 localhost에 있는 이전 DB를 삭제한 후 모든 서비스를 다시 시작하고 데이터베이스를 다시 작성하면 테이블을 Import할 수 있습니다.

이 문제를 해결하는 방법은 매우 귀찮지만, 그것을 다루는 스크립트가 있습니다.

기본적으로 필요한 것은ibdata1그리고.ib_logfile*파일(외부 키 등의 매핑이 포함되어 있습니다).안전한 방법은 모든 데이터베이스를 내보내고 mysql을 중지하고 파일을 삭제하고 mysql을 시작한 다음 파일을 Import하는 입니다.

이 문제를 해결하는 데 도움이 되는 스크립트는 https://github.com/uberhacker/shrink-ibdata1, 입니다.이 스크립트의 목적은 다르지만 문제를 해결할 수 있습니다.

다음 쿼리를 mysql 루트 사용자로 실행할 수 있습니다.

drop tablespace `tableName`

나한테는 그게 먹혀든 유일한 방법은

  1. 유사한 테이블 생성
  2. 새로운 유사 테이블의 .frm 및 .idb 파일을 파손된 테이블의 이름으로 복사합니다.
  3. 권한 수정
  4. 마리아를 재기DB
  5. 파손된 테이블을 드롭합니다.

감사합니다 #DangerDave 이것으로 Magento 2의 문제가 해결되었습니다.이렇게 했습니다.

나는 vps를 하고 있다.

root@myvps [~]# cd /var/lib/mysql/mydatabasename/

root@myvps [~]# ls

.frm fie(.idb만)가 없는 테이블을 확인하고 삭제합니다.

rm customer_grid_flat.ibd

index:reindex 명령어를 실행하면 테이블이 재생성됩니다.

Homebrew의 경우 데이터 파일 디렉토리는 /usr/local/var/mysql입니다.

어떤 my.cnf 파일이 사용되고 있는지 확인하려면 , 환경의 검색 로케이션을 참조해 주세요./etc/my.cnf /etc / my . cnf /usr / local / etc / my . cnf ~ / my . cnf

이 오류를 해결하기 위해 다음 작업을 수행했습니다.

mysqladmin -u root shutdown
rm /usr/local/var/mysql/<dbname>/problemtablename.ibd

주의: 제 경우 개발 셋업이기 때문에 데이터에는 관심이 없습니다.아마 timemachine을 사용하여 노트북을 복원했기 때문일 것입니다.

이 문제가 있고 엔진을 'myisam'과 같은 다른 엔진으로 변경할 수 있는 다른 옵션이 없는 경우 표를 만들어 보십시오.

면책사항: 다른 스토리지 엔진에서 지원되지 않는 외부 키 제약이 있을 수 있으므로 올바른 답변이 아닙니다.모든 스토리지 엔진은 데이터를 저장하고 액세스하는 데 고유한 전문성을 가지고 있으며, 이러한 점도 고려해야 합니다.

가져오기 전에 테이블스페이스를 폐기하십시오.

아래에 같은 문제 해결 방법이 있습니다.

  1. 먼저 데이터베이스 이름을 삭제해야 합니다.데이터베이스가 삭제되지 않으면 플로우 미(flow me)가 됩니다.Windows 시스템의 경우 디렉토리는 C:/xampp/mysql/data/yourdabasefolder remove "yourdabasefolder" 입니다.

  2. 다시 새 데이터베이스를 만들고 이전 SQL 파일을 가져와야 합니다.일이 될 것이다

감사합니다.

MySQL 데이터 디렉토리를 찾아야 했습니다.

변수 표시(Variable_Name은 "%dir"와 같은 경우)

그런 다음 해당 데이터베이스를 강제로 제거합니다.

sudo rm -sudo rm -sudo

언급URL : https://stackoverflow.com/questions/15694168/error-tablespace-for-table-xxx-exists-please-discard-the-tablespace-before-imp