programing

오류: xxx 테이블에 대한 테이블스페이스가 있습니다.가져오기 전에 테이블스페이스를 삭제하십시오.

starjava 2023. 8. 5. 09:44
반응형

오류: xxx 테이블에 대한 테이블스페이스가 있습니다.가져오기 전에 테이블스페이스를 삭제하십시오.

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 설정으로 정의되며 기본적으로 크기가 작습니다.크기가 커지더라도 '테이블 공간 가득'은 더 큰 쿼리 등에서 여전히 발생할 수 있습니다(테이블이 아닌 많은 'stuff'가 저장됨, 실행 취소 로그, 캐시 등).

어쨌든 테이블별 파일이 저장된 OS 디렉토리에서 기본적으로 OSX의 /var/lib/mysql, homebrewiirc를 사용하는 /usr/local/var/mysql을 검색하면 일반적인 companion tablename.frm 파일이 없는 고립된 tablename.ibd 파일을 찾을 수 있습니다.해당 .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가▁the▁i▁and때..idb파일을 다시 만듭니다.MySQL 문서(Tablespace Is Not Exist part)에서 한 줄로 솔루션을 찾았습니다.

1 - 다른 데이터베이스 디렉토리에 일치하는 .frm 파일을 만든 후 분리된 테이블이 있는 데이터베이스 디렉토리에 복사합니다.

2 - 원래 표에 대해 Drop TABLE을 발행합니다.그러면 테이블이 성공적으로 삭제되고 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.ibdMysql의 데이터베이스 디렉토리에서 두 번째 실행:

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/sshd/sshd_name 디렉토리에서 innodb_table.ibd의 덮어쓰기를 확인하고 루트로 다음 작업을 수행하여 문제를 발생시켰습니다.

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

그런 다음 mysql 콘솔에서 나는 두 테이블 모두에서 성공적인 드롭 명령을 실행했습니다.

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 컨텍스트를 데이터베이스에서 거의 즉시 삭제하더라도 데이터베이스를 복사한 후 명령을 실행하면 됩니다. 대신 두 cp 명령에 --sys 또는 -a 옵션을 추가하면 되므로 실제로 아카이브 옵션을 사용하면 다음과 같이 단축할 수 있습니다.

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

내가 생각하기에 더 낫고 이미 만들어진 테이블에 대해 설정된 이러한 리눅스 컨텍스트를 유지하는 것은 다음과 같습니다.

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

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

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

  1. TABLE bad_table=My엔my▁engineMyISAM...
  2. rm bad_table.ibd
  3. TABLEbad_table

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

내가 어떻게

손상된 테이블과 존재하지 않는 테이블을 삭제하려고 했기 때문에 phpmyadmin->database->export->selected tables를 backup->export(.sql)로 이동하여 다른 테이블의 백업을 만들었습니다.

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

손상된 테이블에 대한 백업을 이전에 수행했을 수 있습니다.

사용자 테이블을 만드는 동안 wampserver에서 실행하는 것과 동일한 오류가 발생했습니다.users.ibd 파일을 찾았고 이 파일을 삭제한 후 마이그레이션 명령을 다시 실행하여 작동했습니다.Windows 컴퓨터의 파일은 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을 내립니다.

ALTERTABLE my_table Discard 테이블스페이스;

-그리고-

/var/lib/lib/db/my_db/ 디렉토리에 있는 rm my_table.ibd(my_table.frm에 해당하지 않는 디렉토리)

-그리고 나서-

테이블이 없는 경우 테이블 만들기my_table(...)

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

  1. 데이터베이스 백업(삭제 옵션 및 데이터가 포함된 구조)
  2. mysql 엔진 서비스 중지
  3. mysql/data 내부에서 수동으로 데이터베이스 디렉토리 제거
  4. mysql 엔진 시작
  5. 손상된 데이터베이스와 다른 이름으로 새 데이터베이스 만들기
  6. 새 데이터베이스 내에 손상된 테이블의 이름으로 단일 테이블을 만듭니다(비밀).그리고 정확히 같은 구조로 표를 만드는 것이 더 좋습니다.
  7. 데이터베이스 이름을 손상된 이전 데이터베이스로 변경
  8. 백업을 복원하면 테이블이 제대로 작동합니다.

