Upload
others
View
8
Download
0
Embed Size (px)
Citation preview
Rafael Castro
Desbravando PG Hooks
www.2ndQuadrant.com
PGConf.Brasil 2019
Sobre mim...
● Desenvolvedor (Python, C, …)● DBA PostgreSQL● Criador e mantenedor da ferramenta OmniDB
www.2ndQuadrant.com
PGConf.Brasil 2019
Sumário
● Introdução a Hooks● Lista de Hooks● Exemplos Úteis● Depurador PL/pgSQL com Hooks● Plus: Background Workers
www.2ndQuadrant.com
PGConf.Brasil 2019
Como customizar o PG?
www.2ndQuadrant.com
PGConf.Brasil 2019
Como customizar o PG?● Funções / Procedimentos
www.2ndQuadrant.com
PGConf.Brasil 2019
Como customizar o PG?● Funções / Procedimentos● Tipos
www.2ndQuadrant.com
PGConf.Brasil 2019
Como customizar o PG?● Funções / Procedimentos● Tipos● Operadores
www.2ndQuadrant.com
PGConf.Brasil 2019
Como customizar o PG?● Funções / Procedimentos● Tipos● Operadores● Agregadores
www.2ndQuadrant.com
PGConf.Brasil 2019
Como customizar o PG?● Funções / Procedimentos● Tipos● Operadores● Agregadores● Extensões
www.2ndQuadrant.com
PGConf.Brasil 2019
Como customizar o PG?● Funções / Procedimentos● Tipos● Operadores● Agregadores● Extensões● Ganchos (Hooks)
www.2ndQuadrant.com
PGConf.Brasil 2019
Como customizar o PG?● Funções / Procedimentos● Tipos● Operadores● Agregadores● Extensões● Ganchos (Hooks)● BG Workers
www.2ndQuadrant.com
PGConf.Brasil 2019
Hooks - Introdução
www.2ndQuadrant.com
PGConf.Brasil 2019
Hooks - Introdução● Extender / Modificar / Interromper operações
www.2ndQuadrant.com
PGConf.Brasil 2019
Hooks - Introdução● Extender / Modificar / Interromper operações● Biblioteca externa escrita em C
www.2ndQuadrant.com
PGConf.Brasil 2019
Hooks - Introdução● Extender / Modificar / Interromper operações● Biblioteca externa escrita em C● Carregada com “shared_preload_libraries”
www.2ndQuadrant.com
PGConf.Brasil 2019
Hooks - Implementação
www.2ndQuadrant.com
PGConf.Brasil 2019
Hooks - Implementação● Ponteiros NULL espalhados pelo código-fonte do PG
src/backend/commands/user.c
www.2ndQuadrant.com
PGConf.Brasil 2019
Hooks - Implementação● Bibliotecas apontam ponteiros para funções específicas
www.2ndQuadrant.com
PGConf.Brasil 2019
Hooks - Implementação● Função _PG_init() chamada quando PG inicia
www.2ndQuadrant.com
PGConf.Brasil 2019
Hooks - Implementação● PG_MODULE_MAGIC - Checagem de compatibilidade
www.2ndQuadrant.com
PGConf.Brasil 2019
Hooks - Implementação● Função _PG_fini() chamada quando PG é desligado
www.2ndQuadrant.com
PGConf.Brasil 2019
Hooks - Boas práticas● Bibliotecas devem coexistir em harmonia (encadeamento)
www.2ndQuadrant.com
PGConf.Brasil 2019
Hooks - Boas práticas● Bibliotecas devem coexistir em harmonia
www.2ndQuadrant.com
PGConf.Brasil 2019
Hooks - Boas práticas● Hooks que substituem devem chamar função original
www.2ndQuadrant.com
PGConf.Brasil 2019
Tipos de Hooks
www.2ndQuadrant.com
PGConf.Brasil 2019
Tipos de Hooks● Gerais
○ emit_log_hook: Chamado antes de escrever linha de log
○ shmem_startup_hook: Chamado após PG criar região de memória compartilhada
www.2ndQuadrant.com
PGConf.Brasil 2019
Tipos de Hooks● Segurança
○ password_check_hook: Chamado ao executar CREATE ROLE or ALTER ROLE (para mudar senha)
○ ClientAuthentication_hook: Chamado após PG realizar autenticação de usuário (e antes de retornar ao cliente)
www.2ndQuadrant.com
PGConf.Brasil 2019
Tipos de Hooks● Gerenciamento de funções
○ fmgr_hook: Chamado antes e logo depois de uma função ser executada (chamado 2x)
www.2ndQuadrant.com
PGConf.Brasil 2019
Tipos de Hooks● Planejador
○ explain_get_index_name_hook: Chamado durante explain, para alterar o mecanismo de criação de nomes de índices fictícios
www.2ndQuadrant.com
PGConf.Brasil 2019
Tipos de Hooks● Execução
○ ExecutorStart_hook: Chamado antes da execução de um planejamento de query
○ ProcessUtility_hook: Chamado antes da execução de operações do Process Utility, responsável pela execução de DDL
www.2ndQuadrant.com
PGConf.Brasil 2019
Tipos de Hooks● PL/pgSQL
○ func_beg: Chamado antes da execução de uma função PL/pgSQL
○ stmt_beg: Chamado antes da execução de uma linha de comando do corpo de uma função PL/pgSQL
www.2ndQuadrant.com
PGConf.Brasil 2019
Exemplos● Contrib: passwordcheck
www.2ndQuadrant.com
PGConf.Brasil 2019
Exemplos● Michael Paquier: Superuser restrictions
www.2ndQuadrant.com
PGConf.Brasil 2019
Exemplos● Contrib: auto explain
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador PL/pgSQL
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador PL/pgSQL● Depurar funções PL/pgSQL utilizando interface gráfica
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador PL/pgSQL● Depurar funções PL/pgSQL utilizando interface gráfica● Execução passo a passo
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador PL/pgSQL● Depurar funções PL/pgSQL utilizando interface gráfica● Execução passo a passo● Inserir Breakpoints
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador PL/pgSQL● Depurar funções PL/pgSQL utilizando interface gráfica● Execução passo a passo● Inserir Breakpoints● Visualizar variáveis
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador PL/pgSQL● Depurar funções PL/pgSQL utilizando interface gráfica● Execução passo a passo● Inserir Breakpoints● Visualizar variáveis● Estatísticas de execução
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador - Implementação● Utiliza-se Hooks PL/pgSQL
○ func_setup○ func_beg○ func_end○ stmt_beg○ stmt_end
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador - Implementação● Cliente 1 (PG backend)
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador - Implementação● Cliente 1 (PG backend)
○ Executa função a ser depurada
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador - Implementação● Cliente 1 (PG backend)
○ Executa função a ser depurada○ Pausa execução de cada linha com os Hooks
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador - Implementação● Cliente 1 (PG backend)
○ Executa função a ser depurada○ Pausa execução de cada linha com os Hooks○ Controla tabela de estatísticas e de variáveis
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador - Implementação● Cliente 1 (PG backend)
○ Executa função a ser depurada○ Pausa execução de cada linha com os Hooks○ Controla tabela de estatísticas e de variáveis
● Cliente 2 (Interface Gráfica)
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador - Implementação● Cliente 1 (PG backend)
○ Executa função a ser depurada○ Pausa execução de cada linha com os Hooks○ Controla tabela de estatísticas e de variáveis
● Cliente 2 (Interface Gráfica)○ Se comunica com Cliente 1
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador - Implementação● Cliente 1 (PG backend)
○ Executa função a ser depurada○ Pausa execução de cada linha com os Hooks○ Controla tabela de estatísticas e de variáveis
● Cliente 2 (Interface Gráfica)○ Se comunica com Cliente 1○ Controla pausa/prosseguimento da execução
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador - Implementação● Cliente 1 (PG backend)
○ Executa função a ser depurada○ Pausa execução de cada linha com os Hooks○ Controla tabela de estatísticas e de variáveis
● Cliente 2 (Interface Gráfica)○ Se comunica com Cliente 1○ Controla pausa/prosseguimento da execução
● Como se comunicam?
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador - Implementação● pgAdmin
○ Comunicação cliente/servidor entre clientes● OmniDB
○ Advisory Locks○ Intercalação de aquisição de locks
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador - Implementação
Cliente 1 Cliente 2SELECT pg_advisory_lock(1) FROM tabela WHERE id = 1
.
.
SELECT pg_advisory_unlock(1) FROM tabela WHERE id = 1
SELECT pg_advisory_lock(1) FROM tabela WHERE id = 1
x
.
SELECT pg_advisory_lock(1) FROM tabela WHERE id = 1
x
x
.
.
www.2ndQuadrant.com
PGConf.Brasil 2019
www.2ndQuadrant.com
PGConf.Brasil 2019
Depurador - OmniDBDemonstração...
www.2ndQuadrant.com
PGConf.Brasil 2019
Background Worker
www.2ndQuadrant.com
PGConf.Brasil 2019
Background Worker● Extender funcionalidades do PG
www.2ndQuadrant.com
PGConf.Brasil 2019
Background Worker● Extender funcionalidades do PG● Processo externo iniciado junto com o PG
www.2ndQuadrant.com
PGConf.Brasil 2019
Background Worker● Extender funcionalidades do PG● Processo externo iniciado junto com o PG● Biblioteca externa escrita em C
www.2ndQuadrant.com
PGConf.Brasil 2019
Background Worker● Extender funcionalidades do PG● Processo externo iniciado junto com o PG● Biblioteca externa escrita em C● Carregada com “shared_preload_libraries”
www.2ndQuadrant.com
PGConf.Brasil 2019
Background Worker● Extender funcionalidades do PG● Processo externo iniciado junto com o PG● Biblioteca externa escrita em C● Carregada com “shared_preload_libraries”● Acesso à memória compartilhada
www.2ndQuadrant.com
PGConf.Brasil 2019
Background Worker● Extender funcionalidades do PG● Processo externo iniciado junto com o PG● Biblioteca externa escrita em C● Carregada com “shared_preload_libraries”● Acesso à memória compartilhada● Acesso ao banco com interface interna (SPI)
www.2ndQuadrant.com
PGConf.Brasil 2019
Background Worker● Extender funcionalidades do PG● Processo externo iniciado junto com o PG● Biblioteca externa escrita em C● Carregada com “shared_preload_libraries”● Acesso à memória compartilhada● Acesso ao banco com interface interna (SPI)● libpq para instanciar novas conexões e fazer transações
www.2ndQuadrant.com
PGConf.Brasil 2019
Background Worker● src/test/modules/worker_spi/worker_spi.c