Bërja e bazës së të dhënave të disponueshme për lidhje në distancë

Le të fillojmë me faktin se ka raste kur duhet të bëni një aplikacion me lidhje me një bazë të dhënash. Kjo është bërë në mënyrë që të mos thelloheni shumë në zhvillimin e backend-it dhe të përqendroheni në pjesën e përparme për shkak të mungesës së duarve dhe aftësive. Nuk mund të them se zgjidhja ime do të jetë e sigurt, por funksionon.

Meqenëse nuk më pëlqen të paguaj për hosting, kam përdorur rrjetin në punën time, ka një IP të bardhë atje. Këtu është struktura e saj:

Bërja e bazës së të dhënave të disponueshme për lidhje në distancë

Kam akses në disa kompjuterë, më saktë 192.168.1.2 (aka 192.168.0.2) me Linux të instaluar aty dhe 192.168.0.3 me Windows. Në përgjithësi, zgjodha mysql për aplikacionin tim dhe shikova se çfarë ishte në dispozicion në Linux. Tashmë ishte instaluar atje, por askush nuk e di fjalëkalimin, dhe ata që e dinin harruan (ata që punuan para meje). Pasi mësova se askush nuk kishte nevojë për të, e fshiva dhe u përpoqa ta instaloja përsëri. Nuk kishte memorie të mjaftueshme, dhe meqenëse për të rregulluar këtë gabim do të më duhej të lidhja një monitor dhe tastierë me miun me të, vendosa të heq dorë nga kjo çështje. Për më tepër, makina me Windows është shumë më e fuqishme dhe plus, e kam në laptop në shtëpi. Në parim, nuk do ta përshkruaj vetë instalimin; ka shumë manuale dhe video në lidhje me të. Pasi instalova mysql në një makinë Windows, vendosa të bëj kopje rezervë të tabelave nga laptopi im në stacionin tim të punës.

Është bërë kështu (në rastin tim):

mysqldump -uroot -p your_base > dump_file.sql

Më pas, ne krijojmë një bazë të dhënash në bazën e re të të dhënave dhe rivendosim kopjen rezervë 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;


Skedari rezervë duhet të vendoset në makinën e re dhe, ndoshta, nëse jo në drejtorinë me programin, atëherë shtegu i plotë drejt tij. (Sapo ngarkova kopjen rezervë në GitHub dhe e klonova në një makinë të re). Unë do të shtoja se si krijohen vetë tabelat, por nuk i ruajta pamjet e ekranit dhe mendoj se nuk është e vështirë as për një student 2-3 vjeçar.

Kur të gjitha tabelat të jenë restauruar, është koha për të vënë në dispozicion aksesin në distancë në bazën e të dhënave. Në përgjithësi, komanda të tilla nuk çuan në sukses (ajo dha vetëm leje leximi për të zgjedhur)

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

Më saktësisht, unë mund të lidhem me bazën e të dhënave vetëm me komandën,

mysql -h localhost -u client -pclient

por ky nuk mund ta bënte më

mysql -h 192.168.0.3 -u client -pclient

Kjo nuk funksionoi për mua dhe nuk mund të lidhesha përmes kësaj adrese si rrënjë.

Programi mysql workbench ndihmoi; në cilësimet, ndryshoni localhost në % dhe funksionon, megjithëse klienti nuk ndihmoi. Tani mund të lidheni me bazën e të dhënave nga tastiera ose nga kodi nga çdo adresë.

Bërja e bazës së të dhënave të disponueshme për lidhje në distancë

Ju gjithashtu duhet të krijoni një rrjet shtëpie ose biznesi dhe të fikni murin e zjarrit të Windows, përndryshe nuk do të jeni në gjendje ta bëni ping këtë makinë (le më të lidheni me bazën e të dhënave).

Gjysma e punës është bërë, tani më duhet të jem në gjendje të lidhem me bazën e të dhënave nga shtëpia.

Siç mund ta shihni nga diagrami i rrjetit, për të hyrë në internet duhet të shkoni nga 192.168.0.3 në 192.168.1.1 (ruteri), le të shkojmë në drejtim të kundërt. Le të konfigurojmë rrugën nga 192.168.1.1 në 192.168.1.2 si kjo:

Bërja e bazës së të dhënave të disponueshme për lidhje në distancë

Në përgjithësi, fotografia nuk shfaqet, kështu që do ta 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ë dërgoni menjëherë në adresën 192.168.0.2 ose 192.168.0.3

Kjo është e nevojshme në mënyrë që ruteri të dijë se ku ndodhet nënrrjeti 192.168.0.0/24 (të mësuarit e bazave të rrjeteve është i dobishëm).

Tani shtojmë përcjelljen e portit 3306 (portin e paracaktuar të mysql (nëse nuk e keni ndryshuar gjatë instalimit)) në adresën 192.168.1.2

Bërja e bazës së të dhënave të disponueshme për lidhje në distancë

Gjëja më e vështirë për të bërë është të bëni përcjelljen në një makinë Linux (ajo ka dy karta rrjeti 192.168.1.2 (ndërfaqja enp3s1) dhe 192.168.0.2 (ndërfaqja enp3s0) në mënyrë që kartat e rrjetit të dinë se çfarë t'i transferojnë ato nga 192.168.1.2 në 192.168.0.2, dhe më pas në kompjuterin tonë 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
и последняя строчка сохраняет введенные команды чтобы они при перезапуске оси не стерлись
sudo service iptables-persistent save

ato. Rreshti i parë do të thotë që ne pranojmë lidhjen e parë, e dyta dhe e treta që mund të dërgojmë paketa në të dy drejtimet, e 1-ta dhe e 2-ta do të thotë ndryshim i adresave të destinacionit dhe burimit. Dhe voila, ju mund të lidheni nga shtëpia nëpërmjet mysql. Dhe së fundi, kodi im 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); //Если используется оконное приложение
	}
	// Подключаемся к серверу
	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;
};

Tani mund t'ia dërgoni me siguri këtë program kujtdo dhe nuk keni nevojë ta rishkruani për ta bërë atë të funksionojë në nivel lokal.

Burimi: www.habr.com

Shto një koment