정확히 같은 문제가 있었습니다; 저는 추가로 양조를 할 것입니다.mysql@5.6(이전의 5.5 버전 이후).

5.6에 대한 양조 기본값은 다음과 같습니다.innodb_file_per_table=1 55.5파운드입니다.innodb_file_per_table=0.

의 기존의 의기존자.ibdata1파일(결합된 innodb 데이터)에는 생성/삭제하려는 테이블에 대한 참조가 남아 있습니다. 중 하나를 변경합니다.innodb_file_per_table0으로 돌아가거나 ibdata1 데이터 파일을 삭제합니다(모든 데이터가 손실되므로 mysqdump를 먼저 사용하거나 이미 .sqdump를 가지고 있는지 확인하십시오).

양조주는 른양조주다▁the주양조.mysql@5.6기본적으로 포트가 부족했기 때문에 네트워킹은 유닉스 소켓으로 기본 설정되었고 mysql 클라이언트는 계속 보고했습니다.

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

추가했습니다.<string>--port=3306</string>에▁.plist, 배나그러지수도있습다니할정열있다▁array,▁specify▁also▁could▁you습니를 지정할 수도 있습니다.port=3306의 신의에my.cnf

려달을 합니다.brew services stop mysql@5.6 다음 변경합니다.brew services start mysql@5.6

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

set foreign_key_checks=0

저도 같은 문제가 있었습니다.데이터베이스 이름을 변경하고 가져옵니다.그러면 효과가 있습니다.

단순화: 데이터베이스 이름을 변경합니다.바로 그겁니다.

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

테이블스페이스를 삭제하려고 하면 다른 오류가 발생할 수 있습니다.저는 다음과 같은 오류가 발생했습니다.

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 파일을 삭제하는 데 도움이 되었습니다.

감사합니다 #DangerDave 이것은 마젠토 2에서 제 문제를 해결했고, 저는 이렇게 했습니다.

나는 vps에 있습니다.

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

root@myvps [~]# ls

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

rm customer_grid_flat.ibd

index:reindex 명령을 실행한 후 시스템이 테이블을 재생성합니다.

wamp에서 로컬 호스트에 있는 이전 DB만 직접 삭제하고, 모든 서비스 중지, wamp/bin/mysql/mysql[version]/data로 이동하여 문제가 있는 DB를 찾았습니다. 삭제하고 모든 서비스를 다시 wamp하고, 데이터베이스를 다시 만들고, 이제 테이블을 가져올 수 있습니다.

제가 이 문제를 "해결"하는 방법은 꽤 짜증이 나지만, 이 문제를 처리하는 스크립트가 있습니다.

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

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

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

drop tablespace `tableName`

제게 효과가 있었던 유일한 방법은:

  1. 유사한 테이블 만들기
  2. 새 유사 테이블의 .frm 및 .idb 파일을 손상된 테이블의 이름으로 복사합니다.
  3. 수정 권한
  4. 마리아 다시 시작DB
  5. 손상된 테이블 삭제

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

여기서 사용되는 my.cnf 파일이 /etc/my.cnf/etc/mys/my.cnf/usr/local/etc/my.cnf ~/.my.cnf입니다.

그래서 이 오류를 해결하기 위해 다음을 수행했습니다.

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

참고: 저의 경우 개발 설정되어 있기 때문에 데이터에 신경 쓰지 않았습니다. 아마도 타임머신으로 노트북을 복구했기 때문에 발생했을 것입니다.

이 문제가 발생하고 다른 옵션이 없다면 'myisam'과 같은 다른 엔진으로 엔진을 변경한 다음 표를 작성해 보십시오.

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

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

아래와 같은 문제 해결책이 있습니다.

  1. 먼저 데이터베이스 이름을 삭제해야 합니다.데이터베이스가 삭제되지 않으면 흐름을 사용할 수 있습니다.Windows 시스템의 경우 디렉토리가 C:/xampp/mysql/data/yourdabase 폴더 "yourdabase folder"가 됩니다.

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

감사해요.

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

변수_이름이 "%dir"와 같은 위치에 변수 표시

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

sudum-rf

언급URL : https://stackoverflow.com/questions/73706786/mysql-error-1813-hy000-tablespace-for-table-exists

반응형