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:

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