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
选项。该值可以从 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
表的文件大小限制如下:-
如果您的large表是只读的,可以使用 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 节,“服务器系统变量”。