Considerações importantes
-
Você deve especificar --clean-before-timestamp para controlar a distância alcançada pela limpeza. Use um carimbo de data/hora no formato ISO 8601 (por exemplo,). 2025-01-01T00:00:00+00:00
-
Recomendamos que você especifique --tables para limitar a limpeza a tabelas específicas. Se omitido, o comando limpa todas as tabelas suportadas.
-
Comece com um escopo pequeno — use primeiro um --clean-before-timestamp valor antigo (mais próximo da data de criação do seu ambiente) e uma única tabela. Isso limita a limpeza somente aos registros mais antigos. Como o comando exclui tudo antes do carimbo de data/hora especificado, o uso de um carimbo de data/hora mais recente resulta em um escopo de exclusão maior. Avance gradualmente o carimbo de data/hora à medida que você ganha confiança no processo.
-
Large-scale a limpeza pode afetar o desempenho do banco de dados. A exclusão de um grande volume de registros pressiona o banco de dados Aurora PostgreSQL e pode afetar a capacidade de resposta do seu ambiente. Use o --batch-size parâmetro para controlar o tamanho da transação e considere executar a limpeza durante períodos de baixo tráfego. Tenha cuidado ao executar em ambientes de produção.
Comportamento dependente da tabela
Quando você especifica uma tabela com--tables, o comando inclui automaticamente qualquer tabela dependente (filha) que tenha relações de chave estrangeira com a tabela especificada. Os registros da tabela secundária são excluídos primeiro, depois os registros da tabela principal, para satisfazer as restrições de chave estrangeira. Por exemplo, especificar --tables dag_run também limpatask_instance,, task_instance_history xcomtask_state_store, e deadline porque essas tabelas fazem referência por dag_run meio de chaves estrangeiras.
A tabela a seguir resume as cadeias de dependência.
| Tabela especificada |
Tabelas adicionais limpas (dependentes) |
dag_run |
task_instance, task_instance_history, xcom, task_state_store, deadline |
dag |
dag_version, deadline |
task_instance |
task_instance_history, xcom |
trigger |
task_instance, task_instance_history, xcom |
dag_version |
task_instance, task_instance_history, xcom, dag_run |
Tabelas sem dependentes (comolog,, jobimport_error,sla_miss) são limpas isoladamente quando especificadas.
Use --dry-run para ver exatamente quais tabelas e quantas linhas seriam afetadas antes de se comprometer com uma limpeza.
Parâmetros disponíveis para airflow db clean
A tabela a seguir descreve os parâmetros disponíveis paraairflow db clean.
| Parâmetro |
Description |
Padrão |
--clean-before-timestamp |
(Obrigatório) A data ou o timestamp antes do qual os dados são eliminados. Se nenhum fuso horário for fornecido, o fuso horário padrão do Apache Airflow será assumido. Exemplo: 2025-01-01T00:00:00+00:00 |
Nenhum |
--tables ou -t |
Nomes de tabelas nas quais realizar a manutenção (separados por vírgula). As opções incluem: dag_runtask_instance,task_instance_history,log,job,xcom,import_error, task_rescheduletrigger,dag,dag_version,sla_miss,callback_request,celery_taskmeta,celery_tasksetmeta,asset_event,deadline,revoked_token,task_state_store,connection_test_request, _xcom_archive |
Nenhum |
--batch-size |
Número máximo de linhas a serem excluídas ou arquivadas em uma única transação. Valores mais baixos reduzem os bloqueios de longa duração, mas aumentam o número de lotes. |
Nenhum |
--dry-run |
Execute uma execução seca sem realmente excluir os dados. Recomendado para testes iniciais. |
Falso |
--skip-archive |
Não preserve registros eliminados em uma tabela de arquivamento. Por padrão, db clean move os registros eliminados para as tabelas de arquivamento (nomeadas com uma _<table>_archive convenção, por exemplo_dag_run_archive) em vez de excluí-los permanentemente. Isso fornece uma rede de segurança — você pode inspecionar os dados arquivadosairflow db export-archived, exportá-los ou descartá-los posteriormente. airflow db drop-archived Quando --skip-archive definido, os registros são excluídos permanentemente sem essa etapa intermediária. |
Falso |
--dag-ids |
Limpe somente os dados relacionados aos IDs do DAG fornecidos. |
Nenhum |
--exclude-dag-ids |
Evite limpar os dados relacionados aos IDs do DAG fornecidos. |
Nenhum |
-y, --yes |
Ignorar o prompt de confirmação. Necessário para execução não interativa de CLI por meio do Amazon MWAA. |
Falso |
-v, --verbose |
Torne a saída de registro mais detalhada. |
Falso |
Para obter mais informações sobre os parâmetros disponíveis, consulte a referência de variáveis CLI e env no site do Apache Airflow.
Exemplos de código
Os exemplos a seguir mostram como invocar airflow db clean por meio do endpoint da CLI do Amazon MWAA. Para obter mais informações sobre a criação de tokens CLI, consulteComo criar um token da CLI do Apache Airflow.
Usando um script Python:
import boto3
import base64
import requests
# Replace with your environment name and AWS Region
mwaa_env_name = "YOUR_ENVIRONMENT_NAME"
region = "YOUR_REGION"
# Configure cleanup scope
clean_before_timestamp = "2025-06-01T00:00:00+00:00"
tables = "dag_run,task_instance,log,job,xcom"
# Build the Airflow CLI command
# -y flag is required to skip interactive confirmation prompt
airflow_cmd = f"db clean --clean-before-timestamp {clean_before_timestamp} --tables {tables} -y"
# Create a CLI token
client = boto3.client("mwaa", region_name=region)
cli_token_response = client.create_cli_token(Name=mwaa_env_name)
cli_token = cli_token_response["CliToken"]
web_server_hostname = cli_token_response["WebServerHostname"]
# Invoke the Airflow CLI through the MWAA endpoint
url = f"https://{web_server_hostname}/aws_mwaa/cli"
response = requests.post(
url,
headers={
"Authorization": f"Bearer {cli_token}",
"Content-Type": "text/plain",
},
data=airflow_cmd,
)
# Parse and display the results
stdout_message = base64.b64decode(response.json()["stdout"]).decode("utf-8")
stderr_message = base64.b64decode(response.json()["stderr"]).decode("utf-8")
print(f"Status code: {response.status_code}")
print(f"stdout:\n{stdout_message}")
print(f"stderr:\n{stderr_message}")
Exemplo de operação a seco (primeira etapa recomendada)
Antes de realizar uma limpeza real, execute com --dry-run para ver o que seria excluído:
AIRFLOW_CMD="db clean --clean-before-timestamp 2025-06-01T00:00:00+00:00 --tables dag_run,task_instance --dry-run -y"
from airflow import DAG
from airflow.models.param import Param
from airflow.operators.bash_operator import BashOperator
from airflow.utils.dates import days_ago
from datetime import datetime, timedelta
# Note: Database commands might time out if running longer than 5 minutes. If this occurs, please increase the MAX_AGE_IN_DAYS (or change
# timestamp parameter to an earlier date) for initial runs, then reduce on subsequent runs until the desired retention is met.
MAX_AGE_IN_DAYS = 30
# To clean specific tables, please provide a comma-separated list per
# https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#clean
# A value of None will clean all tables
TABLES_TO_CLEAN = None
with DAG(
dag_id="clean_db_dag",
schedule_interval=None,
catchup=False,
start_date=days_ago(1),
params={
"timestamp": Param(
default=(datetime.now()-timedelta(days=MAX_AGE_IN_DAYS)).strftime("%Y-%m-%d %H:%M:%S"),
type="string",
minLength=1,
maxLength=255,
),
}
) as dag:
if TABLES_TO_CLEAN:
bash_command="airflow db clean --clean-before-timestamp '{{ params.timestamp }}' --tables '"+TABLES_TO_CLEAN+"' --skip-archive --yes"
else:
bash_command="airflow db clean --clean-before-timestamp '{{ params.timestamp }}' --skip-archive --yes"
cli_command = BashOperator(
task_id="bash_command",
bash_command=bash_command
)