MariaDB: Erste Schritte

Wie man mit MariaDB beginnt

👋 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!

Der einfachste Weg, sich mit Ihrem MariaDB-Dienst zu verbinden, ist die Verwendung des MySQL-URL-Formats, vorausgesetzt, Ihr Treiber unterstützt es:

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

Für Ruby-Nutzer unterscheidet sich die MySQL-URL leicht:

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

Nachfolgend finden Sie einige Beispiele zur Verwendung von PHP, um sich mit MariaDB über verschiedene Erweiterungen zu verbinden. Denken Sie daran, dass die Verwendung der 'root'-Datenbank in der Produktion nicht empfohlen wird. Erstellen Sie stattdessen eine dedizierte Datenbank und einen Benutzer.

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Es wird nicht empfohlen, die 'root'-Datenbank zu verwenden. Dies ist nur für das Beispiel. Die beste Praxis ist es, eine dedizierte Datenbank und einen Benutzer in phpMyAdmin zu erstellen und diese hier zu verwenden.

$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'; // Es wird nicht empfohlen, die 'root'-Datenbank zu verwenden. Dies ist nur für das Beispiel. Die beste Praxis ist es, eine dedizierte Datenbank und einen Benutzer in phpMyAdmin zu erstellen und diese hier zu verwenden.

$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'; // Es wird nicht empfohlen, die 'root'-Datenbank zu verwenden. Dies ist nur für das Beispiel. Die beste Praxis ist es, eine dedizierte Datenbank und einen Benutzer in phpMyAdmin zu erstellen und diese hier zu verwenden.

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

$options = array(
  // Wenn Sie auf einen Fehler wie "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed" stoßen, überprüfen Sie, ob das Verzeichnis /etc/ssl/certs/ 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 mit einer Datenbank verbunden, die Version ' . $version[0] . "\n" ausführt;

?>

Wenn Sie den Fehler erhalten:

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

liegt das wahrscheinlich daran, dass das Verzeichnis /etc/ssl/certs/ die CA-Zertifikate nicht enthält. Wenn Sie Systemzugriff haben, können Sie diese Zertifikate wie folgt installieren:

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

    apt-get install ca-certificates
    
  2. Unter Alpine Linux führen Sie aus:

    apk add ca-certificates
    

Wenn Sie keinen direkten Zugriff auf das System haben, das Ihren PHP-Code ausführt, können Sie das Zertifikat manuell installieren:

  1. Laden Sie das Zertifikat herunter: https://letsencrypt.org/certs/isrgrootx1.pem
  2. Fügen Sie die Datei isrgrootx1.pem zu Ihren PHP-Projektdateien hinzu.
  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 den folgenden sehen:

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

oder einen ähnlichen Fehler, der eine undefinierte Konstante für PDO MySQL-Attribute erwähnt, bedeutet dies, dass Ihre PDO-Installation keine MySQL-Unterstützung hat.

Lösung für Ubuntu/Debian

Installieren Sie die erforderliche PHP MySQL-Erweiterung mit:

sudo apt-get install php-mysql
Lösung für Docker

Wenn Sie Docker verwenden, stellen Sie sicher, dass die MySQL-Unterstützung während des Build-Prozesses enthalten ist. Erwägen Sie, Folgendes zu Ihrem Dockerfile hinzuzufügen:

RUN docker-php-ext-install pdo pdo_mysql

Bearbeiten Sie die .env-Datei und definieren Sie die DATABASE_URL-Variable wie folgt:

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

Aktualisieren Sie anschließend die Datei config/packages/doctrine.yaml, indem Sie den Treiber und die Optionen wie folgt festlegen:

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 den Fehler stoßen:

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

bedeutet das wahrscheinlich, dass das Verzeichnis /etc/ssl/certs/ die CA-Zertifikate nicht enthält. Sie können dies beheben, indem Sie sie installieren:

  • Unter Ubuntu/Debian führen Sie aus:

    sudo apt-get install ca-certificates
    
  • Unter Alpine Linux führen Sie aus:

    apk add ca-certificates
    

Wenn Sie die Zertifikate nicht systemweit installieren können, können Sie sie manuell hinzufügen:

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

  2. Platzieren Sie die Datei isrgrootx1.pem in Ihrem Symfony-Projekt.

  3. Aktualisieren Sie dann die Datei config/packages/doctrine.yaml, um das lokale Zertifikat zu verwenden:

    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 einzurichten, bearbeiten Sie die Datei config/database.php und aktualisieren Sie die mysql-Konfiguration wie folgt:

'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([
      // Wenn Sie auf SSL-Fehler wie "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed" stoßen, beachten Sie die obigen Anweisungen.
      PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
      // PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
      PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
    ])
    : [],
],

Fügen Sie in Ihrer database.php-Datei die folgende Konfiguration ein:

