メインコンテンツまでスキップ
メインコンテンツまでスキップ

Manipulating Partitions and Parts

以下の操作がパーティションに対して利用可能です:

  • DETACH PARTITION|PART — 指定したパーティションまたはパートをdetachedディレクトリに移動し、忘れます。
  • DROP PARTITION|PART — 指定したパーティションまたはパートを削除します。
  • DROP DETACHED PARTITION|PARTdetachedからパートまたはパーティションのすべてのパーツを削除します。
  • FORGET PARTITION — 空のパーティションのメタデータをZooKeeperから削除します。
  • ATTACH PARTITION|PARTdetachedディレクトリからテーブルにパーティションまたはパートを追加します。
  • ATTACH PARTITION FROM — 一つのテーブルからデータパーティションを別のテーブルにコピーして追加します。
  • REPLACE PARTITION — 一つのテーブルからデータパーティションを別のテーブルにコピーして置き換えます。
  • MOVE PARTITION TO TABLE — 一つのテーブルから別のテーブルにデータパーティションを移動します。
  • CLEAR COLUMN IN PARTITION — パーティション内の指定したカラムの値をリセットします。
  • CLEAR INDEX IN PARTITION — パーティション内の指定した二次インデックスをリセットします。
  • FREEZE PARTITION — パーティションのバックアップを作成します。
  • UNFREEZE PARTITION — パーティションのバックアップを削除します。
  • FETCH PARTITION|PART — 別のサーバーからパートまたはパーティションをダウンロードします。
  • MOVE PARTITION|PART — パーティション/データパートを別のディスクまたはボリュームに移動します。
  • UPDATE IN PARTITION — 条件によってパーティション内のデータを更新します。
  • DELETE IN PARTITION — 条件によってパーティション内のデータを削除します。

DETACH PARTITION|PART

指定したパーティションのすべてのデータをdetachedディレクトリに移動します。サーバーは、まるでそのデータパーティションが存在しないかのように、detachedデータを忘れます。このデータについてサーバーが認識するのは、ATTACHクエリを実行するまではありません。

例:

パーティション式の設定については、How to set the partition expressionのセクションを参照してください。

クエリが実行されると、detachedディレクトリ内のデータに対して何をしても構いません — ファイルシステムから削除することも、そのまま残すこともできます。

このクエリはレプリケートされ、すべてのレプリカのdetachedディレクトリにデータを移動します。このクエリはリーダーレプリカでのみ実行可能です。レプリカがリーダーかどうかを知るには、system.replicasテーブルへのSELECTクエリを実行します。あるいは、すべてのレプリカでDETACHクエリを実行する方が簡単です — リーダーレプリカを除くすべてのレプリカが例外を投げます(複数のリーダーが許可されているため)。

DROP PARTITION|PART

指定されたパーティションをテーブルから削除します。このクエリは、パーティションを非アクティブとしてタグ付けし、データを完全に削除します。約10分かかります。

パーティション式の設定については、How to set the partition expressionのセクションを参照してください。

このクエリはレプリケートされ、すべてのレプリカでデータが削除されます。

例:

DROP DETACHED PARTITION|PART

指定されたパートまたは指定されたパーティションのすべてのパーツをdetachedから削除します。 パーティション式の設定については、How to set the partition expressionのセクションを参照してください。

FORGET PARTITION

空のパーティションに関するすべてのメタデータをZooKeeperから削除します。パーティションが空でないか不明な場合、クエリは失敗します。再利用されないパーティションに対してのみ実行するようにしてください。

パーティション式の設定については、How to set the partition expressionのセクションを参照してください。

例:

ATTACH PARTITION|PART

detachedディレクトリからテーブルにデータを追加します。全体のパーティションまたは個別のパートにデータを追加することが可能です。例:

パーティション式の設定については、How to set the partition expressionのセクションを参照してください。

