Gør databasen tilgængelig for fjernforbindelse

Lad os starte med, at der er tilfælde, hvor du skal lave en ansøgning med forbindelse til en database. Dette gøres for ikke at dykke for meget i backend-udvikling og koncentrere sig om frontend på grund af mangel på hænder og færdigheder. Jeg kan ikke sige, at min løsning vil være sikker, men den virker.

Da jeg ikke kan lide at betale for hosting, brugte jeg netværket på mit arbejde, der er en hvid IP der. Her er dens struktur:

Gør databasen tilgængelig for fjernforbindelse

Jeg har adgang til flere computere, mere præcist 192.168.1.2 (alias 192.168.0.2) med Linux installeret der og 192.168.0.3 med Windows. Generelt valgte jeg mysql til min applikation og så på, hvad der var tilgængeligt på Linux. Det var allerede installeret der, men ingen kender adgangskoden, og dem, der vidste, glemte det (dem, der arbejdede før mig). Efter at have erfaret, at ingen havde brug for det, slettede jeg det og forsøgte at installere det igen. Der var ikke nok hukommelse, og da jeg for at rette denne fejl skulle tilslutte en skærm og et tastatur med en mus, besluttede jeg at opgive denne sag. Desuden er maskinen med Windows meget mere kraftfuld og plus, jeg har den på min bærbare computer derhjemme. I princippet vil jeg ikke beskrive selve installationen, der er en masse manualer og videoer om det. Efter at have installeret mysql på en Windows-maskine, besluttede jeg at tage backup af tabellerne fra min bærbare computer til min arbejdsstation.

Det er gjort sådan her (i mit tilfælde):

mysqldump -uroot -p your_base > dump_file.sql

Dernæst opretter vi en database i den nye database og gendanner sikkerhedskopien på den "nye" maskine.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Sikkerhedskopieringsfilen skal placeres på den nye maskine og måske, hvis ikke i mappen med hjælpeprogrammet, så den fulde sti til den. (Jeg har lige uploadet sikkerhedskopien til GitHub og klonet den til en ny maskine). Jeg vil tilføje, hvordan selve tabellerne er oprettet, men jeg har ikke gemt skærmbillederne, og jeg tror, ​​at det ikke er svært, selv for en 2-3-årig studerende.

Når alle tabellerne er blevet gendannet, er det tid til at gøre fjernadgang til databasen tilgængelig. Generelt førte sådanne kommandoer ikke til succes (det gav kun læsetilladelse til at vælge)

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

Mere præcist kunne jeg kun oprette forbindelse til databasen med kommandoen,

mysql -h localhost -u client -pclient

men denne kunne ikke gøre det mere

mysql -h 192.168.0.3 -u client -pclient

Dette virkede ikke for mig, og jeg kunne ikke oprette forbindelse via denne adresse som root.

Mysql workbench-programmet hjalp; i indstillingerne skal du ændre localhost til %, og det virker, selvom klienten ikke hjalp. Nu kan du oprette forbindelse til databasen fra konsollen eller fra kode fra enhver adresse.

Gør databasen tilgængelig for fjernforbindelse

Du skal også lave et hjemme- eller forretningsnetværk og slukke for Windows firewall, ellers vil du ikke engang være i stand til at pinge denne maskine (endsige oprette forbindelse til databasen).

Halvdelen er klaret, nu skal jeg kunne oprette forbindelse til databasen hjemmefra.

Som du kan se fra netværksdiagrammet, for at komme til internettet skal du gå fra 192.168.0.3 til 192.168.1.1 (router), lad os gå i den modsatte retning. Lad os konfigurere ruten fra 192.168.1.1 til 192.168.1.2 sådan her:

Gør databasen tilgængelig for fjernforbindelse

Generelt vises billedet ikke, så jeg skriver det i hånden:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Dette kan kun gøres i ét undernet, det vil sige, at du ikke umiddelbart kan videresende til adressen 192.168.0.2 eller 192.168.0.3

Dette er nødvendigt, så routeren ved, hvor undernettet 192.168.0.0/24 er placeret (det er nyttigt at lære det grundlæggende i netværk).

Nu tilføjer vi port forwarding 3306 (standard mysql-porten (hvis du ikke ændrede den under installationen)) til adressen 192.168.1.2

Gør databasen tilgængelig for fjernforbindelse

Det sværeste at gøre er at lave videresendelse på en Linux-maskine (den har to netværkskort 192.168.1.2 (enp3s1-interface) og 192.168.0.2 (enp3s0-interface), så netværkskortene ved, hvad de skal overføre dem fra 192.168.1.2 til 192.168.0.2, og derefter til vores Windows-maskine med 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

De der. 1. linje betyder, at vi accepterer den første forbindelse, 2. og 3. at vi kan sende pakker i begge retninger, 4. og 5. betyder ændring af destinations- og kildeadresser. Og voila, du kan oprette forbindelse hjemmefra via mysql. Og endelig, min C++ kode, der gør dette:

//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;
};

Nu kan du trygt sende dette program til hvem som helst, og du behøver ikke at omskrive det for at få det til at fungere lokalt.

Kilde: www.habr.com

Tilføj en kommentar