이것은 내가 로그 파일에 정확히 같은 오류를 보여준 테이블이있을 때 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
위의 더 긴 명령 목록을 *로 단축 할 수있는 짧은 목록으로 바꿨습니다.