This question already has answers here:
InnoDB table optimization w/o locking table
(3个答案)
在11个月前关闭。
我正在为我的应用程序使用MySql Engine = InnoDB。
有一个表可从不同位置收集搜索数据并将其保存以进行处理。
在特定的时间间隔后,我们使用调度程序删除此数据。
当我们删除大量的行时会发生问题,它不会释放磁盘空间。我们已经将innodb_file_per_table设置为ON。
一种解决方案是运行查询:
但这导致该特定表上的其他Select操作失败,提示:
引起原因:java.sql.SQLException:表定义已更改,请
在重试交易
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:545)
在
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:513)
在
com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:115)
在com.mysql.cj.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:1983)
在
com.mysql.cj.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1826)
在
com.mysql.cj.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1923)
在
com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:353)
在
org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:60)
...省略了154个通用框架
我需要一个解决方案来回收/重用表空间。
我正在使用Spring-boot,因此应从应用程序处理此解决方案。即使需要使用分区,也应该可以从应用程序对其进行配置。
(3个答案)
在11个月前关闭。
我正在为我的应用程序使用MySql Engine = InnoDB。
有一个表可从不同位置收集搜索数据并将其保存以进行处理。
在特定的时间间隔后,我们使用调度程序删除此数据。
当我们删除大量的行时会发生问题,它不会释放磁盘空间。我们已经将innodb_file_per_table设置为ON。
一种解决方案是运行查询:
Optimize Table <TableName>
但这导致该特定表上的其他Select操作失败,提示:
引起原因:java.sql.SQLException:表定义已更改,请
在重试交易
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:545)
在
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:513)
在
com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:115)
在com.mysql.cj.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:1983)
在
com.mysql.cj.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1826)
在
com.mysql.cj.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1923)
在
com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:353)
在
org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:60)
...省略了154个通用框架
我需要一个解决方案来回收/重用表空间。
我正在使用Spring-boot,因此应从应用程序处理此解决方案。即使需要使用分区,也应该可以从应用程序对其进行配置。
最佳答案
一些想法:
在不释放磁盘空间的同时,也不会丢失磁盘空间。当您向该表中插入新行时,先前使用的空间将被重用。换句话说,如果您的表在每次删除之前都增长到相似的大小,则没有问题。
您应该认真考虑在该表上使用分区。如果每个批次进入不同的分区,则可以删除该分区而不是删除。这样会更快,并且实际上会将存储释放回操作系统。在任何给定时间,您最多只需要两个分区。