MariaDB: Comenzando

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 conectarse a su servicio MariaDB es utilizando el formato de URL de MySQL, siempre que su controlador lo soporte:

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

Para los usuarios de Ruby, la URL de MySQL difiere ligeramente:

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

A continuación se presentan varios ejemplos utilizando PHP para ayudarle a conectarse a MariaDB con diferentes extensiones. Recuerde que no se recomienda usar la base de datos 'root' en producción. En su lugar, considere crear una base de datos y un usuario dedicados.

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // No se recomienda usar la base de datos 'root'. Esto es solo para el ejemplo. La mejor práctica es crear una base de datos y un usuario dedicados en phpMyAdmin y usarlos aquí.

$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'; // No se recomienda usar la base de datos 'root'. Esto es solo para el ejemplo. La mejor práctica es crear una base de datos y un usuario dedicados en phpMyAdmin y usarlos aquí.

$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'; // No se recomienda usar la base de datos 'root'. Esto es solo para el ejemplo. La mejor práctica es crear una base de datos y un usuario dedicados en phpMyAdmin y usarlos aquí.

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

$options = array(
  // Si encuentra un error como "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", verifique si el directorio /etc/ssl/certs/ contiene 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 que ejecuta la versión ' . $version[0] . "\n";

?>

Si recibe el error:

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

esto probablemente se deba a que el directorio /etc/ssl/certs/ no contiene los certificados CA. Si tiene acceso al sistema, puede instalar estos certificados de la siguiente manera:

  1. En Ubuntu, puede ejecutar:

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

    apk add ca-certificates
    

Si no tiene acceso directo al sistema que ejecuta su código PHP, puede instalar el certificado manualmente:

  1. Descargue el certificado: https://letsencrypt.org/certs/isrgrootx1.pem
  2. Agregue el archivo isrgrootx1.pem a sus archivos de 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:

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

o un error similar que menciona una constante indefinida para los atributos PDO MySQL, indica que su instalación de PDO carece de soporte MySQL.

Solución para Ubuntu/Debian

Instale la extensión PHP MySQL requerida con:

sudo apt-get install php-mysql
Solución para Docker

Si está utilizando Docker, asegúrese de que el soporte MySQL esté incluido durante el proceso de construcción. Considere agregar lo siguiente a su Dockerfile:

RUN docker-php-ext-install pdo pdo_mysql

Edite el archivo .env y defina la variable DATABASE_URL de la siguiente manera:

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

A continuación, actualice el archivo config/packages/doctrine.yaml, configurando el controlador y las opciones de la siguiente manera:

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 encuentra el error:

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

esto probablemente significa que el directorio /etc/ssl/certs/ no contiene los certificados CA. Puede resolver esto instalándolos:

  • En Ubuntu/Debian, ejecute:

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

    apk add ca-certificates
    

Si no puede instalar los certificados a nivel del sistema, puede agregarlos manualmente:

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

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

  3. Luego, actualice el archivo config/packages/doctrine.yaml para usar el certificado local:

    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, edite el archivo 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 las instrucciones 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, inserte la siguiente configuración:

$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 nombre de usuario.
  'dbdriver' => 'mysqli',
  'dbprefix' => '',
  'pconnect' => TRUE,
  'char_set' => 'utf8',
  'dbcollat' => 'utf8_general_ci',
  'encrypt'  => array() // Importante: activar el cifrado TLS
);

Es mejor evitar codificar sus credenciales. En su lugar, considere usar variables de entorno. Puede recuperar las credenciales de la siguiente manera:

$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 nombre de usuario.

Conectar WordPress a Stackhero para MariaDB es sencillo. Edite el archivo wp-config.php y configure sus ajustes de base de datos de la siguiente manera:

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

// Activar el cifrado TLS (también conocido como SSL)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

La parte importante aquí es la activación del cifrado TLS (también conocido como SSL). Sin él, la conexión no funcionará.

En este ejemplo, utilizamos el paquete mysql2 con soporte de promesas. Primero, instálelo con:

npm install mysql2

Luego, use el siguiente código:

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 'stackherotest' si no existe
  await db.query('CREATE DATABASE IF NOT EXISTS stackherotest');

  // Crear la tabla 'users' si no existe aún
  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 ficticio
  await db.query(
    'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
    [
      [
        Math.round(Math.random() * 100000), // Generar un userId ficticio
        'Nombre de usuario',                 // Columna 'name'
        'Dirección de usuario',             // Columna 'address'
        'user@email.com'                    // Columna 'email'
      ]
    ]
  );

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

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

})().catch(error => {
  console.error('');
  console.error('🐞 ¡Ocurrió un error!');
  console.error(error);
  process.exit(1);
});

Al conectarse desde Node.js, NestJS o TypeORM, incluya la opción ssl como se muestra:

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

Para conectarse con Prisma, agregue la opción sslaccept=strict para garantizar que el cifrado SSL esté habilitado. Por ejemplo, utilizando el usuario "root" conectándose 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 ha instalado el módulo mysqlclient (utilizado para conectarse a MariaDB), ejecute:

pip install mysqlclient

Si encuentra el error Exception: Can not find valid pkg-config name al instalar mysqlclient, instale el paquete libmysqlclient. En Ubuntu/Debian, puede ejecutar:

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

Inicialmente, puede almacenar sus credenciales directamente en el archivo settings.py para pruebas como se muestra a continuación. Tenga en cuenta que este enfoque no es seguro para 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>'
  }
}

alerta Tenga cuidado: este ejemplo no se recomienda para producción y es solo para fines de prueba.

Una vez que la conexión funcione, es mejor usar variables de entorno para almacenar sus credenciales. Por ejemplo, usando django-environ, primero instálelo:

pip install django-environ

Luego actualice settings.py de la siguiente manera:

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')
  }
}

Cree o actualice el archivo .env (en el mismo directorio que settings.py) con lo siguiente:

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

Finalmente, agregue .env a su .gitignore para evitar comprometer información sensible:

echo ".env" >> .gitignore

Para conectar su aplicación Spring, configure la variable de entorno SPRING_DATASOURCE_URL con su URL de base de datos, prefijada con jdbc:. Por ejemplo:

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

El siguiente ejemplo muestra cómo configurar su aplicación Grails para conectarse a 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" // Reemplace '/root' con el nombre de su base de datos deseada.
      username = "root" // Es aconsejable crear un usuario dedicado en lugar de usar 'root'.
      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"
      }
    }
  }
}

Es bueno crear un usuario dedicado para su aplicación en lugar de usar el usuario 'root'. La forma más sencilla de hacerlo es a través de phpMyAdmin:

  1. En phpMyAdmin, haga clic en Cuentas de usuario en la parte superior.
  2. Haga clic en Agregar cuenta de usuario.
  3. Complete el formulario de creación de usuario:
    • Elija un nombre de cuenta (generalmente el nombre de su aplicación).
    • Haga clic en Generar contraseña para una contraseña segura, luego cópiela.
    • Marque la opción Crear base de datos con el mismo nombre y otorgar todos los privilegios.

Después de enviar, se creará un nuevo usuario junto con una base de datos que comparte el mismo nombre que el nombre de usuario.

MariaDB es un fork independiente creado por la comunidad de código abierto después de que Oracle adquiriera MySQL en 2010. Para la mayoría de los propósitos, MariaDB y MySQL son muy similares.