Soluciones

Anuncio
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
Descargar