swo*_*ded 5 mysql innodb partitioning disk-space
我正在使用 innodb_file_per_table 运行 MySql innodb。
作为日常脚本,我想为一组表创建一个新分区,并删除昨天的分区。需要运行什么命令来删除旧分区以释放磁盘空间?我希望避免系统因数据库磁盘使用而耗尽磁盘空间。我还想避免关闭 Mysql。
编辑:我读过丢弃表空间应该删除占用大部分空间的 .ibd 文件。
ALTER TABLE tbl_name DISCARD TABLESPACE;
Run Code Online (Sandbox Code Playgroud)
但是,在分区表上使用此命令存在一个已知错误。
该错误的状态被标记为“无法修复”,我可以理解在这种情况下的原因。
正确的方法是运行,ALTER TABLE tbl_name DROP PARTITION;
因为MySQL 文档ALTER TABLE Partition Operations
说:
DROP PARTITION 可用于删除一个或多个 RANGE 或 LIST 分区。该语句不能与HASH或KEY分区一起使用;相反,请使用 COALESCE PARTITION(见下文)。存储在partition_names 列表中指定的已删除分区中的所有数据都将被丢弃。
ALTER TABLE t1 删除分区 p0, p1;
一旦运行ALTER TABLE tbl_name DISCARD TABLESPACE;
,数据字典应该不再知道孤立.ibd
文件的物理存在。但是,由于该错误不会回收磁盘空间,因此表的数据字典条目可能完好无损。让我们来看看吧。
警告:您应该运行service mysql stop
并进行物理备份/var/lib/mysql
首先这样做:SHOW CREATE TABLE tbl_name\G
然后,运行SELECT * FROM tbl_name WHERE (stuff from partition #x) LIMIT 10;
测试表各分区的可用性。
一旦您对表格的可用性感到满意,您可以执行以下任一操作:
ALTER TABLE tbl_name DROP PARTITION partition-name;
Run Code Online (Sandbox Code Playgroud)
如果您不信任ALTER TABLE tbl_name DROP PARTITION partition-name;
,请手动执行
CREATE TABLE tbl_name2 LIKE tbl_name;
ALTER TABLE tbl_name2 DROP PARTITION partition-name;
INSERT INTO tbl_name2 SELECT * FROM tbl_name WHERE (anything but stuff from partition-name)
ALTER TABLE tbl_name RENAME tbl_name9;
ALTER TABLE tbl_name2 RENAME tbl_name;
DROP TABLE tbl_name9;
Run Code Online (Sandbox Code Playgroud)
ALTER TABLE tbl_name TRUNCATE PARTITION partition-name;
Run Code Online (Sandbox Code Playgroud)
如果您不信任ALTER TABLE tbl_name TRUNCATE PARTITION partition-name;
,请手动执行
CREATE TABLE tbl_name2 LIKE tbl_name;
INSERT INTO tbl_name2 SELECT * FROM tbl_name WHERE (anything but stuff from partition-name)
ALTER TABLE tbl_name RENAME tbl_name9;
ALTER TABLE tbl_name2 RENAME tbl_name;
DROP TABLE tbl_name9;
Run Code Online (Sandbox Code Playgroud)
CREATE TABLE tbl_name2 LIKE tbl_name;
DROP TABLE tbl_name;
ALTER TABLE tbl_name2 RENAME tbl_name;
Run Code Online (Sandbox Code Playgroud)
试一试 !!!
我很高兴您能够删除分区。
我有一些令人痛苦的消息:如果不转储所有数据、删除 ibdata1、重新启动 mysql 并重新加载,就不可能收缩 ibdata1。
以下是我过去关于如何安全地做到这一点的帖子:
May 21, 2012
:MySQL 数据库相对于转储文件有多大?Apr 01, 2012
:innodb_file_per_table 是否可取?Mar 25, 2012
:为什么InnoDB将所有数据库存储在一个文件中?Feb 04, 2011
:MySQL InnoDB - innodb_file_per_table 缺点?Oct 29, 2010
: Howto:清理 mysql InnoDB 存储引擎? 归档时间: |
|
查看次数: |
17184 次 |
最近记录: |