Настройка времени жизни строк (TTL) таблицы
В этом разделе приведены примеры настройки TTL строковых и колоночных таблиц при помощи YDB SDK.
Включение TTL для существующих строковых и колоночных таблиц
В приведенном ниже примере строки таблицы mytable будут удаляться спустя час после наступления времени, записанного в колонке created_at:
session.AlterTable(
"mytable",
TAlterTableSettings()
.BeginAlterTtlSettings()
.Set("created_at", TDuration::Hours(1))
.EndAlterTtlSettings()
);
err := session.AlterTable(ctx, "mytable",
options.WithSetTimeToLiveSettings(
options.NewTTLSettings().ColumnDateType("created_at").ExpireAfter(time.Hour),
),
)
session.alter_table('mytable', set_ttl_settings=ydb.TtlSettings().with_date_type_column('created_at', 3600))
Функциональность на данный момент не поддерживается.
Функциональность на данный момент не поддерживается.
AlterTableSettings settings = new AlterTableSettings()
.setTableTtl(TableTtl.dateTimeColumn("created_at", 3600));
session.alterTable("mytable", settings).join().expectSuccess();
Следующий пример демонстрирует использование колонки modified_at с числовым типом (Uint32) в качестве TTL-колонки. Значение колонки интерпретируется как секунды от Unix-эпохи:
session.AlterTable(
"mytable",
TAlterTableSettings()
.BeginAlterTtlSettings()
.Set("modified_at", TTtlSettings::EUnit::Seconds, TDuration::Hours(1))
.EndAlterTtlSettings()
);
err := session.AlterTable(ctx, "mytable",
options.WithSetTimeToLiveSettings(
options.NewTTLSettings().ColumnSeconds("modified_at").ExpireAfter(time.Hour),
),
)
session.alter_table('mytable', set_ttl_settings=ydb.TtlSettings().with_value_since_unix_epoch('modified_at', UNIT_SECONDS, 3600))
Функциональность на данный момент не поддерживается.
Функциональность на данный момент не поддерживается.
AlterTableSettings settings = new AlterTableSettings()
.setTableTtl(TableTtl.valueSinceUnixEpoch(
"modified_at",
TableTtl.TtlUnit.SECONDS,
3600
));
session.alterTable("mytable", settings).join().expectSuccess();
Включение вытеснения во внешнее S3-совместимое хранилище
Важно
Поддерживается только для колоночных таблиц. Поддержка функциональности для строковых таблиц находится в разработке.
Для включения вытеснения требуется объект external data source, описывающий подключение к внешнему хранилищу. Создание объекта external data source возможно через YQL и YDB CLI.
В следующем примере строки таблицы mytable будут переноситься в бакет, описанный во внешнем источнике данных /Root/s3_cold_data, спустя час после наступления времени, записанного в колонке created_at, а спустя 24 часа будут удаляться:
session.AlterTable(
"mytable",
TAlterTableSettings()
.BeginAlterTtlSettings()
.Set("created_at", {
TTtlTierSettings(TDuration::Hours(1), TTtlEvictToExternalStorageAction("/Root/s3_cold_data")),
TTtlTierSettings(TDuration::Hours(24), TTtlDeleteAction("/Root/s3_cold_data"))
})
.EndAlterTtlSettings()
);
Функциональность на данный момент не поддерживается.
Функциональность на данный момент не поддерживается.
Функциональность на данный момент не поддерживается.
Функциональность на данный момент не поддерживается.
Функциональность на данный момент не поддерживается.
Включение TTL для вновь создаваемой таблицы
Для вновь создаваемой таблицы можно передать настройки TTL вместе с ее описанием:
session.CreateTable(
"mytable",
TTableBuilder()
.AddNullableColumn("id", EPrimitiveType::Uint64)
.AddNullableColumn("expire_at", EPrimitiveType::Timestamp)
.SetPrimaryKeyColumn("id")
.SetTtlSettings("expire_at")
.Build()
);
err := session.CreateTable(ctx, "mytable",
options.WithColumn("id", types.Optional(types.TypeUint64)),
options.WithColumn("expire_at", types.Optional(types.TypeTimestamp)),
options.WithTimeToLiveSettings(
options.NewTTLSettings().ColumnDateType("expire_at"),
),
)
session.create_table(
'mytable',
ydb.TableDescription()
.with_column(ydb.Column('id', ydb.OptionalType(ydb.DataType.Uint64)))
.with_column(ydb.Column('expire_at', ydb.OptionalType(ydb.DataType.Timestamp)))
.with_primary_key('id')
.with_ttl(ydb.TtlSettings().with_date_type_column('expire_at'))
)
Функциональность на данный момент не поддерживается.
Функциональность на данный момент не поддерживается.
TTL для таблицы задаётся в TableDescription при создании. Проверить настройки можно через describeTable.
import tech.ydb.core.grpc.GrpcTransport;
import tech.ydb.table.TableClient;
import tech.ydb.table.description.TableDescription;
import tech.ydb.table.description.TableTtl;
import tech.ydb.table.session.SessionRetryContext;
import tech.ydb.table.values.PrimitiveType;
public class TtlCreateTableExample {
private static final String TABLE_NAME = "mytable";
public static void main(String[] args) {
String connectionString = System.getenv().getOrDefault(
"YDB_CONNECTION_STRING", "grpc://localhost:2136/local");
try (GrpcTransport transport = GrpcTransport.forConnectionString(connectionString).build();
TableClient tableClient = TableClient.newClient(transport).build()) {
SessionRetryContext retryCtx = SessionRetryContext.create(tableClient).build();
String tablePath = transport.getDatabase() + "/" + TABLE_NAME;
TableDescription description = TableDescription.newBuilder()
.addNullableColumn("id", PrimitiveType.Uint64)
.addNullableColumn("expire_at", PrimitiveType.Timestamp)
.setPrimaryKey("id")
.setTtlSettings(TableTtl.dateTimeColumn("expire_at", 0))
.build();
retryCtx.supplyStatus(session -> session.createTable(tablePath, description))
.join().expectSuccess("create table failed");
TableTtl ttl = retryCtx.supplyResult(session -> session.describeTable(tablePath))
.join().getValue().getTableDescription().getTableTtl();
System.out.println("TTL column: " + ttl.getColumnName());
}
}
}
Выключение TTL
session.AlterTable(
"mytable",
TAlterTableSettings()
.BeginAlterTtlSettings()
.Drop()
.EndAlterTtlSettings()
);
err := session.AlterTable(ctx, "mytable",
options.WithDropTimeToLive(),
)
session.alter_table('mytable', drop_ttl_settings=True)
Функциональность на данный момент не поддерживается.
Функциональность на данный момент не поддерживается.
AlterTableSettings settings = new AlterTableSettings()
.setTableTtl(TableTtl.notSet());
session.alterTable("mytable", settings).join().expectSuccess();
Получение настроек TTL
Текущие настройки TTL можно получить из описания таблицы:
auto desc = session.DescribeTable("mytable").GetValueSync().GetTableDescription();
auto ttl = desc.GetTtlSettings();
desc, err := session.DescribeTable(ctx, "mytable")
if err != nil {
// process error
}
ttl := desc.TimeToLiveSettings
desc = session.describe_table('mytable')
ttl = desc.ttl_settings
Функциональность на данный момент не поддерживается.
Функциональность на данный момент не поддерживается.
import tech.ydb.core.grpc.GrpcTransport;
import tech.ydb.table.TableClient;
import tech.ydb.table.description.TableTtl;
import tech.ydb.table.session.SessionRetryContext;
public class TtlDescribeExample {
public static void main(String[] args) {
String connectionString = System.getenv().getOrDefault(
"YDB_CONNECTION_STRING", "grpc://localhost:2136/local");
try (GrpcTransport transport = GrpcTransport.forConnectionString(connectionString).build();
TableClient tableClient = TableClient.newClient(transport).build()) {
SessionRetryContext retryCtx = SessionRetryContext.create(tableClient).build();
String tablePath = transport.getDatabase() + "/mytable";
TableTtl ttl = retryCtx.supplyResult(session -> session.describeTable(tablePath))
.join().getValue().getTableDescription().getTableTtl();
System.out.println("TTL enabled: " + ttl.isEnabled());
System.out.println("TTL column: " + ttl.getColumnName());
}
}
}