MariaDB: Pierwsze kroki

Jak zacząć z MariaDB

👋 Witamy w dokumentacji Stackhero!

Stackhero oferuje gotowe do użycia rozwiązanie MariaDB cloud, które zapewnia wiele korzyści, w tym:

  • Nieograniczone połączenia i transfery.
  • Włączony interfejs webowy phpMyAdmin.
  • Bezproblemowe aktualizacje jednym kliknięciem.
  • Optymalna wydajność i solidne zabezpieczenia dzięki prywatnej i dedykowanej VM.

Oszczędzaj czas i upraszczaj swoje życie: wypróbowanie rozwiązania MariaDB cloud hosting Stackhero zajmuje tylko 5 minut!

Najprostszym sposobem na połączenie się z usługą MariaDB jest użycie formatu URL MySQL, pod warunkiem, że sterownik to obsługuje:

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

Dla użytkowników Ruby, URL MySQL różni się nieco:

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

Poniżej znajduje się kilka przykładów użycia PHP do połączenia z MariaDB przy użyciu różnych rozszerzeń. Pamiętaj, że używanie bazy danych 'root' nie jest zalecane w środowisku produkcyjnym. Zamiast tego rozważ utworzenie dedykowanej bazy danych i użytkownika.

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Nie zaleca się używania bazy danych 'root'. To tylko przykład. Najlepszą praktyką jest utworzenie dedykowanej bazy danych i użytkownika w phpMyAdmin i użycie ich tutaj.

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

echo 'Połączenie udane... ' . $mysqli->host_info . "\n";

$mysqli->close();

?>
<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Nie zaleca się używania bazy danych 'root'. To tylko przykład. Najlepszą praktyką jest utworzenie dedykowanej bazy danych i użytkownika w phpMyAdmin i użycie ich tutaj.

$mysqli = mysqli_init();
$mysqliConnected = mysqli_real_connect($mysqli, $hostname, $user, $password, $database, $port, NULL, MYSQLI_CLIENT_SSL);
if (!$mysqliConnected) {
  die('Błąd połączenia: ' . mysqli_connect_error($mysqli));
}

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

mysqli_close($mysqli);

?>
<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Nie zaleca się używania bazy danych 'root'. To tylko przykład. Najlepszą praktyką jest utworzenie dedykowanej bazy danych i użytkownika w phpMyAdmin i użycie ich tutaj.

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

$options = array(
  // Jeśli napotkasz błąd taki jak "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", sprawdź, czy katalog /etc/ssl/certs/ zawiera certyfikaty 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 'Jesteś połączony z bazą danych w wersji ' . $version[0] . "\n";

?>

Jeśli otrzymasz błąd:

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

to prawdopodobnie dlatego, że katalog /etc/ssl/certs/ nie zawiera certyfikatów CA. Jeśli masz dostęp do systemu, możesz zainstalować te certyfikaty w następujący sposób:

  1. Na Ubuntu, możesz uruchomić:

    apt-get install ca-certificates
    
  2. Na Alpine Linux, uruchom:

    apk add ca-certificates
    

Jeśli nie masz bezpośredniego dostępu do systemu uruchamiającego twój kod PHP, możesz zainstalować certyfikat ręcznie:

  1. Pobierz certyfikat: https://letsencrypt.org/certs/isrgrootx1.pem
  2. Dodaj plik isrgrootx1.pem do plików projektu PHP.
  3. Skomentuj linię z PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/'
  4. Odkomentuj linię z PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'

Jeśli zobaczysz błąd taki jak:

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

lub podobny błąd wspominający o niezdefiniowanej stałej dla atrybutów PDO MySQL, oznacza to, że twoja instalacja PDO nie ma wsparcia dla MySQL.

Rozwiązanie dla Ubuntu/Debian

Zainstaluj wymaganą rozszerzenie PHP MySQL za pomocą:

sudo apt-get install php-mysql
Rozwiązanie dla Docker

Jeśli używasz Docker, upewnij się, że wsparcie MySQL jest uwzględnione podczas procesu budowania. Rozważ dodanie następującego do swojego Dockerfile:

RUN docker-php-ext-install pdo pdo_mysql

Edytuj plik .env i zdefiniuj zmienną DATABASE_URL w następujący sposób:

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

Następnie zaktualizuj plik config/packages/doctrine.yaml, ustawiając sterownik i opcje w następujący sposób:

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

Jeśli napotkasz błąd:

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

to prawdopodobnie oznacza, że katalog /etc/ssl/certs/ nie zawiera certyfikatów CA. Możesz to rozwiązać, instalując je:

  • Na Ubuntu/Debian, uruchom:

    sudo apt-get install ca-certificates
    
  • Na Alpine Linux, uruchom:

    apk add ca-certificates
    

Jeśli nie możesz zainstalować certyfikatów systemowo, możesz dodać je ręcznie:

  1. Pobierz certyfikat: https://letsencrypt.org/certs/isrgrootx1.pem

  2. Umieść plik isrgrootx1.pem w swoim projekcie Symfony.

  3. Następnie zaktualizuj plik config/packages/doctrine.yaml, aby używać lokalnego certyfikatu:

    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
    

Aby skonfigurować MariaDB z Laravel, edytuj plik config/database.php i zaktualizuj konfigurację mysql w następujący sposób:

'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([
      // Jeśli napotkasz błędy SSL takie jak "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", zapoznaj się z powyższymi instrukcjami.
      PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
      // PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
      PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
    ])
    : [],
],

W swoim pliku database.php, wstaw następującą konfigurację:

$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'); // Zgodnie z konwencją, nazwa bazy danych odpowiada nazwie użytkownika.
  'dbdriver' => 'mysqli',
  'dbprefix' => '',
  'pconnect' => TRUE,
  'char_set' => 'utf8',
  'dbcollat' => 'utf8_general_ci',
  'encrypt'  => array() // Ważne: aktywuj szyfrowanie TLS
);

