innodb_page_size 是只读全局变量,初始化时由 --innodb-page-size 决定并写入文件头,不可动态修改;单位字节,常见值16384;查值用 select @@innodb_page_size 或 show variables like 'innodb\_page\_size';版本需≥5.6.3;验证应直接读.ibd文件偏移0x0c处2字节。

查 innodb_page_size 变量必须用 SHOW VARIABLES 或 SELECT @@
MySQL 启动后,innodb_page_size 就已固定,不能动态修改,所以它只存在于全局系统变量中,不会出现在会话级变量里。直接执行 SELECT @@innodb_page_size 最快;如果想看所有 InnoDB 相关变量,用 SHOW VARIABLES LIKE 'innodb%page%' 更稳妥——注意通配符要写全,'innodb_page_size' 本身也支持精确匹配。
-
SELECT @@global.innodb_page_size和SELECT @@innodb_page_size效果一致,但显式加@@global.能避免误读成会话变量 - 如果返回空或报错
Unknown system variable 'innodb_page_size',说明 MySQL 版本低于 5.6.3(该变量从 5.6.3 引入) - 该值单位是字节,常见为
16384(即 16KB),也可能为4096、8192或32768,取决于初始化时指定的--innodb-page-size
初始化后无法通过 SQL 修改 innodb_page_size
这个值不是运行时可调参数,它在 mysqld 第一次初始化数据目录(执行 mysqld --initialize)时就硬编码进 ibdata1 文件头和每个表空间文件中。后续任何 SET GLOBAL innodb_page_size = ... 都会报错 Variable 'innodb_page_size' is a read only variable。
- 想换页大小?只能删掉整个数据目录,用新参数重新初始化,并恢复备份
- 即使停库改配置文件里的
innodb_page_size,再启服务也不会生效——MySQL 启动时会校验实际文件头中的页大小是否匹配配置,不匹配则拒绝启动并报错InnoDB: Unsupported redo log format或类似提示 - 线上环境务必确认该值,尤其做跨版本迁移或使用 Percona Server / MariaDB 时,不同分支对非默认页大小的支持程度不同
从 ibd 文件头直接验证页大小更可靠
当怀疑配置和实际不一致(比如复制环境页大小不匹配导致 crash),可以绕过 SQL,用十六进制工具直接读取 .ibd 文件头。InnoDB 页大小存储在文件偏移量 0x0000000C 处,占 4 字节,按小端序解析。
- Linux 下快速验证:执行
hexdump -C table.ibd | head -20,找到第 13–16 字节(即第 1 行的00000000后第 12–15 列),例如显示00 00 40 00,小端转大端为00400000十六进制 = 4194304 十进制 → 不对;实际应取低 2 字节(因为文档明确说存的是 uint16_t),即40 00→0040hex = 64 decimal?错——正确做法是取偏移0x0000000C开始的 2 字节:xxd -l 16 table.ibd看前 16 字节,第 13 字节(0xC)是低位,第 14 字节(0xD)是高位,如00 40表示 0x4000 = 16384 - Percona Toolkit 中的
pt-online-schema-change在检查兼容性时也会读这里,而非依赖变量值 - 注意:共享表空间
ibdata1和独立表空间.ibd的页大小必须一致,否则启动失败
不同页大小对 ROW_FORMAT 和压缩的影响
页大小不是孤立参数,它约束了你能用的 ROW_FORMAT 和 KEY_BLOCK_SIZE。比如 ROW_FORMAT=COMPRESSED 要求页大小至少为 8KB,且 KEY_BLOCK_SIZE 必须是页大小的约数(如 16KB 页只允许 KEY_BLOCK_SIZE=1,2,4,8)。
-
CREATE TABLE ... ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4在 4KB 页实例上会报错Incorrect key block size - 使用
utf8mb4+ 大字段(如TEXT)时,小页(4KB)更容易触发 “页分裂” 和 “溢出页(off-page)”,影响查询性能 - MySQL 8.0+ 对 32KB 页的支持仍有限制:不支持加密表空间、不支持
DATA DIRECTORY子句、部分 DDL 操作可能失败
--innodb-page-size 参数,以及它写死在每个 ibd 文件头里的那两个字节。别信配置,去读文件头。











