ALTER
Большинство запросов ALTER TABLE изменяют настройки таблицы или данные:
| Модификатор |
|---|
| COLUMN |
| PARTITION |
| DELETE |
| UPDATE |
| ORDER BY |
| INDEX |
| CONSTRAINT |
| TTL |
| STATISTICS |
| APPLY DELETED MASK |
Большинство запросов ALTER TABLE поддерживаются только для таблиц типов *MergeTree, Merge и Distributed.
Эти операторы ALTER изменяют представления:
| Оператор | Описание |
|---|---|
| ALTER TABLE ... MODIFY QUERY | Изменяет структуру материализованного представления. |
Эти операторы ALTER изменяют объекты, связанные с разграничением доступа на основе ролей:
| Оператор |
|---|
| USER |
| ROLE |
| QUOTA |
| ROW POLICY |
| SETTINGS PROFILE |
| Оператор | Описание |
|---|---|
| ALTER TABLE ... MODIFY COMMENT | Добавляет, изменяет или удаляет комментарии к таблице, независимо от того, были ли они заданы ранее. |
| ALTER NAMED COLLECTION | Изменяет именованные коллекции. |
Мутации
ALTER-запросы, предназначенные для изменения данных таблицы, реализованы с помощью механизма, называемого «мутациями», в первую очередь ALTER TABLE ... DELETE и ALTER TABLE ... UPDATE. Это асинхронные фоновые процессы, подобные слияниям в таблицах MergeTree, которые создают новые «мутированные» версии частей данных.
Для таблиц *MergeTree мутации выполняются путем перезаписи целых частей данных.
Атомарность не гарантируется — части заменяются мутированными, как только они готовы, и SELECT-запрос, который начал выполняться во время мутации, будет видеть данные как из уже мутированных частей, так и из частей, которые еще не были мутированы.
Мутации полностью упорядочены по времени их создания и применяются к каждой части в этом порядке. Мутации также частично упорядочены относительно запросов INSERT INTO: данные, которые были вставлены в таблицу до отправки мутации, будут мутированы, а данные, вставленные после этого, мутированы не будут. Обратите внимание, что мутации никоим образом не блокируют вставки.
Запрос мутации завершается немедленно после добавления записи о мутации (для реплицируемых таблиц — в ZooKeeper, для нереплицируемых — в файловую систему). Сама мутация выполняется асинхронно с использованием системных настроек профиля. Для отслеживания прогресса мутаций можно использовать таблицу system.mutations. Мутация, которая была успешно отправлена, продолжит выполняться даже при перезапуске серверов ClickHouse. Откатить мутацию после отправки невозможно, но если по какой-то причине мутация «зависла», ее можно отменить с помощью запроса KILL MUTATION.
Записи о завершенных мутациях не удаляются сразу (количество сохраняемых записей определяется параметром движка хранения finished_mutations_to_keep). Более старые записи о мутациях удаляются.
Синхронность запросов ALTER
Для нереплицируемых таблиц все запросы ALTER выполняются синхронно. Для реплицируемых таблиц запрос лишь добавляет инструкции для соответствующих действий в ZooKeeper, а сами действия выполняются как можно скорее. Однако запрос может ожидать завершения этих действий на всех репликах.
Для запросов ALTER, которые создают мутации (например, включая, но не ограничиваясь UPDATE, DELETE, MATERIALIZE INDEX, MATERIALIZE PROJECTION, MATERIALIZE COLUMN, APPLY DELETED MASK, CLEAR STATISTIC, MATERIALIZE STATISTIC), синхронность определяется настройкой mutations_sync.
Для других запросов ALTER, которые изменяют только метаданные, вы можете использовать настройку alter_sync для настройки ожидания.
Вы можете указать, как долго (в секундах) ожидать, пока неактивные реплики выполнят все запросы ALTER, с помощью настройки replication_wait_for_inactive_replica_timeout.
Для всех запросов ALTER, если alter_sync = 2 и некоторые реплики неактивны дольше времени, указанного в настройке replication_wait_for_inactive_replica_timeout, будет сгенерировано исключение UNFINISHED.