Aprendendo quais são os papéis de um DBA; entendendo como um banco de dados funciona na arquitetura cliente-servidor; aprendendo a gerenciar o serviço do banco de dados; entendendo sobre a administração e otimização do ambiente, do hardware até o software; conhecendo na prática alguns processos de manutenção de bancos de dados; aprendendo com detalhes e na prática sobre backup; otimizando queries utilizando o planejador de queries e índices; mantendo o ambiente seguro gerenciando acessos, usuários, permissões.
- Papel do DBA
- Servidor Postgres
- Tuning de banco
- Processos de manutenção
- Backup e restauração
- Planejamento de queries
- Usuários e permissões
Saiba mais sobre o curso aqui ou acompanhe minhas anotações abaixo. ⬇️
- Avaliar e instalar o ambiente;
- Manter o banco de dados performático;
- Manter os dados através de processos de backup;
- Auxiliar a área de desenvolvimento na manutenção dos dados;
- Monitorar o ambiente de instalação;
- Configurar o ambiente de dados;Configurar o acesso à base de dados;
- Administrar os usuários e seus acessos.
Os programas que desenvolvedores criam e que acessam o banco de dados também são clientes.
Se vários usuários acessarem o sistema, teremos várias conexões sendo feitas com o banco de dados.
Um cluster inicializado pelo comando
initdb
é o local onde o PostgreSQL vai armazenar os arquivos necessários para representar o esquema e seus dados.
Comando para inicializar o cluster:
initdb -D /usr/local/pgsql/data
Comando para subir o servidor:
postgres -D /usr/local/pgsql/data
Comando para subir o servidor com redirecionamento de saída:
postgres -D /usr/local/pgsql/data >logfile 2>&1 &
O pg_ctl
é um utilitário para iniciar, parar ou reiniciar o servidor PostgreSQL ou mostrar o status de um servidor ativo.
Comando para iniciar o servidor:
pg_ctl start -l logfile
Outras ações com pg_ctl
start
iniciastop
pararestart
reiniciareload
recarregastatus
visualiza
Para saber mais: pg_ctl
É possível parar o servidor através do pg_ctl, porém é importante saber quando interromper a execução do servidor. O motivo mais comum é o caso de manutenção física, em que é necessário desligar ou reiniciar o servidor. O ideal é interromper o serviço do PostgreSQL para garantir que nada seja perdido.
Caso o servidor esteja sendo atacado é imprescindível derrubá-lo para impedir dano ou roubo de informações. Mantendo inativo até que a falha seja investigada e corrigida.
Comando para parar o servidor:
pg_ctl stop
Ao não permitir o seu uso como root, o pg_ctl se “autolimita” garantindo que ele não terá acesso a coisas que não deveria. Isso é uma camada a mais de segurança ao servidor.
Tuning é a otimização do banco de dados e ela pode ser feita no hardware, no banco de dados e/ou no sistema operacional. Tendo isso em mente, é necessário verificar alguns pontos, descritos abaixo:
- Preferência a processadores e sistemas 64bits;
- Analisar a relação entre RAM e a base de dados;
- Ver o tipo de leitura do disco;
- Usar RAID.
Um DBA possui diversas funções e gerenciar o hardware e o SO são apenas parte dessas funções. Serviços em nuvem como Azure, Amazon, Google Cloud podem tirar uma parte do fardo do DBA. Porém um DBA ainda se faz muito necessário para manutenção, otimização, backup, etc.
Parâmentros de interação via arquivo de configuração:
- shared_buffers
- quantidade de memória dedicada ao cache
- 15% a 25% do total de RAM
- work_mem
- quantidade de memória dedicada a operações como ordenação
- 25% do total de RAM / max_connections
- maintenance_work_mem
- quantidade de memória dedicada a operações de manutenção
- 5% do total de RAM
Algumas configurações para o servidor do PostgreSQL:
log_connections = yes
log_destination = stderr
shared_buffers = 4GB
Para saber mais: Configurações
Por questões de performance é bem mais rápido para o PostgreSQL executar uma query gerenciando dados excluídos e atualizados, mantendo algumas informações desatualizadas e, digamos, inúteis. Isso causa menos verificações.
O VACUUM
serve para coletar o lixo. Ele também analisa um banco de dados para isso.
VACUUM FULL
trava a base de dados e reescreve todo o conteúdo da tabela em um novo arquivo de discoVACUUM VERBOSE
imprime um relatório detalhado da atividade de limpeza para cada tabelaVACUUM ANALYZE
atualiza as estatísticas para determinar a maneira mais eficiente de executar uma consulta
Quando usar cada comando?
O VACUUM normalmente só é utilizado quando o autovacuum por algum motivo não fizer seu trabalho.
O VACUUM FULL é utilizado quando temos muito desperdício de espaço. Normalmente quando a maioria dos registros de uma tabela já foram excluídos ou alterados.
O VACUUM ANALYSE é um comando a parte. Então o VACUUM faz seu trabalho e depois chama esse outro comando para que ele possa analisar a estrutura e os dados das tabelas e atualizar as estatísticas para o planejador de query.
VACUUM vs VACUUM FULL
VACUUM | VACUUM FULL |
---|---|
Verifica apenas tuplas mortas | Verifica todas as tuplas |
Não bloqueia acesso | Requer acesso exclusivo |
Lança memória para a tabela | Lança memória para o sistema |
Não reordena os indexes | Reordena os indexes |
Não necessita de mais espaço | Precisa do dobro do espaço |
O REINDEX
atualiza a tabela de índices. Muito útil nos casos em que os registros foram excluídos e não mais existem na tabela, mas seu espaço na memória permanece.
REINDEX TABLE instrutor;
Backup é a cópia dos arquivos e registros de um banco.
- Backup frio
- servidor inativo, nenhuma conexão permitida
- Backup morno/quente
- servidor ativo, conexões ativas acontecendo
- Backup lógico
- cópia da estrutura e dos dados
- Backup físico
- cópia dos arquivos binários utilizados
Comando para realizar o backup:
pg_dump -f /tmp/dump.sql
Comandos para ler o arquivo do bakcup:
/tmp/dump.sql more /tmp/dump.sql
O arquivo dos backups realizados podem ser importados para o banco em caso de perda de registros.
Comando para restaurar o backup:
psql alura < /tmp/dump.sql
O comando EXPLAIN
explica o que o PostgreSQL faz com a query que foi executada. No caso abaixo, ele faz a busca de instrutores totais, para só depois realizar o filtro pelos salários.
EXPLAIN SELECT * FROM instrutor WHERE salario > 1500;
Para saber mais: EXPLAIN
O comando CREATE INDEX
cria um índice na coluna especificada de uma tabela. Os índices são usados principalmente para aprimorar o desempenho do banco de dados.
CREATE INDEX idx_salario ON instrutor(salario);
O comando REINDEX
realiza uma nova organização em uma índice existente. Um índice pode ser organizado a partir de um índice criado anteriormente, uma tabela, esquema, base de dados, nome específico.
Quando não utilizar índices:
Em queries simples, índices podem acabar informando ao PostgreSQL que mais trabalho precisa ser feito, deixando a query mais custosa. Use índices com moderação.
Sempre que inserir, atualizar ou remover um registro, os índices precisar ser reorganizados. Isso custa tempo e processamento. Use índices com moderação.
A autenticação do cliente é controlada pelo arquivo de configuração pg_hba.conf
. Ele fica armazenado no diretório do banco de dados. HBA significa autenticação baseada em host.
O arquivo
pg_hba.conf
serve para limitar o acesso de determinados hosts ao servidor. Pode-se configurar para que apenas IPs específicos possam acessar o servidor. Isso ajuda muito na questão de segurança, dificultando possíveis ataques.
Uma ROLE
pode ser um usuário ou um grupo de usuários.
Comando para criar um usuário:
-- Na sintaxe básica apenas cria o cargo, que pode ser utilizado depois
CREATE ROLE nome;
-- Criando de uma dessas formas, define que o usuário pode fazer login
CREATE ROLE nome LOGIN;
CREATE USER nome;
Para criar um usuário através do terminal, pode-se utilizar o comando createuser
diretamente no servidor.
O atributo
SUPERUSER
faz com que o ROLE ignore todos os atributos de restrição. Um SUPERUSER pode fazer tudo no banco de dados. Pode criar novos usuários, definir senhas, criar novos bancos, etc. A recomendação é que os usuários fornecidos para clientes externos JAMAIS tenham esse atributo.
O comando REVOKE
revoga todos os privilégios do usuário
REVOKE ALL ON DATABASE alura FROM nome;
O comando GRANT
garante um ou mais privilégios ao usuário
GRANT SELECT ON public.instrutor TO nome;
⬆️ Voltar ao topo ⬆️