MySQL: Pradžia

Kaip pradėti naudotis MySQL

👋 Sveiki atvykę į Stackhero dokumentaciją!

Stackhero siūlo paruoštą naudoti MySQL 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žtikrinama privačia ir dedikuota VM.

Taupykite laiką ir supaprastinkite savo gyvenimą: užtrunka tik 5 minutes išbandyti Stackhero MySQL cloud hosting sprendimą!

Paprasčiausias būdas prisijungti prie savo MySQL 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 naudotojams MySQL URL formatas yra šiek tiek kitoks:

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

$hostname = '<XXXXXX>.stackhero-network.com';
$port = '<PORT>';
$user = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Nerekomenduojame naudoti "root" duomenų bazės. Šis pavyzdys pateikiamas tik demonstraciniais tikslais. Geriausia praktika yra sukurti atskirą duomenų bazę ir naudotoją 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'; // Nerekomenduojame naudoti "root" duomenų bazės. Šis pavyzdys pateikiamas tik demonstraciniais tikslais. Geriausia praktika yra sukurti atskirą duomenų bazę ir naudotoją 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'; // Nerekomenduojame naudoti "root" duomenų bazės. Tai yra tik demonstraciniais tikslais. Geriausia praktika yra sukurti atskirą duomenų bazę ir naudotoją phpMyAdmin ir naudoti juos čia.

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

