MySQL 数据库的有效最大表大小通常由操作系统对文件大小的限制决定,而不是由 MySQL 内部限制决定。有关操作系统文件大小限制的最新信息,请参阅特定于您的操作系统的文档。
Windows 用户请注意,FAT 和 VFAT (FAT32) 不适合用于 MySQL 的生产环境。请改用 NTFS。
如果遇到全表错误,可能有以下几种原因:
磁盘可能已满。
您正在使用表并且表空间文件
InnoDB
中的空间已用完。InnoDB
最大表空间大小也是表的最大大小。有关表空间大小限制,请参阅 第 15.22 节,“InnoDB 限制”。通常,对于大小超过 1TB 的表,建议将表分区为多个表空间文件。
您已达到操作系统文件大小限制。例如,您
MyISAM
在仅支持最大 2GB 文件大小的操作系统上使用表,并且您已达到数据文件或索引文件的此限制。您正在使用一个
MyISAM
表,并且该表所需的空间超出了内部指针大小所允许的范围。MyISAM
默认情况下允许数据和索引文件增长到 256TB,但可以将此限制更改为最大允许大小 65,536TB(256 7 − 1 字节)。如果您需要一个
MyISAM
大于默认限制的表并且您的操作系统支持大文件,则该CREATE TABLE
语句支持AVG_ROW_LENGTH
和MAX_ROWS
选项。请参阅 第 13.1.20 节,“CREATE TABLE 语句”。服务器使用这些选项来确定允许的表有多大。如果指针大小对于现有表来说太小,您可以更改选项
ALTER TABLE
以增加表的最大允许大小。请参阅第 13.1.9 节,“ALTER TABLE 语句”。ALTER TABLE tbl_name MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;
您必须
AVG_ROW_LENGTH
仅指定具有BLOB
或TEXT
列的表;在这种情况下,MySQL 无法仅根据行数来优化所需的空间。要更改
MyISAM
表的默认大小限制,请设置myisam_data_pointer_size
,它设置用于内部行指针的字节数。MAX_ROWS
如果您未指定该选项,则该值用于设置新表的指针大小。的值myisam_data_pointer_size
可以是2到7。例如,对于使用动态存储格式的表,值4允许表最大4GB;值 6 允许表高达 256TB。使用固定存储格式的表具有更大的最大数据长度。有关存储格式特征,请参阅 第 16.2.3 节,“MyISAM 表存储格式”。您可以使用以下语句检查最大数据和索引大小:
SHOW TABLE STATUS FROM db_name LIKE 'tbl_name';
您也可以使用myisamchk -dv /path/to/table-index-file。请参阅 第 13.7.7 节,“SHOW 语句”或第 4.6.4 节,“myisamchk — MyISAM 表维护实用程序”。
解决
MyISAM
表文件大小限制的其他方法如下:如果你的大表是只读的,你可以使用 myisampack来压缩它。 myisampack通常将表压缩至少 50%,因此您实际上可以拥有更大的表。myisampack还可以将多个表合并为一个表。请参阅 第 4.6.6 节,“myisampack — 生成压缩的只读 MyISAM 表”。
MySQL 包含一个
MERGE
库,使您能够处理MyISAM
具有与单个MERGE
表相同结构的表的集合。请参阅第 16.7 节,“MERGE 存储引擎”。
您正在使用
MEMORY
(HEAP
) 存储引擎;在这种情况下,您需要增加max_heap_table_size
系统变量的值。请参阅第 5.1.8 节,“服务器系统变量”。