MariaDB: Iniziare

Come iniziare con MariaDB

👋 Benvenuti nella documentazione di Stackhero!

Stackhero offre una soluzione MariaDB cloud pronta all'uso che fornisce numerosi vantaggi, tra cui:

  • Connessioni e trasferimenti illimitati.
  • Interfaccia web phpMyAdmin inclusa.
  • Aggiornamenti facili con un solo clic.
  • Prestazioni ottimali e sicurezza robusta grazie a una VM privata e dedicata.

Risparmiate tempo e semplificate la vostra vita: bastano solo 5 minuti per provare la soluzione di MariaDB cloud hosting di Stackhero!

Il modo più semplice per connettersi al servizio MariaDB è utilizzare il formato URL MySQL, a condizione che il driver lo supporti:

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

Per gli utenti Ruby, l'URL MySQL differisce leggermente:

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

Di seguito sono riportati diversi esempi che utilizzano PHP per aiutarti a connetterti a MariaDB utilizzando diverse estensioni. Ricorda che non è consigliato utilizzare il database 'root' in produzione. Invece, considera di creare un database e un utente dedicati.

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Non è consigliato utilizzare il database 'root'. Questo è solo per l'esempio. La migliore pratica è creare un database e un utente dedicati in phpMyAdmin e utilizzarli qui.

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

echo 'Connessione riuscita... ' . $mysqli->host_info . "\n";

$mysqli->close();

?>
<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Non è consigliato utilizzare il database 'root'. Questo è solo per l'esempio. La migliore pratica è creare un database e un utente dedicati in phpMyAdmin e utilizzarli qui.

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

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

mysqli_close($mysqli);

?>
<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Non è consigliato utilizzare il database 'root'. Questo è solo per l'esempio. La migliore pratica è creare un database e un utente dedicati in phpMyAdmin e utilizzarli qui.

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

$options = array(
  // Se incontri un errore come "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", verifica se la directory /etc/ssl/certs/ contiene certificati 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 'Sei connesso a un database che esegue la versione ' . $version[0] . "\n";

?>

Se ricevi l'errore:

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

probabilmente è perché la directory /etc/ssl/certs/ non contiene i certificati CA. Se hai accesso al sistema, puoi installare questi certificati come segue:

  1. Su Ubuntu, puoi eseguire:

    apt-get install ca-certificates
    
  2. Su Alpine Linux, esegui:

    apk add ca-certificates
    

Se non hai accesso diretto al sistema che esegue il tuo codice PHP, puoi installare il certificato manualmente:

  1. Scarica il certificato: https://letsencrypt.org/certs/isrgrootx1.pem
  2. Aggiungi il file isrgrootx1.pem ai tuoi file di progetto PHP.
  3. Commenta la linea con PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/'
  4. Decommenta la linea con PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'

Se vedi un errore come:

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

o un errore simile che menziona una costante non definita per gli attributi PDO MySQL, indica che la tua installazione PDO manca del supporto MySQL.

Soluzione per Ubuntu/Debian

Installa l'estensione PHP MySQL richiesta con:

sudo apt-get install php-mysql
Soluzione per Docker

Se stai usando Docker, assicurati che il supporto MySQL sia incluso durante il processo di build. Considera di aggiungere quanto segue al tuo Dockerfile:

RUN docker-php-ext-install pdo pdo_mysql

Modifica il file .env e definisci la variabile DATABASE_URL come segue:

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

Successivamente, aggiorna il file config/packages/doctrine.yaml, impostando il driver e le opzioni come segue:

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

Se incontri l'errore:

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

probabilmente significa che la directory /etc/ssl/certs/ non contiene i certificati CA. Puoi risolvere questo problema installandoli:

  • Su Ubuntu/Debian, esegui:

    sudo apt-get install ca-certificates
    
  • Su Alpine Linux, esegui:

    apk add ca-certificates
    

Se non puoi installare i certificati a livello di sistema, puoi aggiungerli manualmente:

  1. Scarica il certificato: https://letsencrypt.org/certs/isrgrootx1.pem

  2. Posiziona il file isrgrootx1.pem nel tuo progetto Symfony.

  3. Quindi, aggiorna il file config/packages/doctrine.yaml per utilizzare il certificato locale:

    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
    

Per configurare MariaDB con Laravel, modifica il file config/database.php e aggiorna la configurazione mysql come segue:

'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([
      // Se incontri errori SSL come "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", fai riferimento alle istruzioni sopra.
      PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
      // PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
      PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
    ])
    : [],
],

Nel tuo file database.php, inserisci la seguente configurazione:

$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'); // Per convenzione, il nome del database corrisponde al nome utente.
  'dbdriver' => 'mysqli',
  'dbprefix' => '',
  'pconnect' => TRUE,
  'char_set' => 'utf8',
  'dbcollat' => 'utf8_general_ci',
  'encrypt'  => array() // Importante: attivare la crittografia TLS
);

