MariaDB: Premiers pas

Comment débuter avec MariaDB

👋 Bienvenue sur la documentation de Stackhero !

Stackhero propose une solution MariaDB cloud prête à l'emploi qui offre de nombreux avantages, notamment :

  • Connexions et transferts illimités.
  • Interface web phpMyAdmin incluse.
  • Mises à jour faciles en un clic.
  • Performance optimale et sécurité robuste grâce à une VM privée et dédiée.

Gagnez du temps et simplifiez-vous la vie : il ne faut que 5 minutes pour essayer la solution MariaDB cloud hosting de Stackhero !

La façon la plus simple de se connecter à votre service MariaDB est d'utiliser le format d'URL MySQL, tant que votre driver le prend en charge :

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

Si vous utilisez Ruby, l'URL MySQL est légèrement différente :

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

Voici quelques exemples pour vous connecter à MariaDB depuis PHP avec différentes extensions. Même si ces exemples utilisent la base "root", il est recommandé de créer une base et un utilisateur dédiés pour votre application, surtout en environnement de production.

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Exemple uniquement. Pour de bonnes pratiques, créez votre propre base et utilisateur dans phpMyAdmin et utilisez ces identifiants.

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

echo 'Connexion réussie... ' . $mysqli->host_info . "\n";

$mysqli->close();

?>
<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Exemple uniquement. Pour de bonnes pratiques, créez votre propre base et utilisateur dans phpMyAdmin et utilisez ces identifiants.

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

echo 'Succès : ' . mysqli_get_host_info($mysqli) . "\n";

mysqli_close($mysqli);

?>
<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Exemple uniquement. Pour de bonnes pratiques, créez votre propre base et utilisateur dans phpMyAdmin et utilisez ces identifiants.

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

