MariaDB: Primeros pasos

Cómo empezar con MariaDB

👋 ¡Bienvenido a la documentación de Stackhero!

Stackhero ofrece una solución MariaDB cloud lista para usar que proporciona una serie de beneficios, incluyendo:

  • Conexiones y transferencias ilimitadas.
  • Interfaz web phpMyAdmin incluida.
  • Actualizaciones sin esfuerzo con solo un clic.
  • Rendimiento óptimo y seguridad robusta gracias a una VM privada y dedicada.

Ahorre tiempo y simplifique su vida: ¡solo toma 5 minutos probar la solución de MariaDB cloud hosting de Stackhero!

La forma más sencilla de conectar con su servicio MariaDB es utilizar el formato de URL de MySQL, siempre que su driver lo soporte:

mysql://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?useSSL=true&requireSSL=true

Si utiliza Ruby, la URL de MySQL es ligeramente diferente:

mysql2://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?reconnect=true&useSSL=true&requireSSL=true

A continuación, encontrará algunos ejemplos que muestran cómo puede conectar con MariaDB desde PHP utilizando diferentes extensiones. Aunque estos ejemplos usan la base de datos "root", lo más recomendable es crear una base de datos y un usuario dedicados para su aplicación, especialmente en entornos de producción.

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Solo para demostración. Como buena práctica, cree su propia base de datos y usuario en phpMyAdmin y utilice esas credenciales.

$mysqli = mysqli_init();
$mysqliConnected = $mysqli->real_connect($hostname, $user, $password, $database, $port, NULL, MYSQLI_CLIENT_SSL);
if (!$mysqliConnected) {
  die('Error de conexión: ' . $mysqli->connect_error);
}

echo 'Conexión exitosa... ' . $mysqli->host_info . "\n";

$mysqli->close();

?>
<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Solo para demostración. Como buena práctica, cree su propia base de datos y usuario en phpMyAdmin y utilice esas credenciales.

$mysqli = mysqli_init();
$mysqliConnected = mysqli_real_connect($mysqli, $hostname, $user, $password, $database, $port, NULL, MYSQLI_CLIENT_SSL);
if (!$mysqliConnected) {
  die('Error de conexión: ' . mysqli_connect_error($mysqli));
}

echo 'Éxito: ' . mysqli_get_host_info($mysqli) . "\n";

mysqli_close($mysqli);

?>
<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Solo para demostración. Como buena práctica, cree su propia base de datos y usuario en phpMyAdmin y utilice esas credenciales.

$dsn = "mysql:host=$hostname;port=$port;dbname=$database";

$options = array(
  // Si obtiene un error como "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", asegúrese de que su directorio /etc/ssl/certs/ contiene los certificados CA.
  PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
  // PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
  PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
);

$pdo = new PDO($dsn, $user, $password, $options);

$stm = $pdo->query('SELECT VERSION()');
$version = $stm->fetch();

echo 'Está conectado a una base de datos con la versión ' . $version[0] . "\n";

?>

Si ve este error:

Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed

probablemente se deba a que el directorio /etc/ssl/certs/ no contiene los certificados CA necesarios. Si tiene acceso al sistema, aquí tiene algunas sugerencias para instalarlos:

  1. En Ubuntu, puede ejecutar:

    apt-get install ca-certificates
    
  2. En Alpine Linux, pruebe:

    apk add ca-certificates
    

Si no dispone de acceso a nivel de sistema, puede añadir el certificado manualmente:

  1. Descargue el certificado: https://letsencrypt.org/certs/isrgrootx1.pem
  2. Coloque el archivo isrgrootx1.pem en su proyecto PHP.
  3. Comente la línea con PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/'
  4. Descomente la línea con PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'

Si ve un error como este:

Fatal error: Uncaught Error: Undefined constant PDO::MYSQL_ATTR_SSL_CAPATH