このクエリはレプリケートされます。レプリカのイニシエーターは、detachedディレクトリ内にデータが存在するかどうかを確認します。 データが存在すれば、クエリはその整合性をチェックします。すべてが正しければ、クエリはデータをテーブルに追加します。

イニシエーターでないレプリカは、ATTACHコマンドを受け取ると、自身のdetachedフォルダに正しいチェックサムのパートが見つかれば、他のレプリカからの取得なしにデータを追加します。 正しいチェックサムのパートが見つからなければ、どのレプリカからでもパートがダウンロードされます。

一つのレプリカのdetachedディレクトリにデータを配置し、すべてのレプリカのテーブルに追加するためにALTER ... ATTACHクエリを使用できます。

ATTACH PARTITION FROM

このクエリは、データパーティションをtable1からtable2にコピーします。

注意点:

  • データはtable1またはtable2から削除されません。
  • table1は一時テーブルであってもかまいません。

クエリが正常に実行されるためには、以下の条件を満たす必要があります:

  • 両方のテーブルは同じ構造を持っている必要があります。
  • 両方のテーブルは同じパーティションキー、同じORDER BYキーおよび同じ主キーを持っている必要があります。
  • 両方のテーブルは同じストレージポリシーを持っている必要があります。
  • 目的のテーブルは源のテーブルに含まれるすべてのインデックスとプロジェクションを含む必要があります。もしenforce_index_structure_match_on_partition_manipulation設定が目的のテーブルで有効になっている場合、インデックスとプロジェクションは同一でなければなりません。それ以外の場合、目的のテーブルは源のテーブルのインデックスとプロジェクションのスーパーセットを持つことができます。

REPLACE PARTITION

このクエリは、データパーティションをtable1からtable2にコピーし、table2内の既存のパーティションを置き換えます。操作は原子的です。

注意点:

  • table1からデータは削除されません。
  • table1は一時テーブルであってもかまいません。

クエリが正常に実行されるためには、以下の条件を満たす必要があります:

  • 両方のテーブルは同じ構造を持っている必要があります。
  • 両方のテーブルは同じパーティションキー、同じORDER BYキーおよび同じ主キーを持っている必要があります。
  • 両方のテーブルは同じストレージポリシーを持っている必要があります。
  • 目的のテーブルは源のテーブルに含まれるすべてのインデックスとプロジェクションを含む必要があります。もしenforce_index_structure_match_on_partition_manipulation設定が目的のテーブルで有効になっている場合、インデックスとプロジェクションは同一でなければなりません。それ以外の場合、目的のテーブルは源のテーブルのインデックスとプロジェクションのスーパーセットを持つことができます。

MOVE PARTITION TO TABLE

このクエリは、table_sourceからtable_destにデータパーティションを移動します。table_sourceからデータを削除します。

クエリが正常に実行されるためには、以下の条件を満たす必要があります:

  • 両方のテーブルは同じ構造を持っている必要があります。
  • 両方のテーブルは同じパーティションキー、同じORDER BYキーおよび同じ主キーを持っている必要があります。
  • 両方のテーブルは同じストレージポリシーを持っている必要があります。
  • 両方のテーブルは同じエンジンファミリー(レプリケートまたは非レプリケート)である必要があります。
  • 目的のテーブルは源のテーブルに含まれるすべてのインデックスとプロジェクションを含む必要があります。もしenforce_index_structure_match_on_partition_manipulation設定が目的のテーブルで有効になっている場合、インデックスとプロジェクションは同一でなければなりません。それ以外の場合、目的のテーブルは源のテーブルのインデックスとプロジェクションのスーパーセットを持つことができます。

CLEAR COLUMN IN PARTITION

指定されたパーティション内の指定したカラムのすべての値をリセットします。テーブル作成時にDEFAULT句が設定されている場合、このクエリはカラムの値を指定したデフォルト値に設定します。

例:

FREEZE PARTITION

