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 manière la plus simple de se connecter à votre service MariaDB est d'utiliser le format URL MySQL, à condition que votre driver le supporte :

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

Pour les utilisateurs de Ruby, l'URL MySQL diffère légèrement :

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

Voici plusieurs exemples utilisant PHP pour vous aider à vous connecter à MariaDB avec différentes extensions. Rappelez-vous qu'il n'est pas recommandé d'utiliser la base de données 'root' en production. Envisagez plutôt de créer une base de données et un utilisateur dédiés.

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Il n'est pas recommandé d'utiliser la base de données 'root'. Ceci est juste pour l'exemple. La meilleure pratique est de créer une base de données et un utilisateur dédiés dans phpMyAdmin et de les utiliser ici.

$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'; // Il n'est pas recommandé d'utiliser la base de données 'root'. Ceci est juste pour l'exemple. La meilleure pratique est de créer une base de données et un utilisateur dédiés dans phpMyAdmin et de les utiliser ici.

$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'; // Il n'est pas recommandé d'utiliser la base de données 'root'. Ceci est juste pour l'exemple. La meilleure pratique est de créer une base de données et un utilisateur dédiés dans phpMyAdmin et de les utiliser ici.

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

$options = array(
  // Si vous rencontrez une erreur telle que "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", vérifiez si le répertoire /etc/ssl/certs/ contient des 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 exécutant la version ' . $version[0] . "\n";

?>

Si vous recevez l'erreur :

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

cela est probablement dû au fait que le répertoire /etc/ssl/certs/ ne contient pas les certificats CA. Si vous avez accès au système, vous pouvez installer ces certificats comme suit :

  1. Sur Ubuntu, vous pouvez exécuter :

    apt-get install ca-certificates
    
  2. Sur Alpine Linux, exécutez :

    apk add ca-certificates
    

Si vous n'avez pas d'accès direct au système exécutant votre code PHP, vous pouvez installer le certificat manuellement :

  1. Téléchargez le certificat : https://letsencrypt.org/certs/isrgrootx1.pem
  2. Ajoutez le fichier isrgrootx1.pem à vos fichiers de projet PHP.
  3. Commentez la ligne avec PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/'
  4. Décommentez la ligne avec PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'

Si vous voyez une erreur telle que :

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

ou une erreur similaire mentionnant une constante non définie pour les attributs PDO MySQL, cela indique que votre installation PDO manque de support MySQL.

Solution pour Ubuntu/Debian

Installez l'extension PHP MySQL requise avec :

sudo apt-get install php-mysql
Solution pour Docker

Si vous utilisez Docker, assurez-vous que le support MySQL est inclus lors du processus de build. Envisagez d'ajouter ce qui suit à votre Dockerfile :

RUN docker-php-ext-install pdo pdo_mysql

Modifiez le fichier .env et définissez la variable DATABASE_URL comme suit :

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

Ensuite, mettez à jour le fichier config/packages/doctrine.yaml, en définissant le driver et les options comme suit :

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 l'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 répertoire /etc/ssl/certs/ ne contient pas les certificats CA. Vous pouvez résoudre cela en les installant :

  • Sur Ubuntu/Debian, exécutez :

    sudo apt-get install ca-certificates
    
  • Sur Alpine Linux, exécutez :

    apk add ca-certificates
    

Si vous ne pouvez pas installer les certificats à l'échelle du système, vous pouvez les ajouter manuellement :

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

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

  3. Ensuite, mettez à jour le fichier config/packages/doctrine.yaml pour utiliser le certificat 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
    

Pour configurer MariaDB avec Laravel, modifiez le fichier 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 telles que "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", reportez-vous aux instructions 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, insérez la configuration suivante :

$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 de données correspond au nom d'utilisateur.
  'dbdriver' => 'mysqli',
  'dbprefix' => '',
  'pconnect' => TRUE,
  'char_set' => 'utf8',
  'dbcollat' => 'utf8_general_ci',
  'encrypt'  => array() // Important : activer le chiffrement TLS
);

Il est préférable d'éviter de coder en dur vos identifiants. Envisagez plutôt d'utiliser des variables d'environnement. Vous pouvez récupérer les identifiants comme suit :

