andreadcsousa / alura_postgresql-administracao_sql

Este projeto faz parte do plano de estudos elaborado pela Alura para o programa de formação Desenvolve (3ª edição), trilha de dados, em parceria com a Boticário.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

PostgreSQL: administração e otimização do banco

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.

  1. Papel do DBA
  2. Servidor Postgres
  3. Tuning de banco
  4. Processos de manutenção
  5. Backup e restauração
  6. Planejamento de queries
  7. Usuários e permissões

Saiba mais sobre o curso aqui ou acompanhe minhas anotações abaixo. ⬇️

1. Papel do DBA

Responsabilidades de um DBA

  • 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.

Conexões com o banco

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.

Conexão local do PostgreSQL

2. Servidor Postgres

Inicializando um espaço

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 inicia
  • stop para
  • restart reinicia
  • reload recarrega
  • status visualiza

Para saber mais: pg_ctl

Derrubando o servidor

É 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.

3. Tuning de banco

Tuning de hardware e nuvem

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.

Configurações do PostgreSQL

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

4. Processos de manutenção

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.

Conhecendo o VACUUM

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 disco
  • VACUUM VERBOSE imprime um relatório detalhado da atividade de limpeza para cada tabela
  • VACUUM 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

Processos de manutençã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;

5. Backup e restauração

Processos de backup (exportação)

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

Restaurando backups (importação)

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

6. Planejamento de queries

Plano de execução (EXPLAIN)

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

Criando um índice

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.

7. Usuários e permissões

Arquivo pg_hba

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.

Criando uma role

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.

Definindo permissões

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 ⬆️

About

Este projeto faz parte do plano de estudos elaborado pela Alura para o programa de formação Desenvolve (3ª edição), trilha de dados, em parceria com a Boticário.