このクエリは、指定されたパーティションのローカルバックアップを作成します。PARTITION句が省略された場合、クエリはすべてのパーティションのバックアップを一度に作成します。

注記

バックアッププロセス全体はサーバーを停止することなく実行されます。

古いスタイルのテーブルに対しては、パーティション名のプレフィックス(例えば2019)を指定することができます。この場合、クエリは対応するすべてのパーティションのバックアップを作成します。パーティション式の設定については、How to set the partition expressionのセクションを参照してください。

実行時に、データスナップショットのために、クエリはテーブルデータへのハードリンクを作成します。ハードリンクは、/var/lib/clickhouse/shadow/N/...ディレクトリに配置されます。ここで:

  • /var/lib/clickhouse/は、コンフィグで指定された作業ClickHouseディレクトリです。
  • Nはバックアップのインクリメンタル番号です。
  • WITH NAMEパラメータが指定されている場合、'backup_name'パラメータの値が使用され、インクリメンタル番号の代わりになります。
注記

テーブル内のデータストレージのために一連のディスクを使用する場合shadow/Nディレクトリはすべてのディスクに存在し、PARTITION式によって一致するデータパーツが格納されます。

バックアップ内の同じディレクトリ構造は、/var/lib/clickhouse/内と同様に作成されます。クエリは、すべてのファイルに対してchmodを実行し、それらへの書き込みを禁止します。

バックアップを作成した後は、/var/lib/clickhouse/shadow/からリモートサーバーにデータをコピーし、その後ローカルサーバーから削除できます。なお、ALTER t FREEZE PARTITIONクエリはレプリケーションされないため、ローカルサーバーでのバックアップのみを作成します。

クエリはほぼ瞬時にバックアップを作成します(ただし、最初に、関連するテーブルに対する現在のクエリが完了するのを待ちます)。

ALTER TABLE t FREEZE PARTITIONは、テーブルメタデータではなくデータのみをコピーします。テーブルメタデータのバックアップを作成するには、/var/lib/clickhouse/metadata/database/table.sqlファイルをコピーします。

バックアップからデータを復元するには、次の手順を行います:

  1. テーブルが存在しない場合は作成します。クエリを見るには、.sqlファイルを使用し(ATTACHCREATEに置き換えます)、テーブルを作成します。
  2. バックアップ内のdata/database/table/ディレクトリから/var/lib/clickhouse/data/database/table/detached/ディレクトリにデータをコピーします。
  3. ALTER TABLE t ATTACH PARTITIONクエリを実行して、データをテーブルに追加します。

バックアップからの復元にはサーバーを停止する必要はありません。

バックアップおよびデータ復元に関する詳細については、データバックアップセクションを参照してください。

UNFREEZE PARTITION

指定した名前のfrozenパーティションをディスクから削除します。PARTITION句が省略された場合、クエリはすべてのパーティションのバックアップを一度に削除します。

CLEAR INDEX IN PARTITION

このクエリは、CLEAR COLUMNと同様に動作しますが、カラムデータの代わりにインデックスをリセットします。

FETCH PARTITION|PART

別のサーバーからパーティションをダウンロードします。このクエリはレプリケートテーブルでのみ動作します。

このクエリは次のことを行います:

  1. 指定されたシャードからパーティション|パートをダウンロードします。path-in-zookeeperでは、ZooKeeper内のシャードのパスを指定する必要があります。
  2. 次に、クエリはダウンロードしたデータをtable_nameテーブルのdetachedディレクトリに配置します。データをテーブルに追加するには、ATTACH PARTITION|PARTクエリを使用します。

例:

  1. FETCH PARTITION
  1. FETCH PART

注意点:

  • ALTER ... FETCH PARTITION|PARTクエリはレプリケートされません。パートまたはパーティションは、ローカルサーバーのdetachedディレクトリにのみ配置されます。
  • ALTER TABLE ... ATTACHクエリはレプリケートされます。データはすべてのレプリカに追加されます。データはdetachedディレクトリから一つのレプリカに追加され、他のレプリカには隣接するレプリカから追加されます。

