mysql - 존재하지 않는 테이블을 삭제할 수 없습니다. 존재하는 테이블을 생성할 수 없습니다.

mysql - 존재하지 않는 테이블을 삭제할 수 없습니다. 존재하는 테이블을 생성할 수 없습니다.

서버 충돌 후 특정 테이블 참조 하나에 매우 이상한 문제가 발생했습니다.

데이터베이스가 삭제되고 백업 SQL 덤프가 로드된 백업에서 복원을 선택하면 cache_content"테이블이 이미 존재합니다." 오류와 함께 테이블 생성에서만 실패합니다.

mysql> create table cache_content( id int NOT NULL DEFAULT 0 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ERROR 1005 (HY000): Can't create table '****.cache_content' (errno: -1) mysql> drop table cache_content; ERROR 1051 (42S02): Unknown table 'cache_content'

이상하게도 드롭 테이블은 .frm을 제거했지만 .ibd 파일은 제거하지 않았습니다(존재하는 경우). 생성 테이블은 .ibd 파일을 생성하지만 .frm 파일은 생성하지 않습니다.

덤프를 새 데이터베이스로 가져오고(문제 없이 완료됨) mysql을 종료하고 관련 .frm 및 .ibd 파일을 복사한 다음 다음을 사용하는 등 다양한 복원 방법을 시도했습니다.idbconnect이 "알려진 양호한" 버전을 연결하려고 시도하려면 다음을 수행하십시오.

... Space id: 1952673645 (0x74636F6D) Next record at offset: 74 TABLE_ID of `****/`.`cache_content` can not be 0 ...

information_schema에서 관련 테이블을 확인해 보니 이런 경우이고 TABLESPACE가 0으로 할당되어 있는 것을 알 수 있습니다.

mysql> select * from INNODB_SYS_TABLES where `SCHEMA`="*****";
+----------+--------+--------------------------+------+--------+-------+
| TABLE_ID | SCHEMA | NAME                     | FLAG | N_COLS | SPACE |
+----------+--------+--------------------------+------+--------+-------+
...

|    19791 | *****  | cache_content            |    1 |      9 |     0 |
+----------+--------+--------------------------+------+--------+-------+
N rows in set (0.01 sec)

mysql> select * FROM INNODB_SYS_INDEXES where TABLE_ID=19791;
+----------+--------+----------+------+----------+---------+-------+
| INDEX_ID | NAME   | TABLE_ID | TYPE | N_FIELDS | PAGE_NO | SPACE |
+----------+--------+----------+------+----------+---------+-------+
|     7919 | expire |    19791 |    0 |        1 |  311158 |     0 |
+----------+--------+----------+------+----------+---------+-------+
1 row in set (0.00 sec)

서버 버전: Percona-Server-server-55-5.5.27-rel28.0.291.rhel6.x86_64

이제 읽은 내용을 통해 ibdata1 ib_logfile*을 제거하는 것이 이 "유령" 참조를 정리하는 유일한 방법일 수 있다는 것을 상당히 확신합니다.

내 질문: 백업에서 테이블을 복원할 수 있도록 이러한 고스트 참조를 정리할 수 있는 방법이 있습니까?

답변1

결국 나는 백업에서 모든 데이터베이스를 복원하기로 결정했습니다.

  1. mysqldump --all-databases --triggers > /path/to/dumpfile.sql
  2. service mysql shutdown
  3. rm -rf /path/to/datadir && mkdir /path/to/datadir && chown mysql.mysql /path/to/datadir
  4. iptables -I INPUT -p tcp --dport 3306 -j REJECT && service mysql start
  5. mysql_install_db --datadir=/path/to/datadir
  6. mysql < /path/to/dumpfile.sql
  7. 1. 개별 백업에서 손상되지 않은 모든 데이터베이스를 삭제하고 복원합니다.
  8. service mysql restart && service iptables restart

나는 이 대답을 여기에 남겨두고 다음 주에는 그 질문을 받아들이지 않을 것입니다. 나는 바라고 있다누구전체 ibdata를 재구축할 필요가 없는 솔루션을 제공할 수 있습니다.

관련 정보