Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Importante
Esta funcionalidade está na Pré-visualização Pública nas seguintes regiões: westus, westus2, eastus, eastus2, centralussouthcentralusnortheuropewesteuropeaustraliaeastbrazilsouthcanadacentralcentralindiasoutheastasiauksouth.
Esta página descreve como criar e gerenciar uma tabela sincronizada. Uma tabela sincronizada é uma tabela Postgres de leitura apenas do Unity Catalog que sincroniza automaticamente os dados de uma tabela do Unity Catalog para a sua instância de base de dados Lakebase. A sincronização de uma tabela do Catálogo Unity com o Postgres permite consultas de leitura de baixa latência e suporta junções em tempo de consulta com outras tabelas Postgres.
A sincronização é tratada pelo Lakeflow Spark Declarative Pipelines. Um pipeline gerenciado atualiza continuamente a tabela Postgres com alterações da tabela de origem. Após a criação, as tabelas sincronizadas podem ser consultadas diretamente usando as ferramentas do Postgres.
As principais características das tabelas sincronizadas são as seguintes:
- Somente leitura no Postgres para manter a integridade dos dados com a origem
- Sincronizado automaticamente usando os pipelines declarativos geridos do Lakeflow Spark
- Consultável através de interfaces PostgreSQL padrão
- Gerenciado através do Unity Catalog para governança e gerenciamento do ciclo de vida
Antes de começar
- Você tem uma tabela do Unity Catalog em qualquer catálogo.
- Você tem
CAN USEpermissões na instância do banco de dados.
Criar uma tabela sincronizada
IU
Para sincronizar uma tabela do Catálogo Unity com o Postgres, faça o seguinte:
Clique em Catálogo na barra lateral do espaço de trabalho.
Localize e selecione a tabela do Catálogo Unity na qual você deseja criar uma tabela sincronizada.
Clique em Criar>tabela sincronizada.
Selecione seu catálogo, esquema e insira um nome de tabela para a nova tabela sincronizada.
- Tabelas sincronizadas também podem ser criadas em catálogos padrão, com alguma configuração adicional. Selecione seu catálogo padrão, um esquema e insira um nome de tabela para a tabela sincronizada recém-criada.
Selecione uma instância de banco de dados e insira o nome do banco de dados Postgres no qual criar a tabela sincronizada. O campo Banco de dados Postgres assume como padrão o catálogo de destino selecionado no momento. Se um banco de dados Postgres não existir com esse nome, o Azure Databricks criará um novo.
Selecione uma chave primária. Uma chave primária é necessária , pois permite o acesso eficiente a linhas para leituras, atualizações e exclusões.
Importante
As colunas na chave primária não podem ser nulas na tabela sincronizada. Portanto, linhas com nulos em colunas de chave primária são excluídas da sincronização.
Se duas linhas tiverem a mesma chave primária na tabela de origem, selecione uma Chave de Série Temporal para configurar a desduplicação. Quando uma Chave de Série Temporal é especificada, as tabelas sincronizadas contêm apenas as linhas com o valor de chave de série temporal mais recente para cada chave primária.
Selecione o modo de sincronização entre Instantâneo, Despoletado e Contínuo. Para obter mais informações sobre cada modo de sincronização, consulte Modos de sincronização explicados.
Escolha se deseja criar esta tabela sincronizada a partir de um pipeline novo ou existente.
- Caso esteja a criar um novo pipeline e a utilizar um catálogo gerido, escolha o local de armazenamento para a tabela intermediária. Se estiver usando um catálogo padrão, a tabela de preparo será armazenada automaticamente no catálogo.
- Se estiver usando um pipeline existente, verifique se o novo modo de sincronização corresponde ao modo de pipeline.
(Opcional) Selecione uma política de orçamento sem servidor. Para criar uma política de orçamento sem servidor, consulte Uso de atributos com políticas de orçamento sem servidor. Isso permite que você atribua o uso de cobrança a políticas de uso específicas.
- Para tabelas sincronizadas, a entidade faturável é o pipeline subjacente Lakeflow Spark Declarative Pipelines. Para modificar a política de orçamento, modifique o objeto do fluxo de dados subjacente. Consulte Configurar um pipeline sem servidor.
Depois que o status da tabela sincronizada estiver Online, faça login na instância do banco de dados e consulte a tabela recém-criada. Consulte sua tabela usando o editor SQL, ferramentas externas ou blocos de anotações.
Python SDK
from databricks.sdk import WorkspaceClient
from databricks.sdk.service.database import SyncedDatabaseTable, SyncedTableSpec, NewPipelineSpec, SyncedTableSchedulingPolicy
# Initialize the Workspace client
w = WorkspaceClient()
# Create a synced table in a database catalog
synced_table = w.database.create_synced_database_table(
SyncedDatabaseTable(
name="database_catalog.schema.synced_table", # Full three-part name
spec=SyncedTableSpec(
source_table_full_name="source_catalog.source_schema.source_table",
primary_key_columns=["id"], # Primary key columns
scheduling_policy=SyncedTableSchedulingPolicy.TRIGGERED, # SNAPSHOT, TRIGGERED, or CONTINUOUS
# Optional: timeseries_key="timestamp" # For deduplication
new_pipeline_spec=NewPipelineSpec(
storage_catalog="storage_catalog",
storage_schema="storage_schema"
)
),
)
)
print(f"Created synced table: {synced_table.name}")
# Create a synced table in a standard UC catalog
synced_table = w.database.create_synced_database_table(
SyncedDatabaseTable(
name="standard_catalog.schema.synced_table", # Full three-part name
database_instance_name="my-database-instance", # Required for standard catalogs
logical_database_name="postgres_database", # Required for standard catalogs
spec=SyncedTableSpec(
source_table_full_name="source_catalog.source_schema.source_table",
primary_key_columns=["id"],
scheduling_policy=SyncedTableSchedulingPolicy.CONTINUOUS,
create_database_objects_if_missing=True, # Create database/schema if needed
new_pipeline_spec=NewPipelineSpec(
storage_catalog="storage_catalog",
storage_schema="storage_schema"
)
),
)
)
print(f"Created synced table: {synced_table.name}")
# Check the status of a synced table
synced_table_name = "database_catalog.schema.synced_table"
status = w.database.get_synced_database_table(name=synced_table_name)
print(f"Synced table status: {status.data_synchronization_status.detailed_state}")
print(f"Status message: {status.data_synchronization_status.message}")
CLI
# Create a synced table in a database catalog
databricks database create-synced-database-table \
--json '{
"spec": {
"name": "database_catalog.schema.synced_table",
"source_table_full_name": "source_catalog.source_schema.source_table",
"primary_key_columns": ["id"],
"scheduling_policy": "TRIGGERED"
},
"new_pipeline_spec": {
"storage_catalog": "storage_catalog",
"storage_schema": "storage_schema"
}
}'
# Create a synced table in a standard UC catalog
# new_pipeline_spec, storage_catalog, and storage_schema are optional
databricks database create-synced-database-table \
--database-instance-name "my-database-instance" \
--logical-database-name "databricks_postgres" \
--json '{
"name": "standard_catalog.schema.synced_table",
"spec": {
"source_table_full_name": "source_catalog.source_schema.source_table",
"primary_key_columns": ["id"],
"scheduling_policy": "CONTINUOUS",
"create_database_objects_if_missing": true
}
}'
# Check the status of a synced table
databricks database get-synced-database-table "database_catalog.schema.synced_table"
encaracolar
Crie uma tabela sincronizada em um catálogo de banco de dados.
export CATALOG_NAME=<Database catalog>
export SRC_TBL="source_catalog.source_schema.source_table"
export DEST_TBL="$CATALOG_NAME.some_schema.synced_table"
export PKS='["id"]'
export ST_CATALOG = "storage_catalog"
export ST_SCHEMA = "storage_schema"
curl -X POST https://$WORKSPACE/api/2.0/database/synced_tables \
-H "Content-Type: text/json" \
-H "Authorization: Bearer ${DATABRICKS_TOKEN}" \
--data-binary @- << EOF
{
"name": "$DEST_TBL",
"spec": {
"source_table_full_name": "$SRC_TBL",
"primary_key_columns": $PKS,
"scheduling_policy": "TRIGGERED",
},
"new_pipeline_spec": {
"storage_catalog": "$ST_CATALOG",
"storage_schema": "$ST_SCHEMA",
}
}
EOF
Crie uma tabela sincronizada num catálogo padrão do Unity Catalog.
export CATALOG_NAME=<Standard catalog>
export DATABASE_INSTANCE=<database instance>
export POSTGRES_DATABASE=$CATALOG_NAME
export SRC_TBL="source_catalog.source_schema.source_table"
export DEST_TBL="$CATALOG_NAME.some_schema.sync_table"
export PKS='["id"]'
export ST_CATALOG = "storage_catalog"
export ST_SCHEMA = "storage_schema"
curl -X POST https://$WORKSPACE/api/2.0/database/synced_tables \
-H "Content-Type: text/json" \
-H "Authorization: Bearer ${DATABRICKS_TOKEN}" \
--data-binary @- << EOF
{
"name": "$DEST_TBL",
"database_instance_name": "$DATABASE_INSTANCE",
"logical_database_name": "$POSTGRES_DATABASE",
"spec": {
"source_table_full_name": "$SRC_TBL",
"primary_key_columns": $PKS,
"scheduling_policy": "TRIGGERED",
},
"new_pipeline_spec": {
"storage_catalog": "$ST_CATALOG",
"storage_schema": "$ST_SCHEMA",
}
}
EOF
Verifique o status de uma tabela sincronizada.
export SYNCEDTABLE='pg_db.silver.sbtest1_online'
curl --request GET \
"https://e2-dogfood.staging.cloud.databricks.com/api/2.0/database/synced_tables/$SYNCEDTABLE" \
--header "Authorization: Bearer dapi..."
Modos de sincronização explicados
Uma tabela sincronizada pode ser criada com um dos seguintes modos de sincronização, que determinam como os dados são sincronizados da origem para a tabela sincronizada no Postgres:
| Modo de sincronização | Description | Performance |
|---|---|---|
| Instantâneo | O pipeline é executado uma vez para capturar um instantâneo da tabela de origem e copiá-lo para a tabela sincronizada. Os fluxos de trabalho subsequentes são executados, copiando todos os dados de origem para o destino e substituindo-os diretamente e de forma atómica. O pipeline pode ser acionado manualmente, através de uma API ou de forma programada. | Este modo é 10 vezes mais eficiente do que os modos de sincronização Acionado ou Contínuo porque recria dados do zero. Se você estiver modificando mais de 10% da tabela de origem, considere usar esse modo. |
| Acionado | O pipeline é executado uma vez para capturar um instantâneo da tabela de origem e copiá-lo para a tabela sincronizada. Ao contrário do modo de sincronização de instantâneo, quando a tabela sincronizada é atualizada, apenas as alterações desde a última execução do pipeline são recuperadas e aplicadas à tabela sincronizada. A atualização incremental pode ser acionada manualmente, por meio de uma API ou em uma programação. | Este modo é um bom compromisso entre atraso e custo, porque é executado sob demanda e só aplica alterações desde a última execução. Para minimizar o atraso, execute esse pipeline imediatamente após atualizar a tabela de origem. Se você executar isso com mais frequência do que a cada 5 minutos, pode ser mais caro do que o modo contínuo devido ao custo de iniciar e parar o pipeline cada vez. |
| Contínuo | O pipeline é executado uma vez para tirar um instantâneo da tabela de origem e copiá-lo para a tabela sincronizada e, em seguida, o pipeline é executado continuamente. As alterações subsequentes na tabela de origem são aplicadas incrementalmente à tabela sincronizada em tempo real. Nenhuma atualização manual é necessária. | Este modo tem o menor atraso, mas maior custo, porque está em execução contínua. |
Observação
Para oferecer suporte ao modo de sincronização acionada ou Contínua, a tabela de origem deve ter o feed de dados de alterações ativado. Determinadas fontes (como visualizações) não suportam feeds de dados de mudança, então só podem ser sincronizadas no modo de instantâneo.
Operações apoiadas
O Databricks recomenda executar apenas as seguintes operações no Postgres para tabelas sincronizadas para evitar substituições acidentais ou inconsistências de dados:
- Consultas somente leitura
- Criação de índices
- Soltar a tabela (para liberar espaço depois de remover a tabela sincronizada do Unity Catalog)
Embora você possa modificar essa tabela de outras maneiras, ela interfere no pipeline de sincronização.
Excluir uma tabela sincronizada
Para excluir uma tabela sincronizada, você deve excluí-la do Catálogo Unity e soltá-la na instância do banco de dados. A exclusão da tabela sincronizada do Unity Catalog cancela o registro da tabela e interrompe todas as atualizações de dados. No entanto, a tabela permanece no banco de dados Postgres subjacente. Para liberar espaço na instância do banco de dados, conecte-se à instância e use o DROP TABLE comando.
IU
- Clique em Catálogo na barra lateral do espaço de trabalho.
- Localize e selecione a tabela sincronizada que pretende eliminar.
- Clique no
>Suprimir.
- Conecte-se à instância com
psql, o editor SQL ou através de um bloco de anotações. - Solte a tabela usando o PostgreSQL.
DROP TABLE synced_table_database.synced_table_schema.synced_table
Python SDK
from databricks.sdk import WorkspaceClient
# Initialize the Workspace client
w = WorkspaceClient()
# Delete a synced table from UC
synced_table_name = "catalog.schema.synced_table"
w.database.delete_synced_database_table(name=synced_table_name)
print(f"Deleted synced table from UC: {synced_table_name}")
# To free up space in your database instance, you need to connect to the
# instance and drop the table using PostgreSQL:
#
# DROP TABLE synced_table_database.synced_table_schema.synced_table;
CLI
# Delete a synced table from UC
databricks database delete-synced-database-table "catalog.schema.synced_table"
# To free up space in your database instance, you need to connect to the
# instance and drop the table using PostgreSQL:
#
# DROP TABLE synced_table_database.synced_table_schema.synced_table;
encaracolar
# Delete a synced table from UC
curl -X DELETE --header "Authorization: Bearer ${DATABRICKS_TOKEN}" \
https://$WORKSPACE/api/2.0/database/synced_tables/$SYNCED_TABLE_NAME
# To free up space in your database instance, you need to connect to the
# instance and drop the table using PostgreSQL:
#
# DROP TABLE synced_table_database.synced_table_schema.synced_table;
Propriedade e permissões
Se você criar um novo banco de dados, esquema ou tabela do Postgres, a propriedade do Postgres será definida da seguinte maneira:
- A propriedade é atribuída ao usuário que cria o banco de dados, esquema ou tabela, se o logon do Azure Databricks existir como uma função no Postgres. Para adicionar uma função de identidade do Azure Databricks no Postgres, consulte Gerenciar funções do Postgres.
- Caso contrário, a propriedade será atribuída ao proprietário do objeto pai no Postgres (normalmente o
databricks_superuser).
Gerenciar o acesso sincronizado à tabela
Depois que uma tabela sincronizada é criada, o databricks_superuser pode READ uma tabela sincronizada do Postgres. O databricks_superuser tem pg_read_all_data, que permite que essa função seja lida de todas as tabelas. Ele também tem o pg_write_all_data privilégio, que permite que essa função escreva em todas as tabelas. Isso significa que um databricks_superuser também pode gravar em uma tabela sincronizada no Postgres. O Lakebase suporta esse comportamento de escrita caso você precise fazer alterações urgentes na tabela de destino. No entanto, o Databricks recomenda fazer correções na tabela de origem.
O
databricks_superusertambém pode conceder esses privilégios a outros usuários:GRANT USAGE ON SCHEMA synced_table_schema TO user;GRANT SELECT ON synced_table_name TO user;O
databricks_superuserpode revogar estes privilégios:REVOKE USAGE ON SCHEMA synced_table_schema FROM user;REVOKE {SELECT | INSERT | UPDATE | DELETE} ON synced_table_name FROM user;
Gerenciar operações de tabela sincronizada
O databricks_superuser pode gerenciar quais usuários estão autorizados a executar operações específicas em uma tabela sincronizada. As operações suportadas para tabelas sincronizadas são:
CREATE INDEXALTER INDEXDROP INDEXDROP TABLE
Todas as outras operações DDL são negadas para tabelas sincronizadas.
Para conceder esses privilégios a usuários adicionais, o databricks_superuser deve primeiro criar uma extensão em databricks_auth:
CREATE EXTENSION IF NOT EXISTS databricks_auth;
Em seguida, o databricks_superuser pode adicionar um usuário para gerenciar uma tabela sincronizada:
SELECT databricks_synced_table_add_manager('"synced_table_schema"."synced_table"'::regclass, '[user]');
O databricks_superuser pode remover um usuário do gerenciamento de uma tabela sincronizada:
SELECT databricks_synced_table_remove_manager('[table]', '[user]');
O databricks_superuser pode ver todos os gerentes:
SELECT * FROM databricks_synced_table_managers;
Mapeamento de tipos de dados
Esta tabela de mapeamento de tipo define como cada tipo de dados na tabela de origem do Unity Catalog é mapeado para a tabela de sincronização de destino no Postgres:
| Tipo de coluna de origem | Tipo de coluna Postgres |
|---|---|
| BIGINT | BIGINT |
| BINÁRIO | BYTEA |
| BOOLEANO | BOOLEAN |
| DATA | DATE |
| DECIMAL(p,s) | NUMÉRICO |
| DUPLO | Double Precision |
| FLOAT | REAL |
| INT | INTEGER |
| INTERVALOintervaloQualificador | INTERVALO |
| SMALLINT | SMALLINT |
| STRING | TEXTO |
| CARIMBO DE DATA/HORA | CARIMBO DE DATA/HORA COM FUSO HORÁRIO |
| TIMESTAMP_NTZ | MARCA TEMPORAL SEM ZONA HORÁRIA |
| TINYINT | SMALLINT |
| GEOGRAFIA(srid) | NÃO SUPORTADO |
| GEOMETRIA (srid) | NÃO SUPORTADO |
| ARRAY < elementType > | JSONB |
| < MAP keyType,valueType> | JSONB |
| STRUCT < [fieldName : fieldType [NOT NULL][COMMENT str][, ...]] > | JSONB |
| VARIANTE | JSONB |
| OBJETO | NÃO SUPORTADO |
Observação
- O mapeamento para os tipos ARRAY, MAP e STRUCT foi alterado em maio de 2025. As tabelas de sincronização criadas antes disso continuam a mapear esses tipos para JSON.
- O mapeamento para TIMESTAMP foi alterado em agosto de 2025. As tabelas de sincronização criadas antes disso continuam a mapeá-las para TIMESTAMP WITHOUT TIME ZONE.
Manipular caracteres inválidos
Certos caracteres, como o byte nulo (0x00), são permitidos em STRING, ARRAY, MAPou STRUCT colunas em tabelas Delta, mas não são suportados em Postgres TEXT ou JSONB colunas. Como resultado, a sincronização desses dados do Delta para o Postgres pode levar a falhas de inserção com erros:
org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x00
org.postgresql.util.PSQLException: ERROR: unsupported Unicode escape sequence DETAIL: \u0000 cannot be converted to text.
- O primeiro erro ocorre quando um byte nulo aparece em uma coluna de cadeia de caracteres de nível superior, que mapeia diretamente para o Postgres
TEXT. - O segundo erro ocorre quando um byte nulo aparece numa cadeia de caracteres aninhada dentro de um tipo complexo (
STRUCT,ARRAYouMAP), que o Azure Databricks serializa comoJSONB. Durante a serialização, todas as cadeias de caracteres são convertidas para PostgresTEXT, onde\u0000não é permitido.
Como resolver:
Você pode resolver esse problema de uma das seguintes maneiras:
Sanitizar campos de cadeia de caracteres
Remova ou substitua caracteres não suportados de todos os campos de cadeia de caracteres, incluindo aqueles dentro de tipos complexos, antes de sincronizar com o Postgres.
Para remover bytes nulos de uma coluna de nível superior
STRING, utilize a funçãoREPLACE:SELECT REPLACE(column_name, CAST(CHAR(0) AS STRING), '') AS cleaned_column FROM your_table;Converter para binário (apenas para colunas
STRING)Se for necessário preservar o conteúdo de bytes brutos, converta as colunas afetadas
STRINGemBINARY.
Limitações e considerações
Tabelas de origem suportadas
Dependendo do modo de sincronização de uma tabela sincronizada, há suporte para diferentes tipos de tabelas de origem:
Para o modo Snapshot, a tabela de origem deve suportar
SELECT *. Exemplos incluem tabelas Delta, tabelas Iceberg, visualizações, visualizações materializadas e outros tipos semelhantes.Para os modos de sincronização acionada ou contínua, a tabela de origem também deve ter o feed de dados de alteração habilitado.
Limitações de nomenclatura e identificador
-
Caracteres permitidos: Os nomes de banco de dados, esquema e tabela do Postgres para tabelas sincronizadas podem conter apenas caracteres alfanuméricos e sublinhados (
[A-Za-z0-9_]+). Hífens (-) e outros caracteres especiais não são suportados. - Identificadores de coluna e tabela: Evite usar letras maiúsculas ou caracteres especiais em nomes de colunas ou tabelas na tabela de origem do Catálogo Unity. Se mantido, você precisa citar esses identificadores ao fazer referência a eles no Postgres.
Desempenho e sincronização
- Velocidade de sincronização: A sincronização de dados em tabelas sincronizadas pode ser mais lenta do que gravar dados diretamente na instância do banco de dados com um cliente PostgreSQL nativo devido ao processamento adicional. O modo de sincronização contínua atualiza os dados da tabela gerenciada do Unity Catalog para a tabela sincronizada em um intervalo mínimo de 15 segundos.
- Uso da conexão: Cada sincronização de tabela pode usar até 16 conexões com a instância do banco de dados, que contam para o limite de conexão da instância.
- IDEMPOTÊNCIA DA API: As APIs de tabela sincronizada são idempotentes e podem precisar ser reiteradas em caso de erros, para garantir a execução oportuna das operações.
-
Alterações de esquema: Para tabelas sincronizadas nos modos
TriggeredouContinuous, apenas as alterações de esquema aditivas (como a adição de uma nova coluna) das tabelas do Catálogo Unity são automaticamente refletidas na tabela sincronizada. - Chaves duplicadas: Se duas linhas tiverem a mesma chave primária na tabela de origem, o pipeline de sincronização falhará, a menos que você configure a desduplicação usando uma Chave de Série Temporal. No entanto, o uso de uma chave de séries temporais implica uma penalidade de desempenho.
- Taxa de atualização: O pipeline de sincronização suporta gravações contínuas em aproximadamente 1.200 linhas por segundo por unidade de capacidade (CU) e gravações em massa em até 15.000 linhas por segundo por unidade de capacidade (CU).
Capacidade e limites
-
Limites da tabela:
- Limite de 20 tabelas sincronizadas por tabela de origem.
- Cada sincronização de tabela pode usar até 16 conexões de banco de dados.
-
Limites de tamanho e atualização completa:
- Se você atualizar completamente uma tabela sincronizada, a versão antiga no Postgres não será excluída até que a nova tabela seja sincronizada. Ambas as versões contam temporariamente para o limite de tamanho do banco de dados lógico durante a atualização.
- As tabelas sincronizadas individuais não têm um limite, mas o limite de tamanho total de dados lógicos em todas as tabelas na instância é de 2 TB. No entanto, se você precisar de atualizações em vez de recreação completa da tabela, o Databricks recomenda não exceder 1 TB.
- Se o tamanho descompactado em formato de linha da tabela do Unity Catalog exceder o limite de tamanho da instância do banco de dados (2 TB), a sincronização falhará. Você deve eliminar a tabela sincronizada no Postgres antes de efetuar outras operações de escrita na instância.
Integração de catálogos
- Duplicação de catálogo: Criar uma tabela sincronizada em um catálogo padrão direcionado a um banco de dados Postgres que também é registrado como um catálogo de banco de dados separado faz com que a tabela sincronizada apareça no Unity Catalog sob os catálogos padrão e de banco de dados.