我们只想保留最近三个月的数据,并将其余数据移至 S3。我正在尝试创建一个每天或每周运行的脚本。下面的脚本正确吗?
#!/bin/bash
# Define the table name and partition date format
TABLE="x"
DATE_FORMAT="%Y-%m-%d"
# Get the current date and the date 3 months ago
CURRENT_DATE=$(date +"$DATE_FORMAT")
THREE_MONTHS_AGO=$(date -d "3 months ago" +"$DATE_FORMAT")
# QuestDB SQL query to detach partitions older than 3 months
SQL_QUERY="ALTER TABLE $TABLE DETACH PARTITION WHERE timestamp < '$THREE_MONTHS_AGO';"
# Execute the SQL query using questdb's CLI or REST API (adjust accordingly)
# Assuming you can run SQL commands via the QuestDB CLI, for example:
# questdb-cli --execute "$SQL_QUERY"
# Now, move detached partitions to S3 (if needed)
# Assuming partitions are stored in /var/lib/questdb/db/x/ and end with '.detached'
for partition in $(ls /var/lib/questdb/db/x/*.detached); do
PARTITION_NAME=$(basename "$partition")
# Create a tarball of the partition and move it to S3
tar -czf - "$partition" | aws s3 cp - "s3://questdb-internal/blobs/$PARTITION_NAME.tar.gz"
# Optionally, remove the local detached partition after moving it
rm "$partition"
done
我们可以通过一些更改使脚本变得更好。
脚本现在正在计算日期,这很好,但将其直接委托给查询可能会更容易,如下所示:
ALTER TABLE $TABLE DETACH PARTITION WHERE timestamp < dateadd('M', -3, date_trunc('day', now()))
脚本提到通过
questdb-cli
执行 SQL,但这并不是真正的事情。您可以改为向 /exec
端点发出调用:
curl -G \
--data-urlencode "query=ALTER TABLE $TABLE DETACH PARTITION WHERE timestamp < dateadd('M', -3, date_trunc('day', now()));" \
--data-urlencode "count=true" \
http://localhost:9000/exec
最后一件事是您的脚本现在正在使用原始分区名称上传到 S3。想象一下,您删除了一个分区,3 个月后,无论出于何种原因,您都会收到已删除分区的行。 QuestDB 将再次创建该分区。现在,三个月后,您的脚本将分离分区,并再次压缩并上传到 S3,覆盖您现有的对象,这不是您想要的。
如果这种情况不是您常规操作的一部分,并且仅由于错误或错误数据而发生,您可能需要对 S3 使用条件写入,仅在数据不存在时才发送数据。
如果您的业务中可能发生这种情况(分离分区后收到非常旧的数据),您需要确保新分区不会覆盖 S3 上的数据(可能添加一些日期后缀,或在存储桶中启用对象版本控制) ),但是在将分区重新附加到 QuestDB 时也需要小心,因为截至目前不允许合并分区。您可能需要附加其中一个分区,将分区数据移动到临时表,再次分离,附加同一数据范围中的另一个分区,然后将临时表中的数据插入该分区并删除临时表.