【发布时间】: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