MariaDB: Erste Schritte

Wie Sie mit MariaDB starten

👋 Willkommen in der Stackhero-Dokumentation!

Stackhero bietet eine einsatzbereite MariaDB Cloud Lösung, die zahlreiche Vorteile bietet, darunter:

  • Unbegrenzte Verbindungen und Übertragungen.
  • phpMyAdmin Web-UI inklusive.
  • Mühelose Updates mit nur einem Klick.
  • Optimale Performance und robuste Sicherheit durch eine private und dedizierte VM.

Sparen Sie Zeit und vereinfachen Sie Ihr Leben: Es dauert nur 5 Minuten, um die MariaDB Cloud Hosting Lösung von Stackhero auszuprobieren!

Die einfachste Möglichkeit, sich mit Ihrem MariaDB-Service zu verbinden, ist die Verwendung des MySQL-URL-Formats, sofern Ihr Treiber dies unterstützt:

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

Wenn Sie Ruby verwenden, ist die MySQL-URL leicht abgewandelt:

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

Im Folgenden finden Sie einige Beispiele, wie Sie sich mit verschiedenen PHP-Erweiterungen mit MariaDB verbinden können. Auch wenn in diesen Beispielen die Datenbank "root" verwendet wird, empfiehlt es sich, für Ihre Anwendung – insbesondere in Produktionsumgebungen – eine eigene Datenbank und einen eigenen Benutzer anzulegen.

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Nur zu Demonstrationszwecken. Best Practice: Legen Sie Ihre eigene Datenbank und einen Benutzer in phpMyAdmin an und verwenden Sie diese Zugangsdaten.

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

echo 'Verbindung erfolgreich... ' . $mysqli->host_info . "\n";

$mysqli->close();

?>
<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Nur zu Demonstrationszwecken. Best Practice: Legen Sie Ihre eigene Datenbank und einen Benutzer in phpMyAdmin an und verwenden Sie diese Zugangsdaten.

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

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

mysqli_close($mysqli);

?>
<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Nur zu Demonstrationszwecken. Best Practice: Legen Sie Ihre eigene Datenbank und einen Benutzer in phpMyAdmin an und verwenden Sie diese Zugangsdaten.

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

$options = array(
  // Falls Sie einen Fehler wie "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed" erhalten, stellen Sie sicher, dass Ihr Verzeichnis /etc/ssl/certs/ die CA-Zertifikate enthält.
  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 'Sie sind verbunden mit einer Datenbank in Version ' . $version[0] . "\n";

?>

Wenn Sie diesen Fehler sehen:

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

liegt das vermutlich daran, dass im Verzeichnis /etc/ssl/certs/ die benötigten CA-Zertifikate fehlen. Wenn Sie Systemzugriff haben, können Sie diese wie folgt installieren:

  1. Unter Ubuntu können Sie ausführen:

    apt-get install ca-certificates
    
  2. Unter Alpine Linux versuchen Sie:

    apk add ca-certificates
    

Wenn Sie keinen Systemzugriff haben, können Sie das Zertifikat manuell hinzufügen:

  1. Laden Sie das Zertifikat herunter: https://letsencrypt.org/certs/isrgrootx1.pem
  2. Legen Sie die Datei isrgrootx1.pem in Ihr PHP-Projekt.
  3. Kommentieren Sie die Zeile mit PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/' aus.
  4. Kommentieren Sie die Zeile mit PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem' ein.

Wenn Sie einen Fehler wie diesen sehen:

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

oder eine ähnliche Meldung bezüglich einer undefinierten PDO-MySQL-Konstanten, unterstützt Ihre PDO-Installation vermutlich kein MySQL.

Unter Ubuntu/Debian

Sie können die benötigte PHP-MySQL-Erweiterung installieren mit:

sudo apt-get install php-mysql
Wenn Sie Docker verwenden

Um sicherzustellen, dass MySQL-Support verfügbar ist, fügen Sie Folgendes zu Ihrem Dockerfile hinzu:

RUN docker-php-ext-install pdo pdo_mysql

### MariaDB mit Symfony und Doctrine verwenden

Um zu starten, bearbeiten Sie Ihre `.env`-Datei und setzen Sie die Variable `DATABASE_URL` wie folgt:

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


Anschließend aktualisieren Sie Ihre Datei `config/packages/doctrine.yaml`, um den Treiber und die Optionen zu setzen:

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

Wenn Sie auf diesen Fehler stoßen:

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

liegt das vermutlich daran, dass auf Ihrem System keine CA-Zertifikate installiert sind. Sie können diese wie folgt installieren:

  • Unter Ubuntu/Debian führen Sie aus:

    sudo apt-get install ca-certificates
    
  • Unter Alpine Linux versuchen Sie:

    apk add ca-certificates
    

Wenn Sie keine systemweiten CA-Zertifikate installieren können, können Sie diese manuell hinzufügen:

  1. Laden Sie das Zertifikat herunter: https://letsencrypt.org/certs/isrgrootx1.pem

  2. Legen Sie die Datei isrgrootx1.pem in Ihr Symfony-Projekt.

  3. Aktualisieren Sie Ihre Datei 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
    

Um MariaDB mit Laravel zu konfigurieren, öffnen Sie config/database.php und passen Sie die mysql-Konfiguration wie folgt an:

'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([
      // Falls Sie SSL-Fehler wie "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed" erhalten, siehe die oben genannten Lösungsschritte.
      PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
      // PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
      PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
    ])
    : [],
],

