Hebu tuanze na ukweli kwamba kuna wakati unahitaji kufanya maombi na uunganisho wa database. Hii inafanywa ili usiingie sana katika maendeleo ya nyuma na kuzingatia sehemu ya mbele kwa sababu ya ukosefu wa mikono na ujuzi. Sitasema kuwa suluhisho langu litakuwa salama, lakini linafanya kazi.
Kwa kuwa sipendi kulipia hosting, nilitumia mtandao kazini kwangu, kuna IP nyeupe. Hapa kuna muundo wake:
Nina ufikiaji wa kompyuta kadhaa, kwa usahihi zaidi kwa 192.168.1.2 (aka 192.168.0.2) kuna Linux na 192.168.0.3 na Windows. Kwa ujumla, kwa maombi yangu, nilichagua mysql na kuangalia ni nini kwenye Linux. Ilikuwa tayari imewekwa hapo, lakini hakuna mtu anayejua nenosiri, na wale waliojua walisahau (wale ambao walifanya kazi kabla yangu). Baada ya kujifunza kwamba hakuna mtu anayehitaji, niliifuta na kujaribu kuiweka tena. Hakukuwa na kumbukumbu ya kutosha, na kwa kuwa ili kurekebisha kosa hili ningelazimika kuunganisha kufuatilia na kibodi na panya kwake, niliamua kuacha biashara hii. Aidha, mashine ya Windows ina nguvu zaidi, na pamoja na kila kitu, mimi mwenyewe ninayo kwenye kompyuta yangu ya nyumbani. Kimsingi, sitaelezea usanikishaji yenyewe, kuna miongozo na video nyingi juu yake. Baada ya kusanikisha mysql kwenye mashine ya Windows, niliamua kuhifadhi nakala rudufu kutoka kwa kompyuta ndogo hadi kwenye kituo cha kazi.
Inafanywa kama hii (kwa upande wangu):
mysqldump -uroot -p your_base > dump_file.sql
Ifuatayo, tunaunda hifadhidata katika hifadhidata mpya na kurejesha nakala kwenye mashine "mpya".
mysql -h localhost -u root -p
create database your_base;
use your_base;
mysql -uroot -p your_base < dump_file.sql
show tables;
Faili iliyo na chelezo lazima iwekwe kwenye mashine mpya, na ikiwa sio kwenye saraka na matumizi, basi njia kamili ya hiyo inawezekana. (Nimepakia tu nakala rudufu kwa github na kuitengeneza kwa mashine mpya). Ningeongeza jinsi meza wenyewe zinaundwa, lakini sikuhifadhi viwambo vya skrini, na nadhani si vigumu hata kwa mwanafunzi wa miaka 2-3.
Niliporejesha meza zote, ni wakati wa kufanya ufikiaji wa mbali kwa hifadhidata upatikane. Kwa ujumla, amri kama hizo hazikuleta mafanikio (zilizopewa tu haki ya kusoma chagua)
create user 'client'@'%' IDENTIFIED by 'client';
grant select on your_base . * to 'client'@'%';
flush privileges;
Kwa usahihi zaidi, ningeweza tu kuunganisha kwenye hifadhidata na amri,
mysql -h localhost -u client -pclient
na huyu hakuweza
mysql -h 192.168.0.3 -u client -pclient
Haikunifaa, pia sikuweza kuunganishwa kupitia anwani hii kama mzizi.
Programu ya mysql workbench ilisaidia, hapo kwenye mipangilio unabadilisha localhost hadi% na inafanya kazi, ingawa mteja hakusaidia. Sasa unaweza kuunganisha kwenye hifadhidata kutoka kwa koni au kutoka kwa msimbo kutoka kwa anwani yoyote.
Unahitaji pia kutengeneza mtandao wa nyumbani au wa biashara na kuzima firewall ya Windows, vinginevyo hautaweza hata kubandika mashine hii (sio kwamba itaunganisha kwenye hifadhidata).
Nusu ya kazi imefanywa, basi ninahitaji kuwa na uwezo wa kuunganisha kwenye hifadhidata kutoka nyumbani.
Kama unaweza kuona kutoka kwa mchoro wa mtandao, unahitaji kwenda kwenye mtandao kutoka 192.168.0.3 hadi 192.168.1.1 (router), wacha tuende kinyume. Wacha tuweke njia kutoka 192.168.1.1 hadi 192.168.1.2 kama hii:
Kwa ujumla, picha haionyeshi - nitaandika kwa mikono yangu:
route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2
Hii inaweza tu kufanywa katika subnet moja, yaani, huwezi kusambaza mara moja kwa anwani 192.168.0.2 au 192.168.0.3
Hii ni muhimu ili router ijue ambapo subnet 192.168.0.0/24 iko (jifunze misingi ya mitandao ni muhimu).
Sasa tunaongeza usambazaji wa bandari 3306 (mlango wa mysql kwa chaguo-msingi (ikiwa hukuibadilisha wakati wa usakinishaji)) kwa anwani 192.168.1.2
Sasa jambo ngumu zaidi kufanya ni kufanya usambazaji kwenye mashine ya Linux (ina kadi mbili za mtandao 192.168.1.2 (enp3s1 interface) na 192.168.0.2 (enp3s0 interface) ili kadi za mtandao zijue nini cha kuhamisha kutoka 192.168.1.2 hadi 192.168.0.2, na kisha kwa mashine yetu ya Windows na MySql.
sudo iptables -A FORWARD -i enp3s1 -o enp3s0 -p tcp --syn --dport 3306 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -i enp3s1 -o enp3s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i enp3s0 -o enp3s1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A PREROUTING -i enp3s1 -p tcp --dport 3306 -j DNAT --to-destination 192.168.0.3
sudo iptables -t nat -A POSTROUTING -o enp3s0 -p tcp --dport 3306 -d 192.168.0.3 -j SNAT --to-source 192.168.1.2
ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΡΡΠΎΡΠΊΠ° ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ Π²Π²Π΅Π΄Π΅Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ΅ ΠΎΡΠΈ Π½Π΅ ΡΡΠ΅ΡΠ»ΠΈΡΡ
sudo service iptables-persistent save
Wale. Mstari wa 1 unamaanisha kwamba tunakubali muunganisho wa kwanza, wa 2 na wa 3 kwamba inawezekana kutuma pakiti kwa pande zote mbili, ya 4 na ya 5 inamaanisha uingizwaji wa anwani ya marudio na chanzo. Na voila, unaweza kuunganisha kutoka nyumbani kupitia mysql. Na mwishowe, nambari yangu ya C ++ ambayo hufanya hivi:
//DataBaseConnection.cpp
#include "DataBaseConnection.h"
DataBaseConnection::DataBaseConnection()
{
}
void DataBaseConnection::Connect()
{
// ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ
conn = mysql_init(NULL);
if (conn == NULL)
{
// ΠΡΠ»ΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π½Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ β Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅
fprintf(stderr, "Error: can'tcreate MySQL-descriptorn");
//exit(1); //ΠΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΠΊΠΎΠ½Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
}
// ΠΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ
if (!mysql_real_connect(conn, "192.168.0.3", "root", "password", "your_base", NULL, NULL, 0))
{
// ΠΡΠ»ΠΈ Π½Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ
// Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅
fprintf(stderr, "Error: can't connect to database: %sn", mysql_error(conn));
}
else
{
// ΠΡΠ»ΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΡΠ°Π·Ρ - "Success!"
fprintf(stdout, "Success!n");
}
}
std::vector<std::string> DataBaseConnection::Query()
{
vectordrum.clear();
std::string query = "SELECT * FROM drum where id=0";
const char * q = query.c_str();
qstate = mysql_query(conn, q);
if (!qstate)
{
res = mysql_store_result(conn);
while (row = mysql_fetch_row(res))
{
//printf("ID: %s,Position: %s, Image: %sn", row[0], row[1], row[2]);
vectordrum.push_back(row[2]);
}
}
else
{
std::cout << "Query failed:" << mysql_error(conn) << std::endl;
}
return vectordrum;
}
void DataBaseConnection::Close()
{
// ΠΠ°ΠΊΡΡΠ²Π°Π΅ΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
mysql_close(conn);
}
DataBaseConnection::~DataBaseConnection()
{
vectordrum.clear();
}
//DataBaseConnection.h
#pragma once
#include <iostream>
#include <mysql.h>
#include <vector>
#pragma comment(lib,"mysqlcppconn.lib")
#pragma comment(lib,"libmysql.lib")
class DataBaseConnection
{
public:
DataBaseConnection();
void Connect();
std::vector<std::string> Query();
void Close();
~DataBaseConnection();
MYSQL *conn;
MYSQL_ROW row;
MYSQL_RES *res;
int qstate;
std::vector<std::string> vectordrum;
};
Sasa unaweza kutupa programu hii kwa usalama kwa mtu yeyote, na huna haja ya kuiandika upya ili ifanye kazi ndani ya nchi.
Chanzo: mapenzi.com