Najlepiej unikać twardego kodowania swoich danych uwierzytelniających. Zamiast tego rozważ użycie zmiennych środowiskowych. Możesz pobrać dane uwierzytelniające w następujący sposób:

$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'); // Zgodnie z konwencją, nazwa bazy danych odpowiada nazwie użytkownika.

Łączenie WordPress z Stackhero dla MariaDB jest proste. Edytuj plik wp-config.php i skonfiguruj ustawienia bazy danych w następujący sposób:

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

// Włącz szyfrowanie TLS (znane również jako SSL)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

Ważne jest tutaj włączenie szyfrowania TLS (znane również jako SSL). Bez tego połączenie nie zadziała.

W tym przykładzie używamy pakietu mysql2 z obsługą obietnic. Najpierw zainstaluj go za pomocą:

npm install mysql2

Następnie użyj następującego kodu:

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

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

  // Utwórz bazę danych 'stackherotest', jeśli jeszcze nie istnieje
  await db.query('CREATE DATABASE IF NOT EXISTS stackherotest');

  // Utwórz tabelę 'users', jeśli jeszcze nie istnieje
  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;'
  );

  // Wstaw fikcyjnego użytkownika
  await db.query(
    'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
    [
      [
        Math.round(Math.random() * 100000), // Generuj fikcyjny userId
        'Nazwa użytkownika',                // Kolumna 'name'
        'Adres użytkownika',                // Kolumna 'address'
        'user@email.com'                    // Kolumna 'email'
      ]
    ]
  );

  // Policz liczbę wierszy w tabeli 'users'
  const [usersCount] = await db.query('SELECT COUNT(*) AS `cpt` FROM `stackherotest`.`users`');
  console.log(`Obecnie w tabeli "users" znajduje się ${usersCount[0].cpt} wpisów`);

  // Zamknij połączenie z MariaDB
  await db.end();

})().catch(error => {
  console.error('');
  console.error('🐞 Wystąpił błąd!');
  console.error(error);
  process.exit(1);
});

Podczas łączenia z Node.js, NestJS lub TypeORM, uwzględnij opcję ssl jak pokazano:

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

Aby połączyć się z Prisma, dodaj opcję sslaccept=strict, aby zapewnić włączenie szyfrowania SSL. Na przykład, używając użytkownika "root" łączącego się z bazą danych "root":

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

Jeśli jeszcze nie zainstalowałeś modułu mysqlclient (używanego do połączenia z MariaDB), uruchom:

pip install mysqlclient

Jeśli napotkasz błąd Exception: Can not find valid pkg-config name podczas instalacji mysqlclient, zainstaluj pakiet libmysqlclient. Na Ubuntu/Debian, możesz uruchomić:

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

Początkowo możesz przechowywać swoje dane uwierzytelniające bezpośrednio w pliku settings.py do testów, jak pokazano poniżej. Zauważ, że to podejście nie jest bezpieczne w środowisku produkcyjnym.

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

uwaga Bądź ostrożny: ten przykład nie jest zalecany do produkcji i jest tylko do celów testowych!

Gdy połączenie działa, najlepiej używać zmiennych środowiskowych do przechowywania danych uwierzytelniających. Na przykład, używając django-environ, najpierw zainstaluj go:

pip install django-environ

Następnie zaktualizuj settings.py w następujący sposób:

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

Utwórz lub zaktualizuj plik .env (w tym samym katalogu co settings.py) z następującym:

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

Na koniec dodaj .env do swojego .gitignore, aby zapobiec przypadkowemu przesłaniu wrażliwych informacji:

echo ".env" >> .gitignore

Aby połączyć swoją aplikację Spring, ustaw zmienną środowiskową SPRING_DATASOURCE_URL z URL-em bazy danych, poprzedzonym jdbc:. Na przykład:

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

Poniższy przykład pokazuje, jak skonfigurować aplikację Grails do połączenia z MariaDB:

dataSource {
  pooled = true
  driverClassName = "com.mysql.cj.jdbc.Driver"
  dialect = org.hibernate.dialect.MySQL8Dialect
  // Właściwości specyficzne dla 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" // Zastąp '/root' nazwą swojej bazy danych.
      username = "root" // Zaleca się utworzenie dedykowanego użytkownika zamiast używania 'root'.
      password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD // Rozważ utworzenie dedykowanego użytkownika.
      properties {
        maxActive = 50
        minEvictableIdleTimeMillis = 1800000
        timeBetweenEvictionRunsMillis = 1800000
        numTestsPerEvictionRun = 3
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        validationQuery = "SELECT 1"
      }
    }
  }
}

Dobrą praktyką jest utworzenie dedykowanego użytkownika dla swojej aplikacji zamiast używania użytkownika 'root'. Najprostszym sposobem na to jest użycie phpMyAdmin:

  1. W phpMyAdmin, kliknij Konta użytkowników na górze.
  2. Kliknij Dodaj konto użytkownika.
  3. Wypełnij formularz tworzenia użytkownika:
    • Wybierz nazwę konta (zazwyczaj nazwę swojej aplikacji).
    • Kliknij Generuj hasło dla bezpiecznego hasła, a następnie je skopiuj.
    • Zaznacz opcję Utwórz bazę danych o tej samej nazwie i przyznaj wszystkie uprawnienia.

Po przesłaniu, zostanie utworzony nowy użytkownik wraz z bazą danych o tej samej nazwie co nazwa użytkownika.

MariaDB to niezależny fork stworzony przez społeczność open source po przejęciu MySQL przez Oracle w 2010 roku. W większości przypadków MariaDB i MySQL są bardzo podobne.