In Ihrer Datei database.php können Sie die folgende Konfiguration verwenden:

$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'), // Üblicherweise entspricht der Datenbankname dem Benutzernamen.
  'dbdriver' => 'mysqli',
  'dbprefix' => '',
  'pconnect' => TRUE,
  'char_set' => 'utf8',
  'dbcollat' => 'utf8_general_ci',
  'encrypt'  => array() // Wichtig: TLS-Verschlüsselung aktivieren
);

Es ist eine gute Praxis, Ihre Zugangsdaten nicht im Code zu hinterlegen, sondern Umgebungsvariablen zu verwenden. Sie können diese wie folgt abrufen:

$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'); // Üblicherweise entspricht der Datenbankname dem Benutzernamen.

Die Anbindung von WordPress an Stackhero für MariaDB ist unkompliziert. Legen Sie in Ihrer Datei wp-config.php die folgenden Datenbankparameter fest:

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

// TLS-Verschlüsselung aktivieren (auch als SSL bezeichnet)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

Der entscheidende Schritt ist hier die Aktivierung der TLS-Verschlüsselung (auch als SSL bezeichnet). Ohne diese Einstellung funktioniert die Verbindung nicht.

Wenn Sie Node.js verwenden, empfiehlt sich das Paket mysql2, das Promise-Support bietet. Installation:

npm install mysql2

Hier ein Beispiel, das Sie anpassen können:

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

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

  // Erstellt die Datenbank, falls sie noch nicht existiert
  await db.query('CREATE DATABASE IF NOT EXISTS stackherotest');

  // Erstellt die Tabelle users, falls sie noch nicht existiert
  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;'
  );

  // Fügt einen Beispielbenutzer ein
  await db.query(
    'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
    [
      [
        Math.round(Math.random() * 100000), // Generiert eine userId
        'User name',                         // name
        'User address',                      // address
        '[email protected]'                     // email
      ]
    ]
  );

  // Zählt die Benutzer in der Tabelle
  const [usersCount] = await db.query('SELECT COUNT(*) AS `cpt` FROM `stackherotest`.`users`');
  console.log(`Es gibt jetzt ${usersCount[0].cpt} Einträge in der Tabelle "users"`);

  // Schließt die Verbindung
  await db.end();

})().catch(error => {
  console.error('');
  console.error('Es ist ein Fehler aufgetreten!');
  console.error(error);
  process.exit(1);
});