o un mensaje similar que haga referencia a una constante indefinida de atributos MySQL de PDO, probablemente su instalación de PDO no incluye soporte para MySQL.

En Ubuntu/Debian

Puede instalar la extensión PHP MySQL necesaria con:

sudo apt-get install php-mysql
Si utiliza Docker

Para asegurarse de que el soporte para MySQL está disponible, puede añadir lo siguiente a su Dockerfile:

RUN docker-php-ext-install pdo pdo_mysql

### Uso de MariaDB con Symfony y Doctrine

Para empezar, edite su archivo `.env` y defina la variable `DATABASE_URL` así:

DATABASE_URL="mysql://<USER>:<PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/<DATABASE>"


A continuación, actualice su archivo `config/packages/doctrine.yaml` para establecer el driver y las opciones:

```yaml
doctrine:
    dbal:
        url: '%env(resolve:DATABASE_URL)%'
        driver: 'pdo_mysql'
        options:
            # PDO::MYSQL_ATTR_SSL_CAPATH
            1010: '/etc/ssl/certs'
            # PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT
            1014: true

Si se encuentra con este error:

Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed

probablemente se deba a que su sistema no tiene instalados los certificados CA. Aquí tiene algunas formas de instalarlos:

  • En Ubuntu/Debian, puede ejecutar:

    sudo apt-get install ca-certificates
    
  • En Alpine Linux, pruebe:

    apk add ca-certificates
    

Si no puede instalar los certificados CA a nivel de sistema, puede añadirlos manualmente:

  1. Descargue el certificado: https://letsencrypt.org/certs/isrgrootx1.pem

  2. Coloque el archivo isrgrootx1.pem en su proyecto Symfony.

  3. Actualice su archivo config/packages/doctrine.yaml:

    doctrine:
        dbal:
            url: '%env(resolve:DATABASE_URL)%'
            driver: 'pdo_mysql'
            options:
                # PDO::MYSQL_ATTR_SSL_CA
                1009: 'isrgrootx1.pem'
                # PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT
                1014: true
    

Para configurar MariaDB con Laravel, abra config/database.php y actualice la configuración mysql de la siguiente manera:

'mysql' => [
  'driver'   => 'mysql',
  'host'     => env('STACKHERO_MARIADB_HOST'),
  'port'     => env('STACKHERO_MARIADB_PORT'),
  'username' => env('STACKHERO_MARIADB_USER'),
  'password' => env('STACKHERO_MARIADB_PASSWORD'),
  'database' => env('STACKHERO_MARIADB_USER'),
  'charset'  => 'utf8mb4',
  'collation'=> 'utf8mb4_unicode_ci',
  'prefix'   => '',
  'prefix_indexes' => true,
  'strict'   => true,
  'engine'   => null,
  'sslmode'  => 'require',
  'options'  => extension_loaded('pdo_mysql')
    ? array_filter([
      // Si encuentra errores SSL como "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", consulte los pasos de resolución anteriores.
      PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
      // PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
      PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
    ])
    : [],
],

En su archivo database.php, puede configurar la conexión de la siguiente manera:

$db['default'] = array(
  'hostname' => getenv('STACKHERO_MARIADB_HOST'),
  'port'     => getenv('STACKHERO_MARIADB_PORT'),
  'username' => getenv('STACKHERO_MARIADB_USER'),
  'password' => getenv('STACKHERO_MARIADB_PASSWORD'),
  'database' => getenv('STACKHERO_MARIADB_USER'), // Por convención, el nombre de la base de datos coincide con el usuario.
  'dbdriver' => 'mysqli',
  'dbprefix' => '',
  'pconnect' => TRUE,
  'char_set' => 'utf8',
  'dbcollat' => 'utf8_general_ci',
  'encrypt'  => array() // Importante: active el cifrado TLS
);

Una buena práctica es no poner sus credenciales directamente en el código, sino utilizar variables de entorno. Puede recuperarlas así:

$hostname = getenv('STACKHERO_MARIADB_HOST');
$port     = getenv('STACKHERO_MARIADB_PORT');
$user     = getenv('STACKHERO_MARIADB_USER');
$password = getenv('STACKHERO_MARIADB_PASSWORD');
$database = getenv('STACKHERO_MARIADB_USER'); // Por convención, el nombre de la base de datos coincide con el usuario.

Conectar WordPress a Stackhero para MariaDB es muy sencillo. En su archivo wp-config.php, defina los siguientes parámetros de base de datos:

define('DB_HOST', '<XXXXXX>.stackhero-network.com');
define('DB_PORT', '<PORT>');
define('DB_NAME', 'root');
define('DB_USER', 'root');
define('DB_PASSWORD', '<yourPassword>');

// Active el cifrado TLS (también llamado SSL)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

El paso clave aquí es activar el cifrado TLS (a veces llamado SSL). La conexión no funcionará sin ello.

Si utiliza Node.js, puede probar el paquete mysql2, que soporta promesas. Para instalarlo:

npm install mysql2

Aquí tiene un ejemplo que puede adaptar:

const mysql = require('mysql2/promise');

(async () => {
  const db = await mysql.createConnection({
    host: '<XXXXXX>.stackhero-network.com',
    port: '<PORT>',
    user: 'root',
    password: '<ROOT_PASSWORD>'
  });

  // Crear la base de datos si no existe
  await db.query('CREATE DATABASE IF NOT EXISTS stackherotest');

  // Crear la tabla users si no existe
  await db.query(
    'CREATE TABLE IF NOT EXISTS `stackherotest`.`users` (' +
      '`userId` INT UNSIGNED NOT NULL,' +
      '`name` VARCHAR(128) NOT NULL,' +
      '`address` TEXT NOT NULL,' +
      '`email` VARCHAR(265) NOT NULL' +
    ') ENGINE = InnoDB;'
  );

  // Insertar un usuario de ejemplo
  await db.query(
    'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
    [
      [
        Math.round(Math.random() * 100000), // Generar un userId
        'User name',                         // name
        'User address',                      // address
        '[email protected]'                     // email
      ]
    ]
  );

  // Contar usuarios en la tabla
  const [usersCount] = await db.query('SELECT COUNT(*) AS `cpt` FROM `stackherotest`.`users`');
  console.log(`Ahora hay ${usersCount[0].cpt} registros en la tabla "users"`);

  // Cerrar la conexión
  await db.end();

})().catch(error => {
  console.error('');
  console.error('¡Ha ocurrido un error!');
  console.error(error);
  process.exit(1);
});

Para Node.js, NestJS o TypeORM, puede activar SSL añadiendo la opción ssl:

TypeOrmModule.forRoot({
  type: 'mysql',
  host: '<XXXXXX>.stackhero-network.com',
  port: '<PORT>',
  username: 'root',
  password: '<ROOT_PASSWORD>',
  database: 'root',
  entities: [],
  synchronize: true,
  ssl: {}
});

Para conectar a MariaDB con Prisma, simplemente añada sslaccept=strict a su URL de conexión. Por ejemplo, si se conecta como usuario "root" a la base de datos "root":

datasource db {
  provider = "mysql"
  url = "mysql://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?sslaccept=strict"
}

Si aún no lo ha hecho, puede instalar el módulo mysqlclient para conectar Django con MariaDB:

pip install mysqlclient

Si obtiene el error Exception: Can not find valid pkg-config name durante la instalación, puede que necesite instalar primero el paquete libmysqlclient. Para Ubuntu/Debian:

apt-get update && apt-get install --no-install-recommends -y libmysqlclient-dev

Para probar la conexión, puede empezar poniendo sus credenciales directamente en settings.py. Esto es válido para pruebas, pero no es seguro para un entorno de producción.

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'HOST': '<XXXXXX>.stackhero-network.com',
    'PORT': '<PORT>',
    'OPTIONS': {
      'ssl_mode': 'REQUIRED',
    },
    'NAME': 'root',
    'USER': 'root',
    'PASSWORD': '<ROOT_PASSWORD>'
  }
}

Tenga en cuenta: Este ejemplo es solo para pruebas. No debe usar credenciales en texto plano en producción.

Una vez que haya comprobado que la conexión funciona, es más seguro almacenar las credenciales en variables de entorno. Si utiliza django-environ, puede instalarlo así:

pip install django-environ

Después, actualice settings.py:

import environ
env = environ.Env()
environ.Env.read_env()

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'HOST': env('STACKHERO_MARIADB_HOST'),
    'PORT': env('STACKHERO_MARIADB_PORT'),
    'OPTIONS': {
      'ssl_mode': 'REQUIRED',
    },
    'NAME': 'root',
    'USER': 'root',
    'PASSWORD': env('STACKHERO_MARIADB_ROOT_PASSWORD')
  }
}

A continuación, cree o actualice el archivo .env (en el mismo directorio que settings.py) con:

STACKHERO_MARIADB_HOST=<XXXXXX>.stackhero-network.com
STACKHERO_MARIADB_PORT=<PORT>
STACKHERO_MARIADB_ROOT_PASSWORD=<ROOT_PASSWORD>

Por último, para mantener sus credenciales seguras, añada .env a su .gitignore:

echo ".env" >> .gitignore

Para conectar una aplicación Spring a MariaDB, puede definir la variable de entorno SPRING_DATASOURCE_URL con la URL de su base de datos, utilizando el prefijo jdbc:. Por ejemplo:

SPRING_DATASOURCE_URL=jdbc:mysql://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?useSSL=true&requireSSL=true

Aquí tiene un ejemplo de cómo puede configurar su aplicación Grails para conectar con MariaDB:

dataSource {
  pooled = true
  driverClassName = "com.mysql.cj.jdbc.Driver"
  dialect = org.hibernate.dialect.MySQL8Dialect
  // Propiedades específicas de SSL
  properties {
    useSSL = true
    requireSSL = true
    verifyServerCertificate = true
    sslMode = "REQUIRED"
  }
}

environments {
  production {
    dataSource {
      dbCreate = "none"
      url = "jdbc:mysql://" + System.env.STACKHERO_MYSQL_HOST + ":" + System.env.STACKHERO_MYSQL_PORT + "/root?useSSL=true&requireSSL=true&verifyServerCertificate=true&sslMode=required" // Sustituya '/root' por el nombre real de su base de datos.
      username = "root" // Es recomendable crear un usuario dedicado para su aplicación.
      password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD // Considere crear un usuario dedicado.
      properties {
        maxActive = 50
        minEvictableIdleTimeMillis = 1800000
        timeBetweenEvictionRunsMillis = 1800000
        numTestsPerEvictionRun = 3
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        validationQuery = "SELECT 1"
      }
    }
  }
}

Por motivos de seguridad, es preferible crear un usuario dedicado para su aplicación en lugar de utilizar el usuario "root". Puede hacerlo fácilmente en phpMyAdmin:

  1. En phpMyAdmin, haga clic en User accounts en la parte superior.
  2. Haga clic en Add user account.
  3. Rellene el formulario:
    • Elija un nombre de usuario (a menudo el nombre de su aplicación).
    • Haga clic en Generate password para obtener una contraseña segura y cópiela.
    • Marque Create database with same name and grant all privileges.

Una vez enviado, se crearán su nuevo usuario y una base de datos asociada.

MariaDB es un fork independiente de MySQL, creado por la comunidad open source tras la adquisición de MySQL por Oracle en 2010. Para la mayoría de los casos de uso, MariaDB y MySQL ofrecen características y compatibilidad muy similares.