{"id":18357751,"url":"https://github.com/andreadcsousa/alura_postgresql-administracao_sql","last_synced_at":"2025-04-10T02:33:06.024Z","repository":{"id":168043340,"uuid":"618154283","full_name":"andreadcsousa/alura_postgresql-administracao_sql","owner":"andreadcsousa","description":"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.","archived":false,"fork":false,"pushed_at":"2023-03-23T21:34:28.000Z","size":219,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-15T17:52:09.293Z","etag":null,"topics":["alura","aprendendo","boticario","dados","desenvolve-2023","desenvolve-3-edicao","postgres","postgresql","sql"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andreadcsousa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-03-23T21:34:21.000Z","updated_at":"2023-03-23T22:03:15.000Z","dependencies_parsed_at":"2023-07-16T12:46:03.498Z","dependency_job_id":null,"html_url":"https://github.com/andreadcsousa/alura_postgresql-administracao_sql","commit_stats":null,"previous_names":["andreadcsousa/alura_postgresql-administracao_sql"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreadcsousa%2Falura_postgresql-administracao_sql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreadcsousa%2Falura_postgresql-administracao_sql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreadcsousa%2Falura_postgresql-administracao_sql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreadcsousa%2Falura_postgresql-administracao_sql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andreadcsousa","download_url":"https://codeload.github.com/andreadcsousa/alura_postgresql-administracao_sql/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248144305,"owners_count":21054905,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alura","aprendendo","boticario","dados","desenvolve-2023","desenvolve-3-edicao","postgres","postgresql","sql"],"created_at":"2024-11-05T22:15:20.962Z","updated_at":"2025-04-10T02:33:06.013Z","avatar_url":"https://github.com/andreadcsousa.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# PostgreSQL: administração e otimização do banco\n\nAprendendo 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.\n\n1. [Papel do DBA](#1-papel-do-dba)\n2. [Servidor Postgres](#2-servidor-postgres)\n3. [Tuning de banco](#3-tuning-de-banco)\n4. [Processos de manutenção](#4-processos-de-manutenção)\n5. [Backup e restauração](#5-backup-e-restauração)\n6. [Planejamento de queries](#6-planejamento-de-queries)\n7. [Usuários e permissões](#7-usuários-e-permissões)\n\nSaiba mais sobre o curso [aqui](https://cursos.alura.com.br/course/postgresql-administracao-otimizacao) ou acompanhe minhas anotações abaixo. ⬇️\n\n## 1. Papel do DBA\n\n### **Responsabilidades de um DBA**\n\n- Avaliar e instalar o ambiente;\n- Manter o banco de dados performático;\n- Manter os dados através de processos de backup;\n- Auxiliar a área de desenvolvimento na manutenção dos dados;\n- Monitorar o ambiente de instalação;\n- Configurar o ambiente de dados;Configurar o acesso à base de dados;\n- Administrar os usuários e seus acessos.\n\n### **Conexões com o banco**\n\n\u003e Os programas que desenvolvedores criam e que acessam o banco de dados também são clientes.\n\u003e \n\u003e Se vários usuários acessarem o sistema, teremos várias conexões sendo feitas com o banco de dados.\n\n![Conexão local do PostgreSQL](Imagens/conexao_local.jpg)\n\n## 2. Servidor Postgres\n\n### **Inicializando um espaço**\n\n\u003e Um cluster inicializado pelo comando `initdb` é o local onde o PostgreSQL vai armazenar os arquivos necessários para representar o esquema e seus dados.\n\n***Comando para inicializar o cluster:***\n\n    initdb -D /usr/local/pgsql/data\n\n***Comando para subir o servidor:***\n\n    postgres -D /usr/local/pgsql/data\n\n***Comando para subir o servidor com redirecionamento de saída:***\n\n    postgres -D /usr/local/pgsql/data \u003elogfile 2\u003e\u00261 \u0026\n\nO `pg_ctl` é um utilitário para iniciar, parar ou reiniciar o servidor PostgreSQL ou mostrar o status de um servidor ativo.\n\n***Comando para iniciar o servidor:***\n\n    pg_ctl start -l logfile\n\n**Outras ações com pg_ctl**\n\n- `start` inicia\n- `stop` para\n- `restart` reinicia\n- `reload` recarrega\n- `status` visualiza\n\n**Para saber mais:** [pg_ctl](Para%20saber%20mais/Aula%202%20-%20Atividade%204%20Para%20saber%20mais_%20pg_ctl.pdf)\n\n### **Derrubando o servidor**\n\nÉ 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.\n\nCaso 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.\n\n***Comando para parar o servidor:***\n\n    pg_ctl stop\n\n\u003e 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.\n\n## 3. Tuning de banco\n\n### **Tuning de hardware e nuvem**\n\nTuning é 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:\n\n- Preferência a processadores e sistemas 64bits;\n- Analisar a relação entre RAM e a base de dados;\n- Ver o tipo de leitura do disco;\n- Usar RAID.\n\n\u003e Um DBA possui diversas funções e gerenciar o hardware e o SO são apenas parte dessas funções.\n\u003e Serviços em nuvem como Azure, Amazon, Google Cloud podem tirar uma parte do fardo do DBA.\n\u003e Porém um DBA ainda se faz muito necessário para manutenção, otimização, backup, etc.\n\n### **Configurações do PostgreSQL**\n\n***Parâmentros de interação via arquivo de configuração:***\n\n- shared_buffers\n  - quantidade de memória dedicada ao cache\n  - 15% a 25% do total de RAM\n- work_mem\n  - quantidade de memória dedicada a operações como ordenação\n  - 25% do total de RAM / max_connections\n- maintenance_work_mem\n  - quantidade de memória dedicada a operações de manutenção\n  - 5% do total de RAM\n\n***Algumas configurações para o servidor do PostgreSQL:***\n\n    log_connections = yes\n    log_destination = stderr\n    shared_buffers = 4GB\n\n**Para saber mais:** [Configurações](Para%20saber%20mais/Aula%203%20-%20Atividade%204%20Para%20saber%20mais_%20Configurações.pdf)\n\n## 4. Processos de manutenção\n\n\u003e 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.\n\n### **Conhecendo o VACUUM**\n\nO `VACUUM` serve para coletar o lixo. Ele também analisa um banco de dados para isso.\n\n- `VACUUM FULL` trava a base de dados e reescreve todo o conteúdo da tabela em um novo arquivo de disco\n- `VACUUM VERBOSE` imprime um relatório detalhado da atividade de limpeza para cada tabela\n- `VACUUM ANALYZE` atualiza as estatísticas para determinar a maneira mais eficiente de executar uma consulta\n\n***Quando usar cada comando?***\n\nO VACUUM normalmente só é utilizado quando o autovacuum por algum motivo não fizer seu trabalho.\n\nO 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.\n\nO 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.\n\n***VACUUM vs VACUUM FULL***\n\nVACUUM                        | VACUUM FULL\n----------------------------- | -----------------------------\nVerifica apenas tuplas mortas | Verifica todas as tuplas\nNão bloqueia acesso           | Requer acesso exclusivo\nLança memória para a tabela   | Lança memória para o sistema\nNão reordena os indexes       | Reordena os indexes\nNão necessita de mais espaço  | Precisa do dobro do espaço\n\n### **Processos de manutenção**\n\nO `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.\n\n```sql\nREINDEX TABLE instrutor;\n```\n\n## 5. Backup e restauração\n\n### **Processos de backup (exportação)**\n\nBackup é a cópia dos arquivos e registros de um banco.\n\n- Backup frio\n  - servidor inativo, nenhuma conexão permitida\n- Backup morno/quente\n  - servidor ativo, conexões ativas acontecendo\n- Backup lógico\n  - cópia da estrutura e dos dados\n- Backup físico\n  - cópia dos arquivos binários utilizados\n\n***Comando para realizar o backup:***\n\n  pg_dump -f /tmp/dump.sql\n\n***Comandos para ler o arquivo do bakcup:***\n\n  /tmp/dump.sql\n  more /tmp/dump.sql\n\n### **Restaurando backups (importação)**\n\nO arquivo dos backups realizados podem ser importados para o banco em caso de perda de registros.\n\n***Comando para restaurar o backup:***\n\n  psql alura \u003c /tmp/dump.sql\n\n## 6. Planejamento de queries\n\n### **Plano de execução (EXPLAIN)**\n\nO 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.\n\n```sql\nEXPLAIN SELECT * FROM instrutor WHERE salario \u003e 1500;\n```\n\n**Para saber mais:** [EXPLAIN](Para%20saber%20mais/Aula%206%20-%20Atividade%202%20Para%20saber%20mais_%20EXPLAIN.pdf)\n\n### **Criando um índice**\n\nO 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.\n\n```sql\nCREATE INDEX idx_salario ON instrutor(salario);\n```\n\nO 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.\n\n***Quando não utilizar índices:***\n\n\u003e 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.\n\u003e\n\u003e Sempre que inserir, atualizar ou remover um registro, os índices precisar ser reorganizados. Isso custa tempo e processamento. Use índices com moderação.\n\n## 7. Usuários e permissões\n\n### **Arquivo pg_hba**\n\nA 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.\n\n\u003e 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.\n\n### **Criando uma role**\n\nUma `ROLE` pode ser um usuário ou um grupo de usuários.\n\n***Comando para criar um usuário:***\n\n```sql\n-- Na sintaxe básica apenas cria o cargo, que pode ser utilizado depois\nCREATE ROLE nome;\n\n-- Criando de uma dessas formas, define que o usuário pode fazer login\nCREATE ROLE nome LOGIN;\nCREATE USER nome;\n```\n\nPara criar um usuário através do terminal, pode-se utilizar o comando `createuser` diretamente no servidor.\n\n\u003e 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.\n\n### **Definindo permissões**\n\nO comando `REVOKE` revoga todos os privilégios do usuário\n\n```sql\nREVOKE ALL ON DATABASE alura FROM nome;\n```\n\nO comando `GRANT` garante um ou mais privilégios ao usuário\n\n```sql\nGRANT SELECT ON public.instrutor TO nome;\n```\n\n⬆️ [Voltar ao topo](#postgresql-administração-e-otimização-do-banco) ⬆️","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreadcsousa%2Falura_postgresql-administracao_sql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandreadcsousa%2Falura_postgresql-administracao_sql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreadcsousa%2Falura_postgresql-administracao_sql/lists"}