MariaDB: Pradžia

Kaip pradėti naudotis MariaDB

👋 Sveiki atvykę į Stackhero dokumentaciją!

Stackhero siūlo paruoštą naudoti MariaDB cloud sprendimą, kuris suteikia daugybę privalumų, įskaitant:

  • Neriboti prisijungimai ir perdavimai.
  • Įtraukta phpMyAdmin žiniatinklio sąsaja.
  • Lengvi atnaujinimai vienu paspaudimu.
  • Optimali veikla ir tvirta sauga, užtikrinta privačia ir dedikuota VM.

Taupykite laiką ir supaprastinkite savo gyvenimą: išbandyti Stackhero MariaDB cloud hosting sprendimą užtrunka tik 5 minutes!

Lengviausias būdas prisijungti prie savo MariaDB paslaugos yra naudoti MySQL URL formatą, jei jūsų tvarkyklė jį palaiko:

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

Jei naudojate Ruby, MySQL URL yra šiek tiek kitoks:

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

Žemiau pateikiami keli pavyzdžiai, kaip galite prisijungti prie MariaDB iš PHP naudojant skirtingus plėtinius. Nors šiuose pavyzdžiuose naudojama „root“ duomenų bazė, rekomenduojama sukurti atskirą duomenų bazę ir naudotoją savo aplikacijai, ypač gamybinėje aplinkoje.

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Tik demonstracijai. Geriausia praktika – sukurkite savo duomenų bazę ir naudotoją per phpMyAdmin ir naudokite tuos prisijungimus.

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

echo 'Connection successful... ' . $mysqli->host_info . "\n";

$mysqli->close();

?>
<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Tik demonstracijai. Geriausia praktika – sukurkite savo duomenų bazę ir naudotoją per phpMyAdmin ir naudokite tuos prisijungimus.

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

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

mysqli_close($mysqli);

?>
<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Tik demonstracijai. Geriausia praktika – sukurkite savo duomenų bazę ir naudotoją per phpMyAdmin ir naudokite tuos prisijungimus.

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

$options = array(
  // Jei gaunate klaidą, pvz., "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", įsitikinkite, kad jūsų /etc/ssl/certs/ kataloge yra CA sertifikatai.
  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 'You are connected to a database running version ' . $version[0] . "\n";

?>

Jei matote šią klaidą:

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

greičiausiai kataloge /etc/ssl/certs/ trūksta reikiamų CA sertifikatų. Jei turite prieigą prie sistemos, galite juos įdiegti taip:

  1. Ubuntu sistemoje vykdykite:

    apt-get install ca-certificates
    
  2. Alpine Linux sistemoje bandykite:

    apk add ca-certificates
    

Jei neturite sistemos lygio prieigos, galite pridėti sertifikatą rankiniu būdu:

  1. Atsisiųskite sertifikatą: https://letsencrypt.org/certs/isrgrootx1.pem
  2. Įdėkite isrgrootx1.pem failą į savo PHP projektą.
  3. Pakomentuokite eilutę su PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/'
  4. Atkomentuokite eilutę su PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'

Jei matote tokią klaidą:

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

arba panašią žinutę apie nedefinuotą PDO MySQL konstantą, tikėtina, kad jūsų PDO diegimas neturi MySQL palaikymo.

Ubuntu/Debian sistemoje

Reikiamą PHP MySQL plėtinį galite įdiegti taip:

sudo apt-get install php-mysql
Jei naudojate Docker

Kad užtikrintumėte MySQL palaikymą, pridėkite šią eilutę į savo Dockerfile:

RUN docker-php-ext-install pdo pdo_mysql

### MariaDB naudojimas su Symfony ir Doctrine

Norėdami pradėti, redaguokite savo `.env` failą ir nustatykite `DATABASE_URL` kintamąjį taip:

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


Tada atnaujinkite `config/packages/doctrine.yaml` failą, kad nustatytumėte tvarkyklę ir parinktis:

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

Jei susiduriate su šia klaida:

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

greičiausiai jūsų sistemoje nėra įdiegtų CA sertifikatų. Štai keli būdai juos įdiegti:

  • Ubuntu/Debian sistemoje vykdykite:

    sudo apt-get install ca-certificates
    
  • Alpine Linux sistemoje bandykite:

    apk add ca-certificates
    

Jei negalite įdiegti CA sertifikatų sistemos lygiu, galite juos pridėti rankiniu būdu:

  1. Atsisiųskite sertifikatą: https://letsencrypt.org/certs/isrgrootx1.pem

  2. Įdėkite isrgrootx1.pem failą į savo Symfony projektą.

  3. Atnaujinkite config/packages/doctrine.yaml failą:

    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
    

Norėdami sukonfigūruoti MariaDB su Laravel, atidarykite config/database.php ir atnaujinkite mysql konfigūraciją taip:

'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([
      // Jei susiduriate su SSL klaidomis, pvz., "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", žr. aukščiau pateiktus trikčių šalinimo veiksmus.
      PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
      // PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
      PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
    ])
    : [],
],

Savo database.php faile galite nustatyti šią konfigūraciją:

$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'), // Pagal susitarimą, duomenų bazės pavadinimas atitinka naudotojo vardą.
  'dbdriver' => 'mysqli',
  'dbprefix' => '',
  'pconnect' => TRUE,
  'char_set' => 'utf8',
  'dbcollat' => 'utf8_general_ci',
  'encrypt'  => array() // Svarbu: aktyvuokite TLS šifravimą
);

