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!

Paprasčiausias būdas prisijungti prie jūsų 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

Ruby vartotojams MySQL URL šiek tiek skiriasi:

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

Žemiau pateikiami keli PHP naudojimo pavyzdžiai, padedantys prisijungti prie MariaDB naudojant skirtingus plėtinius. Atminkite, kad 'root' duomenų bazės naudojimas gamyboje nerekomenduojamas. Vietoj to, apsvarstykite galimybę sukurti atskirą duomenų bazę ir vartotoją.

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Nerekomenduojama naudoti 'root' duomenų bazės. Tai tik pavyzdys. Geriausia praktika yra sukurti atskirą duomenų bazę ir vartotoją phpMyAdmin ir naudoti juos čia.

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

echo 'Prisijungimas sėkmingas... ' . $mysqli->host_info . "\n";

$mysqli->close();

?>
<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Nerekomenduojama naudoti 'root' duomenų bazės. Tai tik pavyzdys. Geriausia praktika yra sukurti atskirą duomenų bazę ir vartotoją phpMyAdmin ir naudoti juos čia.

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

echo 'Sėkmė: ' . mysqli_get_host_info($mysqli) . "\n";

mysqli_close($mysqli);

?>
<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Nerekomenduojama naudoti 'root' duomenų bazės. Tai tik pavyzdys. Geriausia praktika yra sukurti atskirą duomenų bazę ir vartotoją phpMyAdmin ir naudoti juos čia.

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

$options = array(
  // Jei susiduriate su klaida, tokia kaip "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", patikrinkite, ar /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 'Jūs esate prisijungę prie duomenų bazės, kurioje veikia versija ' . $version[0] . "\n";

?>

Jei gaunate klaidą:

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

tai tikriausiai dėl to, kad /etc/ssl/certs/ kataloge nėra CA sertifikatų. Jei turite prieigą prie sistemos, galite įdiegti šiuos sertifikatus taip:

  1. Ubuntu galite paleisti:

    apt-get install ca-certificates
    
  2. Alpine Linux paleiskite:

    apk add ca-certificates
    

Jei neturite tiesioginės prieigos prie sistemos, kurioje veikia jūsų PHP kodas, galite įdiegti sertifikatą rankiniu būdu:

  1. Atsisiųskite sertifikatą: https://letsencrypt.org/certs/isrgrootx1.pem
  2. Pridėkite isrgrootx1.pem failą prie savo PHP projekto failų.
  3. Pakomentuokite eilutę su PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/'
  4. Iškomentuokite eilutę su PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'

Jei matote klaidą, tokią kaip:

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

arba panašią klaidą, nurodančią neapibrėžtą konstantą PDO MySQL atributams, tai reiškia, kad jūsų PDO diegimas neturi MySQL palaikymo.

Sprendimas Ubuntu/Debian

Įdiekite reikiamą PHP MySQL plėtinį su:

sudo apt-get install php-mysql
Sprendimas Docker

Jei naudojate Docker, įsitikinkite, kad MySQL palaikymas įtrauktas į kūrimo procesą. Apsvarstykite galimybę pridėti šį kodą prie savo Dockerfile:

RUN docker-php-ext-install pdo pdo_mysql

Redaguokite .env failą ir apibrėžkite DATABASE_URL kintamąjį taip:

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

Tada atnaujinkite config/packages/doctrine.yaml failą, nustatydami tvarkyklę ir parinktis taip:

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 klaida:

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

tai tikriausiai reiškia, kad /etc/ssl/certs/ kataloge nėra CA sertifikatų. Galite tai išspręsti juos įdiegdami:

  • Ubuntu/Debian paleiskite:

    sudo apt-get install ca-certificates
    
  • Alpine Linux paleiskite:

    apk add ca-certificates
    

Jei negalite įdiegti sertifikatų visoje sistemoje, 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. Tada atnaujinkite config/packages/doctrine.yaml failą, kad naudotumėte vietinį sertifikatą:

    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 nustatyti MariaDB su Laravel, redaguokite config/database.php failą 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, tokiomis kaip "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", žiūrėkite aukščiau pateiktas instrukcijas.
      PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
      // PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
      PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
    ])
    : [],
],

Jūsų database.php faile įterpkite š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 konvenciją, duomenų bazės pavadinimas atitinka vartotojo vardą.
  'dbdriver' => 'mysqli',
  'dbprefix' => '',
  'pconnect' => TRUE,
  'char_set' => 'utf8',
  'dbcollat' => 'utf8_general_ci',
  'encrypt'  => array() // Svarbu: aktyvuoti TLS šifravimą
);

Geriausia praktika yra vengti kietai koduoti savo kredencialus. Vietoj to, apsvarstykite galimybę naudoti aplinkos kintamuosius. Galite gauti kredencialus 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 konvenciją, duomenų bazės pavadinimas atitinka vartotojo vardą.

