Solucionar problemas de ingestão do SQL Server
Esta página descreve problemas comuns com o conector Microsoft SQL Server em Databricks LakeFlow Connect e como resolvê-los.
Para obter orientação geral sobre solução de problemas que se aplica a todos os pipelines de ingestão gerenciados, consulte Solucionar problemas de pipelines de ingestão gerenciados.
Verificar se o CDC está ativado para um banco de dados ou uma tabela
Para verificar se o CDC está ativado para o banco de dados <database-name>:
select is_cdc_enabled from sys.databases where name='<database-name>';
Para verificar se o CDC está ativado para a tabela <schema-name>.<table-name>:
select t.is_tracked_by_cdc
from sys.tables t join sys.schemas s on t.schema_id = s.schema_id
where s.name='<schema-name>' and t.name='<table-name>';
Verificar se o acompanhamento de alterações está ativado para um banco de dados ou uma tabela
Para verificar se o acompanhamento de alterações está habilitado para o banco de dados\<database-name\>:
select ctdb.*
from sys.change_tracking_databases ctdb join sys.databases db
on db.database_id = ctdb.database_id
where db.name = '<MyDatabaseName>'
Para verificar se o acompanhamento de alterações está habilitado para a tabela <schema-name>.<table-name>:
select s.name schema_name, t.name table_name, ct.*
from sys.change_tracking_tables ct join sys.tables t
on ct.object_id = t.object_id
join sys.schemas s on t.schema_id = s.schema_id
where s.name = '<MySchemaName>' and t.name = '<MyTableName>'
Tempo limite de espera por tokens de mesa
A ingestão pipeline pode ter um tempo limite enquanto aguarda o fornecimento de informações pelo gateway. Isso pode ser porque:
- Você está executando uma versão mais antiga do gateway.
- Ocorreu um erro ao gerar as informações necessárias. Verifique se há erros no driver do gateway logs.
O fluxo refresh completa reduz significativamente a ocorrência de erros de tempo limite durante as operações refresh completa. Consulte Comportamento refresh completo (CDC).
default auth: não é possível configurar as credenciais do default
Se você receber esse erro, há um problema com a descoberta das credenciais atuais do usuário. Tente substituir o seguinte:
w = WorkspaceClient()
com:
w = WorkspaceClient(host=input('Databricks Workspace URL: '), token=input('Token: '))
Consulte Autenticação na documentação do Databricks SDK para Python.
tech.replicant.common.ExtractorException: com.microsoft.sqlserver.JDBC.SQLServerException: Nome de coluna inválido 'SERIAL_NUMBER'.
Você pode receber esse erro se estiver usando uma versão mais antiga de uma tabela interna. Execute o seguinte no banco de dados conectado:
drop table dbo.replicate_io_audit_ddl_trigger_1;
PERMISSION_DENIED: o senhor não está autorizado a criar clustering. Entre em contato com seu administrador.
Entre em contato com um administrador do Databricks account para que ele lhe conceda as permissões do Unrestricted cluster creation.
CÓDIGO DE ERRO DO DLT: INGESTION_GATEWAY_INTERNAL_ERROR
Verifique o(s) arquivo(s) stdout no driver logs.
Conflito de nomeação da tabela de origem
Ingestion pipeline error: "org.apache.spark.sql.catalyst.ExtendedAnalysisException: Cannot have multiple queries named `XYZ_snapshot_load` for `XYZ`. Additional queries on that table must be named. Note that unnamed queries default to the same name as the table.
Isso indica que há um conflito de nomes devido a várias tabelas de origem denominadas XYZ em diferentes esquemas de origem que estão sendo ingeridas pelo mesmo pipeline de ingestão para o mesmo esquema de destino.
Crie vários pares gateway-pipeline gravando essas tabelas conflitantes em diferentes esquemas de destino.
Alterações de esquema incompatíveis
Uma alteração de esquema incompatível faz com que o pipeline de ingestão falhe com um erro INCOMPATIBLE_SCHEMA_CHANGE. Para continuar a replicação, acione um refresh completo das tabelas afetadas.
A Databricks não pode garantir que, no momento em que o pipeline de ingestão falhar devido a uma alteração de esquema incompatível, todas as linhas anteriores à alteração de esquema tenham sido ingeridas.
NON_INCREMENTAL_SCHEMA_CHANGE
NON_INCREMENTAL_SCHEMA_CHANGE: Column '<column>' was added to table '<table>'. A full refresh is required to continue incremental ingestion.
Este erro ocorre quando uma nova coluna é adicionada a uma tabela de origem enquanto a ingestão incremental está ativa. O conector não pode preencher novamente valores para a nova coluna a partir de dados de alteração históricos, então um refresh completo é necessário.
Executar um refresh completo da tabela afetada para retomar a ingestão. Consulte Fully refresh target tables.
TABELA_AUSENTE_NA_FONTE
MISSING_TABLE_IN_SOURCE: Table '<schema>.<table>' could not be found in the source database.
Esse erro ocorre quando uma tabela que estava anteriormente disponível no banco de dados de origem não pode mais ser encontrada. Causas comuns incluem:
- A tabela foi renomeada ou removida na origem.
- A tabela está temporariamente indisponível, por exemplo, durante uma janela de manutenção.
Para resolver:
- Se a tabela estiver temporariamente indisponível, aguarde a conclusão da manutenção e, em seguida, tente novamente o pipeline.
- Se a tabela foi renomeada ou recriada, execute um refresh completo da tabela afetada.
- Se a tabela foi removida intencionalmente, removê-la do pipeline.
Erros HTTP 403 ao acessar o armazenamento do Azure
Se o seu pipeline falhar com um erro como INTERNAL_ERROR: Server returned HTTP response code: 403 for URL, seu compute pode não ter acesso ao endpoint de armazenamento do Azure usado pelo conector do SQL Server.
Faça a execução dos testes a seguir em um Notebooks do Databricks para isolar o problema. Use dbutils.secrets para recuperar seu token de assinatura de acesso compartilhado (SAS) em vez de codificá-lo diretamente.
Testar o acesso ao endpoint DFS (ADLS Gen2)
O snippet a seguir lista, lê e grava no endpoint do Azure Data Lake Storage (ADLS) Gen2, também chamado de endpoint do Distributed File System (DFS). Substitua os valores de espaço reservado pelos detalhes da sua account de armazenamento, contêiner e segredo e, em seguida, faça a execução para confirmar se os tokens SAS conseguem alcançar o Endpoint DFS:
storage_account = "<storage-account>"
container = "<container>"
sas_token = dbutils.secrets.get(scope="<scope>", key="<key>")
spark.conf.set(
f"fs.azure.sas.{container}.{storage_account}.dfs.core.windows.net",
sas_token
)
base_path = f"abfss://{container}@{storage_account}.dfs.core.windows.net/"
# List contents
display(dbutils.fs.ls(base_path))
# Read a file
df = spark.read.format("parquet").load(base_path + "<path-to-file>")
display(df.limit(10))
# Write a test file
df.write.format("delta").save(base_path + "_connectivity_test")
Testar acesso ao endpoint de blob
Se o teste de DFS for bem-sucedido, mas seu pipeline ainda falhar, o conector pode estar usando o endpoint de blob em vez disso. O trecho a seguir faz a execução das mesmas verificações de listagem, leitura e gravação no Endpoint de blob:
storage_account = "<storage-account>"
container = "<container>"
sas_token = dbutils.secrets.get(scope="<scope>", key="<key>")
spark.conf.set(
f"fs.azure.sas.{container}.{storage_account}.blob.core.windows.net",
sas_token
)
base_path = f"wasbs://{container}@{storage_account}.blob.core.windows.net/"
# List files
display(dbutils.fs.ls(base_path))
# Read a file
df = spark.read.format("parquet").load(base_path + "<path-to-file>")
display(df.limit(10))
# Write a test file
df.write.format("delta").save(base_path + "_connectivity_test")
Se qualquer um dos testes retornar um erro 403, os tokens SAS não terão as permissões necessárias ou não cobrirão o Endpoint correto. Verifique se o token SAS concede pelo menos permissões de Read e List no contêiner e regenere-o, se necessário.
erros de certificado do servidor TLS
Para solucionar problemas de validação de certificado TLS do servidor, consulte Solucionar problemas de erros de certificado TLS.