Gera praktika yra nelaikyti prisijungimo duomenų kodo viduje, o naudoti aplinkos kintamuosius. Juos galite gauti taip:

$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'); // Pagal susitarimą, duomenų bazės pavadinimas atitinka naudotojo vardą.

WordPress prijungimas prie Stackhero MariaDB yra paprastas. Savo wp-config.php faile nustatykite šiuos duomenų bazės parametrus:

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

// Įjunkite TLS šifravimą (dar vadinamą SSL)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

Svarbiausias žingsnis čia – įjungti TLS šifravimą (kartais vadinamą SSL). Be jo prisijungimas neveiks.

Jei naudojate Node.js, galite naudoti mysql2 paketą, kuris palaiko promise. Norėdami įdiegti:

npm install mysql2

Štai pavyzdys, kurį galite pritaikyti:

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

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

  // Sukuria duomenų bazę, jei jos dar nėra
  await db.query('CREATE DATABASE IF NOT EXISTS stackherotest');

  // Sukuria users lentelę, jei jos dar nėra
  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;'
  );

  // Įterpia pavyzdinį naudotoją
  await db.query(
    'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
    [
      [
        Math.round(Math.random() * 100000), // Sugeneruoja userId
        'User name',                         // name
        'User address',                      // address
        '[email protected]'                     // email
      ]
    ]
  );

  // Suskaičiuoja naudotojus lentelėje
  const [usersCount] = await db.query('SELECT COUNT(*) AS `cpt` FROM `stackherotest`.`users`');
  console.log(`Dabar lentelėje "users" yra ${usersCount[0].cpt} įrašų`);

  // Uždaro prisijungimą
  await db.end();

})().catch(error => {
  console.error('');
  console.error('Įvyko klaida!');
  console.error(error);
  process.exit(1);
});

Node.js, NestJS ar TypeORM atveju galite įjungti SSL, pridėdami ssl parinktį:

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

Norėdami prisijungti prie MariaDB su Prisma, tiesiog pridėkite sslaccept=strict prie savo prisijungimo URL. Pavyzdžiui, jei jungiatės kaip „root“ prie „root“ duomenų bazės:

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

Jei dar nepadarėte, galite įdiegti mysqlclient modulį, kad prijungtumėte Django prie MariaDB:

pip install mysqlclient

Jei diegiant gaunate klaidą Exception: Can not find valid pkg-config name, gali reikėti iš pradžių įdiegti libmysqlclient paketą. Ubuntu/Debian sistemose:

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

Norėdami patikrinti prisijungimą, galite pradėti įrašydami prisijungimo duomenis tiesiai į settings.py. Tai tinka testavimui, bet nėra saugu gamyboje.

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

Atkreipkite dėmesį: šis pavyzdys skirtas tik testavimui. Nenaudokite kietai įrašytų prisijungimų gamyboje.

Kai įsitikinsite, kad prisijungimas veikia, saugiau laikyti prisijungimus aplinkos kintamuosiuose. Jei naudojate django-environ, galite jį įdiegti taip:

pip install django-environ

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

Tada sukurkite arba atnaujinkite .env failą (toje pačioje direktorijoje kaip settings.py) su:

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

Galiausiai, kad apsaugotumėte prisijungimus, pridėkite .env į savo .gitignore:

echo ".env" >> .gitignore

Norėdami prijungti Spring aplikaciją prie MariaDB, nustatykite aplinkos kintamąjį SPRING_DATASOURCE_URL su savo duomenų bazės URL, naudojant jdbc: priešdėlį. Pavyzdžiui:

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

Štai pavyzdys, kaip galite sukonfigūruoti savo Grails aplikaciją prisijungti prie MariaDB:

dataSource {
  pooled = true
  driverClassName = "com.mysql.cj.jdbc.Driver"
  dialect = org.hibernate.dialect.MySQL8Dialect
  // SSL specifinės savybės
  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" // Pakeiskite '/root' į tikrą savo duomenų bazės pavadinimą.
      username = "root" // Rekomenduojama sukurti atskirą naudotoją jūsų aplikacijai.
      password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD // Rekomenduojama sukurti atskirą naudotoją.
      properties {
        maxActive = 50
        minEvictableIdleTimeMillis = 1800000
        timeBetweenEvictionRunsMillis = 1800000
        numTestsPerEvictionRun = 3
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        validationQuery = "SELECT 1"
      }
    }
  }
}

Didesniam saugumui rekomenduojama sukurti atskirą naudotoją savo aplikacijai, o ne naudoti „root“. Tai galite lengvai padaryti per phpMyAdmin:

  1. phpMyAdmin viršuje spauskite User accounts.
  2. Spauskite Add user account.
  3. Užpildykite formą:
    • Pasirinkite naudotojo vardą (dažnai tai jūsų aplikacijos pavadinimas).
    • Spauskite Generate password, kad sugeneruotumėte stiprų slaptažodį, ir jį nukopijuokite.
    • Pažymėkite Create database with same name and grant all privileges.

Patvirtinus, bus sukurtas naujas naudotojas ir atitinkama duomenų bazė.

MariaDB yra nepriklausomas MySQL fork'as, sukurtas atvirojo kodo bendruomenės po to, kai Oracle 2010 metais įsigijo MySQL. Daugeliu atvejų MariaDB ir MySQL siūlo labai panašias funkcijas ir suderinamumą.