Prisijungimas prie Stackhero MariaDB su WordPress yra paprastas. Redaguokite wp-config.php failą ir sukonfigūruokite savo duomenų bazės nustatymus taip:

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

// Aktyvuoti TLS šifravimą (taip pat žinomą kaip SSL)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

Svarbi dalis čia yra TLS šifravimo (taip pat žinomo kaip SSL) aktyvavimas. Be jo, prisijungimas neveiks.

Šiame pavyzdyje naudojame mysql2 paketą su pažadų palaikymu. Pirmiausia įdiekite jį su:

npm install mysql2

Tada naudokite šį kodą:

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

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

  // Sukurti duomenų bazę 'stackherotest', jei ji dar neegzistuoja
  await db.query('CREATE DATABASE IF NOT EXISTS stackherotest');

  // Sukurti lentelę 'users', jei ji dar neegzistuoja
  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;'
  );

  // Įterpti netikrą vartotoją
  await db.query(
    'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
    [
      [
        Math.round(Math.random() * 100000), // Generuoti netikrą userId
        'Vartotojo vardas',                  // 'name' stulpelis
        'Vartotojo adresas',                 // 'address' stulpelis
        'user@email.com'                     // 'email' stulpelis
      ]
    ]
  );

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

  // Uždaryti prisijungimą prie MariaDB
  await db.end();

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

Prisijungiant iš Node.js, NestJS ar TypeORM, įtraukite ssl parinktį kaip parodyta:

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 su Prisma, pridėkite sslaccept=strict parinktį, kad užtikrintumėte SSL šifravimo aktyvavimą. Pavyzdžiui, naudojant vartotoją "root" prisijungiant prie duomenų bazės "root":

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

Jei dar neįdiegėte mysqlclient modulio (naudojamo prisijungti prie MariaDB), paleiskite:

pip install mysqlclient

Jei susiduriate su klaida Exception: Can not find valid pkg-config name diegiant mysqlclient, įdiekite libmysqlclient paketą. Ubuntu/Debian galite paleisti:

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

Iš pradžių galite saugoti savo kredencialus tiesiogiai settings.py faile testavimui, kaip parodyta žemiau. Atkreipkite dėmesį, kad šis metodas nėra saugus gamybai.

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

įspėjimas Būkite atsargūs: šis pavyzdys nerekomenduojamas gamybai ir skirtas tik testavimui!

Kai prisijungimas veikia, geriausia naudoti aplinkos kintamuosius savo kredencialams saugoti. Pavyzdžiui, naudojant django-environ, pirmiausia įdiekite jį:

pip install django-environ

Tada atnaujinkite settings.py taip:

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

Sukurkite arba atnaujinkite .env failą (toje pačioje direktorijoje kaip settings.py) su šiuo turiniu:

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

Galiausiai, pridėkite .env prie savo .gitignore, kad išvengtumėte jautrios informacijos įtraukimo:

echo ".env" >> .gitignore

Norėdami prijungti savo Spring programą, nustatykite aplinkos kintamąjį SPRING_DATASOURCE_URL su jūsų duomenų bazės URL, pridedant jdbc:. Pavyzdžiui:

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

Šis pavyzdys rodo, kaip sukonfigūruoti savo Grails programą 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' į norimą duomenų bazės pavadinimą.
      username = "root" // Patartina sukurti atskirą vartotoją vietoj 'root'.
      password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD // Apsvarstykite galimybę sukurti atskirą vartotoją.
      properties {
        maxActive = 50
        minEvictableIdleTimeMillis = 1800000
        timeBetweenEvictionRunsMillis = 1800000
        numTestsPerEvictionRun = 3
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        validationQuery = "SELECT 1"
      }
    }
  }
}

Gera praktika yra sukurti atskirą vartotoją jūsų programai, o ne naudoti 'root' vartotoją. Paprasčiausias būdas tai padaryti yra per phpMyAdmin:

  1. phpMyAdmin spustelėkite Vartotojų paskyros viršuje.
  2. Spustelėkite Pridėti vartotojo paskyrą.
  3. Užpildykite vartotojo kūrimo formą:
    • Pasirinkite paskyros pavadinimą (paprastai jūsų programos pavadinimą).
    • Spustelėkite Generuoti slaptažodį saugiam slaptažodžiui, tada nukopijuokite jį.
    • Pažymėkite parinktį Sukurti duomenų bazę su tuo pačiu pavadinimu ir suteikti visas privilegijas.

Pateikus, bus sukurtas naujas vartotojas kartu su duomenų baze, kurios pavadinimas sutampa su vartotojo vardu.

MariaDB yra nepriklausomas forkas, sukurtas atvirojo kodo bendruomenės po to, kai Oracle įsigijo MySQL 2010 metais. Daugeliu atvejų MariaDB ir MySQL yra labai panašūs.