$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 am besten, Ihre Anmeldeinformationen nicht fest zu codieren. Verwenden Sie stattdessen Umgebungsvariablen. Sie können die Anmeldeinformationen 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 Verbindung von WordPress zu Stackhero für MariaDB ist einfach. Bearbeiten Sie die Datei wp-config.php und konfigurieren Sie Ihre Datenbankeinstellungen wie folgt:

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

Der wichtige Teil hier ist die Aktivierung der TLS-Verschlüsselung (auch bekannt als SSL). Ohne sie wird die Verbindung nicht funktionieren.

In diesem Beispiel verwenden wir das mysql2-Paket mit Unterstützung für Promises. Installieren Sie es zuerst mit:

npm install mysql2

Verwenden Sie dann den folgenden Code:

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

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

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

  // Erstellen Sie 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ügen Sie einen fiktiven Benutzer hinzu
  await db.query(
    'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
    [
      [
        Math.round(Math.random() * 100000), // Generieren Sie eine fiktive userId
        'Benutzername',                      // 'name'-Spalte
        'Benutzeradresse',                   // 'address'-Spalte
        'user@email.com'                     // 'email'-Spalte
      ]
    ]
  );

  // Zählen Sie die Anzahl der Zeilen in der Tabelle 'users'
  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ßen Sie die Verbindung zu MariaDB
  await db.end();

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

Beim Verbinden von Node.js, NestJS oder TypeORM fügen Sie die ssl-Option wie gezeigt hinzu:

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 zu verbinden, fügen Sie die Option sslaccept=strict hinzu, um sicherzustellen, dass die SSL-Verschlüsselung aktiviert ist. Zum Beispiel, wenn Sie den Benutzer "root" verwenden, um sich mit der Datenbank "root" zu verbinden:

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

Wenn Sie das mysqlclient-Modul (zum Verbinden mit MariaDB) noch nicht installiert haben, führen Sie aus:

pip install mysqlclient

Wenn Sie den Fehler Exception: Can not find valid pkg-config name beim Installieren von mysqlclient erhalten, installieren Sie das libmysqlclient-Paket. Unter Ubuntu/Debian können Sie ausführen:

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

Anfangs können Sie Ihre Anmeldeinformationen direkt in der Datei settings.py für Tests speichern, wie unten gezeigt. Beachten Sie, dass dieser Ansatz für die Produktion nicht sicher ist.

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

Achtung Seien Sie vorsichtig: Dieses Beispiel wird nicht für die Produktion empfohlen und dient nur zu Testzwecken!

Sobald die Verbindung funktioniert, ist es am besten, Umgebungsvariablen zu verwenden, um Ihre Anmeldeinformationen zu speichern. Zum Beispiel mit django-environ, installieren Sie es zuerst:

pip install django-environ

Aktualisieren Sie dann settings.py wie folgt:

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 die .env-Datei (im selben Verzeichnis wie settings.py) mit folgendem Inhalt:

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

Fügen Sie schließlich .env zu Ihrer .gitignore hinzu, um zu verhindern, dass sensible Informationen committet werden:

echo ".env" >> .gitignore

Um Ihre Spring-Anwendung zu verbinden, setzen Sie die Umgebungsvariable SPRING_DATASOURCE_URL mit Ihrer Datenbank-URL, die mit jdbc: beginnt. Zum Beispiel:

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

Das folgende Beispiel zeigt, wie Sie Ihre Grails-Anwendung konfigurieren, um sich mit MariaDB zu verbinden:

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 den gewünschten Datenbanknamen.
      username = "root" // Es ist ratsam, einen dedizierten Benutzer zu erstellen, anstatt 'root' zu verwenden.
      password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD // Erwägen Sie, einen dedizierten Benutzer zu erstellen.
      properties {
        maxActive = 50
        minEvictableIdleTimeMillis = 1800000
        timeBetweenEvictionRunsMillis = 1800000
        numTestsPerEvictionRun = 3
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        validationQuery = "SELECT 1"
      }
    }
  }
}

Es ist ratsam, einen dedizierten Benutzer für Ihre Anwendung zu erstellen, anstatt den 'root'-Benutzer zu verwenden. Der einfachste Weg, dies zu tun, ist über phpMyAdmin:

  1. Klicken Sie in phpMyAdmin oben auf Benutzerkonten.
  2. Klicken Sie auf Benutzerkonto hinzufügen.
  3. Füllen Sie das Benutzererstellungsformular aus:
    • Wählen Sie einen Kontonamen (normalerweise den Namen Ihrer Anwendung).
    • Klicken Sie auf Passwort generieren für ein sicheres Passwort und kopieren Sie es dann.
    • Aktivieren Sie die Option Datenbank mit demselben Namen erstellen und alle Berechtigungen gewähren.

Nach dem Absenden wird ein neuer Benutzer erstellt, zusammen mit einer Datenbank, die denselben Namen wie der Benutzername trägt.

MariaDB ist ein unabhängiger Fork, der von der Open-Source-Community erstellt wurde, nachdem Oracle MySQL im Jahr 2010 übernommen hatte. Für die meisten Zwecke sind MariaDB und MySQL sehr ähnlich.