Andmebaasi kättesaadavaks tegemine kaugühenduse jaoks

Alustame sellest, et on juhtumeid, kus on vaja teha rakendus koos andmebaasiga ühendusega. Seda tehakse selleks, et mitte liiga palju taustaprogrammi arendamisse süveneda ning käte ja oskuste puudumise tõttu keskenduda frontendile. Ma ei saa öelda, et minu lahendus oleks ohutu, kuid see töötab.

Kuna mulle ei meeldi hostimise eest maksta, siis kasutasin töö juures võrku, seal on valge IP. Siin on selle struktuur:

Andmebaasi kättesaadavaks tegemine kaugühenduse jaoks

Mul on ligipääs mitmele arvutile, täpsemalt 192.168.1.2 (ehk 192.168.0.2), kuhu on installitud Linux ja 192.168.0.3 Windowsiga. Üldiselt valisin oma rakenduseks mysqli ja vaatasin, mis on Linuxis saadaval. See oli sinna juba installitud, kuid keegi ei tea parooli ja need, kes teadsid, unustasid (need, kes töötasid enne mind). Saanud teada, et kellelgi pole seda vaja, kustutasin selle ja proovisin uuesti installida. Mälu polnud piisavalt ja kuna selle vea parandamiseks peaksin sellega ühendama monitori ja hiirega klaviatuuri, otsustasin sellest asjast loobuda. Pealegi on Windowsiga masin palju võimsam ja pluss, see on mul kodus sülearvutis. Põhimõtteliselt ma installimist ennast ei kirjelda, selle kohta on palju käsiraamatuid ja videoid. Olles installinud Windowsi masinasse mysqli, otsustasin tabelid sülearvutist oma tööjaama varundada.

Seda tehakse nii (minu puhul):

mysqldump -uroot -p your_base > dump_file.sql

Järgmisena loome uues andmebaasis andmebaasi ja taastame varukoopia "uues" masinas.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Varukoopiafail tuleb paigutada uude masinasse ja võib-olla, kui mitte utiliidiga kataloogi, siis kogu tee selle juurde. (Laadisin varukoopia just GitHubisse ja kloonisin selle uude masinasse). Ma lisaksin, kuidas tabelid ise luuakse, kuid ma ei salvestanud ekraanipilte ja arvan, et see pole keeruline isegi 2-3-aastasele üliõpilasele.

Kui kõik tabelid on taastatud, on aeg teha andmebaasile kaugjuurdepääs kättesaadavaks. Üldiselt sellised käsud eduni ei toonud (andis valimiseks ainult lugemisloa)

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

Täpsemalt sain andmebaasiga ühenduse luua ainult käsuga,

mysql -h localhost -u client -pclient

aga see ei saanud enam hakkama

mysql -h 192.168.0.3 -u client -pclient

See ei töötanud minu jaoks ja ma ei saanud selle aadressi kaudu ühendust luua root kasutajana.

Aitas mysql workbench programm, seadistustes muuda localhost %ks ja töötab, kuigi klient ei aidanud. Nüüd saate luua ühenduse andmebaasiga konsoolist või mis tahes aadressi koodi kaudu.

Andmebaasi kättesaadavaks tegemine kaugühenduse jaoks

Samuti peate tegema kodu- või ettevõttevõrgu ja lülitama Windowsi tulemüüri välja, muidu ei saa te isegi seda masinat pingida (rääkimata andmebaasiga ühenduse loomisest).

Pool tööd on tehtud, nüüd pean saama kodust andmebaasiga ühenduse luua.

Nagu näete võrguskeemilt, peate Internetti pääsemiseks minema aadressilt 192.168.0.3 kuni 192.168.1.1 (ruuter), läheme vastupidises suunas. Seadistame marsruudi vahemikus 192.168.1.1 kuni 192.168.1.2 järgmiselt:

Andmebaasi kättesaadavaks tegemine kaugühenduse jaoks

Üldiselt pilti ei kuvata, nii et kirjutan selle käsitsi:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Seda saab teha ainult ühes alamvõrgus, see tähendab, et te ei saa kohe edastada aadressile 192.168.0.2 või 192.168.0.3

See on vajalik selleks, et ruuter teaks, kus asub alamvõrk 192.168.0.0/24 (võrkude põhitõdede õppimine on kasulik).

Nüüd lisame pordi suunamise 3306 (vaikimisi mysql port (kui te seda installimise ajal ei muutnud)) aadressile 192.168.1.2

Andmebaasi kättesaadavaks tegemine kaugühenduse jaoks

Kõige keerulisem on teha edasisaatmine Linuxi masinas (sellel on kaks võrgukaarti 192.168.1.2 (enp3s1 liides) ja 192.168.0.2 (enp3s0 liides), et võrgukaardid teaksid, mida need 192.168.1.2-st üle kanda. 192.168.0.2-le ja seejärel meie Windowsi arvutisse MySql-iga.

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

Need. 1. rida tähendab, et aktsepteerime esimest ühendust, 2. ja 3., et saame saata pakette mõlemas suunas, 4. ja 5. tähendab sihtkoha ja lähteaadressi muutmist. Ja voila, saate kodust ühenduse luua mysql-i kaudu. Ja lõpuks, minu C++ kood, mis seda teeb:

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

Nüüd saate selle programmi turvaliselt kellelegi saata ja te ei pea seda ümber kirjutama, et see kohapeal töötaks.

Allikas: www.habr.com

Lisa kommentaar