MariaDB: Aan de slag

Hoe u aan de slag gaat met MariaDB

👋 Welkom bij de Stackhero-documentatie!

Stackhero biedt een gebruiksklare MariaDB cloud oplossing die tal van voordelen biedt, waaronder:

  • Onbeperkte verbindingen en overdrachten.
  • phpMyAdmin webinterface inbegrepen.
  • Moeiteloze updates met slechts één klik.
  • Optimale prestaties en robuuste beveiliging aangedreven door een privé en toegewijde VM.

Bespaar tijd en vereenvoudig uw leven: het kost slechts 5 minuten om de MariaDB cloud hosting oplossing van Stackhero te proberen!

De eenvoudigste manier om verbinding te maken met uw MariaDB-dienst is door het MySQL-URL-formaat te gebruiken, zolang uw driver dit ondersteunt:

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

Als u Ruby gebruikt, is de MySQL-URL iets anders:

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

Hieronder vindt u enkele voorbeelden van hoe u verbinding kunt maken met MariaDB vanuit PHP met verschillende extensies. Hoewel deze voorbeelden de "root"-database gebruiken, is het aanbevolen om voor uw applicatie een aparte database en gebruiker aan te maken, zeker in productieomgevingen.

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Alleen ter demonstratie. Maak voor best practices uw eigen database en gebruiker aan in phpMyAdmin en gebruik deze inloggegevens.

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

echo 'Verbinding succesvol... ' . $mysqli->host_info . "\n";

$mysqli->close();

?>
<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Alleen ter demonstratie. Maak voor best practices uw eigen database en gebruiker aan in phpMyAdmin en gebruik deze inloggegevens.

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

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

mysqli_close($mysqli);

?>
<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Alleen ter demonstratie. Maak voor best practices uw eigen database en gebruiker aan in phpMyAdmin en gebruik deze inloggegevens.

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