$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 de données correspond au nom d'utilisateur.

Connecter WordPress à Stackhero pour MariaDB est simple. Modifiez le fichier wp-config.php et configurez vos paramètres de base de données comme suit :

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

// Activer le chiffrement TLS (également connu sous le nom de SSL)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

La partie importante ici est l'activation du chiffrement TLS (également connu sous le nom de SSL). Sans cela, la connexion ne fonctionnera pas.

Dans cet exemple, nous utilisons le package mysql2 avec support des promesses. Tout d'abord, installez-le avec :

npm install mysql2

Ensuite, utilisez le code suivant :

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

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

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

  // Créer la table 'users' si elle n'existe pas encore
  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érer un utilisateur fictif
  await db.query(
    'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
    [
      [
        Math.round(Math.random() * 100000), // Générer un userId fictif
        'Nom de l'utilisateur',              // Colonne 'name'
        'Adresse de l'utilisateur',          // Colonne 'address'
        'user@email.com'                     // Colonne 'email'
      ]
    ]
  );

  // Compter le nombre de lignes dans la table 'users'
  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"`);

  // Fermer la connexion à MariaDB
  await db.end();

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

Lors de la connexion depuis Node.js, NestJS ou TypeORM, incluez l'option ssl comme indiqué :

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 avec Prisma, ajoutez l'option sslaccept=strict pour garantir que le chiffrement SSL est activé. Par exemple, en utilisant l'utilisateur "root" se connectant à la base de données "root" :

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

Si vous n'avez pas encore installé le module mysqlclient (utilisé pour se connecter à MariaDB), exécutez :

pip install mysqlclient

Si vous rencontrez l'erreur Exception: Can not find valid pkg-config name lors de l'installation de mysqlclient, installez le package libmysqlclient. Sur Ubuntu/Debian, vous pouvez exécuter :

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

Initialement, vous pouvez stocker vos identifiants directement dans le fichier settings.py pour les tests comme indiqué ci-dessous. Notez que cette approche n'est pas sécurisée 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 Soyez prudent : cet exemple n'est pas recommandé pour la production et est uniquement à des fins de test !

Une fois que la connexion fonctionne, il est préférable d'utiliser des variables d'environnement pour stocker vos identifiants. Par exemple, en utilisant django-environ, installez-le d'abord :

pip install django-environ

Ensuite, mettez à jour settings.py comme suit :

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

Créez ou mettez à jour le fichier .env (dans le même répertoire que settings.py) avec ce qui suit :

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

Enfin, ajoutez .env à votre .gitignore pour éviter de commettre des informations sensibles :

echo ".env" >> .gitignore

Pour connecter votre application Spring, définissez la variable d'environnement SPRING_DATASOURCE_URL avec votre URL de base de données, préfixée par jdbc:. Par exemple :

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

L'exemple suivant montre comment configurer votre application Grails pour se connecter à 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 de votre base de données souhaitée.
      username = "root" // Il est conseillé de créer un utilisateur dédié au lieu d'utiliser 'root'.
      password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD // Envisagez de créer un utilisateur dédié.
      properties {
        maxActive = 50
        minEvictableIdleTimeMillis = 1800000
        timeBetweenEvictionRunsMillis = 1800000
        numTestsPerEvictionRun = 3
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        validationQuery = "SELECT 1"
      }
    }
  }
}

Il est bon de créer un utilisateur dédié pour votre application plutôt que d'utiliser l'utilisateur 'root'. La manière la plus simple de le faire est via phpMyAdmin :

  1. Dans phpMyAdmin, cliquez sur Comptes utilisateurs en haut.
  2. Cliquez sur Ajouter un compte utilisateur.
  3. Remplissez le formulaire de création d'utilisateur :
    • Choisissez un nom de compte (généralement le nom de votre application).
    • Cliquez sur Générer un mot de passe pour un mot de passe sécurisé, puis copiez-le.
    • Cochez l'option Créer une base de données portant le même nom et accorder tous les privilèges.

Après soumission, un nouvel utilisateur sera créé avec une base de données portant le même nom que le nom d'utilisateur.

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