$options = array(
  // Si vous obtenez une erreur du type "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", vérifiez que votre dossier /etc/ssl/certs/ contient bien les certificats 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 'Vous êtes connecté à une base de données en version ' . $version[0] . "\n";

?>

Si vous voyez cette erreur :

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

cela signifie probablement que le dossier /etc/ssl/certs/ ne contient pas les certificats CA nécessaires. Si vous avez accès au système, voici quelques suggestions pour les installer :

  1. Sur Ubuntu, vous pouvez exécuter :

    apt-get install ca-certificates
    
  2. Sur Alpine Linux, essayez :

    apk add ca-certificates
    

Si vous n'avez pas accès au système, vous pouvez ajouter le certificat manuellement :

  1. Téléchargez le certificat : https://letsencrypt.org/certs/isrgrootx1.pem
  2. Placez le fichier isrgrootx1.pem dans votre projet PHP.
  3. Commentez la ligne PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/'
  4. Décommentez la ligne PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'

Si vous voyez une erreur comme :

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

ou un message similaire mentionnant une constante PDO MySQL non définie, cela signifie probablement que votre installation PDO ne prend pas en charge MySQL.

Sur Ubuntu/Debian

Vous pouvez installer l'extension PHP MySQL requise avec :

sudo apt-get install php-mysql
Si vous utilisez Docker

Pour vous assurer que le support MySQL est disponible, ajoutez ceci à votre Dockerfile :

RUN docker-php-ext-install pdo pdo_mysql

### Utiliser MariaDB avec Symfony et Doctrine

Pour commencer, modifiez votre fichier `.env` et définissez la variable `DATABASE_URL` comme ceci :

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


Ensuite, mettez à jour votre fichier `config/packages/doctrine.yaml` pour définir le driver et les options :

```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 vous rencontrez cette erreur :

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

cela signifie probablement que les certificats CA ne sont pas installés sur votre système. Voici comment les installer :

  • Sur Ubuntu/Debian, exécutez :

    sudo apt-get install ca-certificates
    
  • Sur Alpine Linux, essayez :

    apk add ca-certificates
    

Si vous ne pouvez pas installer les certificats CA au niveau système, ajoutez-les manuellement :

  1. Téléchargez le certificat : https://letsencrypt.org/certs/isrgrootx1.pem

  2. Placez le fichier isrgrootx1.pem dans votre projet Symfony.

  3. Mettez à jour votre fichier 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
    

Pour configurer MariaDB avec Laravel, ouvrez config/database.php et mettez à jour la configuration mysql comme suit :

'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 vous rencontrez des erreurs SSL comme "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", consultez les étapes de résolution ci-dessus.
      PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
      // PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
      PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
    ])
    : [],
],

Dans votre fichier database.php, vous pouvez configurer la connexion ainsi :

$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'), // Par convention, le nom de la base correspond à l'utilisateur.
  'dbdriver' => 'mysqli',
  'dbprefix' => '',
  'pconnect' => TRUE,
  'char_set' => 'utf8',
  'dbcollat' => 'utf8_general_ci',
  'encrypt'  => array() // Important : activez le chiffrement TLS
);

Il est recommandé de ne pas mettre vos identifiants en dur dans le code, mais d'utiliser des variables d'environnement. Vous pouvez les récupérer ainsi :

$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'); // Par convention, le nom de la base correspond à l'utilisateur.

Connecter WordPress à Stackhero pour MariaDB est très simple. Dans votre fichier wp-config.php, définissez les paramètres suivants :

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

// Activez le chiffrement TLS (aussi appelé SSL)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

L'étape essentielle ici est d'activer le chiffrement TLS (parfois appelé SSL). La connexion ne fonctionnera pas sans cela.

Si vous utilisez Node.js, vous pouvez utiliser le package mysql2, qui prend en charge les promesses. Pour l'installer :

npm install mysql2

Voici un exemple à adapter :

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

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

  // Crée la base si elle n'existe pas déjà
  await db.query('CREATE DATABASE IF NOT EXISTS stackherotest');

  // Crée la table users si elle n'existe pas
  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;'
  );

  // Insère un utilisateur exemple
  await db.query(
    'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
    [
      [
        Math.round(Math.random() * 100000), // Génère un userId
        'User name',                         // name
        'User address',                      // address
        '[email protected]'                     // email
      ]
    ]
  );

  // Compte les utilisateurs dans la table
  const [usersCount] = await db.query('SELECT COUNT(*) AS `cpt` FROM `stackherotest`.`users`');
  console.log(`Il y a maintenant ${usersCount[0].cpt} entrées dans la table "users"`);

  // Ferme la connexion
  await db.end();

})().catch(error => {
  console.error('');
  console.error('Une erreur est survenue !');
  console.error(error);
  process.exit(1);
});

Pour Node.js, NestJS ou TypeORM, vous pouvez activer SSL en ajoutant l'option ssl :

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

Pour se connecter à MariaDB avec Prisma, il suffit d'ajouter sslaccept=strict à votre URL de connexion. Par exemple, pour une connexion en tant que "root" sur la base "root" :

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

Si ce n'est pas déjà fait, vous pouvez installer le module mysqlclient pour connecter Django à MariaDB :

pip install mysqlclient

Si vous obtenez l'erreur Exception: Can not find valid pkg-config name lors de l'installation, il peut être nécessaire d'installer le package libmysqlclient au préalable. Pour Ubuntu/Debian :

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

Pour tester la connexion, vous pouvez commencer par mettre vos identifiants directement dans settings.py. Cela convient pour des tests, mais ce n'est pas sécurisé pour la production.

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

Attention : cet exemple est uniquement pour des tests. N'utilisez pas d'identifiants en dur en production.

Une fois la connexion validée, il est plus sûr de stocker les identifiants dans des variables d'environnement. Si vous utilisez django-environ, installez-le ainsi :

pip install django-environ

Puis mettez à jour 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')
  }
}

Ensuite, créez ou mettez à jour le fichier .env (dans le même dossier que settings.py) avec :

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

Enfin, pour sécuriser vos identifiants, ajoutez .env à votre .gitignore :

echo ".env" >> .gitignore

Pour connecter une application Spring à MariaDB, définissez la variable d'environnement SPRING_DATASOURCE_URL avec l'URL de votre base, en utilisant le préfixe jdbc:. Par exemple :

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

Voici un exemple de configuration pour connecter votre application Grails à MariaDB :

dataSource {
  pooled = true
  driverClassName = "com.mysql.cj.jdbc.Driver"
  dialect = org.hibernate.dialect.MySQL8Dialect
  // Propriétés spécifiques 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" // Remplacez '/root' par le nom réel de votre base.
      username = "root" // Il est conseillé de créer un utilisateur dédié pour votre application.
      password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD // Pensez à créer un utilisateur dédié.
      properties {
        maxActive = 50
        minEvictableIdleTimeMillis = 1800000
        timeBetweenEvictionRunsMillis = 1800000
        numTestsPerEvictionRun = 3
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        validationQuery = "SELECT 1"
      }
    }
  }
}

Pour plus de sécurité, il est préférable de créer un utilisateur dédié pour votre application plutôt que d'utiliser "root". Vous pouvez le faire facilement dans phpMyAdmin :

  1. Dans phpMyAdmin, cliquez sur Comptes utilisateurs en haut.
  2. Cliquez sur Ajouter un compte utilisateur.
  3. Remplissez le formulaire :
    • Choisissez un nom d'utilisateur (souvent le nom de votre application).
    • Cliquez sur Générer un mot de passe pour obtenir un mot de passe fort, puis copiez-le.
    • Cochez Créer une base de données portant son nom et donner tous les privilèges.

Une fois validé, votre nouvel utilisateur et une base associée seront créés.

MariaDB est un fork indépendant de MySQL, créé par la communauté open source après le rachat de MySQL par Oracle en 2010. Pour la plupart des usages, MariaDB et MySQL offrent des fonctionnalités et une compatibilité très proches.