$options = array(
  // Jei susiduriate su klaida kaip "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed",
  // įsitikinkite, kad /etc/ssl/certs/ kataloge yra CA sertifikatai.
  // Žr. žemiau daugiau informacijos.
  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 susiduriate su klaida:

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

tai greičiausiai dėl to, kad /etc/ssl/certs/ kataloge nėra CA sertifikatų.

Jei turite prieigą prie sistemos, kurioje veikia jūsų PHP kodas, galite įdiegti šiuos sertifikatus taip:

  1. Ubuntu/Debian naudokite sudo apt-get install ca-certificates
  2. Alpine Linux naudokite 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ą į savo kompiuterį: https://letsencrypt.org/certs/isrgrootx1.pem
  2. Pridėkite isrgrootx1.pem failą prie savo PHP projekto failų.
  3. Pakomentuokite eilutę PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/'
  4. Iškomentuokite eilutę PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'

Jei susiduriate su klaida:

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

arba panašiu pranešimu kaip:

Fatal error: Uncaught Error: Undefined constant PDO::MYSQL_*

tai rodo, kad PDO buvo įdiegtas be MySQL palaikymo.

Sprendimas Ubuntu/Debian

Norėdami tai išspręsti Ubuntu ar Debian pagrindu veikiančiose sistemose, įdiekite reikiamą PHP MySQL plėtinį vykdydami šią komandą:

sudo apt-get install php-mysql
Sprendimas Docker

Jei naudojate Docker, įsitikinkite, kad MySQL palaikymas yra įtrauktas į kūrimo procesą. Pridėkite šią eilutę 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 redaguokite config/packages/doctrine.yaml failą ir nustatykite 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 gaunate klaidą:

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

tai greičiausiai dėl to, kad /etc/ssl/certs/ kataloge nėra CA sertifikatų.

Jei turite prieigą prie sistemos, kurioje veikia jūsų PHP kodas, galite įdiegti šiuos sertifikatus taip:

  1. Ubuntu/Debian naudokite sudo apt-get install ca-certificates
  2. Alpine Linux naudokite apk add ca-certificates

Jei neturite tiesioginės prieigos prie sistemos, galite įdiegti sertifikatą rankiniu būdu:

  1. Atsisiųskite sertifikatą į savo kompiuterį: https://letsencrypt.org/certs/isrgrootx1.pem
  2. Pridėkite isrgrootx1.pem failą prie savo Symfony projekto.
  3. Redaguokite config/packages/doctrine.yaml failą ir nustatykite tvarkyklę ir parinktis taip:
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

Redaguokite config/database.php failą ir pakeiskite mysql konfigūraciją šiais nustatymais:

'mysql' => [
  'driver' => 'mysql',
  'host' => env('STACKHERO_MYSQL_HOST'),
  'port' => env('STACKHERO_MYSQL_PORT'),
  'username' => env('STACKHERO_MYSQL_USER'),
  'password' => env('STACKHERO_MYSQL_PASSWORD'),
  'database' => env('STACKHERO_MYSQL_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 klaida kaip "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed",
      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 faile pridėkite šią konfigūraciją:

$db['default'] = array(
  'hostname' => getenv('STACKHERO_MYSQL_HOST'),
  'port'     => getenv('STACKHERO_MYSQL_PORT'),
  'username' => getenv('STACKHERO_MYSQL_USER'),
  'password' => getenv('STACKHERO_MYSQL_PASSWORD'),
  'database' => getenv('STACKHERO_MYSQL_USER'), // Pagal konvenciją, duomenų bazė turi tą patį pavadinimą kaip ir naudotojas.
  'dbdriver' => 'mysqli',
  'dbprefix' => '',
  'pconnect' => true,
  'char_set' => 'utf8',
  'dbcollat' => 'utf8_general_ci',
  'encrypt'  => array() // Svarbu: aktyvuoti TLS šifravimą
);

Geriausia praktika yra nesaugoti savo kredencialų šaltinio kode, o naudoti aplinkos kintamuosius.

Žemiau pateiktas pavyzdys, kaip gauti šiuos kredencialus:

$hostname = getenv('STACKHERO_MYSQL_HOST');
$port = getenv('STACKHERO_MYSQL_PORT');
$user = getenv('STACKHERO_MYSQL_USER');
$password = getenv('STACKHERO_MYSQL_PASSWORD');
$database = getenv('STACKHERO_MYSQL_USER'); // Pagal konvenciją, duomenų bazė turi tą patį pavadinimą kaip ir naudotojas.

Prisijungti WordPress prie Stackhero MySQL yra paprasta. Tiesiog redaguokite wp-config.php failą ir sukonfigūruokite duomenų bazę taip:

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

// Naudoti 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 oficialų xdevapi paketą, kad pasinaudotume MySQL X protokolu. Norėdami jį įdiegti, vykdykite:

npm install @mysql/xdevapi

Žemiau pateiktas pilnas pavyzdys, naudojant xdevapi:

const mysqlx = require('@mysql/xdevapi');

(async () => {
  // Prisijunkite prie MySQL naudodami MySQL X protokolą
  const session = await mysqlx.getSession({
    host: '<XXXXXX>.stackhero-network.com',
    port: '<PORT>',
    user: 'root',
    password: '<ROOT_PASSWORD>'
  });

  // Sukurkite schemą (duomenų bazę), jei ji neegzistuoja
  const schemaExists = await session.getSchema('stackherotest').existsInDatabase();
  if (!schemaExists) {
    await session.createSchema('stackherotest');
  }

  // Sukurkite lentelę 'users', jei ji neegzistuoja
  const tableExists = await session
    .getSchema('stackherotest')
    .getTable('users')
    .existsInDatabase();
  if (!tableExists) {
    await session
      .sql('CREATE TABLE `stackherotest`.`users` '
        + '('
        + '`userId` INT UNSIGNED NOT NULL,'
        + '`name` VARCHAR(128) NOT NULL,'
        + '`address` TEXT NOT NULL,'
        + '`email` VARCHAR(265) NOT NULL'
        + ') '
        + 'ENGINE = InnoDB;')
      .execute();
  }

  // Įterpkite netikrą naudotoją
  await session
    .getSchema('stackherotest') // Duomenų bazės pavadinimas
    .getTable('users') // Lentelės pavadinimas
    .insert('userId', 'name', 'address', 'email') // Stulpelių pavadinimai
    .values(
      Math.round(Math.random() * 100000), // Generuoti netikrą userId
      'Naudotojo vardas', // stulpelis 'name'
      'Naudotojo adresas', // stulpelis 'address'
      'user@email.com' // stulpelis 'email'
    )
    .execute();

  // Suskaičiuokite eilučių skaičių lentelėje 'users'
  const usersCount = await session
    .getSchema('stackherotest') // Duomenų bazės pavadinimas
    .getTable('users')
    .count();

  console.log(`Dabar lentelėje "users" yra ${usersCount} įrašų`);

  // Uždarykite prisijungimą prie MySQL
  await session.close();

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

Šiame pavyzdyje naudojame mysql2 paketą su pažadų palaikymu. Norėdami jį įdiegti, vykdykite:

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

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

  // Sukurkite 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;');

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

  // Suskaičiuokite 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ždarykite prisijungimą prie MySQL
  await db.end();

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

Norėdami prisijungti iš Node.js, NestJS ar TypeORM, įtraukite ssl parinktį, kaip parodyta šiame pavyzdyje:

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 naudojant Prisma, pridėkite sslaccept=strict parinktį, kad užtikrintumėte SSL šifravimo įjungimą. Štai pavyzdys, naudojant naudotoją "root" ir prisijungiant prie duomenų bazės "root":

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

Jei mysqlclient modulis dar neįdiegtas, įdiekite jį, nes jis bus naudojamas prisijungti prie MySQL:

pip install mysqlclient

Jei susiduriate su klaida Exception: Can not find valid pkg-config name diegiant mysqlclient, įdiekite libmysqlclient paketą. Ubuntu/Debian galite vykdyti: apt-get update && apt-get install --no-install-recommends -y libmysqlclient-dev

Šiame pradiniame žingsnyje slaptažodis saugomas tiesiogiai settings.py faile tik testavimo tikslais. Rekomenduojama naudoti saugesnį metodą, kaip aprašyta toliau šioje dokumentacijoje.

Atidarykite settings.py failą ir pridėkite šiuos duomenis:

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

Būkite atsargūs: šis pavyzdys nerekomenduojamas gamybai ir skirtas tik testavimo tikslams!

Kai prisijungimas bus sėkmingas, galite naudoti rekomenduojamą metodą, kad saugiai saugotumėte kredencialus. Šiame pavyzdyje naudojamas django-environ aplinkos kintamųjų valdymui.

Pirmiausia įdiekite django-environ naudodami komandą:

pip install django-environ

Tada atidarykite settings.py failą ir pridėkite šiuos duomenis:

import environ
env = environ.Env()
environ.Env.read_env()

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'HOST': env('STACKHERO_MYSQL_HOST'),
    'PORT': env('STACKHERO_MYSQL_PORT'),
    'OPTIONS': {
      'ssl_mode': 'REQUIRED',
    },
    'NAME': 'root',
    'USER': 'root',
    'PASSWORD': env('STACKHERO_MYSQL_ROOT_PASSWORD')
  }
}

Tada atidarykite arba sukurkite .env failą tame pačiame kataloge kaip settings.py ir pridėkite šiuos duomenis:

STACKHERO_MYSQL_HOST=<XXXXXX>.stackhero-network.com
STACKHERO_MYSQL_PORT=<PORT>
STACKHERO_MYSQL_ROOT_PASSWORD=<ROOT_PASSWORD>

Galiausiai pridėkite .env prie savo .gitignore failo, kad užtikrintumėte, jog jūsų kredencialai nebus įtraukti į jūsų Git saugyklą:

echo ".env" >> .gitignore

Norėdami prijungti savo Spring programą, nustatykite aplinkos kintamąjį SPRING_DATASOURCE_URL su savo duomenų bazės URL, pridedant jdbc: priešdėlį:

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

Šis pavyzdys parodo, kaip prijungti savo Grails programą prie MySQL:

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" į duomenų bazę, prie kurios norite prisijungti.
      username = "root" // Patartina sukurti atskirą naudotoją, o ne naudoti "root" kredencialus.
      password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD // Patartina sukurti atskirą naudotoją, o ne naudoti "root" kredencialus.
      properties {
        maxActive = 50
        minEvictableIdleTimeMillis = 1800000
        timeBetweenEvictionRunsMillis = 1800000
        numTestsPerEvictionRun = 3
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        validationQuery = "SELECT 1"
      }
    }
  }
}

Geriausia praktika yra sukurti atskirą naudotoją savo programai, o ne naudoti "root" naudotoją.

Paprasčiausias būdas tai padaryti yra per phpMyAdmin.

  1. phpMyAdmin spustelėkite Naudotojų paskyros viršuje.

  2. Spustelėkite Pridėti naudotojo paskyrą.

  3. Užpildykite naudotojo kūrimo formą:

    1. Pasirinkite paskyros pavadinimą (paprastai jūsų programos pavadinimas)
    2. Spustelėkite Generuoti slaptažodį, kad sukurtumėte saugų slaptažodį (nukopijuokite jį į savo iškarpinę)
    3. Pažymėkite parinktį Sukurti duomenų bazę su tuo pačiu pavadinimu ir suteikti visas privilegijas

Kai patvirtinsite formą, bus sukurtas naujas naudotojas kartu su atitinkama duomenų baze, turinčia tą patį pavadinimą kaip ir naudotojo vardas.