Datu-basea urrutiko konexiorako eskuragarri jartzea

Has gaitezen datu-base batera konexioa duen aplikazio bat egin behar dela kasuak. Hau egiten da backend garapenean gehiegi ez sakontzeko eta frontend-ean kontzentratzeko esku eta trebetasun faltagatik. Ezin dut esan nire irtenbidea segurua izango denik, baina funtzionatzen du.

Hostingagatik ordaintzea gustatzen ez zaidanez, nire lanean sarea erabili dut, hor IP zuri bat dago. Hona hemen bere egitura:

Datu-basea urrutiko konexiorako eskuragarri jartzea

Hainbat ordenagailutarako sarbidea daukat, zehatzago, 192.168.1.2 (aka 192.168.0.2) Linux instalatuta eta 192.168.0.3 Windowsekin. Orokorrean, mysql aukeratu nuen nire aplikaziorako eta Linux-en eskuragarri zegoena aztertu nuen. Dagoeneko han instalatuta zegoen, baina inork ez daki pasahitza, eta zekitenek ahaztu egin zuten (ni baino lehen lan egin zutenek). Inork behar ez zuela ikasita, ezabatu egin nuen eta berriro instalatzen saiatu nintzen. Ez zegoen nahikoa memoria, eta errore hau konpontzeko monitorea eta teklatua sagu batekin konektatu beharko nituzkeenez, gai honi uko egitea erabaki nuen. Gainera, Windows-eko makina askoz indartsuagoa da eta gainera, nire ordenagailu eramangarrian daukat etxean. Printzipioz, ez dut instalazioa bera deskribatuko; horri buruzko eskuliburu eta bideo asko daude. Mysql Windows makina batean instalatu ondoren, mahaien babeskopia egitea erabaki nuen ordenagailu eramangarritik lan-estaziora.

Honela egiten da (nire kasuan):

mysqldump -uroot -p your_base > dump_file.sql

Ondoren, datu-base bat sortuko dugu datu-base berrian eta babeskopia berrezartzen dugu makina "berrian".

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Babeskopia-fitxategia makina berrian jarri behar da eta, agian, erabilgarritasuna duen direktorioan ez bada, haren bide osoa. (Bakopia GitHub-era igo eta makina berri batean klonatu dut). Taulak beraiek nola sortzen diren gehituko nuke, baina ez ditut pantaila-argazkiak gorde, eta uste dut 2-3 urteko ikasle batentzat ere ez dela zaila.

Taula guztiak leheneratu direnean, datu-baserako urruneko sarbidea eskuragarri jartzeko garaia da. Oro har, horrelako komandoek ez zuten arrakastarik ekarri (hautatzeko irakurtzeko baimena bakarrik ematen zuen)

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

Zehatzago esanda, datu-basera komandoarekin soilik konekta nezakeen,

mysql -h localhost -u client -pclient

baina honek ezin zuen gehiago egin

mysql -h 192.168.0.3 -u client -pclient

Honek ez zidan funtzionatu eta ezin izan nuen helbide honen bidez konektatu root gisa.

Mysql workbench programak lagundu zuen; ezarpenetan, aldatu localhost %-ra eta funtzionatzen du, bezeroak lagundu ez zuen arren. Orain datu-basera konekta zaitezke kontsolatik edo edozein helbidetako kodetik.

Datu-basea urrutiko konexiorako eskuragarri jartzea

Etxeko edo negozioko sare bat ere egin behar duzu eta Windows suebakia itzali, bestela ezingo duzu makina honi ping-a egin ere egin (are gutxiago datu-basera konektatu).

Lan erdia eginda dago, orain datu-basera etxetik konektatu ahal izan behar dut.

Sare-diagraman ikusten denez, Internetera heltzeko 192.168.0.3-tik 192.168.1.1-era (bideratzailea) joan behar da, goazen kontrako norabidean. Konfigura dezagun ibilbidea 192.168.1.1-tik 192.168.1.2-ra honela:

Datu-basea urrutiko konexiorako eskuragarri jartzea

Oro har, irudia ez da agertzen, beraz, eskuz idatziko dut:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Hau azpisare batean bakarrik egin daiteke, hau da, ezin duzu berehala birbidali 192.168.0.2 edo 192.168.0.3 helbidera.

Hau beharrezkoa da bideratzaileak 192.168.0.0/24 azpisarea non dagoen jakin dezan (sareen oinarriak ikastea erabilgarria da).

Orain 3306 ataka birbidaltzea gehitzen dugu (mysql ataka lehenetsia (instalazioan zehar aldatu ez bazenuen)) 192.168.1.2 helbidean.

Datu-basea urrutiko konexiorako eskuragarri jartzea

Egiteko zailena Linux makina batean birbidaltzea da (bi sare-txartel ditu 192.168.1.2 (enp3s1 interfazea) eta 192.168.0.2 (enp3s0 interfazea), sare-txartelek 192.168.1.2tik zer transferitu behar duten jakin dezaten. 192.168.0.2ra, eta gero gure Windows makinara MySql-rekin.

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

Horiek. 1. lerroak lehen konexioa onartzen dugula esan nahi du, 2. eta 3.ak paketeak bi noranzkoetan bidal ditzakegula, 4. eta 5.ak helmuga eta iturburu helbideak aldatzea esan nahi du. Eta listo, etxetik konekta zaitezke mysql bidez. Eta azkenik, hau egiten duen nire C++ kodea:

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

Orain segurtasunez bidal diezaiokezu programa hau edonori, eta ez duzu berridatzi behar lokalean funtziona dezan.

Iturria: www.habr.com

Gehitu iruzkin berria