【问题标题】:mysqldump problems with restore error: 'Please DISCARD the tablespace before IMPORT'mysqldump 出现恢复错误的问题:“请在导入前丢弃表空间”
【发布时间】:2013-07-28 16:14:42
【问题描述】:

我运行生产数据库的每日备份mysqldump备份(mysql版本5.1.66):

mysqldump --user=username --password=secret -C -e --create-options --hex-blob --net_buffer_length=5000 databasename > file

我还在我的开发机器(mysql 版本 5.6.12)上每天恢复该数据库

mysql --user=username --password=secret databasename < file

我得到错误: 第 25 行的错误 1813 (HY000):表 'databasename.tablename' 的表空间存在。请在 IMPORT 之前丢弃表空间。

我的阅读表明这是因为 mysql innodb 数据库需要命令:

 ALTER TABLE tbl_name DISCARD TABLESPACE;

在删除表之前运行——删除表似乎不足以摆脱它的索引。 (我的开发服务器使用 innodb_file_per_table 选项)

我不想使用“替换”选项,因为我的开发数据库中可能存在已在生产数据库中删除的数据。

顺便说一句,出现错误后,表不可读,但重新启动 mysqld 可以修复它。

所以问题是,是否有任何 mysql 转储选项可以帮助解决此问题,或者是否有其他方法可以导入数据来防止错误?

提前感谢您的阅读。

【问题讨论】:

    标签: mysql mysqldump


    【解决方案1】:

    听起来你有一个 tablename.ibd 但没有 tablename.frm。

    检查:

    1. cd 到你的 mysql 数据目录,然后是数据库名称。
      cd /var/lib/mysql/database_name
    2. 搜索出现错误的表名。

      ls 表名.*

      你应该看到两个文件:

      表名.ibd 表名.frm

      但我猜你没有而且只看到

      表名.ibd

    要解决这个问题,您有几个选择:

    1. 在 mysqldump 中添加以下内容,这将导致数据库被删除,清理数据目录,在恢复之前。
      --add-drop-database
    2. 将 tablename.frm 从 prod 复制到 dev,然后发出 delete table 语句。

    还有:

    • 当您转储到 localhost 上的文件时,无需使用 net_buffer_length=5000。
    • 其他备份解决方案 - Percona Xtrabackup

    【讨论】:

    • 非常感谢。我添加了:--add-drop-database --databases,因为创建数据库命令不是只添加了 add-drop-database
    • 复制tablename.frm后,确保该文件具有适当的权限并且属于可以从mysql访问的user:group。
    【解决方案2】:

    我在删除架构并再次创建它时也遇到了这个问题。我通过去C:\ProgramData\MySQL\MySQL Server 5.6\data\my_database_name 并删除从先前数据库创建中剩余的表来克服这个问题。如果您愿意,也可以删除整个数据库。

    【讨论】:

      【解决方案3】:

      如果您使用的是 XAMPP,那么首先(“停止”)MySQL 然后转到 C:\xampp\mysql\data\dnb 在我的例子中,dnb 是我的数据库名称文件夹。 所以然后打开它并删除 .ibd 文件因此你只能在你已经停止 MYsql 时删除它。 然后去phpmyadmin 1 点击 phpmyadmin 。 2点击出现在下面的数据库(server.127.0.0.1在你的情况下我会改变) 3 然后检查您要删除的数据库,然后单击删除。 4 然后就可以创建同名数据库并成功导入数据库了。here you can see how you drop database from phpmyadmin

      【讨论】:

        【解决方案4】:

        我发现跳过此问题的最简单方法是手动编辑 phpmyadmin 数据库转储并将有问题的表编辑/更改为 INNODB 以外的其他内容。我将问题表更改为ENGINE=MyISAM,瞧。导入成功。

        CREATE TABLE IF NOT EXISTS `home3_acymailing_tag` (
            `tagid` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
            `name` varchar(250) NOT NULL,
            `userid` int(10) unsigned DEFAULT NULL,
            PRIMARY KEY (`tagid`),
            KEY `useridindex` (`userid`)
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
        

        【讨论】:

        • 这里的所有建议中,这是对我有用的解决方案。
        • 这不是正确的解决方案:(1)损坏仍然存在于您的文件系统和数据库中,(2)InnoDB 比 MyISAM 有很多优势。这样做的原因是它在 /var/lib/mysql 中以 MyISAM 文件格式创建了一个新的数据库数据文件,因此不会触及损坏的 InnoDB 数据文件。只有在您更喜欢 MyISAM(阅读 InnoDB 与 MyISAM)并且不介意文件系统中存在损坏数据时,您才应该这样做
        • @phsource - 由于损坏已经完成(并且您没有有效的备份),如果它是唯一的解决方案,那么“正确”的解决方案有什么关系?有总比没有好。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-14
        • 2018-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-23
        相关资源
        最近更新 更多