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