$options = array(
  // Als u een foutmelding krijgt zoals "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", controleer dan of uw directory /etc/ssl/certs/ de benodigde CA-certificaten bevat.
  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 'U bent verbonden met een database met versie ' . $version[0] . "\n";

?>

Als u deze foutmelding ziet:

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

komt dit waarschijnlijk doordat de benodigde CA-certificaten ontbreken in de map /etc/ssl/certs/. Als u systeemtoegang heeft, kunt u deze als volgt installeren:

  1. Op Ubuntu kunt u het volgende uitvoeren:

    apt-get install ca-certificates
    
  2. Op Alpine Linux probeert u:

    apk add ca-certificates
    

Als u geen systeemtoegang heeft, kunt u het certificaat handmatig toevoegen:

  1. Download het certificaat: https://letsencrypt.org/certs/isrgrootx1.pem
  2. Plaats het bestand isrgrootx1.pem in uw PHP-project.
  3. Zet de regel met PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/' in commentaar.
  4. Haal de commentaar weg bij de regel met PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'

Als u een foutmelding krijgt zoals:

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

of een vergelijkbare melding over een onbekende constante voor PDO MySQL-attributen, dan ondersteunt uw PDO-installatie waarschijnlijk geen MySQL.

Op Ubuntu/Debian

U kunt de benodigde PHP MySQL-extensie installeren met:

sudo apt-get install php-mysql
Als u Docker gebruikt

Om MySQL-ondersteuning te activeren, voegt u het volgende toe aan uw Dockerfile:

RUN docker-php-ext-install pdo pdo_mysql

### MariaDB gebruiken met Symfony en Doctrine

Om te beginnen, bewerk uw `.env`-bestand en stel de variabele `DATABASE_URL` in als volgt:

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


Werk vervolgens uw bestand `config/packages/doctrine.yaml` bij om de driver en opties in te stellen:

```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

Als u deze foutmelding krijgt:

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

komt dit waarschijnlijk doordat de CA-certificaten niet op uw systeem zijn geïnstalleerd. U kunt deze als volgt installeren:

  • Op Ubuntu/Debian voert u uit:

    sudo apt-get install ca-certificates
    
  • Op Alpine Linux probeert u:

    apk add ca-certificates
    

Als u geen systeemtoegang heeft om CA-certificaten te installeren, kunt u ze handmatig toevoegen:

  1. Download het certificaat: https://letsencrypt.org/certs/isrgrootx1.pem

  2. Plaats het bestand isrgrootx1.pem in uw Symfony-project.

  3. Werk uw bestand config/packages/doctrine.yaml bij:

    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
    

Om MariaDB te configureren met Laravel, opent u config/database.php en past u de mysql-configuratie als volgt aan:

'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([
      // Als u SSL-fouten krijgt zoals "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", zie de bovenstaande troubleshooting-stappen.
      PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
      // PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
      PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
    ])
    : [],
],

In uw database.php-bestand kunt u de volgende configuratie instellen:

$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'), // Volgens conventie komt de databasenaam overeen met de gebruikersnaam.
  'dbdriver' => 'mysqli',
  'dbprefix' => '',
  'pconnect' => TRUE,
  'char_set' => 'utf8',
  'dbcollat' => 'utf8_general_ci',
  'encrypt'  => array() // Belangrijk: activeer TLS-encryptie
);

Het is een goede praktijk om uw inloggegevens niet in de code te plaatsen, maar gebruik te maken van omgevingsvariabelen. U kunt deze als volgt ophalen:

$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'); // Volgens conventie komt de databasenaam overeen met de gebruikersnaam.

WordPress verbinden met Stackhero voor MariaDB is eenvoudig. Stel in uw wp-config.php-bestand de volgende databaseparameters in:

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

// Activeer TLS-encryptie (ook wel SSL genoemd)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

De belangrijkste stap hier is het inschakelen van TLS-encryptie (ook wel SSL genoemd). Zonder deze instelling werkt de verbinding niet.

Als u Node.js gebruikt, kunt u het mysql2-pakket proberen, dat ondersteuning biedt voor promises. Om het te installeren:

npm install mysql2

Hieronder een voorbeeld dat u kunt aanpassen:

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

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

  // Maak de database aan als deze nog niet bestaat
  await db.query('CREATE DATABASE IF NOT EXISTS stackherotest');

  // Maak de users-tabel aan als deze nog niet bestaat
  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;'
  );

  // Voeg een voorbeeldgebruiker toe
  await db.query(
    'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
    [
      [
        Math.round(Math.random() * 100000), // Genereer een userId
        'User name',                         // name
        'User address',                      // address
        '[email protected]'                     // email
      ]
    ]
  );

  // Tel het aantal gebruikers in de tabel
  const [usersCount] = await db.query('SELECT COUNT(*) AS `cpt` FROM `stackherotest`.`users`');
  console.log(`Er staan nu ${usersCount[0].cpt} records in de tabel "users"`);

  // Sluit de verbinding
  await db.end();

})().catch(error => {
  console.error('');
  console.error('Er is een fout opgetreden!');
  console.error(error);
  process.exit(1);
});

Voor Node.js, NestJS of TypeORM kunt u SSL inschakelen door de optie ssl toe te voegen:

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

Om verbinding te maken met MariaDB via Prisma, voegt u eenvoudig sslaccept=strict toe aan uw connectie-URL. Bijvoorbeeld, als u als gebruiker "root" op de database "root" wilt verbinden:

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

Als u dat nog niet heeft gedaan, kunt u de module mysqlclient installeren om Django met MariaDB te verbinden:

pip install mysqlclient

Als u de foutmelding Exception: Can not find valid pkg-config name krijgt tijdens de installatie, moet u mogelijk eerst het pakket libmysqlclient installeren. Voor Ubuntu/Debian:

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

Om uw verbinding te testen, kunt u uw inloggegevens direct in settings.py plaatsen. Dit is prima voor testdoeleinden, maar niet veilig voor productie.

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

Let op: dit voorbeeld is alleen bedoeld voor testdoeleinden. Gebruik geen hardcoded credentials in productie.

Zodra u de verbinding heeft getest, is het veiliger om de inloggegevens in omgevingsvariabelen op te slaan. Als u django-environ gebruikt, installeert u deze als volgt:

pip install django-environ

Werk vervolgens settings.py bij:

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

Maak vervolgens of werk het .env-bestand bij (in dezelfde map als settings.py) met:

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

Tot slot, om uw inloggegevens te beschermen, voegt u .env toe aan uw .gitignore:

echo ".env" >> .gitignore

Om een Spring-applicatie te verbinden met MariaDB, stelt u de omgevingsvariabele SPRING_DATASOURCE_URL in met uw database-URL, met het jdbc:-voorvoegsel. Bijvoorbeeld:

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

Hieronder een voorbeeld van hoe u uw Grails-applicatie kunt configureren om verbinding te maken met MariaDB:

dataSource {
  pooled = true
  driverClassName = "com.mysql.cj.jdbc.Driver"
  dialect = org.hibernate.dialect.MySQL8Dialect
  // SSL-specifieke eigenschappen
  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" // Vervang '/root' door uw daadwerkelijke databasenaam.
      username = "root" // Het is verstandig om een aparte gebruiker voor uw applicatie aan te maken.
      password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD // Overweeg een aparte gebruiker aan te maken.
      properties {
        maxActive = 50
        minEvictableIdleTimeMillis = 1800000
        timeBetweenEvictionRunsMillis = 1800000
        numTestsPerEvictionRun = 3
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        validationQuery = "SELECT 1"
      }
    }
  }
}

Voor een betere beveiliging is het aanbevolen om een aparte gebruiker voor uw applicatie aan te maken in plaats van "root" te gebruiken. Dit kan eenvoudig in phpMyAdmin:

  1. Klik in phpMyAdmin bovenaan op User accounts.
  2. Klik op Add user account.
  3. Vul het formulier in:
    • Kies een gebruikersnaam (vaak de naam van uw applicatie).
    • Klik op Generate password voor een sterk wachtwoord en kopieer dit.
    • Vink Create database with same name and grant all privileges aan.

Na het indienen worden uw nieuwe gebruiker en een bijbehorende database aangemaakt.

MariaDB is een onafhankelijke fork van MySQL, ontwikkeld door de open source-community nadat Oracle MySQL in 2010 heeft overgenomen. Voor de meeste toepassingen bieden MariaDB en MySQL zeer vergelijkbare functionaliteit en compatibiliteit.