Bëni bazën e të dhënave të aksesueshme për lidhje të largët

Le të fillojmë me faktin se ndodhin raste kur është e nevojshme të krijohet një aplikacion me lidhje në bazën e të dhënave. Kjo bëhet për të mos u thelluar shumë në zhvillimin e backend dhe për t'u përqëndruar në frontend për shkak të mungesës së personave dhe aftësive. Nuk jam në pozita për të thënë se zgjidhja ime do të jetë e sigurt, por funksionon.

Pasi nuk më pëlqen të paguaj për hostim, përdora rrjetin në punë, ku kam një IP të bardhë. Kjo është struktura e saj:

Bëni bazën e të dhënave të aksesueshme për lidhje të largët

Kam qasje në disa kompjuterë, përkatësisht në 192.168.1.2 (po ashtu 192.168.0.2) aty është i instaluar Linux dhe në 192.168.0.3 me Windows. Në përgjithësi, për aplikacionin tim zgjodha mysql dhe shikova se çfarë kishte në Linux. Aty tashmë ishte instaluar, por askush nuk e dinte fjalëkalimin, dhe ata që e dinin e kishin harruar (ata që kishin punuar para meje). Pasi u mora vesh se s’kishte nevojë për të, e fshiva dhe përpiqesha ta instaloj nga e para. Memoria nuk ishte e mjaftueshme dhe që të rregulloja këtë gabim do të duhej të lidhja një monitor dhe një tastierë me miun, kështu që vendosa ta lë mënjanë. Për më tepër, makina me Windows është shumë më e fuqishme dhe për më tepër ajo tashmë është në laptopin tim. Në thelb, nuk do ta përshkruaj instalimin vetë, ka shumë manuale dhe video për këtë. Pas instalimit të mysql në makinën me Windows, vendosa të bëj një backup të tabelave nga laptopi në stacionin e punës.

Kjo bëhet kështu (në rastin tim):

mysqldump -uroot -p your_base > dump_file.sql

Më pas në bazën e të dhënave të re krijojmë një bazë të dhënash dhe rikuperojmë backup-in në makinën e "re".

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


File me backup-in duhet vendosur në makinën e re dhe ndoshta, nëse nuk ndodhet në direktorinë me mjetin, atëherë rruga e plotë për të. (Unë thjesht e ngarkova backup-in në github dhe e klonova atë në makinën e re). Do të kisha dashur të tregoj si krijohen vetë tabelat, por nuk kam ruajtur screenshot-e, dhe mendoj se nuk është e vështirë as për një student të vitit të dytë-të tretë.

Kur rikuperova të gjitha tabelat, erdhi koha për të bërë aksesin e largët në bazën e të dhënave. Në përgjithësi, këto komanda nuk rezultuan të suksesshme (kisha vetëm të drejtën për lexim selektimi)

create user 'client'@'%' IDENTIFIED by 'client';
grant select on your_base . * to 'client'@'%';
flush privileges;

Më saktë, unë mund të lidhem me bazën vetëm me komandën,

mysql -h localhost -u client -pclient

ndërsa ajo tjetër nuk mund të lidhet

mysql -h 192.168.0.3 -u client -pclient

kjo nuk më përshtatej, as nuk mund të lidhesha përmes këtij adresi dhe nga root.

Më ndihmoi programi mysql workbench, aty në cilësime ndërroni localhost me % dhe funksionon, megjithatë client nuk e ndihmoi. Tani mund të lidhesh në bazën e të dhënave nga konsola ose nga kodi nga çdo adresë.

Bëni bazën e të dhënave të aksesueshme për lidhje të largët

Duhet gjithashtu të bëni rrjetin shtëpiak ose të biznesit dhe të çaktivizoni firewal-in e Windows, përndryshe nuk do të mund t'i bëni as ping kësaj makine (ndoshta as të lidheni me bazën e të dhënave).

Pjesa e parë u krye, tani duhet të mund të lidhem me bazën e të dhënave nga shtëpia.

Siç duket nga skema e rrjetit, për të arritur në internet duhet të kalosh nga 192.168.0.3 në 192.168.1.1 (router), kështu që do të ecim mbrapsht. Do të konfiguroni rrugën nga 192.168.1.1 në 192.168.1.2 kështu:

Bëni bazën e të dhënave të aksesueshme për lidhje të largët

Në përgjithësi, nuk e shfaq pamjen — do të shkruaj me dorë:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Kjo mund të bëhet vetëm në një nënrrjet, domethënë nuk mund të çojë drejtpërdrejt në adresat 192.168.0.2 ose 192.168.0.3

Kjo është për të siguruar që router-i e di se ku ndodhet nënrrjeti 192.168.0.0/24 (mësoni thelbësitë e rrjeteve, është e dobishme).

Tani shtoni forwarding-in e portit 3306 (porti mysql sipas parazgjedhjes (nëse nuk e keni ndërruar gjatë instalimit)) në adresën 192.168.1.2

Bëni bazën e të dhënave të aksesueshme për lidhje të largët

Kjo mbetet për të bërë gjëja më e komplikuar, kjo është t'i bëni forwarding-n në makinën Linux (kjo ka dy karta rrjeti 192.168.1.2 (ndërfaqja enp3s1) dhe 192.168.0.2 (ndërfaqja enp3s0), për t'iu treguar kartave të rrjetit se çfarë të dërgojnë nga 192.168.1.2 në 192.168.0.2, dhe pastaj në makinën tonë me Windows me 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
dhe rreshti i fundit ruan komandat e shkruara që ato të mos fshihen kur riaktivizohet sistemi

Pra, rreshti 1 do të thotë se ne pranojmë lidhjen e parë, rreshti 2 dhe 3 do të thotë se pakot mund të kalojnë në të dyja anët, rreshti 4 dhe 5 do të thotë zëvendësimin e adresës së destinacionit dhe burimit. Dhe voilà, tani mund të lidhesh nga shtëpia përmes mysql. Dhe për fund, kodi im në c++ që e bën këtë:

//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); //Если используется оконное приложение
	}
	// Подключаемся к server
	if (!mysql_real_connect(conn, "192.168.0.3", "root", "password", "your_base", NULL, NULL, 0))
	{
		// Nëse nuk ka mundësi për të vendosur lidhjen me serverin 
		// базы данных выводим сообщение об ошибке
		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;
};

Tani mund ta dërgoni këtë program kujtdo me siguri, dhe nuk keni nevojë ta shkruani përsëri që të punojë lokal.

Burimi: habr.com

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster