这正是我在 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 目录中,我以 root 身份执行以下操作,确认覆盖 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
我已将上述较长的命令列表替换为较短的列表,该列表仍可以用 * 来缩短