MySql innodbをinnodb_file_per_tableで実行しています。
毎日のスクリプトとして、一連のテーブルに新しいパーティションを作成し、昨日のパーティションを削除したいと思います。古いパーティションを削除してディスク領域を解放するには、どのコマンドを実行する必要がありますか?データベースのディスク使用量が原因でディスク領域が不足するシステムは避けたいです。また、Mysqlをシャットダウンする必要もありません。
編集:テーブルスペースを破棄すると、ほとんどのスペースを占める.ibdファイルが削除されることを確認しました。
ALTER TABLE tbl_name DISCARD TABLESPACE;
ただし、パーティション分割されたテーブルでこのコマンドを使用する既知のバグがあります。
バグのステータスには「修正できない」というラベルが付けられます であり、このコンテキストで理由を理解できます。
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;
試してみる !!!
パーティションを落とせてよかったです。
私にはいくつかの悲惨なニュースがあります。すべてのデータをダンプし、ibdata1を削除し、mysqlを再起動し、リロードしない限り、ibdata1を圧縮することはできません。
これを安全に行う方法に関する私の過去の投稿は次のとおりです。
May 21, 2012
: MySQLデータベースは、ダンプファイルと比較してどのくらいの大きさですか?Apr 01, 2012
: innodb_file_per_tableは推奨ですか?Mar 25, 2012
: なぜInnoDBはすべてのデータベースを1つのファイルに格納するのですか?Feb 04, 2011
: MySQL InnoDB-innodb_file_per_table cons?Oct 29, 2010
: 方法:mysql InnoDBストレージエンジンをクリーンアップしますか?「スマート」なオンラインスペース再利用機能があるかどうかはわかりません。私はあなたがあなたのデータベースと手順のような他の項目のmysqldumpを取り、それからデータベースを削除し、Mysqlを停止し、データベースのデータとログファイルを削除し、データベースを開始し、そしてダンプから復元する必要があると信じています。