MariaDB: Aan de slag

Hoe te beginnen 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-service is door het MySQL URL-formaat te gebruiken, mits uw driver dit ondersteunt:

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

Voor Ruby-gebruikers verschilt de MySQL URL enigszins:

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

Hieronder staan verschillende voorbeelden met PHP om u te helpen verbinding te maken met MariaDB met verschillende extensies. Onthoud dat het gebruik van de 'root'-database niet wordt aanbevolen voor productie. Overweeg in plaats daarvan een speciale database en gebruiker aan te maken.

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Het wordt niet aanbevolen om de 'root'-database te gebruiken. Dit is alleen voor het voorbeeld. De beste praktijk is om een speciale database en gebruiker aan te maken in phpMyAdmin en deze hier te gebruiken.

$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'; // Het wordt niet aanbevolen om de 'root'-database te gebruiken. Dit is alleen voor het voorbeeld. De beste praktijk is om een speciale database en gebruiker aan te maken in phpMyAdmin en deze hier te gebruiken.

$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'; // Het wordt niet aanbevolen om de 'root'-database te gebruiken. Dit is alleen voor het voorbeeld. De beste praktijk is om een speciale database en gebruiker aan te maken in phpMyAdmin en deze hier te gebruiken.

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

$options = array(
  // Als u een fout tegenkomt zoals "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", controleer dan of de /etc/ssl/certs/ directory 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 die versie ' . $version[0] . "\n" draait;

?>

Als u de fout ontvangt:

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

dan komt dit waarschijnlijk omdat de /etc/ssl/certs/ directory de CA-certificaten niet bevat. Als u toegang heeft tot het systeem, kunt u deze certificaten als volgt installeren:

  1. Op Ubuntu kunt u uitvoeren:

    apt-get install ca-certificates
    
  2. Op Alpine Linux, voer uit:

    apk add ca-certificates
    

Als u geen directe toegang heeft tot het systeem dat uw PHP-code uitvoert, kunt u het certificaat handmatig installeren:

  1. Download het certificaat: https://letsencrypt.org/certs/isrgrootx1.pem
  2. Voeg het isrgrootx1.pem bestand toe aan uw PHP-projectbestanden.
  3. Commentaar de regel met PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/'
  4. Haal de commentaar weg bij de regel met PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'

Als u een fout ziet zoals:

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

of een soortgelijke fout die een niet-gedefinieerde constante voor PDO MySQL-attributen vermeldt, betekent dit dat uw PDO-installatie MySQL-ondersteuning mist.

Oplossing voor Ubuntu/Debian

Installeer de vereiste PHP MySQL-extensie met:

sudo apt-get install php-mysql
Oplossing voor Docker

Als u Docker gebruikt, zorg ervoor dat MySQL-ondersteuning is opgenomen tijdens het buildproces. Overweeg het volgende toe te voegen aan uw Dockerfile:

RUN docker-php-ext-install pdo pdo_mysql

Bewerk het .env bestand en definieer de DATABASE_URL variabele als volgt:

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

Werk vervolgens het config/packages/doctrine.yaml bestand bij, waarbij u de driver en opties als volgt instelt:

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 de fout tegenkomt:

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

dan betekent dit waarschijnlijk dat de /etc/ssl/certs/ directory de CA-certificaten niet bevat. U kunt dit oplossen door ze te installeren:

  • Op Ubuntu/Debian, voer uit:

    sudo apt-get install ca-certificates
    
  • Op Alpine Linux, voer uit:

    apk add ca-certificates
    

Als u de certificaten niet systeemwijd kunt installeren, kunt u ze handmatig toevoegen:

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

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

  3. Werk vervolgens het config/packages/doctrine.yaml bestand bij om het lokale certificaat te gebruiken:

    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 met Laravel in te stellen, bewerk het config/database.php bestand en werk de mysql configuratie als volgt bij:

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

Voeg in uw database.php bestand de volgende configuratie in:

$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'); // Conventioneel 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 het beste om uw inloggegevens niet hard te coderen. Overweeg in plaats daarvan om omgevingsvariabelen te gebruiken. U kunt de inloggegevens 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'); // Conventioneel komt de databasenaam overeen met de gebruikersnaam.