È buona pratica evitare di codificare le credenziali. Invece, considera di utilizzare variabili d'ambiente. Puoi recuperare le credenziali come segue:

$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'); // Per convenzione, il nome del database corrisponde al nome utente.

Connettere WordPress a Stackhero per MariaDB è semplice. Modifica il file wp-config.php e configura le impostazioni del database come segue:

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

// Abilitare la crittografia TLS (nota anche come SSL)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

La parte importante qui è l'attivazione della crittografia TLS (nota anche come SSL). Senza di essa, la connessione non funzionerà.

In questo esempio, utilizziamo il pacchetto mysql2 con supporto per le promesse. Prima, installalo con:

npm install mysql2

Quindi, utilizza il seguente codice:

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

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

  // Crea il database 'stackherotest' se non esiste già
  await db.query('CREATE DATABASE IF NOT EXISTS stackherotest');

  // Crea la tabella 'users' se non esiste ancora
  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;'
  );

  // Inserisci un utente fittizio
  await db.query(
    'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
    [
      [
        Math.round(Math.random() * 100000), // Genera un userId fittizio
        'Nome utente',                      // Colonna 'name'
        'Indirizzo utente',                 // Colonna 'address'
        'user@email.com'                    // Colonna 'email'
      ]
    ]
  );

  // Conta il numero di righe nella tabella 'users'
  const [usersCount] = await db.query('SELECT COUNT(*) AS `cpt` FROM `stackherotest`.`users`');
  console.log(`Ci sono ora ${usersCount[0].cpt} voci nella tabella "users"`);

  // Chiudi la connessione a MariaDB
  await db.end();

})().catch(error => {
  console.error('');
  console.error('🐞 Si è verificato un errore!');
  console.error(error);
  process.exit(1);
});

Quando ti connetti da Node.js, NestJS o TypeORM, includi l'opzione ssl come mostrato:

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

Per connettersi con Prisma, aggiungi l'opzione sslaccept=strict per garantire che la crittografia SSL sia abilitata. Ad esempio, utilizzando l'utente "root" che si connette al database "root":

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

Se non hai ancora installato il modulo mysqlclient (utilizzato per connettersi a MariaDB), esegui:

pip install mysqlclient

Se incontri l'errore Exception: Can not find valid pkg-config name durante l'installazione di mysqlclient, installa il pacchetto libmysqlclient. Su Ubuntu/Debian, puoi eseguire:

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

Inizialmente, puoi memorizzare le tue credenziali direttamente nel file settings.py per i test come mostrato di seguito. Nota che questo approccio non è sicuro per la produzione.

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

attenzione Fai attenzione: questo esempio non è consigliato per la produzione ed è solo a scopo di test!

Una volta che la connessione funziona, è meglio utilizzare variabili d'ambiente per memorizzare le tue credenziali. Ad esempio, utilizzando django-environ, installalo prima:

pip install django-environ

Quindi aggiorna settings.py come segue:

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

Crea o aggiorna il file .env (nella stessa directory di settings.py) con quanto segue:

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

Infine, aggiungi .env al tuo .gitignore per evitare di commettere informazioni sensibili:

echo ".env" >> .gitignore

Per connettere la tua applicazione Spring, imposta la variabile d'ambiente SPRING_DATASOURCE_URL con il tuo URL del database, prefissato con jdbc:. Ad esempio:

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

Il seguente esempio mostra come configurare la tua applicazione Grails per connettersi a MariaDB:

dataSource {
  pooled = true
  driverClassName = "com.mysql.cj.jdbc.Driver"
  dialect = org.hibernate.dialect.MySQL8Dialect
  // Proprietà specifiche 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" // Sostituisci '/root' con il nome del database desiderato.
      username = "root" // È consigliabile creare un utente dedicato invece di utilizzare 'root'.
      password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD // Considera di creare un utente dedicato.
      properties {
        maxActive = 50
        minEvictableIdleTimeMillis = 1800000
        timeBetweenEvictionRunsMillis = 1800000
        numTestsPerEvictionRun = 3
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        validationQuery = "SELECT 1"
      }
    }
  }
}

È buona pratica creare un utente dedicato per la tua applicazione piuttosto che utilizzare l'utente 'root'. Il modo più semplice per farlo è tramite phpMyAdmin:

  1. In phpMyAdmin, fai clic su Account utente in alto.
  2. Fai clic su Aggiungi account utente.
  3. Completa il modulo di creazione dell'utente:
    • Scegli un nome account (tipicamente il nome della tua applicazione).
    • Fai clic su Genera password per una password sicura, quindi copiala.
    • Seleziona l'opzione Crea database con lo stesso nome e concedi tutti i privilegi.

Dopo l'invio, verrà creato un nuovo utente insieme a un database che condivide lo stesso nome dell'username.

MariaDB è un fork indipendente creato dalla comunità open source dopo l'acquisizione di MySQL da parte di Oracle nel 2010. Per la maggior parte degli scopi, MariaDB e MySQL sono molto simili.