Instalación de versiones antiguas de PostgreSQL en Linux actuales

Hola a tod@s, hoy queríamos contaros cómo realizar la instalación de una versión antigua de PostgreSQL (8.4.22) en un Centos con una versión bastante actualizada (8.5 o superior).

Nos ha surgido la necesidad de realizar un proyecto de modernización de software de sistema operativo pero en el que querían mantener la misma versión de PostgreSQL. Esto en otros gestores puede ser un problema, pero no para nuestro Postgres :-D.

En primer lugar nos vamos a la página oficial de PostgreSQL y buscamos los paquetes. Al desplegar las versiones ya vemos que la más antigua es la 12:

instalación software PostgreSQL

Si nos vamos a Direct download vemos también que la más antigua que podemos descargar es la versión 11, pero las versiones anteriores (la versión 8.4.22 es del 2014) ya no están disponibles, por lo que no podemos hacer nada directamente.

¿Qué es lo que podemos hacer entonces?

La mejor opción en este caso siempre es compilar los binarios sobre el nuevo sistema operativo y empezar a trabajar desde ahí, ya que es independiente de la versión del sistema operativo utilizado.

En la página:

https://ftp.postgresql.org/pub/source

Tenemos todas las versiones disponibles desde la 6, por lo que nos vale para nuestro propósito. En nuestro caso el fichero que necesitamos es:

https://ftp.postgresql.org/pub/source/v8.4.22/postgresql-8.4.22.tar.gz

Una vez localizado vamos a empezar con la instalación del software en nuestro nuevo sistema.

Los pasos son:

Instalación de software necesario

  1. Instalación de paquetes necesarios. Para la compilación de los binarios necesitamos los siguientes paquetes instalados:
yum install -y make
yum install -y tar
yum install -y gcc
yum install -y readline-devel
yum install -y zlib
yum install -y zlib-devel

2. Nos bajamos el software y lo dejamos en nuestra máquina, en nuestro caso en /tmp:

[root@centos8 ~]# cd /tmp
[root@centos8 tmp]# wget https://ftp.postgresql.org/pub/source/v8.4.22/postgresql-8.4.22.tar.gz
--2023-11-29 08:31:22--  https://ftp.postgresql.org/pub/source/v8.4.22/postgresql-8.4.22.tar.gz
Resolving ftp.postgresql.org (ftp.postgresql.org)... 217.196.149.55, 72.32.157.246, 87.238.57.227, ...
Connecting to ftp.postgresql.org (ftp.postgresql.org)|217.196.149.55|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 18332542 (17M) [application/octet-stream]
Saving to: ‘postgresql-8.4.22.tar.gz’

postgresql-8.4.22.tar.gz                        100%[====================================================================================================>]  17.48M  9.55MB/s    in 1.8s

2023-11-29 08:31:24 (9.55 MB/s) - ‘postgresql-8.4.22.tar.gz’ saved [18332542/18332542]

3. Como no instalamos con paquetes no nos crea el usuario postgres y la estructura de directorios, por lo que lo hacemos a mano y damos los permisos al nuevo usuario:

adduser postgres
cp /tmp/postgresql-8.4.22.tar.gz /home/postgres
cd /home/postgres
gunzip postgresql-8.4.22.tar.gz
tar -xvf postgresql-8.4.22.tar
chown -R postgres:postgres postgresql-8.4.22
mkdir -p /usr/local/pgsql
chown postgres:postgres /usr/local/pgsql

mkdir /usr/local/pgsql/data
chown postgres /usr/local/pgsql/data

4. Compilamos el software como postgres:

su - postgres
cd /home/postgres/postgresql-8.4.22 
./configure
……………………………………………………..

checking for collateindex.pl... no
checking for sgmlspl... no
checking for docbook2man...
checking if gcc supports -Wl,--as-needed... yes
configure: using CFLAGS=-O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -fwrapv -fexcess-precision=standard -fno-aggressive-loop-optimizations
configure: using CPPFLAGS= -D_GNU_SOURCE
configure: using LDFLAGS=  -Wl,--as-needed
configure: creating ./config.status
config.status: creating GNUmakefile
config.status: creating src/Makefile.global
config.status: creating src/include/pg_config.h
config.status: creating src/interfaces/ecpg/include/ecpg_config.h
config.status: linking ./src/backend/port/tas/dummy.s to src/backend/port/tas.s
config.status: linking ./src/backend/port/dynloader/linux.c to src/backend/port/dynloader.c
config.status: linking ./src/backend/port/sysv_sema.c to src/backend/port/pg_sema.c
config.status: linking ./src/backend/port/sysv_shmem.c to src/backend/port/pg_shmem.c
config.status: linking ./src/backend/port/dynloader/linux.h to src/include/dynloader.h
config.status: linking ./src/include/port/linux.h to src/include/pg_config_os.h
config.status: linking ./src/makefiles/Makefile.linux to src/Makefile.port

En algunas versiones antiguas, como la 8.4.4 se puede generar un problema al compilar el software, se soluciona lanzando el comando configure de la siguiente forma:

./configure  CFLAGS="-Wno-aggressive-loop-optimizations"



gmake