Het verbinden van WordPress met Stackhero voor MariaDB is eenvoudig. Bewerk het wp-config.php bestand en configureer uw database-instellingen als volgt:

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 bekend als SSL)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

Het belangrijke deel hier is de activering van TLS-encryptie (ook bekend als SSL). Zonder dit zal de verbinding niet werken.

In dit voorbeeld gebruiken we het mysql2 pakket met ondersteuning voor promises. Installeer het eerst met:

npm install mysql2

Gebruik vervolgens de volgende code:

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 'stackherotest' aan als deze nog niet bestaat
  await db.query('CREATE DATABASE IF NOT EXISTS stackherotest');

  // Maak de tabel 'users' 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 fictieve gebruiker toe
  await db.query(
    'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
    [
      [
        Math.round(Math.random() * 100000), // Genereer een fictieve userId
        'Gebruikersnaam',                    // 'name' kolom
        'Gebruikersadres',                   // 'address' kolom
        'user@email.com'                     // 'email' kolom
      ]
    ]
  );

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

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

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

Bij het verbinden vanuit Node.js, NestJS of TypeORM, voeg de ssl optie toe zoals getoond:

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 Prisma, voeg de sslaccept=strict optie toe om ervoor te zorgen dat SSL-encryptie is ingeschakeld. Bijvoorbeeld, met de gebruiker "root" die verbinding maakt met de database "root":

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

Als u de mysqlclient module nog niet heeft geïnstalleerd (gebruikt om verbinding te maken met MariaDB), voer uit:

pip install mysqlclient

Als u de fout Exception: Can not find valid pkg-config name tegenkomt bij het installeren van mysqlclient, installeer dan het libmysqlclient pakket. Op Ubuntu/Debian, kunt u uitvoeren:

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

Aanvankelijk kunt u uw inloggegevens direct in het settings.py bestand opslaan voor testen zoals hieronder getoond. Merk op dat deze aanpak niet veilig is 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>'
  }
}

waarschuwing Wees voorzichtig: dit voorbeeld wordt niet aanbevolen voor productie en is alleen voor testdoeleinden!

Zodra de verbinding werkt, is het het beste om omgevingsvariabelen te gebruiken om uw inloggegevens op te slaan. Bijvoorbeeld, met django-environ, installeer het eerst:

pip install django-environ

Werk vervolgens settings.py bij als volgt:

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 of werk het .env bestand bij (in dezelfde directory als settings.py) met het volgende:

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

Voeg ten slotte .env toe aan uw .gitignore om te voorkomen dat gevoelige informatie wordt gecommit:

echo ".env" >> .gitignore

Om uw Spring-applicatie te verbinden, stelt u de omgevingsvariabele SPRING_DATASOURCE_URL in met uw database-URL, voorafgegaan door jdbc:. Bijvoorbeeld:

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

Het volgende voorbeeld laat zien hoe u uw Grails-applicatie configureert 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 gewenste databasenaam.
      username = "root" // Het is raadzaam om een speciale gebruiker aan te maken in plaats van 'root' te gebruiken.
      password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD // Overweeg een speciale gebruiker aan te maken.
      properties {
        maxActive = 50
        minEvictableIdleTimeMillis = 1800000
        timeBetweenEvictionRunsMillis = 1800000
        numTestsPerEvictionRun = 3
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        validationQuery = "SELECT 1"
      }
    }
  }
}

Het is goed om een speciale gebruiker voor uw applicatie aan te maken in plaats van de 'root'-gebruiker te gebruiken. De eenvoudigste manier om dit te doen is via phpMyAdmin:

  1. Klik in phpMyAdmin bovenaan op Gebruikersaccounts.
  2. Klik op Gebruikersaccount toevoegen.
  3. Vul het gebruikersaanmaakformulier in:
    • Kies een accountnaam (meestal de naam van uw applicatie).
    • Klik op Wachtwoord genereren voor een veilig wachtwoord en kopieer het.
    • Vink de optie Maak een database met dezelfde naam aan en geef alle rechten aan.

Na indiening wordt er een nieuwe gebruiker aangemaakt samen met een database die dezelfde naam heeft als de gebruikersnaam.

MariaDB is een onafhankelijke fork gemaakt door de open source gemeenschap nadat Oracle MySQL in 2010 had overgenomen. Voor de meeste doeleinden zijn MariaDB en MySQL zeer vergelijkbaar.