Dajanje baze podatkov na voljo za oddaljeno povezavo

Začnimo z dejstvom, da morate včasih narediti aplikacijo s povezavo z bazo podatkov. To je narejeno zato, da se zaradi pomanjkanja rok in spretnosti ne bi preveč poglobili v zaledni razvoj in se osredotočili na sprednji del. Ne bom rekel, da bo moja rešitev varna, vendar deluje.

Ker ne maram plačevati gostovanja, sem uporabljal omrežje v službi, tam je bel IP. Tukaj je njegova struktura:

Dajanje baze podatkov na voljo za oddaljeno povezavo

Imam dostop do več računalnikov, natančneje do 192.168.1.2 (aka 192.168.0.2) je Linux in 192.168.0.3 z Windowsi. Na splošno sem za svojo aplikacijo izbral mysql in pogledal, kaj je na Linuxu. Tam je že bil nameščen, vendar nihče ne pozna gesla, tisti, ki so vedeli, pa so pozabili (tisti, ki so delali pred mano). Ko sem izvedel, da ga nihče ne potrebuje, sem ga izbrisal in poskusil znova namestiti. Ni bilo dovolj pomnilnika in ker bi moral za odpravo te napake nanj priključiti monitor in tipkovnico z miško, sem se odločil, da opustim ta posel. Poleg tega je Windows stroj veliko močnejši, poleg vsega pa ga imam tudi sam doma na prenosniku. Načeloma ne bom opisoval same namestitve, o tem je veliko priročnikov in videov. Ko sem namestil mysql na računalnik z operacijskim sistemom Windows, sem se odločil varnostno kopirati tabele iz prenosnika na delovno postajo.

To se naredi tako (v mojem primeru):

mysqldump -uroot -p your_base > dump_file.sql

Nato ustvarimo bazo podatkov v novi bazi podatkov in obnovimo varnostno kopijo na "novem" stroju.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Datoteko z varnostno kopijo je treba postaviti na nov stroj in če ni v imeniku s pripomočkom, je možna celotna pot do nje. (Pravkar sem naložil varnostno kopijo na github in jo kloniral na nov stroj). Dodal bi, kako nastanejo same tabele, vendar posnetkov zaslona nisem shranil in mislim, da ni težko niti za 2-3 letnika.

Ko sem obnovil vse tabele, je čas, da omogočim oddaljeni dostop do baze podatkov. Na splošno taki ukazi niso privedli do uspeha (podana je bila le pravica do branja izbire)

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

Natančneje, z bazo sem se lahko povezal le z ukazom,

mysql -h localhost -u client -pclient

in ta ni mogel

mysql -h 192.168.0.3 -u client -pclient

Ni mi ustrezalo, tudi preko tega naslova se nisem mogel povezati kot root.

Pomagal je program mysql workbench, tam v nastavitvah spremeniš localhost v% in dela, čeprav klient ni pomagal. Zdaj se lahko povežete z bazo podatkov iz konzole ali iz kode s katerega koli naslova.

Dajanje baze podatkov na voljo za oddaljeno povezavo

Ustvariti morate tudi domače ali poslovno omrežje in izklopiti požarni zid Windows, sicer ne boste mogli niti pingati tega stroja (ne da se bo povezal z bazo podatkov).

Polovica dela je opravljena, potem se moram od doma povezati z bazo podatkov.

Kot je razvidno iz diagrama omrežja, morate iti na internet od 192.168.0.3 do 192.168.1.1 (usmerjevalnik), pojdimo v nasprotni smeri. Nastavimo pot od 192.168.1.1 do 192.168.1.2 takole:

Dajanje baze podatkov na voljo za oddaljeno povezavo

Na splošno slika ni prikazana - napisal bom z rokami:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

To je mogoče storiti samo v enem podomrežju, torej ne morete takoj posredovati na naslov 192.168.0.2 ali 192.168.0.3

To je potrebno, da usmerjevalnik ve, kje se nahaja podomrežje 192.168.0.0/24 (koristno je naučiti se osnov omrežij).

Zdaj dodamo posredovanje vrat 3306 (privzeta vrata mysql (če jih niste spremenili med namestitvijo)) na naslov 192.168.1.2

Dajanje baze podatkov na voljo za oddaljeno povezavo

Zdaj je najtežje narediti posredovanje na računalniku z Linuxom (ima dve omrežni kartici 192.168.1.2 (vmesnik enp3s1) in 192.168.0.2 (vmesnik enp3s0), da omrežne kartice vedo, kaj jim je treba prenesti iz 192.168.1.2. na 192.168.0.2 in nato na naš stroj Windows z 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

Tisti. 1. vrstica pomeni, da sprejemamo prvo povezavo, 2. in 3., da je možno pošiljanje paketov v obe smeri, 4. in 5. pomenita zamenjavo ciljnega in izvornega naslova. In voila, lahko se povežete od doma prek mysql. In končno, moja koda C++, ki naredi to:

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

Zdaj lahko ta program varno zavržete komur koli in vam ga ni treba prepisati, da bo deloval lokalno.

Vir: www.habr.com

Dodaj komentar