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!
URL MariaDB
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
Utilizzo di MariaDB con PHP
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.
Utilizzo di MariaDB con PHP e MySQLi (stile orientato agli oggetti)
<?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();
?>
Utilizzo di MariaDB con PHP e MySQLi (stile procedurale)
<?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);
?>
Utilizzo di MariaDB con PHP e PDO
<?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";
?>
Come risolvere l’errore "SSL operation failed with code 1"
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:
-
Su Ubuntu, potete eseguire:
apt-get install ca-certificates -
Su Alpine Linux, provate:
apk add ca-certificates
Se non avete accesso a livello di sistema, potete aggiungere manualmente il certificato:
- Scaricate il certificato: https://letsencrypt.org/certs/isrgrootx1.pem
- Inserite il file
isrgrootx1.pemnel vostro progetto PHP. - Commentate la riga con
PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/' - Decommentate la riga con
PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'
Come risolvere "Fatal error: Uncaught Error: Undefined constant PDO::MYSQL_ATTR_SSL_CAPATH"
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
Come risolvere l’errore "SSL operation failed with code 1"
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:
-
Scaricate il certificato: https://letsencrypt.org/certs/isrgrootx1.pem
-
Inserite il file
isrgrootx1.pemnel vostro progetto Symfony. -
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
Utilizzo di MariaDB con Laravel
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,
])
: [],
],
Utilizzo di MariaDB con PHP CodeIgniter
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
);
Connessione a MariaDB con PHP tramite variabili d’ambiente
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.
Utilizzo di MariaDB con WordPress
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.
Utilizzo di MariaDB con Node.js
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);
});
Utilizzo di MariaDB con Node.js/NestJS/TypeORM
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: {}
});
Utilizzo di MariaDB con Prisma
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"
}
Utilizzo di MariaDB con Django
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 pacchettolibmysqlclient. 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
Connessione a MariaDB con Java/Spring
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
Connessione a MariaDB con Groovy/Grails
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"
}
}
}
}
Creazione di un utente MariaDB tramite phpMyAdmin
Per una maggiore sicurezza, è preferibile creare un utente dedicato per la vostra applicazione invece di utilizzare "root". Potete farlo facilmente tramite phpMyAdmin:
- In phpMyAdmin, cliccate su
User accountsin alto.
- Cliccate su
Add user account.
- Compilate il modulo:
- Scegliete un nome utente (spesso il nome della vostra applicazione).
- Cliccate su
Generate passwordper 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.
Differenze tra MariaDB e MySQL
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.