MySQL: Pradžia
Kaip pradėti naudotis MySQL
👋 Sveiki atvykę į Stackhero dokumentaciją!
Stackhero siūlo pilnai valdomą MySQL cloud paslaugą, kuri supaprastina diegimą ir valdymą gamybinėms apkrovoms:
- Neriboti prisijungimai ir duomenų perdavimai.
- Integruota phpMyAdmin žiniatinklio sąsaja patogiam duomenų bazių valdymui.
- Paprasti atnaujinimai su vieno paspaudimo atnaujinimo galimybe.
- Pastovi našumo ir stipri saugumo užtikrinimas privačioje, dedikuotoje infrastruktūroje.
Su Stackhero patikima MySQL duomenų bazė bus paruošta vos per kelias minutes. Skirkite mažiau laiko diegimui ir priežiūrai, o daugiau – savo aplikacijų kūrimui. Išbandykite MySQL cloud hostingą Stackhero platformoje jau šiandien.
MySQL URL adresai
Jei norite greitai prisijungti prie savo MySQL paslaugos, galite naudoti MySQL URL formatą, jei jūsų tvarkyklė jį palaiko:
mysql://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?useSSL=true&requireSSL=true
Jei dirbate su Ruby, URL formatas šiek tiek skiriasi:
mysql2://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?reconnect=true&useSSL=true&requireSSL=true
MySQL naudojimas su PHP
MySQLi (objektinis stilius)
Štai pavyzdys, kaip prisijungti prie MySQL naudojant PHP MySQLi plėtinį objektiniu stiliumi:
<?php
$hostname = '<XXXXXX>.stackhero-network.com';
$port = '<PORT>';
$user = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Nors šiame pavyzdyje naudojama "root" duomenų bazė, rekomenduojama sukurti atskirą duomenų bazę ir naudotoją savo aplikacijai per phpMyAdmin.
$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();
?>
MySQLi (procedūrinis stilius)
Jei jums labiau patinka procedūrinis kodas, štai kaip galite prisijungti naudojant MySQLi procedūriniu stiliumi:
<?php
$hostname = '<XXXXXX>.stackhero-network.com';
$port = '<PORT>';
$user = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Dėl saugumo rekomenduojama sukurti atskirą duomenų bazę ir naudotoją per phpMyAdmin, o ne naudoti "root".
$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ėkmingai: ' . mysqli_get_host_info($mysqli) . "\n";
mysqli_close($mysqli);
?>
PDO
Jei duomenų bazės prieigai norite naudoti PDO, štai pavyzdinė prisijungimo konfigūracija:
<?php
$hostname = '<XXXXXX>.stackhero-network.com';
$port = '<PORT>';
$user = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Geriausia sukurti atskirą duomenų bazę ir naudotoją savo aplikacijai.
$dsn = "mysql:host=$hostname;port=$port;dbname=$database";
$options = array(
// Jei jungiantis matote SSL klaidas, įsitikinkite, kad jūsų sistemoje įdiegti tinkami CA sertifikatai (žr. žemiau).
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 prisijungėte prie duomenų bazės, kurios versija " . $version[0] . "\n";
?>
Trikčių šalinimas: SSL operation failed with code 1
Jei matote tokią klaidą:
Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed
Tai greičiausiai reiškia, kad jūsų sistemoje trūksta CA sertifikatų kataloge /etc/ssl/certs/.
Jei turite prieigą prie serverio, kuriame veikia jūsų PHP kodas, sertifikatus galite įdiegti taip:
- Ubuntu/Debian:
sudo apt-get install ca-certificates - Alpine Linux:
apk add ca-certificates
Jei neturite tiesioginės prieigos, galite pridėti sertifikatą rankiniu būdu:
- Atsisiųskite sertifikatą: https://letsencrypt.org/certs/isrgrootx1.pem
- Įkelkite
isrgrootx1.pemį savo PHP projektą. - Pakomentuokite eilutę
PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/' - Atkomentuokite eilutę
PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'
Sprendimas: nedefinuotų konstantų klaidos su PDO
Jei matote klaidas kaip:
Fatal error: Uncaught Error: Undefined constant PDO::MYSQL_ATTR_SSL_CAPATH
ar panašias žinutes, tai reiškia, kad PDO įdiegtas be MySQL palaikymo.
- Ubuntu/Debian
Reikiamą plėtinį galite įdiegti vykdydami:
sudo apt-get install php-mysql
- Docker aplinkoje
Jei naudojate Docker, įsitikinkite, kad MySQL palaikymas įtrauktas į build procesą. Pridėkite tai į savo Dockerfile:
RUN docker-php-ext-install pdo pdo_mysql
### MySQL naudojimas su Symfony ir Doctrine
Jei dirbate su Symfony ir Doctrine, galite konfigūruoti prisijungimą taip:
1. Redaguokite `.env` failą ir nustatykite `DATABASE_URL` kintamąjį:
DATABASE_URL="mysql://<USER>:<PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/<DATABASE>"
1. Tuomet faile `config/packages/doctrine.yaml` nustatykite tvarkyklę ir parinktis:
```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
Trikčių šalinimas: SSL operation failed with code 1
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 reiškia, kad kataloge /etc/ssl/certs/ nėra CA sertifikatų.
Jei turite prieigą prie sistemos, galite juos įdiegti taip:
- Ubuntu/Debian:
sudo apt-get install ca-certificates - Alpine Linux:
apk add ca-certificates
Jei neturite tiesioginės prieigos, galite pridėti sertifikatą rankiniu būdu:
- Atsisiųskite: https://letsencrypt.org/certs/isrgrootx1.pem
- Įkelkite
isrgrootx1.pemį savo Symfony projektą. - Atnaujinkite
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
MySQL naudojimas su Laravel
Norėdami konfigūruoti MySQL Laravel aplinkoje, atverkite config/database.php ir atnaujinkite MySQL sekciją:
'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([
// Dėl SSL klaidų žr. trikčių šalinimą aukščiau.
PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
// PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
])
: [],
],
MySQL naudojimas su PHP CodeIgniter
Konfigūracijos faile database.php galite pridėti:
$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 susitarimą, duomenų bazės pavadinimas sutampa su naudotoju.
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => true,
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'encrypt' => array() // Svarbu: įjunkite TLS šifravimą
);
Prisijungimas naudojant aplinkos kintamuosius PHP
Paprastai saugiau nerašyti duomenų bazės prisijungimo duomenų tiesiai į kodą. Vietoj to naudokite aplinkos kintamuosius. Štai kaip juos gauti:
$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 susitarimą, duomenų bazės pavadinimas sutampa su naudotoju.
MySQL naudojimas su WordPress
WordPress prijungimas prie Stackhero MySQL yra paprastas. Tiesiog redaguokite savo wp-config.php failą taip:
define('DB_HOST', '<XXXXXX>.stackhero-network.com');
define('DB_PORT', '<PORT>');
define('DB_NAME', 'root');
define('DB_USER', 'root');
define('DB_PASSWORD', '<yourPassword>');
// Įjunkite TLS šifravimą (dar vadinamą SSL)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
Svarbiausias žingsnis čia – įjungti TLS (SSL) šifravimą. Be to, jūsų prisijungimas neveiks tinkamai.
MySQL naudojimas su Node.js
MySQL X protokolas (xdevapi paketas)
Norėdami naudoti MySQL X protokolą, įdiekite oficialų xdevapi paketą:
npm install @mysql/xdevapi
Štai pavyzdinis scenarijus:
const mysqlx = require('@mysql/xdevapi');
(async () => {
// Prisijungimas prie MySQL naudojant MySQL X protokolą
const session = await mysqlx.getSession({
host: '<XXXXXX>.stackhero-network.com',
port: '<PORT>',
user: 'root',
password: '<ROOT_PASSWORD>'
});
// Sukuria schemą (duomenų bazę), jei jos nėra
const schemaExists = await session.getSchema('stackherotest').existsInDatabase();
if (!schemaExists) {
await session.createSchema('stackherotest');
}
// Sukuria lentelę 'users', jei jos nėra
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();
}
// Įterpia pavyzdinį naudotoją
await session
.getSchema('stackherotest')
.getTable('users')
.insert('userId', 'name', 'address', 'email')
.values(
Math.round(Math.random() * 100000),
'User name',
'User address',
'[email protected]'
)
.execute();
// Suskaičiuoja naudotojų skaičių
const usersCount = await session
.getSchema('stackherotest')
.getTable('users')
.count();
console.log(`Dabar lentelėje "users" yra ${usersCount} įrašų`);
// Uždaro prisijungimą
await session.close();
})().catch(error => {
console.error('');
console.error('Įvyko klaida!');
console.error(error);
process.exit(1);
});
MySQL protokolas (mysql2 paketas)
Jei norite naudoti klasikinį protokolą, galite naudoti mysql2 paketą su promise palaikymu. Įdiekite jį taip:
npm install mysql2
Naudojimo pavyzdys:
const mysql = require('mysql2/promise');
(async () => {
const db = await mysql.createConnection({
host: '<XXXXXX>.stackhero-network.com',
port: '<PORT>',
user: 'root',
password: '<ROOT_PASSWORD>'
});
// Sukuria duomenų bazę, jei reikia
await db.query('CREATE DATABASE IF NOT EXISTS stackherotest');
// Sukuria lentelę, jei reikia
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;');
// Įterpia pavyzdinį naudotoją
await db.query(
'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
[
[
Math.round(Math.random() * 100000),
'User name',
'User address',
'[email protected]'
]
]
);
// Suskaičiuoja naudotojus
const [ usersCount ] = await db.query('SELECT COUNT(*) AS `cpt` FROM `stackherotest`.`users`');
console.log(`Dabar lentelėje "users" yra ${usersCount[0].cpt} įrašų`);
// Uždaro prisijungimą
await db.end();
})().catch(error => {
console.error('');
console.error('Įvyko klaida!');
console.error(error);
process.exit(1);
});
MySQL naudojimas su Node.js, NestJS ar TypeORM
Norėdami prisijungti iš Node.js, NestJS ar TypeORM, galite pridėti ssl parinktį, kaip parodyta žemiau:
TypeOrmModule.forRoot({
type: 'mysql',
host: '<XXXXXX>.stackhero-network.com',
port: <PORT>,
username: 'root',
password: '<ROOT_PASSWORD>',
database: 'root',
entities: [],
synchronize: true,
ssl: {}
});
MySQL naudojimas su Prisma
Jei naudojate Prisma, pridėjus sslaccept=strict užtikrinsite užšifruotą prisijungimą. Štai pavyzdinė konfigūracija:
datasource db {
provider = "mysql"
url = "mysql://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?sslaccept=strict"
}
MySQL naudojimas su Django
Jei dar neįdiegėte mysqlclient modulio, galite tai padaryti taip:
pip install mysqlclient
Jei diegimo metu gaunate klaidą
Exception: Can not find valid pkg-config name, gali reikėti įdiegtilibmysqlclientpaketą. Ubuntu/Debian sistemose naudokite:apt-get update && apt-get install --no-install-recommends -y libmysqlclient-dev
Iš pradžių galite testuoti prisijungimą, slaptažodį įrašydami tiesiai į settings.py failą. Ilgalaikiam saugumui geriau naudoti aplinkos kintamuosius (žr. žemiau).
Redaguokite savo settings.py taip:
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>'
}
}
Atkreipkite dėmesį: šis pavyzdys skirtas tik testavimui ir nerekomenduojamas gamybinėje aplinkoje!
Patikrinę, kad prisijungimas veikia, galite pereiti prie saugesnio metodo, naudodami django-environ aplinkos kintamųjų valdymui.
Pirmiausia įdiekite paketą:
pip install django-environ
Tada atnaujinkite savo settings.py:
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')
}
}
Sukurkite arba redaguokite .env failą tame pačiame kataloge kaip ir settings.py ir pridėkite:
STACKHERO_MYSQL_HOST=<XXXXXX>.stackhero-network.com
STACKHERO_MYSQL_PORT=<PORT>
STACKHERO_MYSQL_ROOT_PASSWORD=<ROOT_PASSWORD>
Galiausiai, kad apsaugotumėte savo prisijungimo duomenis, pridėkite .env į .gitignore failą:
echo ".env" >> .gitignore
MySQL prijungimas su Java/Spring
Norėdami prijungti savo Spring aplikaciją, galite nustatyti SPRING_DATASOURCE_URL aplinkos kintamąjį su savo duomenų bazės URL, būtinai pridėkite jdbc: prieš adresą:
SPRING_DATASOURCE_URL=jdbc:mysql://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?useSSL=true&requireSSL=true
MySQL prijungimas su Groovy/Grails
Štai pavyzdys, kaip konfigūruoti savo Grails aplikaciją prisijungti 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" // Galite pakeisti "/root" į norimą duomenų bazę.
username = "root" // Rekomenduojama sukurti atskirą naudotoją savo aplikacijai.
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"
}
}
}
}
Naudotojo kūrimas MySQL per phpMyAdmin
Dėl didesnio saugumo rekomenduojama sukurti atskirą naudotoją savo aplikacijai, o ne naudoti "root" naudotoją. Tai galite lengvai padaryti per phpMyAdmin:
-
phpMyAdmin viršuje pasirinkite
User accounts.
-
Spauskite
Add user account.
-
Užpildykite naudotojo kūrimo formą:
- Įveskite paskyros pavadinimą (dažniausiai jūsų aplikacijos pavadinimą)
- Spauskite
Generate password, kad sugeneruotumėte saugų slaptažodį, ir nukopijuokite jį - Pasirinkite
Create database with same name and grant all privileges
Pateikus formą, turėsite naują naudotoją ir dedikuotą duomenų bazę, kurios pavadinimas sutampa su naudotojo vardu.