Für Node.js, NestJS oder TypeORM können Sie SSL aktivieren, indem Sie die Option ssl hinzufügen:

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

Um sich mit Prisma mit MariaDB zu verbinden, fügen Sie einfach sslaccept=strict zu Ihrer Verbindungs-URL hinzu. Zum Beispiel, wenn Sie sich als "root" mit der Datenbank "root" verbinden:

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

Falls noch nicht geschehen, können Sie das Modul mysqlclient installieren, um Django mit MariaDB zu verbinden:

pip install mysqlclient

Falls Sie beim Installieren den Fehler Exception: Can not find valid pkg-config name erhalten, müssen Sie eventuell zuerst das Paket libmysqlclient installieren. Für Ubuntu/Debian:

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

Um Ihre Verbindung zu testen, können Sie Ihre Zugangsdaten zunächst direkt in settings.py eintragen. Das ist für Tests in Ordnung, aber nicht sicher für den Produktivbetrieb.

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

Hinweis: Dieses Beispiel dient nur zu Testzwecken. Verwenden Sie keine fest codierten Zugangsdaten in der Produktion.

Sobald die Verbindung funktioniert, ist es sicherer, die Zugangsdaten in Umgebungsvariablen zu speichern. Wenn Sie django-environ verwenden, können Sie es so installieren:

pip install django-environ

Anschließend aktualisieren Sie 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')
  }
}

Erstellen oder aktualisieren Sie dann die .env-Datei (im selben Verzeichnis wie settings.py) mit:

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

Um Ihre Zugangsdaten zu schützen, fügen Sie .env zu Ihrer .gitignore hinzu:

echo ".env" >> .gitignore

Um eine Spring-Anwendung mit MariaDB zu verbinden, können Sie die Umgebungsvariable SPRING_DATASOURCE_URL mit Ihrer Datenbank-URL und dem Präfix jdbc: setzen. Zum Beispiel:

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

Hier ein Beispiel, wie Sie Ihre Grails-Anwendung für die Verbindung zu MariaDB konfigurieren können:

dataSource {
  pooled = true
  driverClassName = "com.mysql.cj.jdbc.Driver"
  dialect = org.hibernate.dialect.MySQL8Dialect
  // SSL-spezifische Eigenschaften
  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" // Ersetzen Sie '/root' durch Ihren tatsächlichen Datenbanknamen.
      username = "root" // Es empfiehlt sich, einen eigenen Benutzer für Ihre Anwendung zu erstellen.
      password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD // Legen Sie idealerweise einen dedizierten Benutzer an.
      properties {
        maxActive = 50
        minEvictableIdleTimeMillis = 1800000
        timeBetweenEvictionRunsMillis = 1800000
        numTestsPerEvictionRun = 3
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        validationQuery = "SELECT 1"
      }
    }
  }
}

Aus Sicherheitsgründen empfiehlt es sich, für Ihre Anwendung einen eigenen Benutzer anzulegen, anstatt "root" zu verwenden. Das geht ganz einfach in phpMyAdmin:

  1. Klicken Sie in phpMyAdmin oben auf Benutzerkonten.
  2. Klicken Sie auf Benutzerkonto hinzufügen.
  3. Füllen Sie das Formular aus:
    • Wählen Sie einen Benutzernamen (oft den Namen Ihrer Anwendung).
    • Klicken Sie auf Passwort generieren für ein sicheres Passwort und kopieren Sie es.
    • Aktivieren Sie Datenbank mit gleichem Namen anlegen und alle Rechte gewähren.

Nach dem Absenden werden Ihr neuer Benutzer und eine passende Datenbank erstellt.

MariaDB ist ein unabhängiger Fork von MySQL, der von der Open-Source-Community nach der Übernahme von MySQL durch Oracle im Jahr 2010 entwickelt wurde. Für die meisten Anwendungsfälle bieten MariaDB und MySQL sehr ähnliche Funktionen und eine hohe Kompatibilität.