为什么MariaDB在更新表模式时尝试预分配非常大的文件

o8x7eapl  于 10个月前  发布在  其他
关注(0)|答案(1)|浏览(71)

当我的SpringBoot应用程序尝试通过JPA更新表模式时,mariadb示例预分配了一个非常大的文件(几乎100 GB,在/rdsdbdata/tmp/#sql_4c44_0.MAI),然后服务器存储立即变满并导致db示例关闭。日志显示JPA只向该表添加了2列(数据类型varchar(255)),表大小小于5 MB,只有5000条记录。
maridb服务器是AWS RDS,Mariadb社区版,10.3.8,引擎InnoDB
当我查看AWS CloudWatch日志时,第一个错误是

[ERROR] InnoDB: preallocating 103934853120 bytes for file ./mydbname/users.ibd failed with error 28

字符串
则误差

Disk is full writing '/rdsdbdata/log/binlog/mysql-bin-changelog.~rec~' (Errcode: 28 "No space left on device"). Waiting for someone to free space... (Expect up to 60 secs delay for server to continue after freeing disk space)


和/或

[ERROR] mysqld: Disk full (/rdsdbdata/tmp/#sql_4c44_0.MAI); waiting for someone to free some space... (errno: 28 "No space left on device")


有没有其他人遇到过这种情况,或者有任何想法。

erhoui1w

erhoui1w1#

我有一个类似的观察,可以在我的SpringBoot应用程序之外重现它。MariaDB版本是10.5.9-MariaDB。
当执行ALTER TABLE MYSCHEMA.MYTABLE MODIFY COLUMN MYCOLUMN TEXT;(在应用程序中或通过CLI mysql -uroot)将列MYCOLUMN从tinytext迁移到text时,MariaDB尝试分配24 GB的磁盘空间(不幸的是,这比虚拟机中可用的磁盘空间多2 GB),然后此执行在一段时间后停止,并显示以下消息:

  1. 2023-07-11 17:55:26 68 [ERROR] InnoDB: preallocating 24083693568 bytes for file ./MYSCHEMA/#sql-alter-1-44.ibd failed with error 28
  2. 2023-07-11 17:55:26 68 [ERROR] mysqld: The table 'MYTABLE' is full
    我的解决方法不是MODIFY,而是ADD一个新列,复制现有内容,RENAME旧列,RENAME新列来替换旧列:
  3. ALTER TABLE MYSCHEMA.MYTABLE ADD COLUMN NEWMYCOLUMN TEXT;
  4. UPDATE MYSCHEMA.MYTABLE set NEWMYCOLUMN = MYCOLUMN;
  5. ALTER TABLE MYSCHEMA.MYTABLE RENAME COLUMN MYCOLUMN TO DELETEMYCOLUMN;
  6. ALTER TABLE MYSCHEMA.MYTABLE RENAME COLUMN NEWMYCOLUMN TO MYCOLUMN;
    在我的例子中,执行花了两分钟,并且在没有分配(太多)磁盘空间的情况下工作。

相关问题