postgres — servidor de base de datos de PostgreSQL
postgres [option...]
postgres es el
servidor de base de datos de PostgreSQL. Para
que una aplicación cliente acceda a una base de datos, debe conectarse (a través de la
red o localmente) a una instancia de postgres en ejecución.
La instancia de postgres inicia entonces un proceso de servidor
independiente para gestionar la conexión.
Una instancia de postgres siempre gestiona los datos de
exactamente un clúster de bases de datos. Un clúster de bases de datos es una colección
de bases de datos que se almacena en una ubicación común del sistema de archivos (el
“área de datos”). Se puede ejecutar más de una
instancia de postgres en un sistema al mismo
tiempo, siempre y cuando utilicen diferentes áreas de datos y diferentes
puertos de comunicación (véase más abajo). Cuando
postgres se inicia, necesita saber la ubicación
del área de datos. La ubicación debe especificarse mediante la
opción -D o la variable de entorno PGDATA;
no hay un valor predeterminado. Típicamente, -D o
PGDATA apuntan directamente al directorio del área de datos
creado por initdb. Otros diseños de archivos posibles se
discuten en Section 19.2.
Por defecto, postgres se inicia en
primer plano e imprime los mensajes de registro en el flujo de error estándar. En
aplicaciones prácticas, postgres
debería iniciarse como un proceso en segundo plano, quizás durante el arranque del sistema.
El comando postgres también se puede invocar en
modo monousuario (single-user mode). El uso principal de este modo es durante
la inicialización por parte de initdb. A veces se utiliza
para la depuración o la recuperación ante desastres; ten en cuenta que ejecutar un
servidor en modo monousuario no es realmente adecuado para depurar el servidor, ya que no
habrá comunicación entre procesos ni bloqueo realistas.
Cuando se invoca en modo monousuario
desde la consola (shell), el usuario puede introducir consultas y los resultados
se imprimirán en la pantalla, pero en un formato que es más útil
para los desarrolladores que para los usuarios finales. En el modo monousuario,
el usuario de la sesión se establecerá como el usuario con ID 1, y se conceden
poderes implícitos de superusuario a este usuario.
Este usuario no tiene que existir realmente, por lo que el modo monousuario
se puede utilizar para recuperarse manualmente de ciertos
tipos de daños accidentales en los catálogos del sistema.
postgres acepta los siguientes argumentos de línea de
comandos. Para una discusión detallada de las opciones, consulta Chapter 19. Puedes ahorrarte escribir la mayoría de estas
opciones configurando un archivo de configuración. Algunas opciones (seguras)
también se pueden establecer desde el cliente que se conecta de una manera
dependiente de la aplicación para que se apliquen únicamente a esa sesión. Por
ejemplo, si la variable de entorno PGOPTIONS está
establecida, los clientes basados en libpq pasarán esa
cadena al servidor, el cual la interpretará como
opciones de línea de comandos de postgres.
-B nbuffersEstablece el número de búferes compartidos que utilizarán los procesos del servidor. El valor predeterminado de este parámetro se elige automáticamente por initdb. Especificar esta opción es equivalente a establecer el parámetro de configuración shared_buffers.
-c name=value
Establece un parámetro de configuración en tiempo de ejecución. Los parámetros de configuración
soportados por PostgreSQL se
describen en Chapter 19. La mayoría de las
demás opciones de línea de comandos son en realidad formas abreviadas de dicha
asignación de parámetros. -c puede aparecer varias veces
para establecer múltiples parámetros.
-C name
Muestra el valor del parámetro de tiempo de ejecución nombrado y termina.
(Consulta la opción -c anterior para más detalles). Esto
devuelve los valores de
postgresql.conf, modificados por cualquier parámetro
proporcionado en esta invocación. No refleja los parámetros
proporcionados cuando se inició el clúster.
Esto se puede usar en un servidor en ejecución para la mayoría de los parámetros. Sin embargo, el servidor debe estar detenido para algunos parámetros calculados en tiempo de ejecución (por ejemplo, shared_memory_size, shared_memory_size_in_huge_pages y wal_segment_size).
Esta opción está pensada para que otros programas que interactúan con una instancia del
servidor, como pg_ctl, consulten los valores de los parámetros
de configuración. Las aplicaciones destinadas al usuario deberían en su lugar utilizar SHOW o la vista pg_settings.
-d debug-level
Establece el nivel de depuración. Cuanto mayor sea este valor, más
salida de depuración se escribirá en el registro del servidor. Los valores van
del 1 al 5. También es posible pasar -d
0 para una sesión específica, lo que evitará que el
nivel de registro del servidor del proceso postgres padre se
propague a esta sesión.
-D datadirEspecifica la ubicación en el sistema de archivos de los archivos de configuración de la base de datos. Consulta Section 19.2 para más detalles.
-e
Establece el formato de fecha predeterminado en “European”, es decir, el
orden DMY de los campos de fecha de entrada. Esto también hace que
el día se imprima antes del mes en ciertos formatos de salida de fecha.
Consulta Section 8.5 para obtener más información.
-F
Desactiva las llamadas a fsync para mejorar el
rendimiento, a riesgo de corrupción de datos en caso de una
caída del sistema. Especificar esta opción es equivalente a
desactivar el parámetro de configuración fsync.
¡Lee la documentación detallada antes de usar esto!
-h hostname
Especifica el nombre de host IP o dirección en la que
postgres debe escuchar las conexiones
TCP/IP de las aplicaciones cliente. El valor también puede ser una
lista de direcciones separadas por comas, o * para especificar
que escuche en todas las interfaces disponibles. Un valor vacío
especifica no escuchar en ninguna dirección IP, en cuyo caso
solo se pueden utilizar sockets de dominio Unix para conectarse al
servidor. Por defecto, solo se escucha en
localhost.
Especificar esta opción es equivalente a establecer el parámetro de configuración listen_addresses.
-i
Permite que los clientes remotos se conecten a través de conexiones
TCP/IP (dominio de Internet). Sin esta opción, solo se aceptan
conexiones locales. Esta opción es equivalente a establecer
listen_addresses en * en
postgresql.conf o a través de -h.
Esta opción está obsoleta (deprecated) ya que no permite el acceso a la
funcionalidad completa de listen_addresses.
Normalmente es mejor configurar listen_addresses directamente.
-k directory
Especifica el directorio del socket de dominio Unix en el que
postgres debe escuchar las
conexiones de las aplicaciones cliente. El valor también puede ser una
lista de directorios separados por comas. Un valor vacío
especifica no escuchar en ningún socket de dominio Unix, en cuyo caso
solo se pueden usar sockets TCP/IP para conectarse al servidor.
El valor predeterminado es normalmente
/tmp, pero esto se puede cambiar en tiempo de compilación.
Especificar esta option es equivalente a establecer el parámetro de configuración unix_socket_directories.
-lHabilita las conexiones seguras utilizando SSL. PostgreSQL debe haber sido compilado con soporte para SSL para que esta opción esté disponible. Para obtener más información sobre el uso de SSL, consulta Section 18.9.
-N max-connectionsEstablece el número máximo de conexiones de clientes que este servidor aceptará. El valor predeterminado de este parámetro se elige automáticamente por initdb. Especificar esta opción es equivalente a establecer el parámetro de configuración max_connections.
-p port
Especifica el puerto TCP/IP o la extensión del archivo de socket de dominio Unix local en el que
postgres
debe escuchar las conexiones de las aplicaciones cliente.
El valor predeterminado es el valor de la variable de entorno PGPORT, o si
PGPORT no está establecida, el valor establecido durante la compilación
(normalmente 5432). Si especificas un puerto distinto del predeterminado,
todas las aplicaciones cliente deben especificar el mismo puerto utilizando
las opciones de línea de comandos o la variable PGPORT.
-sImprime información de tiempo y otras estadísticas al final de cada comando. Esto es útil para realizar pruebas de rendimiento (benchmarking) o para ajustar el número de búferes.
-S work-mem
Especifica la cantidad base de memoria que utilizarán los ordenamientos y
las tablas hash antes de recurrir a archivos temporales en el disco. Consulta la
descripción del parámetro de configuración work_mem en
Section 19.4.1.
-V--versionMuestra la versión de postgres y termina.
--name=value
Establece un parámetro de tiempo de ejecución nombrado; una forma abreviada de
-c.
--describe-config
Esta opción vuelca las variables de configuración interna del servidor,
sus descripciones y sus valores predeterminados en un formato de COPY delimitado por tabulaciones.
Está diseñado principalmente para ser utilizado por herramientas de administración.
-?--helpMuestra la ayuda sobre los argumentos de línea de comandos de postgres y termina.
Las opciones descritas aquí se utilizan principalmente con fines de depuración y, en algunos casos, para ayudar con la recuperación de bases de datos gravemente dañadas. No debería haber ninguna razón para utilizarlas en una configuración de base de datos de producción. Se enumeran aquí solo para el uso de los desarrolladores del sistema PostgreSQL. Además, estas opciones podrían cambiar o eliminarse en una versión futura sin previo aviso.
-f { s | i | o | b | t | n | m | h }
Prohíbe el uso de métodos particulares de escaneo y unión:
s e i
desactivan los escaneos secuenciales y de índice respectivamente,
o, b y t
desactivan los escaneos de solo índice, los escaneos de índice de mapa de bits y los escaneos TID
respectivamente, mientras que
n, m y h
desactivan las uniones de bucle anidado (nested-loop), de mezcla (merge) y hash respectivamente.
Ni los escaneos secuenciales ni las uniones de bucle anidado se pueden desactivar
por completo; las opciones -fs y
-fn simplemente desalientan al optimizador
de utilizar esos tipos de planes si tiene cualquier otra alternativa.
-O
Permite modificar la estructura de las tablas del sistema. Esto es
utilizado por initdb.
-PIgnora los índices del sistema al leer las tablas del sistema, pero sigue actualizando los índices al modificar las tablas. Esto es útil cuando se realiza una recuperación de índices del sistema dañados.
-t pa[rser] | pl[anner] | e[xecutor]
Imprime estadísticas de tiempo para cada consulta relacionadas con cada uno de los
principales módulos del sistema. Esta opción no se puede utilizar junto
con la opción -s.
-TEsta opción sirve para depurar problemas que provocan que un proceso del servidor muera de forma anormal. La estrategia ordinaria en esta situación es notificar a todos los demás procesos del servidor que deben terminar, enviándoles señales SIGQUIT. Con esta opción, se enviará SIGABRT en su lugar, lo que resultará en la generación de archivos core dump.
-v protocolEspecifica el número de versión del protocolo frontend/backend que se utilizará para una sesión en particular. Esta opción es solo para uso interno.
-W secondsSe produce un retraso de este número de segundos cuando se inicia un nuevo proceso de servidor, después de que este realiza el procedimiento de autenticación. Esto está pensado para dar la oportunidad de acoplar un depurador al proceso de servidor.
Las siguientes opciones solo se aplican al modo monousuario (véase Single-User Mode más abajo).
--singleSelecciona el modo monousuario. Este debe ser el primer argumento en la línea de comandos.
databaseEspecifica el nombre de la base de datos a la que se va a acceder. Este debe ser el último argumento en la línea de comandos. Si se omite, el valor predeterminado es el nombre del usuario.
-EMuestra todos los comandos en la salida estándar antes de ejecutarlos.
-jUtiliza un punto y coma seguido de dos saltos de línea, en lugar de un solo salto de línea, como terminador de entrada de comandos.
-r filename
Envía toda la salida del registro del servidor a filename. Esta opción solo se
respeta cuando se suministra como una opción de línea de comandos.
PGCLIENTENCODINGCodificación de caracteres predeterminada utilizada por los clientes. (Los clientes pueden anular esto individualmente). Este valor también se puede establecer en el archivo de configuración.
PGDATAUbicación predeterminada del directorio de datos
PGDATESTYLEValor predeterminado del parámetro de tiempo de ejecución DateStyle. (El uso de esta variable de entorno está obsoleto).
PGPORTNúmero de puerto predeterminado (preferiblemente configurado en el archivo de configuración)
Un mensaje de fallo que mencione semget o
shmget probablemente indica que necesitas configurar tu
núcleo (kernel) para proporcionar suficiente memoria compartida y semáforos. Para una
discusión más detallada, consulta Section 18.4. Es posible que puedas
posponer la reconfiguración de tu núcleo reduciendo shared_buffers para disminuir el consumo de memoria compartida
de PostgreSQL, y/o reduciendo
max_connections para reducir el consumo de semáforos.
Un mensaje de fallo que sugiera que ya se está ejecutando otro servidor debe comprobarse cuidadosamente, por ejemplo mediante el comando
$ps ax | grep postgres
o
$ps -ef | grep postgres
dependiendo de tu sistema. Si tienes la certeza de que no hay ningún servidor en conflicto ejecutándose, puedes eliminar el archivo de bloqueo (lock file) mencionado en el mensaje e intentarlo de nuevo.
Un mensaje de fallo que indique la imposibilidad de enlazarse a un puerto podría
indicar que ese puerto ya está en uso por algún proceso que no es de
PostgreSQL. También podrías
obtener este error si terminas postgres
e inmediatamente lo reinicias utilizando el mismo puerto; en este caso,
simplemente debes esperar unos segundos hasta que el sistema operativo cierre
el puerto antes de intentarlo de nuevo. Finalmente, podrías obtener este error si
especificas un número de puerto que tu sistema operativo considera que está
reservado. Por ejemplo, muchas versiones de Unix consideran que los números de puerto
inferiores a 1024 son “confiables” y solo permiten que el superusuario de
Unix acceda a ellos.
El comando de utilidad pg_ctl se puede utilizar para
iniciar y detener el servidor postgres
de forma segura y cómoda.
Si es posible, no utilices
SIGKILL para matar el servidor
postgres principal. Hacerlo evitará que
postgres libere los recursos del sistema
(por ejemplo, memoria compartida y semáforos) que posee antes de
terminar. Esto podría causar problemas para iniciar una nueva
ejecución de postgres.
Para terminar el servidor postgres normalmente, se
pueden utilizar las señales SIGTERM, SIGINT o
SIGQUIT. La primera esperará a que
todos los clientes terminen antes de salir, la segunda desconectará a todos los
clientes por la fuerza y la tercera saldrá inmediatamente sin un apagado
adecuado, lo que resultará en una ejecución de recuperación
durante el reinicio.
La señal SIGHUP volverá a cargar
los archivos de configuración del servidor. También es posible enviar
SIGHUP a un proceso de servidor individual, pero eso
no suele ser sensato.
Para cancelar una consulta en ejecución, envía la señal SIGINT
al proceso que ejecuta ese comando. Para terminar un proceso backend de forma
limpia, envía SIGTERM a ese proceso. Consulta
también pg_cancel_backend y pg_terminate_backend
en Section 9.28.2 para los equivalentes ejecutables en SQL
de estas dos acciones.
El servidor postgres utiliza SIGQUIT
para indicar a los procesos de servidor subordinados que terminen sin una limpieza normal.
Esta señal no debe ser utilizada por los usuarios. También
es imprudente enviar SIGKILL a un proceso de servidor
— el proceso principal postgres interpretará esto
como una caída y forzará a todos los procesos hermanos a
salir como parte de su procedimiento estándar de recuperación de caídas.
Las opciones -- no funcionarán en FreeBSD o OpenBSD.
Utiliza -c en su lugar. Este es un error en los sistemas operativos afectados; una
versión futura de PostgreSQL
proporcionará una solución alternativa si esto no se soluciona.
Para iniciar un servidor en modo monousuario, utiliza un comando como
postgres --single -D /usr/local/pgsql/data other-options my_database
Proporciona la ruta correcta al directorio de la base de datos con -D, o
asegúrate de que la variable de entorno PGDATA esté establecida.
Especifica también el nombre de la base de datos en particular en la que deseas trabajar.
Normalmente, el servidor en modo monousuario trata el salto de línea como el terminador de entrada de comandos; no hay inteligencia sobre los puntos y comas, como la hay en psql. Para continuar un comando en varias líneas, debes escribir una barra invertida (backslash) justo antes de cada salto de línea excepto el último. La barra invertida y el salto de línea adyacente se eliminan de la entrada del comando. Ten en cuenta que esto sucederá incluso cuando esté dentro de una cadena literal o un comentario.
Pero si utilizas el interruptor de línea de comandos -j, un único salto de línea
no termina la entrada del comando; en su lugar, lo hace la secuencia
punto y coma-salto de línea-salto de línea. Es decir, escribe un punto y coma inmediatamente
seguido de una línea completamente vacía. La barra invertida-salto de línea no se
trata de forma especial en este modo. De nuevo, no hay inteligencia sobre
el hecho de que dicha secuencia aparezca dentro de una cadena literal o comentario.
En cualquier modo de entrada, si escribes un punto y coma que no esté justo antes o que no forme parte de un terminador de entrada de comandos, se considera un separador de comandos. Cuando escribas un terminador de entrada de comandos, las múltiples sentencias que hayas introducido se ejecutarán como una única transacción.
Para salir de la sesión, escribe EOF (Control+D, por lo general). Si has introducido algún texto desde el último terminador de entrada de comandos, entonces EOF se tomará como un terminador de entrada de comandos, y se necesitará otro EOF para salir.
Ten en cuenta que el servidor en modo monousuario no proporciona características sofisticadas de edición de líneas (no hay historial de comandos, por ejemplo). El modo monousuario tampoco realiza ningún procesamiento en segundo plano, como puntos de control (checkpoints) automáticos o replicación.
Para iniciar postgres en segundo plano
utilizando los valores predeterminados, ejecuta:
$nohup postgres >logfile 2>&1 </dev/null &
Para iniciar postgres con un puerto
específico, por ejemplo, 1234:
$postgres -p 1234
Para conectarse a este servidor utilizando psql, especifica este puerto con la opción -p:
$psql -p 1234
o establece la variable de entorno PGPORT:
$export PGPORT=1234$psql
Los parámetros de tiempo de ejecución con nombre se pueden establecer en cualquiera de estos estilos:
$postgres -c work_mem=1234$postgres --work-mem=1234
Cualquiera de las dos formas anula cualquier configuración que pueda existir para
work_mem en postgresql.conf. Observa que
los guiones bajos en los nombres de los parámetros se pueden escribir como guion bajo
o guion en la línea de comandos. Excepto para experimentos a corto plazo,
es probablemente mejor práctica editar la configuración en
postgresql.conf que confiar en un interruptor de línea de comandos
para establecer un parámetro.