mysqldump恢复错误问题:'请在IMPORT之前丢弃表空间'

pge*_*e70 22 mysql mysqldump

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

mysqldump --user=username --password=secret -C -e --create-options --hex-blob --net_buffer_length=5000 databasename > file
Run Code Online (Sandbox Code Playgroud)

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

mysql --user=username --password=secret databasename < file
Run Code Online (Sandbox Code Playgroud)

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

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

 ALTER TABLE tbl_name DISCARD TABLESPACE;
Run Code Online (Sandbox Code Playgroud)

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

我不想使用'replace'选项,因为我可能在我的开发数据库中有数据已在生产数据库中删除.

在错误之后,表格不可读,但重新启动mysqld会修复它.

所以问题是,是否有任何mysql转储选项可以帮助解决这个问题,还是有另一种方法来导入数据,以防止错误?

提前感谢阅读.

Dav*_*ave 39

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

去检查:

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

    ls tablename.*

    你应该看到两个文件:

    tablename.ibd
    tablename.frm
    

    但我猜你不会,只能看到

    tablename.ibd

要修复你有几个选择:

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

也:

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


小智 9

我发现跳过此问题的最简单方法是手动编辑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 ;
Run Code Online (Sandbox Code Playgroud)