ダウンロード前に、システムはパーティションの存在とテーブル構造の一致を確認します。最も適切なレプリカが自動的に健全なレプリカの中から選択されます。

クエリはALTER TABLEと呼ばれますが、テーブル構造は変更せず、テーブル内のデータも即座には変更しません。

MOVE PARTITION|PART

MergeTreeエンジンテーブル用の別のボリュームまたはディスクにパーティションまたはデータパーツを移動します。データストレージのために複数のブロックデバイスを使用するを参照してください。

ALTER TABLE t MOVEクエリは:

  • レプリケートされず、異なるレプリカが異なるストレージポリシーを持つ可能性があるためです。
  • 指定されたディスクまたはボリュームが設定されていない場合、エラーを返します。また、ストレージポリシーで指定されたデータ移動の条件が適用できない場合もエラーを返します。
  • データがすでにバックグラウンドプロセス、同時ALTER TABLE t MOVEクエリ、またはバックグラウンドデータマージの結果によって移動されている場合、エラーを返す可能性があります。この場合、ユーザーは追加の操作を行うことを避けるべきです。

例:

UPDATE IN PARTITION

指定されたフィルタリング式と一致する指定のパーティション内のデータを操作します。これはミューテーションとして実装されています。

文法:

参照

DELETE IN PARTITION

指定されたフィルタリング式と一致する指定のパーティション内のデータを削除します。これはミューテーションとして実装されています。

文法:

参照

How to Set Partition Expression

ALTER ... PARTITIONクエリでパーティション式を指定する方法はいくつかあります:

  • system.partsテーブルのpartitionカラムからの値として。例えば、ALTER TABLE visits DETACH PARTITION 201901
  • ALLキーワードを使用して。このキーワードはDROP/DETACH/ATTACH/ATTACH FROMでのみ使用できます。例えば、ALTER TABLE visits ATTACH PARTITION ALL
  • (タイプが一致する)タプル式や定数のタプルとして。単一要素のパーティションキーの場合、式はtuple (...)関数でラップする必要があります。例えば、ALTER TABLE visits DETACH PARTITION tuple(toYYYYMM(toDate('2019-01-25'))).
  • パーティションIDとして。パーティションIDは、パーティションの文字列識別子(可能であれば人間が読めるもの)であり、ファイルシステムおよびZooKeeperでパーティションの名前として使用されます。パーティションIDは、PARTITION ID句に指定する必要があり、単一引用符で囲まれます。例えば、ALTER TABLE visits DETACH PARTITION ID '201901'
  • ATTACH PARTITIONおよびDROP DETACHED PARTクエリでは、system.detached_partsテーブルのnameカラムからの値を持つ文字列リテラルを使用してパートの名前を指定します。例えば、ALTER TABLE visits ATTACH PART '201901_1_1_0'

パーティションを指定したときの引用符の使用は、パーティション式のタイプによって異なります。例えば、String型の場合は、その名前を引用符(')で指定する必要があります。DateおよびInt*型の場合は、引用符を使用する必要はありません。

上記のすべての規則は、OPTIMIZEクエリにも当てはまります。非パーティションテーブルを最適化する際に唯一のパーティションを指定する必要がある場合、式をPARTITION tuple()に設定します。例えば:

IN PARTITIONは、UPDATEまたはDELETE式がALTER TABLEクエリの結果として適用されるパーティションを指定します。新しいパーツは指定されたパーティションからのみ作成されます。このようにして、IN PARTITIONは、テーブルが多くのパーティションに分割されているときに負担を軽減し、データを一点ずつ更新する必要があるときに役立ちます。

ALTER ... PARTITIONクエリの例は、テスト00502_custom_partitioning_localおよび00502_custom_partitioning_replicated_zookeeperで示されています。