MariaDB: はじめに

MariaDBの利用開始方法

👋 Stackheroのドキュメントへようこそ!

Stackheroは、数多くの利点を提供するMariaDBクラウドソリューションを提供しています。

  • 無制限の接続と転送。
  • phpMyAdminウェブUIが含まれています。
  • ワンクリックで簡単にアップデート
  • プライベートで専用のVMによる最適なパフォーマンスと強力なセキュリティ

時間を節約し、生活を簡素化しましょう: StackheroのMariaDBクラウドホスティングソリューションを試すのに5分しかかかりません

MariaDBサービスへの最も簡単な接続方法は、ドライバが対応していればMySQLのURL形式を利用することです:

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

Rubyを利用する場合、MySQLのURLは少し異なります:

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

以下は、PHPから異なる拡張モジュールを使ってMariaDBへ接続する例です。これらの例では「root」データベースを使用していますが、特に本番環境ではアプリケーション専用のデータベースとユーザーを作成して利用することを推奨します。

<?php

$hostname = '<XXXXXX>.stackhero-network.com';
$port     = '<PORT>';
$user     = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // デモ用。実運用ではphpMyAdminで独自のデータベースとユーザーを作成し、その認証情報を利用してください。

$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'; // デモ用。実運用ではphpMyAdminで独自のデータベースとユーザーを作成し、その認証情報を利用してください。

$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'; // デモ用。実運用ではphpMyAdminで独自のデータベースとユーザーを作成し、その認証情報を利用してください。

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

$options = array(
  // "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed" のようなエラーが出る場合は、/etc/ssl/certs/ ディレクトリに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 'You are connected to a database running version ' . $version[0] . "\n";

?>

このエラーが表示される場合:

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

/etc/ssl/certs/ ディレクトリに必要なCA証明書が存在しないことが原因の可能性があります。システムへのアクセス権がある場合、以下の方法でインストールできます:

  1. Ubuntuの場合:

    apt-get install ca-certificates
    
  2. Alpine Linuxの場合:

    apk add ca-certificates
    

システムレベルでのインストールができない場合は、証明書を手動で追加できます:

  1. 証明書をダウンロード:https://letsencrypt.org/certs/isrgrootx1.pem
  2. isrgrootx1.pem ファイルをPHPプロジェクトに配置します。
  3. PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/' の行をコメントアウトします。
  4. PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem' の行をアンコメントします。

このようなエラーが表示される場合:

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

またはPDO MySQL属性の未定義定数に関する類似のメッセージが出る場合、PDOのMySQLサポートがインストールされていない可能性があります。

Ubuntu/Debianの場合

必要なPHP MySQL拡張をインストールするには:

sudo apt-get install php-mysql
Dockerを利用している場合

MySQLサポートを有効にするには、Dockerfileに以下を追加してください:

RUN docker-php-ext-install pdo pdo_mysql

### Symfony + DoctrineでMariaDBを利用する

まず、`.env`ファイルを編集し、`DATABASE_URL`変数を以下のように設定します:

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


次に、`config/packages/doctrine.yaml`ファイルを編集し、ドライバとオプションを設定します:

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

このエラーが発生した場合:

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

システムにCA証明書がインストールされていない可能性があります。以下の方法でインストールできます:

  • Ubuntu/Debianの場合:

    sudo apt-get install ca-certificates
    
  • Alpine Linuxの場合:

    apk add ca-certificates
    

システム全体にCA証明書をインストールできない場合は、手動で追加できます:

  1. 証明書をダウンロード:https://letsencrypt.org/certs/isrgrootx1.pem

  2. isrgrootx1.pem ファイルをSymfonyプロジェクトに配置します。

  3. 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
    

MariaDBをLaravelで利用するには、config/database.phpを開き、mysql設定を以下のように更新します:

'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([
      // 「Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed」などのSSLエラーが発生した場合は、上記のトラブルシューティングを参照してください。
      PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
      // PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
      PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
    ])
    : [],
],

database.phpファイル内で、以下のように設定できます:

$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'), // 慣例として、データベース名はユーザー名と同じです。
  'dbdriver' => 'mysqli',
  'dbprefix' => '',
  'pconnect' => TRUE,
  'char_set' => 'utf8',
  'dbcollat' => 'utf8_general_ci',
  'encrypt'  => array() // 重要:TLS暗号化を有効にしてください
);

