web-dev-qa-db-ja.com

ディスク領域のパーティション化と解放

MySql innodbをinnodb_file_per_tableで実行しています。

毎日のスクリプトとして、一連のテーブルに新しいパーティションを作成し、昨日のパーティションを削除したいと思います。古いパーティションを削除してディスク領域を解放するには、どのコマンドを実行する必要がありますか?データベースのディスク使用量が原因でディスク領域が不足するシステムは避けたいです。また、Mysqlをシャットダウンする必要もありません。

編集:テーブルスペースを破棄すると、ほとんどのスペースを占める.ibdファイルが削除されることを確認しました。

ALTER TABLE tbl_name DISCARD TABLESPACE;

ただし、パーティション分割されたテーブルでこのコマンドを使用する既知のバグがあります。

4
sworded

バグのステータスには「修正できない」というラベルが付けられます であり、このコンテキストで理由を理解できます。

MySQL Documentation on ALTER TABLE tbl_name DROP PARTITION; が言うので、正しい方法はALTER TABLE Partition Operationsを実行することでした。

DROP PARTITIONを使用して、1つ以上のRANGEまたはLISTパーティションを削除できます。このステートメントは、HASHまたはKEYパーティションでは使用できません。代わりに、COALESCE PARTITIONを使用してください(以下を参照)。 partition_namesリストで指定されたドロップされたパーティションに格納されていたデータはすべて破棄されます。

ALTER TABLE t1 DROP PARTITION 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;

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;   

パーティションからすべてのデータを削除しますが、パーティションは保持します

ALTER TABLE tbl_name TRUNCATE PARTITION partition-name;

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;   

空白のテーブルを作成する

CREATE TABLE tbl_name2 LIKE tbl_name;
DROP TABLE tbl_name;
ALTER TABLE tbl_name2 RENAME tbl_name;

試してみる !!!

2013-05-20 18:41 EDT更新

パーティションを落とせてよかったです。

私にはいくつかの悲惨なニュースがあります。すべてのデータをダンプし、ibdata1を削除し、mysqlを再起動し、リロードしない限り、ibdata1を圧縮することはできません。

これを安全に行う方法に関する私の過去の投稿は次のとおりです。

1
RolandoMySQLDBA

「スマート」なオンラインスペース再利用機能があるかどうかはわかりません。私はあなたがあなたのデータベースと手順のような他の項目のmysqldumpを取り、それからデータベースを削除し、Mysqlを停止し、データベースのデータとログファイルを削除し、データベースを開始し、そしてダンプから復元する必要があると信じています。

0
Robert Gannon