这正是我在 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...
drop table 不能像 alter table 一样工作...
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 控制台,我在两个表上都发出了成功的删除命令
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 命令的 --archive 或 -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
到以下我认为更好的,它保留了 selinux
为已创建的表设置的上下文。
cp -a innodb_table2.frm innodb_table.frm
cp -a innodb_table2.ibd innodb_table.ibd
systemctl restart mariadb
我已将上述较长的命令列表替换为较短的列表
仍然可以用 *
缩短