【问题标题】:Altering MySQL table gives 1114 table is full更改 MySQL 表给出 1114 表已满
【发布时间】:2015-02-13 03:22:34
【问题描述】:

我正在尝试更改我的 InnoDB 表之一。 这是查询:

ALTER TABLE `tf5h_assets`
   ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `idx_asset_name` (`name`), ADD KEY `idx_lft_rgt` (`lft`,`rgt`), ADD KEY `idx_parent_id` (`parent_id`);

错误是:

#1114 - The table 'tf5h_assets' is full

我不明白当它是我从 MySQL 转储(结构,无数据)文件创建的空表时它是如何“满”的。

奇怪的是我可以这样改变它:

ALTER TABLE `tf5h_assets`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `tf5h_assets`
  ADD UNIQUE KEY `idx_asset_name` (`name`);

ALTER TABLE `tf5h_assets`
  ADD KEY `idx_lft_rgt` (`lft`,`rgt`);

ALTER TABLE `tf5h_assets`
  ADD KEY `idx_parent_id` (`parent_id`);

并且它不会抛出该错误。 我究竟做错了什么? 此 ALTER TABLE 语句来自结构 mysql 转储文件。有没有办法像我在导出结构时那样以某种方式拆分 em,所以我不必手动进行?

我用谷歌搜索“表已满”错误,这就是我到目前为止所做的:

1) 检查磁盘空间 - 80+ gigs 的可用空间

2) 添加到 my.cnf 中:

innodb_file_per_table = 1
innodb_file_format = barracuda

并重新启动 mysql 服务器并创建新的数据库。

编辑:

我解决了我的问题,但我不知道如何解决我无法从 Joomla 导出的数据库。

问题是,phpmyadmin 将表创建与键创建分开,如下所示:

CREATE TABLE IF NOT EXISTS `tf5h_assets` (
`id` int(10) unsigned NOT NULL COMMENT 'Primary Key',
`parent_id` int(11) NOT NULL DEFAULT '0' COMMENT 'Nested set parent.',
`lft` int(11) NOT NULL DEFAULT '0' COMMENT 'Nested set lft.',
`rgt` int(11) NOT NULL DEFAULT '0' COMMENT 'Nested set rgt.',
`level` int(10) unsigned NOT NULL COMMENT 'The cached level in the nested tree.',
`name` varchar(50) NOT NULL COMMENT 'The unique name for the asset.\n',
`title` varchar(100) NOT NULL COMMENT 'The descriptive title for the asset.',
`rules` varchar(5120) NOT NULL COMMENT 'JSON encoded access control.'
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=382 ;

及以后:

ALTER TABLE `tf5h_assets`
  ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `idx_asset_name` (`name`), ADD KEY `idx_lft_rgt` (`lft`,`rgt`), ADD KEY `idx_parent_id` (`parent_id`);

以后:

ALTER TABLE `tf5h_assets`
  MODIFY `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primary Key',AUTO_INCREMENT=382;

我设法通过使用 Joomla 的备份/恢复组件(它是 Joomla 站点)启动并运行我的数据库。我打开了该组件创建的 MySQL 转储,这就是我在那里找到的:

CREATE TABLE `#__assets` 
(`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primary Key',   
  `parent_id` int(11) NOT NULL DEFAULT '0' COMMENT 'Nested set parent.',   
  `lft` int(11) NOT NULL DEFAULT '0' COMMENT 'Nested set lft.',   
  `rgt` int(11) NOT NULL DEFAULT '0' COMMENT 'Nested set rgt.',   
  `level` int(10) unsigned NOT NULL COMMENT 'The cached level in the nested tree.',   
  `name` varchar(50) NOT NULL COMMENT 'The unique name for the asset.\n',   
  `title` varchar(100) NOT NULL COMMENT 'The descriptive title for the asset.',  
   `rules` varchar(5120) NOT NULL COMMENT 'JSON encoded access control.',   
   PRIMARY KEY (`id`),   
   UNIQUE KEY `idx_asset_name` (`name`),   
   KEY `idx_lft_rgt` (`lft`,`rgt`),   
   KEY `idx_parent_id` (`parent_id`) ) 
ENGINE=InnoDB AUTO_INCREMENT=382 DEFAULT CHARSET=utf8;

整个过程一次执行,运行良好。

现在,我很幸运,它是 Joomla 数据库。但是当数据库不是 Joomla 的时候我会怎么做?我不知道。有没有办法改变 phpmyadmin 存储转储的方式?终端对 mysql 的访问是否会创建不同的 mysql 转储,以一次性创建数据库而不是使用“ALTER”?

【问题讨论】:

  • 我不在乎,但你写得很好,我不得不投票:P

标签: mysql


【解决方案1】:

好吧,我仍然不知道是什么造成了这个问题,除了它与 phpmyadmin 如何导出数据库并再次重新导入它们有关。

正如我在原始帖子中假设的那样,我迟早会遇到无法通过 Joomla 组件导出的数据库的问题,它发生了......好吧......很快。

无论如何,如果您可以通过控制台访问您的 mysql 服务器,您可以通过简单的 mysql 转储来处理这个问题: mysqldump -p NameOfDatabase > NameOfDumpFile.sql

从服务器下载转储文件,您可以通过 phpmyadmin 导入它。它就像一个魅力。 mysqldump 在一个查询中创建数据库,因此分配键等没有问题。

【讨论】:

    猜你喜欢
    • 2019-01-20
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    相关资源
    最近更新 更多