Prácticas de Administración de PostgreSQL Boletín 02 - Enunciados Objetivos: o Estructura física de PostgreSQL 1. Conectarse con la base de datos del profesor usando psql y ver los procesos en el servidor que tienen que ver con “postgres” y “postmaster”. Intentar identificar cada uno. $ ps –ef | grep postmaster $ ps –ef | grep postgres: postgres 973 1 postgres postgres postgres postgres postgres postgres 975 976 977 1214 1216 1220 973 973 976 973 973 973 0 01:45 ? 00:00:00 /home/postgres/pgsql/bin/postmaster 0 0 0 0 0 0 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 01:45 01:45 01:45 06:07 06:08 06:09 ? ? ? ? ? ? postgres: postgres: postgres: postgres: postgres: postgres: writer process stats buffer process stats collector process postgres postgres [local] idle curso postgres [local] idle curso template1 [local] idle 2. Además de las conexiones anteriores, vamos a conectarnos desde el pgadmin y hacemos lo mismo. $ ps –ef | grep postmaster $ ps –ef | grep postgres: postgres 973 1 postgres postgres postgres postgres postgres postgres postgres 975 976 977 1214 1216 1220 1223 973 973 976 973 973 973 973 0 01:45 ? 00:00:00 /home/postgres/pgsql/bin/postmaster 0 0 0 0 0 0 0 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 01:45 01:45 01:45 06:07 06:08 06:09 06:12 ? ? ? ? ? ? ? postgres: postgres: postgres: postgres: postgres: postgres: postgres: writer process stats buffer process stats collector process postgres postgres [local] idle curso postgres [local] idle curso template1 [local] idle curso postgres 192.168.159.1(1642) idle 3. Cuando hay conexiones TCP/IP, se crea un socket, comprobar que existe dicho socket y ver su contenido. ¿qué indica su contenido?. $ find / -name .s.PGSQL* supongamos que devuelve "/tmp" $ cd /tmp $ ls .s.PGSQL* drwxrwxrwt drwxr-xr-x -rw-r--r-srwxrwxrwx -rw------- 2 21 1 1 1 root root postgres postgres postgres root 1024 2006-10-18 06:19 . root 1024 2006-06-12 23:34 .. postgres 329 2006-10-18 06:19 s03.txt postgres 0 2006-10-18 05:39 .s.PGSQL.5432 postgres 24 2006-10-18 05:39 .s.PGSQL.5432.lock 1 José Manuel Alarcón Medina Prácticas de Administración de PostgreSQL Boletín 02 - Enunciados Vemos el contenido del archivo $ more s.PGSQL.5432.lock y sale: 973 /home/postgres/data que se corresponde con el número de proceso del “postmaster” y el directorio donde está instalado el cluster (PGDATA). 4. Vamos a ver cómo afectan las conexiones a Postgres en la memoria compartida, para ello, desconectaremos todas las sesiones, y veremos cuánta memoria compartida hay reservada para la caché de la base de datos, luego conectaremos y veremos lo mismo para comparar (nota, usar el comando “ipcs –m” del sistema operativo. comprobamos primero que no hay conexiones en marcha, y si las hay, apagamos postgres: $ $ $ $ ps –ef | grep postgres pg_ctl stop ps –ef | grep postgres ipcs –m -> si salen conexiones apagamos ---- Segmentos memoria compartida ---key shmid propietario perms bytes nattch estado arrancamos postgres pero no conectamos, miramos primero la memoria $ pg_ctl start & $ ipcs –m ---- Segmentos memoria compartida ---key shmid propietario perms 0x0052e2c1 32768 postgres 600 bytes 10461184 nattch estado 2 realizamos conexiones y vemos el resultado $ psql & $ psql & $ ipcs –m ---- Segmentos memoria compartida ---key shmid propietario perms 0x0052e2c1 32768 postgres 600 bytes 10461184 nattch estado 4 Como se ve, aumenta el numero de “nattach” 2 José Manuel Alarcón Medina Prácticas de Administración de PostgreSQL Boletín 02 - Enunciados 5. Vamos a ver la distribución en disco del cluster de base de datos, donde vamos a ver las bases de datos, los tablespaces, etc. Se trata de que veamos la correspondencia entre las bases de datos, las tablas y tablespaces con unos ficheros en el sistema de ficheros. Para ello iremos al directorio $PGDATA/base y los directorios que cuelgan de éste, intentaremos ver qué significan esos números. Pista: utilizar las tablas pg_database y pg_class (atención al atributo “oculto” oid). Nos situamos en $PGDATA/base $ ls –la drwx-----drwx-----drwx-----drwx-----drwx------ 5 10 2 2 3 postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres 1024 1024 2048 2048 3072 2006-06-13 2006-10-18 2006-06-13 2006-06-13 2006-10-18 02:35 . 10:23 .. 02:35 02:35 02:45 1 10792 10793 ¿qué son estos 3 directorios? Para verlo, ejecutar la siguiente consulta: select oid,datname from pg_database; podemos ejecutarla así: $ psql –c “select oid,datname from pg_database” oid | datname -------+----------10793 | postgres 1 | template1 10792 | template0 (3 filas) estamos, pues viendo que cada base de datos tiene asociado un directorio. Si se crea una base de datos nueva,y vemos su fichero correspondiente, por ejemplo: $ createdb prueba00 oid | datname ---------+----------10793 | postgres 1643831 | prueba 1 | template1 10792 | template0 (4 filas) 3 José Manuel Alarcón Medina Prácticas de Administración de PostgreSQL Boletín 02 - Enunciados Si entramos en el directorio 1 (template1) y vemos su contenido, veremos todos los objetos (tablas, índices, clusters de esa base de datos): $ ls –la $PGDATA/base/1 total 3605 drwx-----drwx------rw-------rw-------rw-------rw-------rw-------rw-------rw------... ... -rw-------rw-------rw-------rw-------rw-------rw-------rw------- 2 5 1 1 1 1 1 1 1 postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres 2048 1024 0 8192 0 8192 0 8192 0 2006-06-13 2006-06-13 2006-06-13 2006-06-13 2006-06-13 2006-06-13 2006-06-13 2006-06-13 2006-06-13 02:35 02:35 02:35 02:35 02:35 02:35 02:35 02:35 02:35 . .. 10287 10289 10293 10295 10299 10301 10302 1 1 1 1 1 1 1 postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres 16384 16384 16384 16384 40960 57988 4 2006-06-13 2006-06-13 2006-06-13 2006-06-13 2006-06-13 2006-06-13 2006-06-13 02:35 02:35 02:35 02:35 02:35 02:35 02:35 2700 2701 2702 2703 2704 pg_internal.init PG_VERSION ¿qué objeto se corresponde con el fichero 10301? $ psql template1 postgres=> select relname,relfilenode from pg_class where relfilenode = 10301; 6. Crear una tabla con el usuario cursoNN en el esquema esquemaNN y comprobar dónde se ha creado el fichero correspondiente. ejecutamos: $ psql –U curso00 postgres –c “create tabla prueba (nombre text)” $ psql –U curso00 postgres –c “select relfilenode from pg_class where relname = ‘prueba’” relfilenode ------------1643837 (1 fila) ahora buscamos ese fichero en la base de datos correspondiente, en un ejercicio anterior hemos visto que está en el directorio 10793: $ ls $PGDATA/base/10793/1643837 -rw------- 1 postgres postgres 0 2006-10-18 11:30 /home/postgres/data/base/10793/1643837 4 José Manuel Alarcón Medina Prácticas de Administración de PostgreSQL Boletín 02 - Enunciados 7. En cuanto a crear un tablespace es diferente, porque implica crear primero una localización y luego crear el tablespace. Vamos a crear los tablespaces en $PGDATA/tbs/tbsNN y los tablespaces se llamaran “tablespaceNN”. ejecutamos, en este caso siempre con superusuario de base de datos, porque tiene que tener permisos en el sistema de ficheros: $ mkdir $PGDATA/tbs $ mkdir $PGDATA/tbs/tbs00 $ psql –c “create tablespace tbs00 location ‘/home/postgres/data/tbs/tbs00’” y vemos el contenido de los siguientes directorios: $ ls –la $PGDATA/tbs/tbs00 $ ls –la $PGDATA/pg_tblspc sale respectivamente: ls –la $PGDATA/tbs/tbs00 total 4 drwx-----drwxr-xr-x -rw------- 2 postgres postgres 1024 2006-10-18 11:49 . 3 postgres postgres 1024 2006-10-18 11:46 .. 1 postgres postgres 4 2006-10-18 11:47 PG_VERSION $ ls –la $PGDATA/pg_tblspc total 2 drwx-----drwx-----lrwxrwxrwx 2 postgres postgres 1024 2006-10-18 11:47 . 11 postgres postgres 1024 2006-10-18 11:46 .. 1 postgres postgres 29 2006-10-18 11:47 1643839 -> /home/postgres/data/tbs/tbs00 8. Una vez conocida la estructura de un cluster, vamos a crearnos uno cada alumno. Nos situamos en un directorio concreto, donde cada uno creará un cluster en un directorio “dataNN”. El cluster tendrá que tener codificación UTF8 y localización en España. ¿Se crea el cluster sin problemas o muestra algún mensaje de advertencia?. Cuando esté hecho, nos presentará dos opciones para arrancar el postmaster, una ejecutando el programa “postmaster” y otra usando “pg_ctl”. Probar a arrancar de estos modos: a. con “postmaster –D dataNN”, ¿qué ocurre? b. con “postmaster –D dataNN –p 54NN”. ¿Ha arrancado?, ¿qué ocurre?, ¿pulsar ctr+c y ver qué pasa? c. con “pg_ctl –D dataNN –l logNN start”. ¿Ha arrancado?. Mirar el contenido del fichero logNN. 5 José Manuel Alarcón Medina Prácticas de Administración de PostgreSQL Boletín 02 - Enunciados desde el mismo directorio donde “cuelga” el cluster inicial, “data”, ejecutamos con superusuario, porque tener permisos en el sistema de ficheros: $ initdb –D dataNN –E UTF8 –locale=es_ES y vemos que crea un cluster pero muestra un mensaje que no podemos ver, para poderlo ver, borramos el cluster y volvemos a ejecutar pero de este modo: $ rm –r dataNN $ initdb –D dataNN –E UTF8 –locale=es_ES 2>&1 | tee init.log si editamos el fichero init.log: initdb: initdb: initdb: initdb: initdb: initdb: initdb: nombre de nombre de nombre de nombre de nombre de nombre de atención: configuración local «es_ES» configuración local «es_ES» configuración local «es_ES» configuración local «es_ES» configuración local «es_ES» configuración local «es_ES» codificaciones no coinciden no no no no no no es es es es es es válido válido válido válido válido válido La codificación que seleccionó (UTF8) y la codificación de la configuración local elegida (ISO-8859-15) no coinciden. Esto puede llevar a comportamientos erráticos en ciertas funciones de procesamiento de cadenas de caracteres. Para corregir esta situación, ejecute initdb nuevamente y no especifique una codificación, o bien especifique una combinación adecuada. Los archivos de este cluster serán de propiedad del usuario «postgres». Este usuario también debe ser quien ejecute el proceso servidor. El cluster será inicializado con configuración local es_ES@euro. creando el directorio dataNN ... hecho creando directorio dataNN/global ... hecho creando directorio dataNN/pg_xlog ... hecho creando directorio dataNN/pg_xlog/archive_status ... hecho creando directorio dataNN/pg_clog ... hecho creando directorio dataNN/pg_subtrans ... hecho creando directorio dataNN/pg_twophase ... hecho creando directorio dataNN/pg_multixact/members ... hecho creando directorio dataNN/pg_multixact/offsets ... hecho creando directorio dataNN/base ... hecho creando directorio dataNN/base/1 ... hecho creando directorio dataNN/pg_tblspc ... hecho seleccionando el valor para max_connections ... 100 seleccionando el valor para shared_buffers ... 1000 creando archivos de configuración ... hecho creando base de datos template1 en dataNN/base/1 ... hecho inicializando pg_authid ... hecho habilitando tamaño de registro ilimitado para tablas de sistema ... hecho inicializando dependencias ... hecho creando las vistas de sistema ... hecho cargando pg_description ... hecho creando conversiones ... hecho estableciendo privilegios en objetos predefinidos ... hecho creando el esquema de información ... hecho haciendo vacuum a la base de datos template1 ... hecho copiando template1 a template0 ... hecho copiando template1 a postgres ... hecho ATENCIÓN: activando autentificación «trust» para conexiones locales. Puede cambiar esto editando pg_hba.conf o usando el parámetro -A la próxima vez que ejecute initdb. Completado. Puede iniciar el servidor de bases de datos usando: postmaster -D dataNN o pg_ctl -D dataNN -l archivo_de_registro start Vemos dos mensajes, uno que habla de la codificación “es_ES” y otro con el tema del LATIN9/UTF8. En ambos caso el problema viene dado por una diferente codificación entre el cliente y el cluster, en Linux, los clientes suelen estar en “es_ES@euro”. Con el comando locale podemos ver la codificación, y en el caso de la localización, 6 José Manuel Alarcón Medina Prácticas de Administración de PostgreSQL Boletín 02 - Enunciados basta con poner lo mismo, en el caso de la codificación, aunque nos diga que es distinta, si controlamos los problemas, se puede seguir adelante: $ rm –r dataNN $ initdb –D dataNN –E UTF8 –locale=es_ES@euro 2>&1 | tee init.log otra forma sería cambiando la codificación del cliente: $ rm –r dataNN $ export LC_ALL=es_ES.UTF8 $ initdb –D dataNN –E UTF8 –locale=es_ES 2>&1 | tee init.log y ya no devuelve mensajes. Ahora nos fijamos en lo que nos aconseja y probamos: $ postmaster –D dataNN que produce esta salida: FATAL: lock file "/tmp/.s.PGSQL.5432.lock" already exists HINT: Is another postmaster (PID 3617) using socket file "/tmp/.s.PGSQL.5432"? lógico porque ya teníamos arrancado un postmaster en el puerto 5432. Para corregirlo, ejecutamos $ postmaster –D dataNN –p 5400 LOG: LOG: LOG: LOG: LOG: LOG: LOG: database system was shut down at 2006-10-18 13:22:07 CEST checkpoint record is at 0/33A734 redo record is at 0/33A734; undo record is at 0/0; shutdown TRUE next transaction ID: 565; next OID: 10794 next MultiXactId: 1; next MultiXactOffset: 0 database system is ready transaction ID wrap limit is 2147484146, limited by database "postgres" se ejecuta en primer plano, nos muestra la siguiente pantalla y no nos deja hacer nada más, porque está mostrando el log de postmaster en la pantalla. Si pulsamos control-c manda un kill a postmaster y hace una parada. Por último, si ejecutamos: $ pg_ctl –D dataNN –l dataNN.log –o “-p 5400” start iniciará sin problemas y además tendremos dos procesos postmaster escuchando: ps –ef | grep postgres postgres root root postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres postgres 1116 3919 3921 3923 3924 4426 4428 4429 4430 4435 4437 4438 4439 4442 4443 1 927 3919 3919 3923 1 4426 4426 4429 1 4435 4435 4438 1116 1116 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 04:10 12:55 12:56 12:56 12:56 13:43 13:43 13:43 13:43 13:44 13:44 13:44 13:44 13:44 13:44 tty1 ? ? ? ? tty1 tty1 tty1 tty1 tty1 tty1 tty1 tty1 tty1 tty1 00:00:01 -bash 00:00:00 sshd: postgres [priv] 00:00:00 sshd: postgres [priv] 00:00:00 sshd: postgres@notty 00:00:00 /usr/lib/sftp-server 00:00:00 /home/postgres/pgsql/bin/postmaster -D data 00:00:00 postgres: writer process 00:00:00 postgres: stats buffer process 00:00:00 postgres: stats collector process 00 /home/postgres/pgsql/bin/postmaster -D dataNN -p 5400 00:00:00 postgres: writer process 00:00:00 postgres: stats buffer process 00:00:00 postgres: stats collector process 00:00:00 ps -ef 00:00:00 –bash en caso de usar varios postmaster, hay que llevar cuidado con los apagados, matar sesiones, etc. 7 José Manuel Alarcón Medina