Tagħmel id-database disponibbli għal konnessjoni remota

Nibdew bil-fatt li hemm każijiet meta għandek bżonn tagħmel applikazzjoni b'konnessjoni ma 'database. Dan isir sabiex ma jidħolx wisq fl-iżvilupp backend u jikkonċentra fuq il-frontend minħabba nuqqas ta 'idejn u ħiliet. Ma nistax ngħid li s-soluzzjoni tiegħi se tkun sigura, iżda taħdem.

Peress li ma nħobbx inħallas għall-hosting, użajt in-netwerk fuq ix-xogħol tiegħi, hemm IP abjad. Hawnhekk hawn l-istruttura tiegħu:

Tagħmel id-database disponibbli għal konnessjoni remota

Għandi aċċess għal diversi kompjuters, aktar preċiżament 192.168.1.2 (magħruf ukoll bħala 192.168.0.2) bil-Linux installat hemmhekk u 192.168.0.3 bil-Windows. B'mod ġenerali, għażilt mysql għall-applikazzjoni tiegħi u ħares lejn dak li kien disponibbli fuq Linux. Kien diġà installat hemm, iżda ħadd ma jaf il-password, u dawk li kienu jafu nesa (dawk li ħadmu qabli). Wara li tgħallimt li ħadd ma kellu bżonnha, ħassarha u ppruvajt ninstallaha mill-ġdid. Ma kienx hemm memorja biżżejjed, u peress li biex nirranġa dan l-iżball kien ikolli nqabbad monitor u tastiera b'maws miegħu, iddeċidejt li nċedi fuq din il-kwistjoni. Barra minn hekk, il-magna bil-Windows hija ħafna aktar qawwija u plus, għandi fuq il-laptop tiegħi fid-dar. Fil-prinċipju, mhux se niddeskrivi l-installazzjoni nnifisha; hemm ħafna manwali u vidjows dwarha. Wara li installajt mysql fuq magna Windows, iddeċidejt li nagħmel backup tat-tabelli mill-laptop tiegħi għall-istazzjon tax-xogħol tiegħi.

Issir hekk (fil-każ tiegħi):

mysqldump -uroot -p your_base > dump_file.sql

Sussegwentement, noħolqu database fid-database l-ġdida u nirrestawraw il-backup fuq il-magna "ġdida".

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Il-fajl tal-backup għandu jitqiegħed fuq il-magna l-ġdida u, forsi, jekk mhux fid-direttorju bl-utilità, allura l-mogħdija sħiħa għaliha. (Jien kemm tellajt il-backup fuq GitHub u kklonajtha fuq magna ġdida). Inżid kif jinħolqu t-tabelli nfushom, imma ma ssalvajtx il-screenshots, u naħseb li mhux diffiċli anke għal student ta '2-3 snin.

Meta t-tabelli kollha jkunu ġew restawrati, wasal iż-żmien li jsir disponibbli aċċess mill-bogħod għad-database. B'mod ġenerali, kmandi bħal dawn ma wasslux għal suċċess (taw biss permess tal-qari biex tagħżel)

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

B'mod aktar preċiż, stajt nikkonnettja mad-database biss bil-kmand,

mysql -h localhost -u client -pclient

iżda dan ma setax jagħmel aktar

mysql -h 192.168.0.3 -u client -pclient

Dan ma ħadimx għalija u ma stajtx nikkonnettja permezz ta 'dan l-indirizz bħala għerq.

Il-programm mysql workbench għen; fis-settings, ibdel localhost għal % u jaħdem, għalkemm il-klijent ma għenx. Issa tista 'tikkonnettja mad-database mill-console jew mill-kodiċi minn kwalunkwe indirizz.

Tagħmel id-database disponibbli għal konnessjoni remota

Trid ukoll tagħmel netwerk tad-dar jew tan-negozju u itfi l-firewall tal-Windows, inkella lanqas biss tkun tista 'tagħmel ping din il-magna (aħseb u ara tikkonnettja mad-database).

Nofs ix-xogħol isir, issa għandi bżonn inkun nista' nikkonnettja mad-database mid-dar.

Kif tistgħu taraw mid-dijagramma tan-netwerk, biex tasal għall-Internet trid tmur minn 192.168.0.3 sa 192.168.1.1 (router), ejja mmorru fid-direzzjoni opposta. Ejja kkonfigurat ir-rotta minn 192.168.1.1 għal 192.168.1.2 bħal dan:

Tagħmel id-database disponibbli għal konnessjoni remota

B'mod ġenerali, l-istampa ma turix, għalhekk ser niktebha bl-idejn:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Dan jista' jsir biss f'subnet waħda, jiġifieri, ma tistax tgħaddi immedjatament lill-indirizz 192.168.0.2 jew 192.168.0.3

Dan huwa meħtieġ sabiex ir-router ikun jaf fejn jinsab is-subnet 192.168.0.0/24 (it-tagħlim tal-baŜi tan-netwerks huwa utli).

Issa nżidu port forwarding 3306 (il-port default mysql (jekk ma biddiltx waqt l-installazzjoni)) fl-indirizz 192.168.1.2

Tagħmel id-database disponibbli għal konnessjoni remota

L-iktar ħaġa diffiċli li għad fadal hija li tagħmel forwarding fuq magna Linux (għandha żewġ karti tan-netwerk 192.168.1.2 (interface enp3s1) u 192.168.0.2 (interface enp3s0) sabiex il-kards tan-netwerk ikunu jafu x'għandhom jittrasferixxuhom minn 192.168.1.2. għal 192.168.0.2, u mbagħad għall-magna Windows tagħna b'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

Dawk. L-ewwel linja tfisser li naċċettaw l-ewwel konnessjoni, it-1 u t-2 li nistgħu nibagħtu pakketti fiż-żewġ direzzjonijiet, ir-3 u l-4 tfisser li nibdlu l-indirizzi tad-destinazzjoni u tas-sors. U voila, tista 'tqabbad mid-dar permezz ta' mysql. U fl-aħħar nett, il-kodiċi C++ tiegħi li jagħmel dan:

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

Issa tista 'tibgħat dan il-programm b'mod sikur lil xi ħadd, u m'għandekx għalfejn tiktebh mill-ġdid biex taħdem lokalment.

Sors: www.habr.com

Żid kumment