MariaDB: Prime operazioni

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 di MySQL, purché il driver lo supporti:

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

Se si utilizza Ruby, l’URL MySQL è leggermente diverso:

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

Di seguito alcuni esempi che mostrano come connettersi a MariaDB da PHP utilizzando diverse estensioni. Anche se questi esempi utilizzano il database "root", è consigliabile creare un database e un utente dedicati per la propria applicazione, soprattutto in ambienti di produzione.

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Solo a scopo dimostrativo. Per best practice, creare un proprio database e utente tramite phpMyAdmin e utilizzare quelle credenziali.

$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'; // Solo a scopo dimostrativo. Per best practice, creare un proprio database e utente tramite phpMyAdmin e utilizzare quelle credenziali.

$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'; // Solo a scopo dimostrativo. Per best practice, creare un proprio database e utente tramite phpMyAdmin e utilizzare quelle credenziali.

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

$options = array(
  // Se ricevete un errore come "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", assicuratevi che la directory /etc/ssl/certs/ contenga i 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 con versione ' . $version[0] . "\n";

?>

Se visualizzate questo errore:

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

probabilmente la directory /etc/ssl/certs/ non contiene i certificati CA necessari. Se avete accesso al sistema, ecco alcune soluzioni per installarli:

  1. Su Ubuntu, potete eseguire:

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

    apk add ca-certificates
    

Se non avete accesso a livello di sistema, potete aggiungere manualmente il certificato:

  1. Scaricate il certificato: https://letsencrypt.org/certs/isrgrootx1.pem
  2. Inserite il file isrgrootx1.pem nel vostro progetto PHP.
  3. Commentate la riga con PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/'
  4. Decommentate la riga con PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'

Se visualizzate un errore come:

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

oppure un messaggio simile che fa riferimento a una costante PDO MySQL non definita, probabilmente la vostra installazione di PDO non include il supporto MySQL.

Su Ubuntu/Debian

Potete installare l’estensione PHP MySQL necessaria con:

sudo apt-get install php-mysql
Se utilizzate Docker

Per assicurarvi che il supporto MySQL sia disponibile, aggiungete quanto segue al vostro Dockerfile:

RUN docker-php-ext-install pdo pdo_mysql

### Utilizzo di MariaDB con Symfony e Doctrine

Per iniziare, modificate il file `.env` e impostate la variabile `DATABASE_URL` come segue:

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


Successivamente, aggiornate il file `config/packages/doctrine.yaml` per impostare il driver e le opzioni:

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

Se riscontrate questo errore:

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

probabilmente il sistema non dispone dei certificati CA installati. Ecco alcune modalità per installarli:

  • Su Ubuntu/Debian, potete eseguire:

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

    apk add ca-certificates
    

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

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

  2. Inserite il file isrgrootx1.pem nel vostro progetto Symfony.

  3. Aggiornate il file 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
    

Per configurare MariaDB con Laravel, aprite config/database.php e aggiornate 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 riscontrate errori SSL come "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed", consultate i passaggi di troubleshooting 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 file database.php, potete configurare la connessione come segue:

$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 coincide con il nome utente.
  'dbdriver' => 'mysqli',
  'dbprefix' => '',
  'pconnect' => TRUE,
  'char_set' => 'utf8',
  'dbcollat' => 'utf8_general_ci',
  'encrypt'  => array() // Importante: attivare la cifratura TLS
);

Una buona pratica è non inserire le credenziali direttamente nel codice, ma utilizzare variabili d’ambiente. Potete recuperarle così:

$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 coincide con il nome utente.

Collegare WordPress a Stackhero per MariaDB è molto semplice. Nel file wp-config.php, impostate i seguenti parametri di database:

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

// Abilita la cifratura TLS (detta anche SSL)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

Il passaggio fondamentale qui è abilitare la cifratura TLS (a volte chiamata SSL). La connessione non funzionerà senza questa impostazione.

Se utilizzate Node.js, potete provare il pacchetto mysql2, che supporta le promise. Per installarlo:

npm install mysql2

Ecco un esempio che potete adattare:

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 se non esiste già
  await db.query('CREATE DATABASE IF NOT EXISTS stackherotest');

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

  // Inserisce un utente di esempio
  await db.query(
    'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
    [
      [
        Math.round(Math.random() * 100000), // Genera un userId
        'User name',                        // name
        'User address',                     // address
        '[email protected]'                    // email
      ]
    ]
  );

  // Conta gli utenti nella tabella
  const [usersCount] = await db.query('SELECT COUNT(*) AS `cpt` FROM `stackherotest`.`users`');
  console.log(`Ora ci sono ${usersCount[0].cpt} record nella tabella "users"`);

  // Chiude la connessione
  await db.end();

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

Per Node.js, NestJS o TypeORM, potete abilitare SSL includendo l’opzione ssl:

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

Per connettersi a MariaDB con Prisma, basta aggiungere sslaccept=strict all’URL di connessione. Ad esempio, se vi collegate come utente "root" al database "root":

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

Se non lo avete già fatto, potete installare il modulo mysqlclient per collegare Django a MariaDB:

pip install mysqlclient

Se durante l’installazione ricevete l’errore Exception: Can not find valid pkg-config name, potrebbe essere necessario installare prima il pacchetto libmysqlclient. Su Ubuntu/Debian:

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

Per testare la connessione, potete iniziare inserendo le credenziali direttamente in settings.py. Questo va bene per i test, ma non è sicuro in 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: questo esempio è solo per test. Non utilizzate credenziali hardcoded in produzione.

Una volta verificata la connessione, è più sicuro memorizzare le credenziali tramite variabili d’ambiente. Se utilizzate django-environ, potete installarlo così:

pip install django-environ

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

Poi create o aggiornate il file .env (nella stessa directory di settings.py) con:

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

Infine, per mantenere sicure le credenziali, aggiungete .env al vostro .gitignore:

echo ".env" >> .gitignore

Per collegare un’applicazione Spring a MariaDB, potete impostare la variabile d’ambiente SPRING_DATASOURCE_URL con l’URL del database, utilizzando il prefisso jdbc:. Ad esempio:

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

Ecco un esempio di configurazione per collegare la vostra applicazione Grails 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" // Sostituite '/root' con il nome reale del vostro database.
      username = "root" // È consigliabile creare un utente dedicato per la vostra applicazione.
      password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD // Valutate la creazione di un utente dedicato.
      properties {
        maxActive = 50
        minEvictableIdleTimeMillis = 1800000
        timeBetweenEvictionRunsMillis = 1800000
        numTestsPerEvictionRun = 3
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        validationQuery = "SELECT 1"
      }
    }
  }
}

Per una maggiore sicurezza, è preferibile creare un utente dedicato per la vostra applicazione invece di utilizzare "root". Potete farlo facilmente tramite phpMyAdmin:

  1. In phpMyAdmin, cliccate su User accounts in alto.
  2. Cliccate su Add user account.
  3. Compilate il modulo:
    • Scegliete un nome utente (spesso il nome della vostra applicazione).
    • Cliccate su Generate password per ottenere una password sicura e copiatela.
    • Selezionate Create database with same name and grant all privileges.

Una volta confermato, verranno creati il nuovo utente e un database corrispondente.

MariaDB è un fork indipendente di MySQL, creato dalla comunità open source dopo l’acquisizione di MySQL da parte di Oracle nel 2010. Per la maggior parte degli utilizzi, MariaDB e MySQL offrono funzionalità e compatibilità molto simili.