View a markdown version of this page

Limpeza do banco de dados do Aurora PostgreSQL em um ambiente do Amazon MWAA - Amazon Managed Workflows for Apache Airflow

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Limpeza do banco de dados do Aurora PostgreSQL em um ambiente do Amazon MWAA

A solução Workflows gerenciados pela Amazon para Apache Airflow usa um banco de dados Aurora PostgreSQL como o banco de dados de metadados do Apache Airflow, onde o DAG é executado e as instâncias das tarefas são armazenadas. O código de exemplo a seguir limpa periodicamente as entradas do banco de dados Aurora PostgreSQL dedicado para seu ambiente Amazon MWAA.

Importante

O Apache Airflow v3 restringe o acesso direto ao banco de dados de metadados a partir do código da tarefa. Os trabalhadores não se conectam mais ao banco de dados de metadados, e o DAG ou o código de tarefa não podem importar ou usar sessões ou modelos do banco de dados Apache Airflow diretamente. Essa mudança melhora a segurança e a escalabilidade. No entanto, a abordagem DAG-based de limpeza do banco de dados que funciona no Apache Airflow v2 não funciona nos ambientes Apache Airflow v3.

Em vez disso, use o comando airflow db clean CLI por meio do endpoint da CLI do Amazon MWAA para realizar a limpeza do banco de dados de metadados.

nota

Com o tempo, o banco de dados de metadados acumula registros antigos, dados do XCom e dados de tarefas obsoletos. Esse crescimento usa conexões de banco de dados, reduz a velocidade do ambiente e atrasa as tarefas. Execute uma limpeza regular de metadados para evitar esses problemas.

Versão

Os exemplos de código nesta página são específicos para o Apache Airflow v2 e v3 com suporte no Amazon MWAA. Consulte as versões compatíveis do Apache Airflow.

Pré-requisitos

Para usar o código de amostra nesta página, você precisará do seguinte:

Dependências

Para usar esse exemplo de código com o Apache Airflow v2, nenhuma dependência adicional é necessária. Use aws-mwaa-docker-images para instalar o Apache Airflow.

Exemplo de código

Os exemplos a seguir mostram como limpar o banco de dados de metadados em seu ambiente Amazon MWAA.

Apache Airflow v3.0.6 to 3.2.1
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"
Apache Airflow v2.7.2 to 2.11.2
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 )