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

パーティションとパーツの操作

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

  • DETACH PARTITION|PART — 指定されたパーティションまたはパーツを detached ディレクトリに移動し、記憶から消去します。
  • DROP PARTITION|PART — パーティションまたはパーツを削除します。
  • DROP DETACHED PARTITION|PART - detached からパーツまたはパーティションの全パーツを削除します。
  • 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 ディレクトリに移動します。サーバーは、デタッチされたデータパーティションを存在しないかのように忘れます。このデータは、ATTACH クエリを実行するまでサーバーには認識されません。

例:

パーティション式の設定については、パーティション式の設定方法セクションをお読みください。

クエリが実行された後、detached ディレクトリ内のデータに対して任意の操作を行えます — ファイルシステムから削除することも、そのままにしておくことも可能です。

このクエリはレプリケートされます – すべてのレプリカの detached ディレクトリにデータを移動します。リーダーレプリカでのみこのクエリを実行できることに注意してください。レプリカがリーダーかどうかを確認するには、system.replicas テーブルに対して SELECT クエリを実行してください。または、すべてのレプリカで DETACH クエリを実行する方が簡単です - リーダーレプリカ以外はすべて例外を投げます(複数のリーダーが許可されています)。

DROP PARTITION|PART

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

パーティション式の設定については、パーティション式の設定方法セクションをお読みください。

このクエリはレプリケートされます - すべてのレプリカに対してデータを削除します。

例:

DROP DETACHED PARTITION|PART

指定されたパーツまたは指定されたパーティションのすべてのパーツを detached から削除します。 パーティション式の設定については、パーティション式の設定方法セクションをお読みください。

FORGET PARTITION

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

パーティション式の設定については、パーティション式の設定方法セクションをお読みください。

例:

ATTACH PARTITION|PART

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

パーティション式の設定については、パーティション式の設定方法セクションをお読みください。

このクエリはレプリケートされます。レプリカの起動者は detached ディレクトリにデータが存在するか確認します。 データが存在する場合、クエリはその整合性をチェックします。すべてが正しい場合、クエリはデータをテーブルに追加します。

非起動者レプリカがアタッチコマンドを受信し、自身の detached フォルダーに正しいチェックサムを持つパーツを見つけた場合、他のレプリカからデータを取得することなくデータをアタッチします。 正しいチェックサムを持つパーツが存在しない場合、パーツを持つ任意のレプリカからデータがダウンロードされます。

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

ATTACH PARTITION FROM

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

注意点:

  • データは table1 からも table2 からも削除されません。
  • table1 は一時テーブルである可能性があります。

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

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

REPLACE PARTITION

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

注意点:

  • データは table1 から削除されません。
  • table1 は一時テーブルである可能性があります。

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

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

MOVE PARTITION TO TABLE

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

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

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

CLEAR COLUMN IN PARTITION

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

例:

FREEZE PARTITION

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

注記

バックアッププロセス全体は、サーバーを停止せずに実行されます。

注意点として、古いスタイルのテーブルではパーティション名のプレフィックス(例えば、2019)を指定できます。すると、クエリはすべての対応するパーティションのバックアップを作成します。パーティション式の設定については、パーティション式の設定方法セクションをお読みください。

実行時に、データスナップショットのために、クエリはテーブルデータへのハードリンクを作成します。ハードリンクは、次のディレクトリに配置されます:/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

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

CLEAR INDEX IN PARTITION

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

FETCH PARTITION|PART

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

クエリは次のように実行されます:

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

例:

  1. PARTITION のフェッチ
  1. 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'
  • ALTER ATTACH PARTDROP 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_local00502_custom_partitioning_replicated_zookeeper で示されています。