Skip to content

Bases de datos

Casi todas las aplicaciones web necesitan algún método de persistencia para guardar la información:

  • Mostrar/Guardar post
  • Mostrar/Guardar productos en venta
  • Mostrar/Guardar pedidos y recibos
  • Etc.

La persistencia nos la da (generalmente) un motro de base de datos.

Nota: Un servidor web recibe peticiones simultáneas con lo que la persistencia de datos debe ser capaz de aceptar peticiones concurrente garantizando la integridad de los datos. Utilizar un fichero no sería suficiente.

Comunicación entre elementos

En este momento añadimos un elemento más a nuestro ecosistema web. Un esquema sería el siguiente gráfico.

Petición HTTP      Servidor Web       Lenguaje CGI    Servidor DB
----------------------->|
                        |
                Procesa petición
                        ------------------->|
                                            |
                                        La petición
                                        requiere acceso
                                        a datos
                                            |
                                            --------------->|
                                                        Consulta SQL
                                            |<--------------
                                        Generación de
                                        HTML o json o ...
                        |<------------------|
                  Respuesta HTTP
<-----------------------

:)
El usuario
ha conseguido
lo que quería

Para que todo esto ocurra necesitamos:

  • Servidor web (Apache2, ya lo tenemos)
  • Lenguaje de script (PHP, ya lo tenemos)
  • Base de datos (FALTA!)
    • Servidor DB
    • Base de datos
    • Usuario y Permisos
  • Librería para que PHP y la base de datos hablen (FALTA!)

Este último punto de las librerías nos suele faltar. Por ejemplo si nuestra web tiene una aplicación que convierte imágenes o aplica un filtro a las imágenes, necesitaremos tener la librerías de procesamiento de imágenes dentro del servidor. El listado de posibilidades y librerías es muy grande. Cada vez que instalemos una aplicación web necesitaremos verificar que nuestro servidor cumple los requisitos.

Qué vamos a hacer en esta práctica:

  • Instalación
  • Configuración
  • Creación de base de datos
  • Creación de usuarios
  • Instalación de la integración con el lenguaje de programación
  • Consultas

Instalación

Vamos a utilizar la base de datos MariaDB. Esta es un fork del proyecto MySQL que surgió con la adquisición de Sun por parte de Oracle.

Al ser un fork todo esto se haría de forma similar en la base de datos Mysql.

Instalamos desde los repositorios:

apt install mariadb-server

Una vez instalado necesitamos asegurar la instalación, hay un script que nos facilita esta tarea:

mysql_secure_installation

Aquí contestaremos a las preguntas leyendo y entendiendo qué dice el script.

Configuración

Como cualquier servidor podemos tocar los parámetros de configuración del motor de base de datos. Temas como puertos, memoria, etc.

NOTA: Los motores de base de datos tienen numerosos parámetros de configuración tanto a nivel servicio como a nivel de consultas, índices, espacio en disco.

Es común dejar solo conexiones locales, es decir, los procesos que se conecten solo serán procesos que se ejecuten en la misma máquina. También se pueden establecer conexiones dentro de la red interna de la organización. Es poco común que se acepten conexiones desde Internet.

Dibujo ejemplo de configuración

Conexión con el motor

Para conectarnos con el motor de base de datos vamos a utilizar el comando mysql. Este comando tiene los parámetros -u y -p para especificar un usuario y que vamos a utilizar contraseña.

# Como un usuario normal:
mysql -u root -p

Ahora mismo no nos deja conectarnos con usuario y contraseña. Esto es una medida de seguridad de las versiones de Mysq/MariaDB de los últimos años. Cuidado si estáis viendo algún tutorial antiguo.

Ahora mismo la autentificación de root se debe hacer con una conexión desde la cuenta de root.

# Siendo root en el sistema
mysql

Para comprobar que estamos conectados y las tablas internas del motor están bien podemos usar las sentencias SQL:

show databases;
show tables from mysql;
select Host,  User, Password from mysql.user;

Bases de datos y usuarios

Los siguientes comandos sirven para crear bases de datos y crear usuarios con permisos totales sobre ellas.

Crear base de datos:

CREATE DATABASE nombre_de_base_de_datos;

Crear un usuario (Debes cambiar 'nombreusuario' y '1234' por sus valores MANTENIENDO LAS COMILLAS):

CREATE USER 'nombreusuario'@'localhost' IDENTIFIED BY '1234';

Conceder todos los permisos a este nuevo usuario (Debes cambiar 'nombreusuario' y nombre_de_base_de_datos MANTENIENDO LAS COMILLAS Y LAS NO COMILLAS):

GRANT ALL ON nombre_de_base_de_datos.* TO 'nombreusuario'@'localhost';                      

Tarea

Crea un usuario prueba1, con una base de datos prueba1_db con password 654321.

Tras la creación y siendo un usuario normal conéctate como ese usuario

mysql -u prueba1 -p prueba1_db

Prueba a hacer consultas y crear una tabla.

Acceso desde php

Clona el repositorio o descarga el código fuente:

El error aparece por que no tenemos instalada la parte de PHP capaz de hablar con MariaDB.

apt install php7.4-mysql

Recarga apache2

service apache2 reload

Acceso a base de datos

En el repositorio de github del módulo tienes el código fuente y las instrucciones DDL/DML para crear una base de datos y el código fuente php para mostrar un listado. Ejecuta el script SQL y sube la página a algún espacio tuyo del servidor.

https://github.com/JorgeDuenasLerin/IAW/tree/main/02_DB

Backup

Estos comandos te pueden ser útiles para crear y para restaurar webs. Como hemos visto las páginas web tienen código en el espacio de ficheros y una base de datos asociada. Restaurando esto podemos hacer backups de las páginas webs.

Para la base de datos:

mysqldump -u NOMBREUSUARIO -p NOMBREBASEDEDATOS > $(date +%Y-%m-%d-%H.%M.%S).sql
mysql -u NOMBREUSUARIO -p NOMBREBASEDEDATOS < dumpfilename.sql                      

Para los ficheros:

cd /var/www
tar -cvzf $(date +%Y-%m-%d-%H.%M.%S).tar.gz /var/www/ESPACIOWEB

cd /var/www
tar -xvzf $(date +%Y-%m-%d-%H.%M.%S).tar.gz