……………………………………………………..
gmake[3]: Leaving directory '/home/postgres/postgresql-8.4.22/contrib/spi'
cp ../../../contrib/spi/refint.so refint.so
gmake -C ../../../contrib/spi autoinc.so
gmake[3]: Entering directory '/home/postgres/postgresql-8.4.22/contrib/spi'
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -fwrapv -fexcess-precision=standard -fno-aggressive-loop-optimizations -fpic -DREFINT_VERBOSE -I. -I../../src/include -D_GNU_SOURCE   -c -o autoinc.o autoinc.c
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -fwrapv -fexcess-precision=standard -fno-aggressive-loop-optimizations -fpic -shared -o autoinc.so autoinc.o
rm autoinc.o
gmake[3]: Leaving directory '/home/postgres/postgresql-8.4.22/contrib/spi'
cp ../../../contrib/spi/autoinc.so autoinc.so
rm -rf ./testtablespace
mkdir ./testtablespace
gmake[2]: Leaving directory '/home/postgres/postgresql-8.4.22/src/test/regress'
gmake[1]: Leaving directory '/home/postgres/postgresql-8.4.22/src'
gmake -C config all
gmake[1]: Entering directory '/home/postgres/postgresql-8.4.22/config'
gmake[1]: Nothing to be done for 'all'.
gmake[1]: Leaving directory '/home/postgres/postgresql-8.4.22/config'
All of PostgreSQL successfully made. Ready to install.


gmake install
……………………………………………………..
make[3]: Leaving directory '/home/postgres/postgresql-8.4.22/src/pl/plpgsql'
make[2]: Leaving directory '/home/postgres/postgresql-8.4.22/src/pl'
make -C makefiles install
make[2]: Entering directory '/home/postgres/postgresql-8.4.22/src/makefiles'
/bin/sh ../../config/install-sh -c -m 644 ./pgxs.mk '/usr/local/pgsql/lib/pgxs/src/makefiles/'
make[2]: Leaving directory '/home/postgres/postgresql-8.4.22/src/makefiles'
make -C test/regress install
make[2]: Entering directory '/home/postgres/postgresql-8.4.22/src/test/regress'
make -C ../../../src/port all
make[3]: Entering directory '/home/postgres/postgresql-8.4.22/src/port'
make[3]: Nothing to be done for 'all'.
make[3]: Leaving directory '/home/postgres/postgresql-8.4.22/src/port'
rm -rf ./testtablespace
mkdir ./testtablespace
/bin/sh ../../../config/install-sh -c  pg_regress '/usr/local/pgsql/lib/pgxs/src/test/regress/pg_regress'
make[2]: Leaving directory '/home/postgres/postgresql-8.4.22/src/test/regress'
make[1]: Leaving directory '/home/postgres/postgresql-8.4.22/src'
make -C config install
make[1]: Entering directory '/home/postgres/postgresql-8.4.22/config'
/bin/sh ../config/install-sh -c -m 755 ./install-sh '/usr/local/pgsql/lib/pgxs/config/install-sh'
/bin/sh ../config/install-sh -c -m 755 ./mkinstalldirs '/usr/local/pgsql/lib/pgxs/config/mkinstalldirs'
make[1]: Leaving directory '/home/postgres/postgresql-8.4.22/config'
PostgreSQL installation complete.

5. Por defecto, la generación de los binarios es en /usr/local/pgsql pero podemos indicar otra ruta que necesitemos. Nosotros no lo hemos modificado, lo que hemos hecho es modificar la variable PATH del usuario postgres:

[postgres@centos8 ~]$ export PATH=/usr/local/pgsql/bin:$PATH
[postgres@centos8 ~]$ which psql
/usr/local/pgsql/bin/psql

[postgres@centos8 ~]$ psql --version
psql (PostgreSQL) 8.4.22
contains support for command-line editing

Inicialización del cluster

6. Una vez que tenemos el software inicializamos el clúster y revisamos que levanta correctamente:

[postgres@centos8 ~]$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale en_US.UTF-8.
The default database encoding has accordingly been set to UTF8.
The default text search configuration will be set to "english".

fixing permissions on existing directory /usr/local/pgsql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 32MB
creating configuration files ... ok
creating template1 database in /usr/local/pgsql/data/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option the
next time you run initdb.

Success. You can now start the database server using:

    /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
or
    /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start

Ya solo nos falta arrancar y comprobar que está correcto:

[postgres@centos8 ~]$ psql
psql (8.4.22)
Type "help" for help.

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |  Collation  |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
                                                             : postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
                                                             : postgres=CTc/postgres
(3 rows)

Con estos sencillos pasos tenemos el software de Postgres que necesitemos sobre cualquier versión de sistema operativo. Si tú también necesitas realizar este tipo de instalación, puedes contactarnos sin compromiso. Podemos encargarnos de la instalación de PostgreSQL, así como de su mantenimiento.

Esperamos que la entrada os sea de utilidad y podáis disfrutar de este estupendo motor. Con GPS Query Performance, puedes comprobar si tu actual entorno Oracle, funcionaría en PostgreSQL, ¿no lo vas a probar?

¿Aún no conoces Query Performance? Descubre cómo puede ayudarte en tu entorno Oracle. Más información en su página de LinkedIn.

Sígue a GPS en LinkedIn

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *