Salta el contingut

Arxius de configuració

Introducció

Cada motor de bases de dades gestiona la seva configuració a través d'un conjunt de fitxers de text estructurats. Conèixer la ubicació i el propòsit de cadascun és fonamental per a qualsevol DBA, ja que la majoria d'incidències en producció es resolen editant aquests fitxers.

Edició d'arxius de configuració

Feu sempre una còpia de seguretat del fitxer original abans d'editar-lo:

cp postgresql.conf postgresql.conf.bak.$(date +%Y%m%d_%H%M%S)
Un error de sintaxi en el fitxer de configuració pot impedir que el SGBD arrenqui.


Arxius principals per motor

PostgreSQL utilitza tres fitxers de configuració principals:

Fitxer Propòsit
postgresql.conf Paràmetres generals del servidor
pg_hba.conf Autenticació de clients (Host-Based Authentication)
pg_ident.conf Mapatge d'identitats de sistema operatiu a rols PostgreSQL

Ubicacions habituals:

# Instal·lació via apt (Ubuntu/Debian)
/etc/postgresql/16/main/postgresql.conf
/etc/postgresql/16/main/pg_hba.conf
/etc/postgresql/16/main/pg_ident.conf

# Instal·lació Docker (per defecte PGDATA)
/var/lib/postgresql/data/postgresql.conf
/var/lib/postgresql/data/pg_hba.conf
/var/lib/postgresql/data/pg_ident.conf

Per trobar la ubicació des de psql:

SHOW config_file;
SHOW hba_file;
SHOW ident_file;
SHOW data_directory;

MySQL/MariaDB llegeix la configuració d'un conjunt de fitxers en ordre de precedència:

Prioritat Fitxer SO
1 /etc/my.cnf Linux (global)
2 /etc/mysql/my.cnf Linux (Debian/Ubuntu)
3 /etc/mysql/conf.d/*.cnf Linux (Debian, fragments)
4 /etc/mysql/mysql.conf.d/*.cnf Linux (Ubuntu, fragments)
5 ~/.my.cnf Linux (usuari)
6 C:\ProgramData\MySQL\my.ini Windows

Comprovar quins fitxers es llegeixen:

mysqld --verbose --help 2>/dev/null | grep -A 1 "Default options"

SQL Server no usa fitxers .conf tradicionals a Windows; la configuració rau al registre. A Linux:

Fitxer / Eina Ubicació Notes
mssql.conf /var/opt/mssql/mssql.conf Linux: paràmetres de servidor
SQL Server Configuration Manager Eina GUI Windows Serveis, protocols, ports
sp_configure Procediment emmagatzemat SQL Paràmetres en temps d'execució
Registre Windows HKLM\SOFTWARE\Microsoft\MSSQLServer Windows: configuració avançada

Per veure la configuració actual a Linux:

cat /var/opt/mssql/mssql.conf
# o
/opt/mssql/bin/mssql-conf get

Oracle pot usar dos tipus de fitxer de paràmetres:

Fitxer Tipus Notes
init<SID>.ora PFILE (text) Llegible/editable directament
spfile<SID>.ora SPFILE (binari) Gestionat per Oracle, canvis via ALTER SYSTEM
listener.ora Text Configuració del listener de xarxa
tnsnames.ora Text Noms de servei i adreces de connexió
sqlnet.ora Text Paràmetres de xarxa SQLNet

Ubicació habitual:

$ORACLE_HOME/dbs/init<SID>.ora          # PFILE
$ORACLE_HOME/dbs/spfile<SID>.ora        # SPFILE
$ORACLE_HOME/network/admin/listener.ora
$ORACLE_HOME/network/admin/tnsnames.ora


Paràmetres més importants

postgresql.conf — Paràmetres clau

# ===== CONNEXIONS =====
listen_addresses = 'localhost'      # '*' per escoltar a totes les interfícies
port = 5432
max_connections = 100

# ===== MEMÒRIA =====
shared_buffers = 256MB              # 25% de la RAM total
work_mem = 4MB                      # Per connexió, per operació
maintenance_work_mem = 64MB
effective_cache_size = 768MB        # Estimació de RAM del SO per a caché

# ===== WAL (Write-Ahead Log) =====
wal_level = replica                 # minimal | replica | logical
max_wal_size = 1GB
min_wal_size = 80MB
checkpoint_completion_target = 0.9

# ===== LOGS =====
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 100MB
log_min_duration_statement = 1000   # Registra consultes > 1 segon (ms)
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
log_connections = off
log_disconnections = off
log_lock_waits = on

# ===== RENDIMENT =====
random_page_cost = 1.1              # Per a SSDs (4.0 per a HDD)
effective_io_concurrency = 200      # Per a SSDs
default_statistics_target = 100

# ===== AUTOVACUUM =====
autovacuum = on
autovacuum_max_workers = 3
autovacuum_naptime = 1min

pg_hba.conf — Autenticació de clients

El fitxer pg_hba.conf controla qui es pot connectar, des d'on i amb quin mètode d'autenticació:

# Tipus   Base de dades  Usuari    Adreça              Mètode
# ---------------------------------------------------------------
# Connexions locals via socket Unix
local     all            postgres                       peer
local     all            all                            scram-sha-256

# Connexions locals via TCP/IP
host      all            all        127.0.0.1/32        scram-sha-256
host      all            all        ::1/128             scram-sha-256

# Accés des de la xarxa local (exemple: 192.168.1.0/24)
host      empresa        app_user   192.168.1.0/24      scram-sha-256

# Replicació
local     replication    postgres                       peer
host      replication    replica    192.168.1.10/32     scram-sha-256

Mètodes d'autenticació a pg_hba.conf

  • trust — Accés sense contrasenya (PERILLÓS en xarxa)
  • reject — Denegació sempre
  • peer — Verificació per nom d'usuari del SO (només connexions locals)
  • scram-sha-256 — Autenticació per contrasenya xifrada (recomanat)
  • md5 — Autenticació per contrasenya (llegat, menys segur)
  • ldap — Autenticació via servidor LDAP

my.cnf — Seccions principals de MySQL

[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
# Configuració bàsica
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
tmpdir          = /tmp
port            = 3306
bind-address    = 127.0.0.1         # '0.0.0.0' per a accés extern

# Codificació
character-set-server  = utf8mb4
collation-server      = utf8mb4_unicode_ci

# InnoDB
innodb_buffer_pool_size   = 1G
innodb_buffer_pool_instances = 2
innodb_log_file_size      = 256M
innodb_flush_log_at_trx_commit = 1  # 1=màxima durabilitat, 2=rendiment
innodb_flush_method       = O_DIRECT

# Connexions
max_connections           = 200
wait_timeout              = 600
interactive_timeout       = 600

# Logs
general_log               = 0
general_log_file          = /var/log/mysql/mysql.log
slow_query_log            = 1
slow_query_log_file       = /var/log/mysql/mysql-slow.log
long_query_time           = 2       # Consultes > 2 segons
log_error                 = /var/log/mysql/error.log

# Seguretat
local-infile              = 0       # Desactivar LOAD DATA LOCAL INFILE

mssql.conf — SQL Server a Linux

[EULA]
accepteula = Y

[sqlagent]
enabled = true

[network]
tlscert = /etc/ssl/certs/mssql.pem
tlskey = /etc/ssl/private/mssql.key
tlsprotocols = 1.2
forceencryption = 0

[memory]
memorylimitmb = 3072           # Límit de memòria en MB per a SQL Server

[filelocation]
defaultdatadir = /var/opt/mssql/data/
defaultlogdir  = /var/opt/mssql/data/
defaultbackupdir = /var/opt/mssql/backup/

[telemetry]
customerfeedback = false

[hadr]
hadrenabled = 0

Canviar paràmetres via mssql-conf:

sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb 3072
sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true
sudo systemctl restart mssql-server

init.ora / SPFILE — Oracle

-- Veure tots els paràmetres actuals
SELECT name, value, description, isdefault
FROM v$parameter
ORDER BY name;

-- Veure paràmetres no-defaults
SELECT name, value
FROM v$parameter
WHERE isdefault = 'FALSE'
ORDER BY name;

-- Modificar un paràmetre en el SPFILE (persistent, requereix reinici)
ALTER SYSTEM SET db_cache_size = 500M SCOPE = SPFILE;

-- Modificar un paràmetre en memòria (efectiu ara, no persistent)
ALTER SYSTEM SET log_archive_dest_1 = 'LOCATION=/opt/oracle/archive' SCOPE = MEMORY;

-- Modificar un paràmetre a ambdós (SPFILE + memòria activa, si el paràmetre ho permet)
ALTER SYSTEM SET pga_aggregate_target = 400M SCOPE = BOTH;

-- Crear un PFILE a partir del SPFILE actual (per a edició manual)
CREATE PFILE = '/tmp/init_backup.ora' FROM SPFILE;

Ubicació dels arxius de log

# Ubicació dels logs (si logging_collector = on)
# Variable log_directory relativa a data_directory
/var/lib/postgresql/data/log/

# Des de psql
SHOW log_directory;
SHOW log_filename;

# Veure els últims errors des del contenidor
docker logs postgres16 --tail 50

# O directament al fitxer
tail -f /var/lib/postgresql/data/log/postgresql-$(date +%Y-%m-%d)*.log
# Log d'errors (el més important)
/var/log/mysql/error.log

# Log de consultes lentes
/var/log/mysql/mysql-slow.log

# Log binari (per a replicació i PITR)
/var/lib/mysql/mysql-bin.000001
/var/lib/mysql/mysql-bin.index

# Des de MySQL
SHOW VARIABLES LIKE '%log%';
SHOW VARIABLES LIKE 'log_error';

# Veure des del contenidor Docker
docker logs mysql8 --tail 50
# Logs de SQL Server a Linux
/var/opt/mssql/log/errorlog         # Log principal d'errors
/var/opt/mssql/log/errorlog.1       # Log anterior
/var/opt/mssql/log/sqlagent.out     # Log de l'agent SQL

# Des de SQL (T-SQL)
EXEC xp_readerrorlog 0, 1, NULL, NULL, NULL, NULL, 'DESC';
GO

# O via Dynamic Management View
SELECT log_date, process_info, text
FROM sys.dm_os_ring_buffers
WHERE ring_buffer_type = N'RING_BUFFER_EXCEPTION'
ORDER BY log_date DESC;
GO
# Alert log — el log principal de diagnòstic d'Oracle
$ORACLE_BASE/diag/rdbms/<db_name>/<instance_name>/trace/alert_<SID>.log

# Traces de sessió
$ORACLE_BASE/diag/rdbms/<db_name>/<instance_name>/trace/

# ADR (Automatic Diagnostic Repository) — Oracle 11g+
ADRCI> show alert         # Veure alert log via adrci
-- Des de SQL*Plus, localitzar l'alert log
SELECT value FROM v$parameter WHERE name = 'background_dump_dest';

-- Via V$DIAG_INFO (Oracle 11g+)
SELECT name, value FROM v$diag_info;

Recàrrega de configuració sense reinici

Alguns paràmetres es poden aplicar sense aturar el servei. Altres requereixen un reinici complet.

-- Des de psql: recarregar pg_hba.conf i paràmetres "reload-safe"
SELECT pg_reload_conf();

-- Comprovar quins paràmetres requereixen reinici
SELECT name, setting, pending_restart, context
FROM pg_settings
WHERE pending_restart = true
   OR context IN ('postmaster', 'sighup');

-- Paràmetres que requereixen reinici (context = 'postmaster'):
-- max_connections, shared_buffers, port, listen_addresses...

-- Paràmetres que NO requereixen reinici (context = 'sighup'):
-- log_min_duration_statement, work_mem, autovacuum_*...
# Des del sistema operatiu
sudo systemctl reload postgresql
# o
sudo pg_ctlcluster 16 main reload
# o des del contenidor Docker
docker exec postgres16 pg_ctl reload -D /var/lib/postgresql/data
-- Canvis en temps d'execució (sense reinici, no persistents)
SET GLOBAL max_connections = 200;
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1;

-- Recarregar taules de privilegis
FLUSH PRIVILEGES;

-- Recarregar les taules de logs
FLUSH LOGS;

-- Comprovar si un paràmetre és canviable en temps d'execució
SHOW VARIABLES LIKE 'max_connections';

-- Veure si el canvi ha tingut efecte
SELECT @@GLOBAL.max_connections;
# Per aplicar canvis del my.cnf requereix reinici del servei
sudo systemctl restart mysql
-- Molts paràmetres s'apliquen immediatament amb RECONFIGURE
EXEC sp_configure 'max degree of parallelism', 4;
RECONFIGURE;
GO

-- Alguns requereixen RECONFIGURE WITH OVERRIDE (canvis que pot ser perillosos)
EXEC sp_configure 'allow updates', 0;
RECONFIGURE WITH OVERRIDE;
GO

-- Comprovar si un paràmetre requereix reinici
SELECT name, value, value_in_use, is_dynamic
FROM sys.configurations
WHERE is_dynamic = 0;  -- is_dynamic = 0 => requereix reinici
GO
# Reinici a Linux
sudo systemctl restart mssql-server
-- Paràmetres dinàmics: canvi immediate (SCOPE = MEMORY)
ALTER SYSTEM SET log_archive_max_processes = 4 SCOPE = MEMORY;

-- Paràmetres estàtics: cal reinici (SCOPE = SPFILE)
ALTER SYSTEM SET db_block_size = 8192 SCOPE = SPFILE;
-- (db_block_size no es pot canviar realment sense recrear la BD)

-- Comprovar si un paràmetre és modificable dinàmicament
SELECT name, issys_modifiable, isinstance_modifiable
FROM v$parameter
WHERE name = 'log_archive_max_processes';
-- ISSYS_MODIFIABLE: IMMEDIATE (sense reinici) | DEFERRED (propera sessió) | FALSE (reinici)

-- Reinici del servei Oracle
-- SHUTDOWN IMMEDIATE;
-- STARTUP;

Miniactivitat — AC0108

Exploració dels arxius de configuració

  1. Entreu al contenidor Docker de PostgreSQL i localitzeu el fitxer postgresql.conf amb la comanda SHOW config_file; des de psql.
  2. Editeu el fitxer postgresql.conf i canvieu log_min_duration_statement a 500 (ms). Recarregueu la configuració amb SELECT pg_reload_conf(); i verifiqueu que el canvi s'ha aplicat amb SHOW log_min_duration_statement;.
  3. Localitzeu el fitxer pg_hba.conf i observeu les seves entrades. Afegiu una línia per permetre connexions des de la xarxa 172.17.0.0/16 (xarxa Docker per defecte) amb autenticació scram-sha-256. Recarregueu la configuració.
  4. Per a MySQL: entreu al contenidor, localitzeu el my.cnf i comproveu el valor de innodb_buffer_pool_size. Canvieu-lo a un valor diferent via SET GLOBAL i verifiqueu el canvi.
  5. Responeu: Quin és el risc de posar trust com a mètode al pg_hba.conf per a connexions de xarxa?

Entrega: captures dels passos 2, 3 i 4, i resposta a la pregunta 5.