Add unified Database documentation (Postgres/MySQL/Redis) complying with new structure
This commit is contained in:
parent
1106d0a8bd
commit
2c7cb4d197
14
README.md
14
README.md
|
|
@ -28,13 +28,13 @@ Este repositório contém a documentação técnica da iT Guys, organizada por s
|
||||||
- [ ] [Nível 3] Configuração de iSCSI Target
|
- [ ] [Nível 3] Configuração de iSCSI Target
|
||||||
|
|
||||||
### 3. Bancos de Dados (PostgreSQL / MySQL / Redis)
|
### 3. Bancos de Dados (PostgreSQL / MySQL / Redis)
|
||||||
- [ ] [Nível 1] Backup e Restore Básico
|
- [x] [Nível 1] Diagnóstico de Conectividade e Status
|
||||||
- [ ] [Nível 2] Manutenção Preventiva (Vacuum/Optimize)
|
- [x] [Nível 1] Procedimento de Backup e Restore Manual
|
||||||
- [ ] [Nível 2] Gestão de Usuários e Permissões
|
- [x] [Nível 2] Instalação e Configuração Base
|
||||||
- [ ] [Nível 3] Troubleshooting de Performance
|
- [x] [Nível 2] Gestão de Usuários e Permissões
|
||||||
- [ ] [Nível 1] Redis: Instalação e Comandos
|
- [x] [Nível 2] Manutenção Preventiva e Logs
|
||||||
- [ ] [Nível 2] Redis: Persistência e Segurança
|
- [x] [Nível 3] Tuning de Performance e Otimização
|
||||||
- [ ] [Nível 3] Redis: Troubleshooting de Memória
|
- [x] [Nível 3] Arquitetura de Persistência e Troubleshooting Avançado
|
||||||
|
|
||||||
### 4. Windows Server (AD / DNS / GPO)
|
### 4. Windows Server (AD / DNS / GPO)
|
||||||
- [ ] [Nível 1] Criação e Bloqueio de Usuários (Padrão)
|
- [ ] [Nível 1] Criação e Bloqueio de Usuários (Padrão)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,101 @@
|
||||||
|
# MANUAL TÉCNICO - DIAGNÓSTICO DE CONECTIVIDADE DE BANCOS DE DADOS
|
||||||
|
|
||||||
|
**Código:** ITGSUP 0020/26 | **Classificação:** INTERNO
|
||||||
|
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
|
||||||
|
|
||||||
|
## 1. HISTÓRICO DE REVISÃO
|
||||||
|
|
||||||
|
| Data | Versão | Descrição | Autor |
|
||||||
|
| :--- | :--- | :--- | :--- |
|
||||||
|
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
|
||||||
|
|
||||||
|
## 2. OBJETIVO
|
||||||
|
Padronizar o diagnóstico inicial de incidentes de "banco fora do ar" ou "erro de conexão" para PostgreSQL, MySQL e Redis.
|
||||||
|
|
||||||
|
## 3. PRÉ-REQUISITOS
|
||||||
|
* [ ] Acesso ao terminal do servidor.
|
||||||
|
* [ ] Saber qual banco está sendo diagnosticado (PG, MySQL ou Redis).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. VERIFICAÇÃO DE STATUS DO SERVIÇO
|
||||||
|
|
||||||
|
O primeiro passo é saber se o processo está rodando.
|
||||||
|
|
||||||
|
**PostgreSQL:**
|
||||||
|
```bash
|
||||||
|
sudo systemctl status postgresql
|
||||||
|
```
|
||||||
|
* **Ativo:** `Active: active (exited)` ou `(running)`.
|
||||||
|
* **Porta Padrão:** 5432.
|
||||||
|
|
||||||
|
**MySQL / MariaDB:**
|
||||||
|
```bash
|
||||||
|
sudo systemctl status mysql
|
||||||
|
# ou
|
||||||
|
sudo systemctl status mariadb
|
||||||
|
```
|
||||||
|
* **Porta Padrão:** 3306.
|
||||||
|
|
||||||
|
**Redis:**
|
||||||
|
```bash
|
||||||
|
sudo systemctl status redis-server
|
||||||
|
# ou
|
||||||
|
sudo systemctl status redis
|
||||||
|
```
|
||||||
|
* **Porta Padrão:** 6379.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. TESTE DE CONEXÃO LOCAL (PING)
|
||||||
|
|
||||||
|
Se o serviço roda, ele responde?
|
||||||
|
|
||||||
|
### Redis (Mais Simples)
|
||||||
|
Use o `redis-cli` para enviar um PING.
|
||||||
|
```bash
|
||||||
|
redis-cli ping
|
||||||
|
```
|
||||||
|
* **Sucesso:** Retorna `PONG`.
|
||||||
|
* **Falha:** `Could not connect...` (Serviço parado) ou `NOAUTH` (Precisa de senha: `redis-cli -a SENHA ping`).
|
||||||
|
|
||||||
|
### PostgreSQL
|
||||||
|
Tente logar como o usuário `postgres`.
|
||||||
|
```bash
|
||||||
|
sudo -u postgres psql -c "\conninfo"
|
||||||
|
```
|
||||||
|
* **Sucesso:** Mostra dados da conexão (Socket, Port).
|
||||||
|
* **Falha:** `Is the server running locally...`
|
||||||
|
|
||||||
|
### MySQL
|
||||||
|
Teste o login (pode exigir senha de root).
|
||||||
|
```bash
|
||||||
|
sudo mysqladmin -u root -p ping
|
||||||
|
```
|
||||||
|
* **Sucesso:** `mysqld is alive`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. DIAGNÓSTICO DE REDE (ACESSO EXTERNO)
|
||||||
|
|
||||||
|
Se local funciona, mas a aplicação não conecta, verifique a rede.
|
||||||
|
|
||||||
|
**1. A Porta está aberta? (`ss` ou `netstat`)**
|
||||||
|
```bash
|
||||||
|
sudo ss -tuln | grep 5432 # (Exemplo PG)
|
||||||
|
```
|
||||||
|
* `127.0.0.1:5432` -> **ERRO:** Só aceita conexão local (localhost).
|
||||||
|
* `0.0.0.0:5432` -> **OK:** Aceita conexões de qualquer IP.
|
||||||
|
|
||||||
|
**2. Teste de Telnet (Da estação do usuário/app)**
|
||||||
|
No computador que está com erro, tente:
|
||||||
|
```bash
|
||||||
|
telnet IP_DO_SERVIDOR 5432
|
||||||
|
```
|
||||||
|
* **Connected:** Rede OK. Problema é senha/usuario.
|
||||||
|
* **Timeout:** Firewall bloqueando ou IP errado.
|
||||||
|
|
||||||
|
## 7. VALIDAÇÃO FINAL
|
||||||
|
- [ ] O serviço está "Active (Running)"?
|
||||||
|
- [ ] O teste local (Ping/Psql) funcionou?
|
||||||
|
- [ ] A porta está escutando em `0.0.0.0` (se precisar de acesso externo)?
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,108 @@
|
||||||
|
# MANUAL TÉCNICO - BACKUP E RESTORE MANUAL (DUMP)
|
||||||
|
|
||||||
|
**Código:** ITGSUP 0021/26 | **Classificação:** RESTRITO
|
||||||
|
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
|
||||||
|
|
||||||
|
## 1. HISTÓRICO DE REVISÃO
|
||||||
|
|
||||||
|
| Data | Versão | Descrição | Autor |
|
||||||
|
| :--- | :--- | :--- | :--- |
|
||||||
|
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
|
||||||
|
|
||||||
|
## 2. OBJETIVO
|
||||||
|
Executar backups pontuais (Dumps) e restaurações de emergência em bancos de dados, incluindo a exportação segura para servidores remotos (Storage/NFS).
|
||||||
|
|
||||||
|
## 3. PRÉ-REQUISITOS
|
||||||
|
* [ ] Espaço em disco suficiente para o dump.
|
||||||
|
* [ ] Senhas de administração dos bancos.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. POSTGRESQL (pg_dump)
|
||||||
|
|
||||||
|
### Backup (Exportar)
|
||||||
|
```bash
|
||||||
|
# Backup de UM banco
|
||||||
|
pg_dump -U usuario_admin -h localhost nome_do_banco > backup.sql
|
||||||
|
|
||||||
|
# Backup de TODOS os bancos (Cluster)
|
||||||
|
pg_dumpall -U usuario_admin > backup_full.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
### Restore (Importar)
|
||||||
|
```bash
|
||||||
|
# Se o banco ja existe (Sobrescreve estruturas)
|
||||||
|
psql -U usuario_admin -d nome_do_banco < backup.sql
|
||||||
|
|
||||||
|
# Se foi gerado com pg_dumpall
|
||||||
|
psql -U usuario_admin -f backup_full.sql postgres
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. MYSQL / MARIADB (mysqldump)
|
||||||
|
|
||||||
|
### Backup (Exportar)
|
||||||
|
```bash
|
||||||
|
# Backup de UM banco
|
||||||
|
mysqldump -u root -p nome_do_banco > backup.sql
|
||||||
|
|
||||||
|
# Backup de VÁRIOS bancos
|
||||||
|
mysqldump -u root -p --databases db1 db2 > backup_db1_db2.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
### Restore (Importar)
|
||||||
|
```bash
|
||||||
|
# O banco DEVE existir antes (mysqladmin create nome_do_banco)
|
||||||
|
mysql -u root -p nome_do_banco < backup.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. REDIS (RDB Snapshot)
|
||||||
|
|
||||||
|
O Redis trabalha em memória, mas salva arquivos `.rdb`.
|
||||||
|
|
||||||
|
### Backup (Snapshot Force)
|
||||||
|
1. Acesse o CLI: `redis-cli`
|
||||||
|
2. Execute: `BGSAVE` (Salva em background).
|
||||||
|
3. Verifique o diretório de dados (geralmente `/var/lib/redis/dump.rdb`).
|
||||||
|
4. Copie o arquivo `dump.rdb` para local seguro.
|
||||||
|
|
||||||
|
### Restore
|
||||||
|
1. Pare o serviço: `systemctl stop redis`
|
||||||
|
2. Substitua o arquivo `dump.rdb` pelo seu backup.
|
||||||
|
3. Garanta as permissões: `chown redis:redis dump.rdb`
|
||||||
|
4. Inicie o serviço: `systemctl start redis`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. EXPORTAÇÃO REMOTA (OFF-SITE)
|
||||||
|
|
||||||
|
> ⚠️ **IMPORTANTE:** Nunca deixe o backup apenas no próprio servidor. Mova-o.
|
||||||
|
|
||||||
|
### Opção A: Cópia via SCP (Windows/Linux Seguro)
|
||||||
|
Envia o arquivo para outro servidor via SSH.
|
||||||
|
```bash
|
||||||
|
scp backup.sql usuario@192.168.1.50:/home/usuario/backups/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Opção B: Montagem NFS (Storage Linux)
|
||||||
|
Se você tem um storage montado em `/mnt/backup`:
|
||||||
|
```bash
|
||||||
|
# Gera direto na pasta remota
|
||||||
|
pg_dump -U postgres meu_banco > /mnt/backup/pg_$(date +%F).sql
|
||||||
|
```
|
||||||
|
|
||||||
|
### Opção C: Montagem SMB/CIFS (Windows Share)
|
||||||
|
Para enviar para uma pasta do Windows Server.
|
||||||
|
1. Instale: `apt install cifs-utils`
|
||||||
|
2. Monte:
|
||||||
|
```bash
|
||||||
|
mount -t cifs -o username=user,password=pass //servidor/share /mnt/windows
|
||||||
|
```
|
||||||
|
3. Copie: `cp backup.sql /mnt/windows/`
|
||||||
|
|
||||||
|
## 8. VALIDAÇÃO FINAL
|
||||||
|
- [ ] O arquivo `.sql` foi gerado e tem tamanho maior que 0?
|
||||||
|
- [ ] O arquivo está salvo em local externo (SCP/NFS)?
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,91 @@
|
||||||
|
# MANUAL TÉCNICO - GESTÃO DE USUÁRIOS E PERMISSÕES DE BANCO
|
||||||
|
|
||||||
|
**Código:** ITGINF 0021/26 | **Classificação:** RESTRITO
|
||||||
|
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
|
||||||
|
|
||||||
|
## 1. HISTÓRICO DE REVISÃO
|
||||||
|
|
||||||
|
| Data | Versão | Descrição | Autor |
|
||||||
|
| :--- | :--- | :--- | :--- |
|
||||||
|
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
|
||||||
|
|
||||||
|
## 2. OBJETIVO
|
||||||
|
Padronizar a criação de credenciais, rotação de senhas e a concessão de privilégios mínimos (Least Privilege) em bancos de dados.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. POSTGRESQL
|
||||||
|
|
||||||
|
Acesse como admin: `sudo -u postgres psql`
|
||||||
|
|
||||||
|
### Criar Usuário (Role)
|
||||||
|
```sql
|
||||||
|
-- Criar usuario com senha
|
||||||
|
CREATE USER app_user WITH PASSWORD 'SenhaForte123';
|
||||||
|
|
||||||
|
-- Criar um banco para ele
|
||||||
|
CREATE DATABASE app_db OWNER app_user;
|
||||||
|
```
|
||||||
|
|
||||||
|
### Permissões (Grant)
|
||||||
|
```sql
|
||||||
|
-- Conectar no banco especifico
|
||||||
|
\c app_db
|
||||||
|
|
||||||
|
-- Dar acesso a todas as tabelas (SCHEMA public)
|
||||||
|
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO app_user;
|
||||||
|
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO app_user;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. MYSQL / MARIADB
|
||||||
|
|
||||||
|
Acesse como admin: `mysql -u root -p`
|
||||||
|
|
||||||
|
### Criar Usuário (Definindo Origem)
|
||||||
|
No MySQL, o usuário é atrelado ao IP de origem (`@'%'` = qualquer lugar, `@'localhost'` = local).
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE USER 'app_user'@'%' IDENTIFIED BY 'SenhaForte123';
|
||||||
|
```
|
||||||
|
|
||||||
|
### Permissões (Grant)
|
||||||
|
```sql
|
||||||
|
-- Dar acesso total a UM banco especifico
|
||||||
|
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'%';
|
||||||
|
|
||||||
|
-- Aplicar mudancas
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. REDIS
|
||||||
|
|
||||||
|
### Redis Antigo ( < 6.0 )
|
||||||
|
Só existe UMA senha global definida no `redis.conf` (`requirepass`). Não há usuários.
|
||||||
|
|
||||||
|
### Redis Moderno (ACLs - Access Control Lists)
|
||||||
|
Acesse: `redis-cli` (com a senha de admin/default).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Criar usuario 'app_user'
|
||||||
|
# on > Habilitado
|
||||||
|
# >Senha... > Define senha
|
||||||
|
# ~app:* > Só acessa chaves que comessem com 'app:'
|
||||||
|
# +@all > Pode rodar todos os comandos (Cuidado!)
|
||||||
|
|
||||||
|
ACL SETUSER app_user on >SenhaForte123 ~app:* +get +set
|
||||||
|
```
|
||||||
|
|
||||||
|
### Verificar Permissões
|
||||||
|
```bash
|
||||||
|
ACL LIST
|
||||||
|
ACL WHOAMI
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. VALIDAÇÃO FINAL
|
||||||
|
- [ ] O usuário consegue logar remotamente?
|
||||||
|
- [ ] O usuário consegue escrever na tabela/chave permitida?
|
||||||
|
- [ ] O usuário é BLOQUEADO ao tentar acessar outro banco/tabela (Teste de negação)?
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,80 @@
|
||||||
|
# MANUAL TÉCNICO - INSTALAÇÃO E CONFIGURAÇÃO BASE DE BANCOS DE DADOS
|
||||||
|
|
||||||
|
**Código:** ITGINF 0020/26 | **Classificação:** RESTRITO
|
||||||
|
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
|
||||||
|
|
||||||
|
## 1. HISTÓRICO DE REVISÃO
|
||||||
|
|
||||||
|
| Data | Versão | Descrição | Autor |
|
||||||
|
| :--- | :--- | :--- | :--- |
|
||||||
|
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
|
||||||
|
|
||||||
|
## 2. OBJETIVO
|
||||||
|
Padronizar a instalação, caminhos de configuração e liberação de acesso externo para PostgreSQL, MySQL e Redis em servidores Linux.
|
||||||
|
|
||||||
|
## 3. PRÉ-REQUISITOS
|
||||||
|
* [ ] Servidor Linux (Debian/RHEL) atualizado.
|
||||||
|
* [ ] Acesso root/sudo.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. POSTGRESQL
|
||||||
|
|
||||||
|
**Instalação:**
|
||||||
|
* **Debian/Ubuntu:** `sudo apt install postgresql postgresql-contrib`
|
||||||
|
* **RHEL/CentOS:** `sudo dnf install postgresql-server postgresql-contrib && sudo postgresql-setup --initdb`
|
||||||
|
|
||||||
|
**Arquivos de Configuração (Padrão Debian):**
|
||||||
|
* **Principal:** `/etc/postgresql/14/main/postgresql.conf` (Versão varia).
|
||||||
|
* **Acesso (Quem conecta):** `/etc/postgresql/14/main/pg_hba.conf`
|
||||||
|
|
||||||
|
**Liberar Acesso Externo:**
|
||||||
|
1. No `postgresql.conf`, mude `listen_addresses = 'localhost'` para `listen_addresses = '*'`.
|
||||||
|
2. No `pg_hba.conf`, adicione no final:
|
||||||
|
```
|
||||||
|
# TYPE DATABASE USER ADDRESS METHOD
|
||||||
|
host all all 0.0.0.0/0 scram-sha-256
|
||||||
|
```
|
||||||
|
3. Reinicie: `sudo systemctl restart postgresql`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. MYSQL / MARIADB
|
||||||
|
|
||||||
|
**Instalação:**
|
||||||
|
* **Debian/Ubuntu:** `sudo apt install mariadb-server` (ou `mysql-server`).
|
||||||
|
* **RHEL/CentOS:** `sudo dnf install mariadb-server`
|
||||||
|
|
||||||
|
**Arquivos de Configuração:**
|
||||||
|
* **Principal:** `/etc/mysql/mysql.conf.d/mysqld.cnf` (ou `/etc/my.cnf`).
|
||||||
|
|
||||||
|
**Liberar Acesso Externo:**
|
||||||
|
1. Edite o arquivo de config.
|
||||||
|
2. Localize `bind-address` e mude de `127.0.0.1` para `0.0.0.0`.
|
||||||
|
3. Reinicie: `sudo systemctl restart mariadb`.
|
||||||
|
|
||||||
|
**Secure Installation (Obrigatório):**
|
||||||
|
Rode `sudo mysql_secure_installation` logo após instalar para definir senha de root e remover usuários anônimos.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. REDIS
|
||||||
|
|
||||||
|
**Instalação:**
|
||||||
|
* **Todas as distros:** `sudo apt install redis-server` (ou `dnf install redis`).
|
||||||
|
|
||||||
|
**Arquivos de Configuração:**
|
||||||
|
* **Principal:** `/etc/redis/redis.conf`.
|
||||||
|
|
||||||
|
**Liberar Acesso Externo (CUIDADO):**
|
||||||
|
> ⚠️ **ALERTA:** O Redis não tem autenticação forte por padrão. NUNCA exponha para a internet.
|
||||||
|
|
||||||
|
1. Edite `/etc/redis/redis.conf`.
|
||||||
|
2. Mude `bind 127.0.0.1 ::1` para `bind 0.0.0.0`.
|
||||||
|
3. **OBRIGATÓRIO:** Defina uma senha na diretiva `requirepass SUA_SENHA_FORTE`.
|
||||||
|
4. Reinicie: `sudo systemctl restart redis`.
|
||||||
|
|
||||||
|
## 7. VALIDAÇÃO FINAL
|
||||||
|
- [ ] O serviço está rodando e habilitado no boot (`systemctl enable`)?
|
||||||
|
- [ ] O acesso externo funciona (se configurado)?
|
||||||
|
- [ ] (Redis) A senha foi configurada antes de abrir a rede?
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,92 @@
|
||||||
|
# MANUAL TÉCNICO - MANUTENÇÃO PREVENTIVA E LOGS DE BANCO
|
||||||
|
|
||||||
|
**Código:** ITGINF 0022/26 | **Classificação:** RESTRITO
|
||||||
|
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
|
||||||
|
|
||||||
|
## 1. HISTÓRICO DE REVISÃO
|
||||||
|
|
||||||
|
| Data | Versão | Descrição | Autor |
|
||||||
|
| :--- | :--- | :--- | :--- |
|
||||||
|
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
|
||||||
|
|
||||||
|
## 2. OBJETIVO
|
||||||
|
Descrever as rotinas de limpeza de espaço (Vacuum/Optimize), desfragmentação e verificação de logs para evitar paradas por disco cheio ou corrupção.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. POSTGRESQL (VACUUM)
|
||||||
|
|
||||||
|
O Postgres usa MVCC, gerando "tuplas mortas" quando dados são deletados/alterados.
|
||||||
|
|
||||||
|
### Manutenção Automática (Autovacuum)
|
||||||
|
Geralmente já vem ativo. Verifique:
|
||||||
|
```sql
|
||||||
|
SHOW autovacuum; -- Deve ser 'on'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Manutenção Manual (Recuperar Espaço)
|
||||||
|
Se o banco inchou muito após um DELETÃO em massa.
|
||||||
|
1. Acesse o `psql`.
|
||||||
|
2. Rode em horário de baixo pico (Pode travar mesas se usar FULL):
|
||||||
|
```sql
|
||||||
|
-- Limpa e otimiza estatisticas (Rapido)
|
||||||
|
VACUUM ANALYZE;
|
||||||
|
|
||||||
|
-- (PERIGOSO) Recria o arquivo do disco para liberar espaço físico. Bloqueia escrita!
|
||||||
|
VACUUM FULL;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. MYSQL / MARIADB (OPTIMIZE)
|
||||||
|
|
||||||
|
Tabelas InnoDB podem ficar fragmentadas.
|
||||||
|
|
||||||
|
### Otimizar Tabelas
|
||||||
|
```sql
|
||||||
|
-- Reconstrói a tabela e indices (Bloqueia a tabela durante a execução!)
|
||||||
|
OPTIMIZE TABLE nome_da_tabela;
|
||||||
|
```
|
||||||
|
|
||||||
|
### Logs Binários (Binlog)
|
||||||
|
Cuidado: Eles podem encher o disco.
|
||||||
|
1. Verifique a expiração no `my.cnf`:
|
||||||
|
```ini
|
||||||
|
binlog_expire_logs_seconds = 604800 # 7 Dias
|
||||||
|
```
|
||||||
|
2. Limpar manualmente (PURGE):
|
||||||
|
```sql
|
||||||
|
PURGE BINARY LOGS BEFORE '2023-10-01 00:00:00';
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. REDIS (Memory Defrag)
|
||||||
|
|
||||||
|
O Redis pode alocar memória fragmentada.
|
||||||
|
|
||||||
|
1. Verifique a fragmentação: `INFO MEMORY`
|
||||||
|
* `mem_fragmentation_ratio > 1.5` indica fragmentação alta.
|
||||||
|
2. Ativar Desfragmentação Ativa (Config):
|
||||||
|
```bash
|
||||||
|
CONFIG SET activedefrag yes
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. ROTAÇÃO DE LOGS (Logrotate)
|
||||||
|
|
||||||
|
Garanta que os logs de erro (`/var/log/mysql`, `/var/log/postgresql`) não estão gigantes.
|
||||||
|
Verifique se existem arquivos em `/etc/logrotate.d/`:
|
||||||
|
* `mysql-server`
|
||||||
|
* `postgresql-common`
|
||||||
|
|
||||||
|
Force uma verificação se achar que não está rodando:
|
||||||
|
```bash
|
||||||
|
sudo logrotate -f /etc/logrotate.d/mysql-server
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7. VALIDAÇÃO FINAL
|
||||||
|
- [ ] PostgreSQL: `VACUUM` rodou sem erro?
|
||||||
|
- [ ] MySQL: Disco liberado após Purge de Binlogs?
|
||||||
|
- [ ] Logs antigos estão compactados (.gz)?
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,68 @@
|
||||||
|
# MANUAL TÉCNICO - ARQUITETURA DE PERSISTÊNCIA E TROUBLESHOOTING AVANÇADO
|
||||||
|
|
||||||
|
**Código:** ITGENG 0021/26 | **Classificação:** CONFIDENCIAL
|
||||||
|
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
|
||||||
|
|
||||||
|
## 1. HISTÓRICO DE REVISÃO
|
||||||
|
|
||||||
|
| Data | Versão | Descrição | Autor |
|
||||||
|
| :--- | :--- | :--- | :--- |
|
||||||
|
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
|
||||||
|
|
||||||
|
## 2. OBJETIVO
|
||||||
|
Definir políticas de persistência de dados (Trade-off Performance vs Segurança) e procedimentos de recuperação de desastres (Crash Recovery e OOM).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. ESTRATÉGIAS DE PERSISTÊNCIA REDIS
|
||||||
|
|
||||||
|
O Redis pode ser apenas Cache (volátil) ou Banco (persistente).
|
||||||
|
|
||||||
|
| Modo | Descrição | Prós | Contras |
|
||||||
|
| :--- | :--- | :--- | :--- |
|
||||||
|
| **RDB (Snapshot)** | Salva o banco a cada X minutos. | Rápido restore, arquivo compacto. | Perde os dados desde o último snap. |
|
||||||
|
| **AOF (Append Only)** | Salva cada comando escrito. | Perda mínima (1s), Seguro. | Arquivo cresce muito, restore lento. |
|
||||||
|
| **Híbrido** | RDB + AOF. | Segurança do AOF + Rapidez do RDB. | Mais I/O de disco. |
|
||||||
|
|
||||||
|
**Recomendação iT Guys:** Use **Híbrido** para bancos críticos e **Apenas RDB** para Cache.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. PERSISTÊNCIA SQL (WAL / BINLOG)
|
||||||
|
|
||||||
|
Se o servidor desligar da tomada, os dados no WAL/Binlog salvam o dia.
|
||||||
|
|
||||||
|
**PostgreSQL (WAL):**
|
||||||
|
* `fsync = on`: **OBRIGATÓRIO**. Garante que o dado foi pro disco físico. Desativar dá velocidade mas corrompe o banco em crash.
|
||||||
|
* `synchronous_commit`: Pode ser `off` se você aceita perder alguns milissegundos em troca de performance.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. CENÁRIOS DE CRASH E SOLUÇÕES
|
||||||
|
|
||||||
|
### Cenário 1: OOM Killer (Out Of Memory)
|
||||||
|
O Linux mata o banco porque acabou a RAM.
|
||||||
|
* **Sintoma:** Log do sistema diz `Killed process 1234 (postgres)`.
|
||||||
|
* **Correção Imediata:** Aumente o Swap ou reduza os Buffers do banco.
|
||||||
|
* **Prevenção:** Ajuste o `oom_score_adj` no Systemd para -1000 (Imune) - *Use com cautela extrema*.
|
||||||
|
|
||||||
|
### Cenário 2: Arquivo Corrompido (.pid lock)
|
||||||
|
Após um crash elétrico, o serviço não sobe dizendo que "já está rodando".
|
||||||
|
* **Solução:** Verifique se o processo existe (`ps aux`). Se não existir, delete o arquivo `postmaster.pid` (PG) ou `mysql.pid`.
|
||||||
|
|
||||||
|
### Cenário 3: Redis em modo Read-Only
|
||||||
|
O Redis parou de aceitar escrita.
|
||||||
|
* **Causa provável:** O disco encheu ou o RDB falhou (`stop-writes-on-bgsave-error yes`).
|
||||||
|
* **Solução:** Libere espaço em disco ou corrija a permissão da pasta de dados.
|
||||||
|
|
||||||
|
## 6. POLÍTICA DE DISASTER RECOVERY (DR)
|
||||||
|
|
||||||
|
Em caso de corrupção total:
|
||||||
|
1. Não tente consertar a produção corrompida.
|
||||||
|
2. Suba uma nova instância (VM limpa).
|
||||||
|
3. Importe o Último Dump/Backup (Nível 1).
|
||||||
|
4. Reaplique os logs de transação (Point-in-Time Recovery) se disponíveis (Requer setup prévio de Archiving).
|
||||||
|
|
||||||
|
## 7. VALIDAÇÃO FINAL
|
||||||
|
- [ ] A persistência (fsync/AOF) está ativa conforme a criticidade?
|
||||||
|
- [ ] O servidor tem Swap configurado para segurar picos antes do OOM?
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,82 @@
|
||||||
|
# MANUAL TÉCNICO - TUNING E PERFORMANCE DE BANCOS DE DADOS
|
||||||
|
|
||||||
|
**Código:** ITGENG 0020/26 | **Classificação:** CONFIDENCIAL
|
||||||
|
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
|
||||||
|
|
||||||
|
## 1. HISTÓRICO DE REVISÃO
|
||||||
|
|
||||||
|
| Data | Versão | Descrição | Autor |
|
||||||
|
| :--- | :--- | :--- | :--- |
|
||||||
|
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
|
||||||
|
|
||||||
|
## 2. OBJETIVO
|
||||||
|
Guiar a identificação de gargalos (Slow Queries) e aplicar otimizações seguras (Universais) e agressivas (Tailored) para PostgreSQL, MySQL e Redis.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. PREPARAÇÃO PROATIVA (MONITORAMENTO)
|
||||||
|
|
||||||
|
Não espere o problema acontecer. Ative isso AGORA.
|
||||||
|
|
||||||
|
1. **MySQL Slow Query Log:**
|
||||||
|
* No `my.cnf`: `slow_query_log = 1`, `long_query_time = 2` (segundos).
|
||||||
|
2. **Postgres pg_stat_statements:**
|
||||||
|
* Instale a extensão: `CREATE EXTENSION pg_stat_statements;`
|
||||||
|
* Veja as queries mais lentas: `SELECT * FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 5;`
|
||||||
|
3. **Redis Latency Monitor:**
|
||||||
|
* Config: `CONFIG SET latency-monitor-threshold 100` (ms).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. OTIMIZAÇÕES UNIVERSAIS (SEGURO PARA TODOS)
|
||||||
|
|
||||||
|
Alterações de Sistema Operacional (Linux) que beneficiam qualquer DB.
|
||||||
|
|
||||||
|
### 1. Swappiness (Evitar Swap)
|
||||||
|
Bancos de dados odeiam Swap. O padrão do Linux (60) é ruim.
|
||||||
|
* **Ação:** Mude para 1 ou 10.
|
||||||
|
* Arquivo `/etc/sysctl.conf`:
|
||||||
|
```ini
|
||||||
|
vm.swappiness = 10
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Transparent Huge Pages (THP) - DESATIVAR
|
||||||
|
O THP causa picos de lag no Redis e MongoDB.
|
||||||
|
* **Ação:** Desative no boot (varie conforme distro, geralmente via GRUB ou Systemd service).
|
||||||
|
* Verifique: `cat /sys/kernel/mm/transparent_hugepage/enabled` (Deve estar `[never]`).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. TUNING TAILORED (CENÁRIOS ESPECÍFICOS)
|
||||||
|
|
||||||
|
### Cenário A: Hardware com MUITA RAM (Cache Heavy)
|
||||||
|
O objetivo é manter o [Working Set] na RAM.
|
||||||
|
|
||||||
|
* **Postgres (`shared_buffers`):** Defina como 25% a 40% da RAM Total.
|
||||||
|
* **MySQL (`innodb_buffer_pool_size`):** Defina como 70-80% da RAM Total (Se o servidor for dedicado apenas ao DB).
|
||||||
|
|
||||||
|
### Cenário B: Aplicação Write-Heavy (Muita Escrita)
|
||||||
|
O gargalo é o disco (I/O).
|
||||||
|
|
||||||
|
* **Postgres:** Aumente `max_wal_size` (ex: 4GB) para reduzir checkpoints frequentes.
|
||||||
|
* **Redis:** Evite `AOF everysec` se puder tolerar perda de 1s. Use persistência mista (RDB + AOF).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. DIAGNÓSTICO DE QUERIES (EXPLAIN)
|
||||||
|
|
||||||
|
O desenvolvedor diz que "o banco está lento". Prove que é a query.
|
||||||
|
|
||||||
|
1. Pegue a query lenta no log.
|
||||||
|
2. Rode com `EXPLAIN` (MySQL) ou `EXPLAIN ANALYZE` (Postgres).
|
||||||
|
```sql
|
||||||
|
EXPLAIN ANALYZE SELECT * FROM pedidos WHERE data < '2023-01-01';
|
||||||
|
```
|
||||||
|
3. **Analise:**
|
||||||
|
* **Seq Scan:** Leu a tabela inteira do inicio ao fim. **RUIM**. Falta índice.
|
||||||
|
* **Index Scan:** Usou o índice. **BOM**.
|
||||||
|
|
||||||
|
## 7. VALIDAÇÃO FINAL
|
||||||
|
- [ ] O Swappiness está baixo (1-10)?
|
||||||
|
- [ ] Slow Query Log está capturando consultas lentas?
|
||||||
|
- [ ] Índices foram criados para eliminar "Seq Scans" críticos?
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -1,3 +0,0 @@
|
||||||
# Documentação Mysql
|
|
||||||
|
|
||||||
Local para manuais e procedimentos referentes ao **Mysql**.
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# Documentação Postgresql
|
|
||||||
|
|
||||||
Local para manuais e procedimentos referentes ao **Postgresql**.
|
|
||||||
Loading…
Reference in New Issue