Tietokannan asettaminen saataville etäyhteyttä varten

Aloitetaan siitä, että on tapauksia, joissa sinun on tehtävä sovellus, jossa on yhteys tietokantaan. Tämä tehdään, jotta ei syventyä liikaa backend-kehitykseen ja keskittyä frontendiin käsien ja taitojen puutteen vuoksi. En voi sanoa, että ratkaisuni olisi turvallinen, mutta se toimii.

Koska en pidä isännöinnistä maksamisesta, käytin verkkoa työssäni, siellä on valkoinen IP. Tässä sen rakenne:

Tietokannan asettaminen saataville etäyhteyttä varten

Minulla on pääsy useisiin tietokoneisiin, tarkemmin sanottuna 192.168.1.2 (alias 192.168.0.2), johon on asennettu Linux ja 192.168.0.3 Windowsilla. Yleensä valitsin sovellukseni mysql:n ja katsoin, mitä Linuxissa oli saatavilla. Se oli jo asennettu sinne, mutta kukaan ei tiedä salasanaa, ja ne, jotka tiesivät, unohtivat (ne, jotka työskentelivät ennen minua). Saatuani tietää, että kukaan ei tarvinnut sitä, poistin sen ja yritin asentaa sen uudelleen. Muisti ei riittänyt, ja koska tämän virheen korjaamiseksi minun piti liittää siihen näyttö ja näppäimistö hiirellä, päätin luopua tästä asiasta. Lisäksi Windows-kone on paljon tehokkaampi ja lisäksi minulla on se kannettavassani kotona. Periaatteessa en kuvaa itse asennusta, siitä on paljon oppaita ja videoita. Asennettuani mysql:n Windows-koneeseen, päätin varmuuskopioida taulukot kannettavastani työasemalleni.

Se on tehty näin (minun tapauksessani):

mysqldump -uroot -p your_base > dump_file.sql

Seuraavaksi luomme tietokannan uuteen tietokantaan ja palautamme varmuuskopion "uudelle" koneelle.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Varmuuskopiotiedosto on sijoitettava uuteen koneeseen ja ehkä jos ei apuohjelman hakemistoon, niin koko polku siihen. (Latasin juuri varmuuskopion GitHubiin ja kloonasin sen uudelle koneelle). Lisäisin kuinka itse taulukot luodaan, mutta en tallentanut kuvakaappauksia, ja mielestäni se ei ole vaikeaa edes 2-3-vuotiaalle opiskelijalle.

Kun kaikki taulukot on palautettu, on aika mahdollistaa etäkäyttö tietokantaan. Yleensä tällaiset komennot eivät johtaneet menestykseen (se antoi vain lukuoikeuden valita)

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

Tarkemmin sanottuna voisin muodostaa yhteyden tietokantaan vain komennolla,

mysql -h localhost -u client -pclient

mutta tämä ei enää jaksanut

mysql -h 192.168.0.3 -u client -pclient

Tämä ei toiminut minulle, enkä voinut muodostaa yhteyttä tämän osoitteen kautta root-käyttäjänä.

Mysql workbench -ohjelma auttoi, vaihda asetuksissa localhost %:ksi ja se toimii, vaikka asiakas ei auttanut. Nyt voit muodostaa yhteyden tietokantaan konsolista tai koodista mistä tahansa osoitteesta.

Tietokannan asettaminen saataville etäyhteyttä varten

Sinun on myös luotava koti- tai yritysverkko ja sammutettava Windowsin palomuuri, muuten et voi edes pingata tätä konetta (puhumattakaan yhteyden muodostamisesta tietokantaan).

Puolet työstä on tehty, nyt minun täytyy pystyä muodostamaan yhteys tietokantaan kotoa käsin.

Kuten verkkokaaviosta näkyy, Internetiin pääsemiseksi sinun on siirryttävä 192.168.0.3:sta 192.168.1.1:een (reititin), mennään päinvastaiseen suuntaan. Määritetään reitti 192.168.1.1 - 192.168.1.2 seuraavasti:

Tietokannan asettaminen saataville etäyhteyttä varten

Yleensä kuva ei näy, joten kirjoitan sen käsin:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Tämä voidaan tehdä vain yhdessä aliverkossa, eli et voi lähettää välittömästi osoitteeseen 192.168.0.2 tai 192.168.0.3

Tämä on välttämätöntä, jotta reititin tietää, missä aliverkko 192.168.0.0/24 sijaitsee (verkkojen perusteiden oppiminen on hyödyllistä).

Nyt lisäämme portin edelleenohjauksen 3306 (oletusmysql-portti (jos et muuttanut sitä asennuksen aikana)) osoitteeseen 192.168.1.2

Tietokannan asettaminen saataville etäyhteyttä varten

Vaikeinta on tehdä edelleenlähetys Linux-koneella (sillä on kaksi verkkokorttia 192.168.1.2 (enp3s1-liitäntä) ja 192.168.0.2 (enp3s0-liitäntä), jotta verkkokortit tietävät, mitä ne siirtävät 192.168.1.2:sta. 192.168.0.2:een ja sitten Windows-koneeseemme MySql:llä.

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

Nuo. 1. rivi tarkoittaa, että hyväksymme ensimmäisen yhteyden, 2. ja 3. että voimme lähettää paketteja molempiin suuntiin, 4. ja 5. tarkoittaa kohde- ja lähdeosoitteen muuttamista. Ja voila, voit muodostaa yhteyden kotoa mysql:n kautta. Ja lopuksi C++-koodini, joka tekee tämän:

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

Nyt voit turvallisesti lähettää tämän ohjelman kenelle tahansa, eikä sinun tarvitse kirjoittaa sitä uudelleen, jotta se toimisi paikallisesti.

Lähde: will.com

Lisää kommentti