MariaDB: Pierwsze kroki

Jak rozpocząć pracę 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 połączenia się z usługą MariaDB jest użycie formatu URL MySQL, o ile Twój sterownik go obsługuje:

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

Jeśli korzystasz z Ruby, adres URL MySQL jest nieco inny:

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

Poniżej znajdziesz kilka przykładów pokazujących, jak połączyć się z MariaDB z poziomu PHP przy użyciu różnych rozszerzeń. Chociaż w przykładach używana jest baza "root", zalecamy utworzenie dedykowanej bazy danych i użytkownika dla Twojej aplikacji, szczególnie w środowisku produkcyjnym.

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Tylko do demonstracji. Zalecana praktyka to utworzenie własnej bazy i użytkownika w phpMyAdmin i używanie tych danych.

$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'; // Tylko do demonstracji. Zalecana praktyka to utworzenie własnej bazy i użytkownika w phpMyAdmin i używanie tych danych.

$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'; // Tylko do demonstracji. Zalecana praktyka to utworzenie własnej bazy i użytkownika w phpMyAdmin i używanie tych danych.

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

$options = array(
  // Jeśli pojawi się błąd typu "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", upewnij się, że 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 'Połączono z bazą danych w wersji ' . $version[0] . "\n";

?>

Jeśli pojawi się taki błąd:

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

prawdopodobnie katalog /etc/ssl/certs/ nie zawiera wymaganych certyfikatów CA. Jeśli masz dostęp do systemu, możesz je zainstalować na przykład tak:

  1. Na Ubuntu uruchom:

    apt-get install ca-certificates
    
  2. Na Alpine Linux spróbuj:

    apk add ca-certificates
    

Jeśli nie masz dostępu do systemu, możesz dodać certyfikat ręcznie:

  1. Pobierz certyfikat: https://letsencrypt.org/certs/isrgrootx1.pem
  2. Umieść plik isrgrootx1.pem w swoim projekcie PHP.
  3. Zakomentuj linię PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/'
  4. Odkomentuj linię PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'

Jeśli pojawi się błąd taki jak:

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

lub podobny komunikat dotyczący niezdefiniowanej stałej PDO MySQL, prawdopodobnie Twoja instalacja PDO nie obsługuje MySQL.

Na Ubuntu/Debian

Wymaganą bibliotekę PHP MySQL możesz zainstalować poleceniem:

sudo apt-get install php-mysql
Jeśli korzystasz z Dockera

Aby mieć pewność, że wsparcie MySQL jest dostępne, dodaj do swojego Dockerfile:

RUN docker-php-ext-install pdo pdo_mysql

### Używanie MariaDB z Symfony i Doctrine

Aby rozpocząć, edytuj plik `.env` i ustaw 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`, aby ustawić sterownik i opcje:

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

Jeśli pojawi się taki błąd:

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

prawdopodobnie na Twoim systemie nie są zainstalowane certyfikaty CA. Możesz je zainstalować na przykład tak:

  • Na Ubuntu/Debian uruchom:

    sudo apt-get install ca-certificates
    
  • Na Alpine Linux spróbuj:

    apk add ca-certificates
    

Jeśli nie możesz zainstalować certyfikatów CA 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. Zaktualizuj plik 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
    

Aby skonfigurować MariaDB z Laravel, otwórz 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 pojawią się błędy SSL typu "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", zobacz powyższe kroki rozwiązywania problemów.
      PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
      // PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
      PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
    ])
    : [],
],

W pliku database.php możesz ustawić 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 odpowiada nazwie użytkownika.
  'dbdriver' => 'mysqli',
  'dbprefix' => '',
  'pconnect' => TRUE,
  'char_set' => 'utf8',
  'dbcollat' => 'utf8_general_ci',
  'encrypt'  => array() // Ważne: aktywuj szyfrowanie TLS
);

Dobrą praktyką jest przechowywanie danych dostępowych poza kodem, korzystając ze zmiennych środowiskowych. Możesz je pobrać 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 odpowiada nazwie użytkownika.

Połączenie WordPressa ze Stackhero dla MariaDB jest bardzo proste. W pliku wp-config.php ustaw następujące parametry bazy danych:

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 (nazywane też SSL)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

Kluczowym krokiem jest tutaj włączenie szyfrowania TLS (czasem nazywanego SSL). Połączenie nie zadziała bez tego ustawienia.

Jeśli korzystasz z Node.js, możesz użyć pakietu mysql2, który obsługuje promisy. Aby go zainstalować:

npm install mysql2

Oto przykład, który możesz dostosować:

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, 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 przykładowego użytkownika
  await db.query(
    'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
    [
      [
        Math.round(Math.random() * 100000), // Generuj userId
        'User name',                         // name
        'User address',                      // address
        '[email protected]'                     // email
      ]
    ]
  );

  // Policz użytkowników w tabeli
  const [usersCount] = await db.query('SELECT COUNT(*) AS `cpt` FROM `stackherotest`.`users`');
  console.log(`Aktualnie w tabeli "users" jest ${usersCount[0].cpt} wpisów`);

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

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

Dla Node.js, NestJS lub TypeORM możesz włączyć SSL, dodając opcję ssl:

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 MariaDB przez Prisma, wystarczy dodać sslaccept=strict do adresu URL połączenia. Przykładowo, jeśli łączysz się jako "root" do bazy "root":

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

Jeśli jeszcze tego nie zrobiłeś, możesz zainstalować moduł mysqlclient, aby połączyć Django z MariaDB:

pip install mysqlclient

Jeśli podczas instalacji pojawi się błąd Exception: Can not find valid pkg-config name, może być konieczne wcześniejsze zainstalowanie pakietu libmysqlclient. Na Ubuntu/Debian:

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

Aby przetestować połączenie, możesz na początek wpisać dane dostępowe bezpośrednio w pliku settings.py. To rozwiązanie nadaje się do testów, ale 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: ten przykład służy wyłącznie do testów. Nie należy używać danych dostępowych wpisanych na stałe w środowisku produkcyjnym.

Po potwierdzeniu działania połączenia, bezpieczniej jest przechowywać dane dostępowe w zmiennych środowiskowych. Jeśli korzystasz z django-environ, możesz go zainstalować tak:

pip install django-environ

Następnie zaktualizuj 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')
  }
}

Następnie utwórz lub zaktualizuj plik .env (w tym samym katalogu co settings.py) z zawartością:

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

Aby zabezpieczyć dane dostępowe, dodaj .env do pliku .gitignore:

echo ".env" >> .gitignore

Aby połączyć aplikację Spring z MariaDB, ustaw zmienną środowiskową SPRING_DATASOURCE_URL z adresem URL bazy danych, używając prefiksu jdbc:. Przykład:

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

Oto przykład konfiguracji aplikacji Grails do połączenia z MariaDB:

dataSource {
  pooled = true
  driverClassName = "com.mysql.cj.jdbc.Driver"
  dialect = org.hibernate.dialect.MySQL8Dialect
  // Właściwości związane z 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" // Zamień '/root' na faktyczną nazwę swojej bazy.
      username = "root" // Zalecane jest utworzenie dedykowanego użytkownika dla aplikacji.
      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"
      }
    }
  }
}

Ze względów bezpieczeństwa zaleca się utworzenie dedykowanego użytkownika dla aplikacji zamiast korzystania z "root". Możesz to zrobić łatwo w phpMyAdmin:

  1. W phpMyAdmin kliknij na User accounts u góry.
  2. Kliknij na Add user account.
  3. Wypełnij formularz:
    • Wybierz nazwę użytkownika (często jest to nazwa aplikacji).
    • Kliknij Generate password, aby wygenerować silne hasło i skopiuj je.
    • Zaznacz Create database with same name and grant all privileges.

Po zatwierdzeniu zostanie utworzony nowy użytkownik oraz odpowiadająca mu baza danych.

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