認証情報をコード内に直接記述せず、環境変数を利用するのが推奨されます。以下のように取得できます:

$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'); // 慣例として、データベース名はユーザー名と同じです。

WordPressをStackhero for MariaDBに接続するのは簡単です。wp-config.phpファイルで以下のデータベースパラメータを設定してください:

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

// TLS暗号化(SSLとも呼ばれます)を有効化
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

ここで重要なのはTLS暗号化(SSLとも呼ばれます)を有効にすることです。これを有効にしないと接続できません。

Node.jsを利用する場合は、Promise対応のmysql2パッケージを利用できます。インストール方法:

npm install mysql2

以下はサンプルコードです:

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

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

  // データベースがなければ作成
  await db.query('CREATE DATABASE IF NOT EXISTS stackherotest');

  // usersテーブルがなければ作成
  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;'
  );

  // サンプルユーザーを挿入
  await db.query(
    'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
    [
      [
        Math.round(Math.random() * 100000), // userIdを生成
        'User name',                         // name
        'User address',                      // address
        '[email protected]'                     // email
      ]
    ]
  );

  // テーブル内のユーザー数をカウント
  const [usersCount] = await db.query('SELECT COUNT(*) AS `cpt` FROM `stackherotest`.`users`');
  console.log(`There are now ${usersCount[0].cpt} entries in the table "users"`);

  // 接続をクローズ
  await db.end();

})().catch(error => {
  console.error('');
  console.error('An error occurred!');
  console.error(error);
  process.exit(1);
});

Node.js、NestJS、TypeORMを利用する場合、sslオプションを追加することでSSLを有効化できます:

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

PrismaでMariaDBに接続するには、接続URLにsslaccept=strictを追加してください。たとえば、ユーザー「root」でデータベース「root」に接続する場合:

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

まだの場合は、mysqlclientモジュールをインストールしてDjangoからMariaDBに接続できます:

pip install mysqlclient

インストール時に Exception: Can not find valid pkg-config name エラーが出る場合は、事前に libmysqlclient パッケージをインストールしてください(Ubuntu/Debianの場合):

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

接続テストのため、まずはsettings.pyに直接認証情報を記載しても構いませんが、本番環境では推奨されません。

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

注意:この例はテスト用です。本番環境でハードコードした認証情報は使用しないでください。

接続が確認できたら、認証情報は環境変数で管理するのが安全です。django-environを利用する場合、以下のようにインストールします:

pip install django-environ

その後、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')
  }
}

次に、.envファイル(settings.pyと同じディレクトリ)を作成または更新し、以下を記載します:

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

最後に、認証情報の漏洩を防ぐため、.env.gitignoreに追加してください:

echo ".env" >> .gitignore

SpringアプリケーションからMariaDBに接続するには、SPRING_DATASOURCE_URL環境変数にjdbc:プレフィックス付きのデータベースURLを設定します。例:

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

GrailsアプリケーションでMariaDBに接続する設定例:

dataSource {
  pooled = true
  driverClassName = "com.mysql.cj.jdbc.Driver"
  dialect = org.hibernate.dialect.MySQL8Dialect
  // 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" // '/root'は実際のデータベース名に置き換えてください。
      username = "root" // アプリケーション専用のユーザー作成を推奨します。
      password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD // 専用ユーザーの利用を検討してください。
      properties {
        maxActive = 50
        minEvictableIdleTimeMillis = 1800000
        timeBetweenEvictionRunsMillis = 1800000
        numTestsPerEvictionRun = 3
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        validationQuery = "SELECT 1"
      }
    }
  }
}

セキュリティ向上のため、「root」ユーザーではなくアプリケーション専用のユーザーを作成することを推奨します。phpMyAdminで簡単に作成できます:

  1. phpMyAdminで上部の「User accounts」をクリックします。
  2. 「Add user account」をクリックします。
  3. フォームに入力します:
    • ユーザー名を選択(通常はアプリケーション名)
    • 「Generate password」をクリックして強力なパスワードを生成し、コピーします。
    • 「Create database with same name and grant all privileges」にチェックを入れます。

送信後、新しいユーザーと同名のデータベースが作成されます。

MariaDBは、2010年にOracleがMySQLを買収した後、オープンソースコミュニティによって作られたMySQLの独立したフォークです。多くの用途でMariaDBとMySQLは非常に似た機能と互換性を提供しています。