Desarrollo web

Instalando MySQL en Ubuntu

Las siguientes instrucciones detallan cómo instalar MySQL en una instancia EC2 de AWS corriendo Ubuntu 22.04.

Descargar el script SQL de prueba

  1. Desde el directorio donde se desee decargar el script SQL, teclear en la terminal:

    wget https://arielortiz.info/s202411/tc2005b/quotations.sql
  2. Se puede usar el editor de textos de Cloud9 para visualizar el contenido del archivo quotations.sql recién descargado. Este archivo será utilizado para hacer unas pruebas más adelante.

Instalar servidor de MySQL

  1. Actualizar los paquetes del sistema. En la terminal, teclear:

    sudo apt update
    sudo apt upgrade -y
  2. Instalar el servidor de MySQL. Teclear en la terminal:

    sudo apt install mysql-server -y

Verificar que MySQL esté corriendo

  1. El servidor de MySQL se inicia de manera automática después de su instalación y cada vez que se reinicia la instancia de EC2.
  2. Para verificar que el servidor de MySQL esté efectivamente funcionando se puede ejecutar desde la terminal el siguiente comando en cualquier momento:

    service mysql status

    La salida debe incluir los siguientes mensajes si el servidor está ejecutándose de manera correcta:

    • Active: active (running)
    • Status: "Server is operational"

    Si es necesario, presionar la tecla Q para cerrar la aplición service.

Crear contraseña para el usuario root

  1. Ingresar al cliente de MySQL. Teclear en la terminal:

    sudo mysql
  2. En el prompt de MySQL teclear el siguiente commando, sustituyendo some_password por la contraseña elegida:

    ALTER USER 'root'@'localhost'
    IDENTIFIED WITH mysql_native_password BY 'some_password';
    
  3. Salir del cliente de MySQL presionando Ctrl-D.

Correr el cliente

  1. Después de ejecutar los comandos de la sección anterior, la forma de correr el cliente de MySQL requiere teclear en la terminal lo siguiente:

    mysql -u root -p

    La aplicación solicita la contraseña elegida en la sección anterior en lugar de some_password.

  2. A partir de este momento es posible ejecutar cualquier comando de SQL en el prompt de MySQL. Por ejemplo, para ver todas las bases de datos existentes, teclear:

    SHOW DATABASES;
    
  3. Para correr el script descargado anteriormente, teclear:

    SOURCE quotations.sql
    
  4. Para realizar una consulta, solo se requiere teclearla directamente, por ejemplo:

    SELECT DISTINCT author FROM quotations ORDER BY author;
    
  5. Presionar Ctrl-D para salir del cliente de MySQL.

Establecer credenciales de manera segura

  1. Abrir en el editor el archivo .bashrc contenido en el directorio raíz del usuario del ambiente de Cloud9 para definir como variables de entorno el nombre de usuario y constraseña de MySQL. Para localizar dicho archivo se requiere activar la opción de “Show Hidden Files” en el menú de configuración del ambiente.

  2. Ir al final del archivo .bashrc y agregar las siguientes dos líneas:

    export MYSQL_USER="root"
    export MYSQL_PASSWORD="some_password"
    

    NOTA: Sustituir some_password por la contraseña seleccionada anteriormente.

    Guardar el archivo.

  3. Cerrar la terminal y abrir una nueva para que tomen efecto los valores de las nuevas variables de entorno. Para verificar que así sea, teclar en la terminal:

    echo $MYSQL_USER
    echo $MYSQL_PASSWORD

    Dichos comandos deben desplegar los valores asociados a las respectivas variables de entorno.

    En un programa de JavaScript corriendo en Node se pueden acceder a los valores de estas variables de entorno de la siguiente manera:

    • process.env.MYSQL_USER
    • process.env.MYSQL_PASSWORD

Programa de prueba

  1. Instalar el paquete de MySQL para Node. En la terminal teclear:

    npm install mysql
  2. En el editor crear un archivo llamado mysql_select.js con el siguiente programa de JavaScript como contenido:

    // File: mysql_select.js
    
    // Import the mysql and util modules
    const mysql = require('mysql');
    const util = require('util');
    
    // Create a connection to the database
    const db = mysql.createConnection({
      host: 'localhost',                   // The host where the
                                           // database is located
      database: 'web_database',            // Database name
      user: process.env.MYSQL_USER,        // Database username
      password: process.env.MYSQL_PASSWORD // Database password
    });
    
    // Convert the connect and query methods from callback-based
    // to promise-based
    db.connect = util.promisify(db.connect);
    db.query = util.promisify(db.query);
    
    // An async function to connect to the database
    async function connectToDatabase() {
      try {
        // Try to connect to the database
        await db.connect();
        // If successful, log a success message
        console.log('Connected to database.');
      } catch (err) {
        // If an error occurs, log an error message and
        // re-throw the error
        console.log('Unable to connect to the database.');
        throw err;
      }
    }
    
    // An async function to perform a SELECT operation on the
    // database
    async function do_select() {
        // The SQL query to execute
        const sqlQuery = 'SELECT DISTINCT author '
          + 'FROM quotations ORDER BY author';
        try {
            // Try to execute the query
            const result = await db.query(sqlQuery);
            // If successful, log a success message
            console.log('Success!');
            // Loop through the result and log each author
            for (let row of result) {
                console.log(row.author);
            }
            // Close the database connection
            db.end();
        } catch (err) {
            // If an error occurs, re-throw the error
            throw err;
        }
    }
    
    // Immediately Invoked Function Expression (IIFE) to run the
    // async functions. This is used for top-level await which is
    // not allowed outside of functions.
    (async () => {
      // Connect to the database
      await connectToDatabase();
      // Perform the select operation
      await do_select();
    })();
    
  3. Correr el programa anterior. Teclear en la terminal:

    node mysql_select.js

    La salida esperada es la siguiente:

    Connected to database.
    Success!
    Alan Kay
    Alan Turing
    Anonymous
    Aristotle
    Brian Kernigan
    Charles Babbage
    Chinese Proverb
    Donald Knuth
    Douglas Adams
    Edsger Dijkstra
    Fred Brooks
    George Boole
    Grace Hopper
    Harold Abelson
    Homer Simpson
    Howard Aiken
    Isaac Asimov
    Jan van de Snepscheut
    Kent Beck
    Linus Torvalds
    Radia Pearlman
    Thomas Watson