Datu bāzes padarīšana pieejamu attālinātam savienojumam

Sāksim ar to, ka ir gadījumi, kad ir nepieciešams izveidot aplikāciju ar savienojumu ar datu bāzi. Tas tiek darīts, lai pārāk neiedziļinātos backend izstrādē un roku un prasmju trūkuma dēļ koncentrētos uz frontend. Es nevaru teikt, ka mans risinājums būs drošs, bet tas darbojas.

Tā kā man nepatīk maksāt par hostingu, es izmantoju tīklu savā darbā, tur ir balts IP. Šeit ir tā struktūra:

Datu bāzes padarīšana pieejamu attālinātam savienojumam

Man ir pieejami vairāki datori, precīzāk 192.168.1.2 (aka 192.168.0.2) ar tur instalētu Linux un 192.168.0.3 ar Windows. Kopumā es izvēlējos mysql savai lietojumprogrammai un paskatījos, kas ir pieejams Linux. Tas jau tur bija uzstādīts, bet neviens nezina paroli, un tie, kas zināja, aizmirsa (tie, kas strādāja pirms manis). Uzzinājis, ka nevienam tas nav vajadzīgs, es to izdzēsu un mēģināju instalēt vēlreiz. Atmiņas nebija pietiekami daudz, un, tā kā, lai labotu šo kļūdu, man būtu jāpievieno monitors un tastatūra ar peli, es nolēmu atteikties no šī jautājuma. Turklāt mašīna ar Windows ir daudz jaudīgāka un plus, man tā ir mājās klēpjdatorā. Principā es neaprakstīšu pašu instalāciju, par to ir daudz rokasgrāmatu un video. Pēc mysql instalēšanas Windows datorā es nolēmu dublēt tabulas no klēpjdatora uz manu darbstaciju.

Tas tiek darīts šādi (manā gadījumā):

mysqldump -uroot -p your_base > dump_file.sql

Pēc tam mēs izveidojam datu bāzi jaunajā datu bāzē un atjaunojam dublējumu “jaunajā” mašīnā.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Dublējuma fails ir jāievieto jaunajā datorā un, iespējams, ja ne direktorijā ar utilītu, tad pilns ceļš uz to. (Es tikko augšupielādēju dublējumu GitHub un klonēju to jaunā mašīnā). Es piebilstu, kā tiek veidotas pašas tabulas, bet es nesaglabāju ekrānuzņēmumus, un, manuprāt, tas nav grūti pat 2-3 gadu studentam.

Kad visas tabulas ir atjaunotas, ir pienācis laiks nodrošināt attālo piekļuvi datu bāzei. Kopumā šādas komandas nedeva panākumus (tas deva tikai lasīšanas atļauju atlasīt)

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

Precīzāk, es varētu izveidot savienojumu ar datu bāzi tikai ar komandu,

mysql -h localhost -u client -pclient

bet šis to vairs nevarēja

mysql -h 192.168.0.3 -u client -pclient

Tas man nedarbojās, un es nevarēju izveidot savienojumu, izmantojot šo adresi kā root.

Palīdzēja mysql workbench programma, iestatījumos nomainiet localhost uz % un strādā, lai gan klients nepalīdzēja. Tagad jūs varat izveidot savienojumu ar datu bāzi no konsoles vai no koda no jebkuras adreses.

Datu bāzes padarīšana pieejamu attālinātam savienojumam

Jums arī jāizveido mājas vai uzņēmuma tīkls un jāizslēdz Windows ugunsmūris, pretējā gadījumā jūs pat nevarēsit ping šo mašīnu (nemaz nerunājot par savienojumu ar datu bāzi).

Puse darba ir paveikta, tagad man jāspēj pieslēgties datu bāzei no mājām.

Kā redzat no tīkla diagrammas, lai nokļūtu internetā, jums jāiet no 192.168.0.3 uz 192.168.1.1 (maršrutētājs), iesim pretējā virzienā. Konfigurēsim maršrutu no 192.168.1.1 līdz 192.168.1.2 šādi:

Datu bāzes padarīšana pieejamu attālinātam savienojumam

Kopumā bilde neparādās, tāpēc uzrakstīšu ar roku:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

To var izdarīt tikai vienā apakštīklā, tas ir, jūs nevarat nekavējoties pārsūtīt uz adresi 192.168.0.2 vai 192.168.0.3

Tas ir nepieciešams, lai maršrutētājs zinātu, kur atrodas apakštīkls 192.168.0.0/24 (tīklu pamatu apguve ir noderīga).

Tagad mēs pievienojam porta pāradresāciju 3306 (noklusējuma mysql ports (ja to nemainījāt instalēšanas laikā)) adresei 192.168.1.2.

Datu bāzes padarīšana pieejamu attālinātam savienojumam

Visgrūtāk ir veikt pārsūtīšanu Linux datorā (tam ir divas tīkla kartes 192.168.1.2 (enp3s1 interfeiss) un 192.168.0.2 (enp3s0 interfeiss), lai tīkla kartes zinātu, ko tās pārsūtīt no 192.168.1.2. uz 192.168.0.2 un pēc tam uz mūsu Windows mašīnu ar 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

Tie. 1. rinda nozīmē, ka mēs pieņemam pirmo savienojumu, 2. un 3., ka varam nosūtīt paketes abos virzienos, 4. un 5. nozīmē galamērķa un avota adreses maiņu. Un voila, jūs varat izveidot savienojumu no mājām, izmantojot mysql. Un visbeidzot, mans C++ kods, kas to dara:

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

Tagad varat droši nosūtīt šo programmu ikvienam, un jums tā nav jāpārraksta, lai tā darbotos lokāli.

Avots: www.habr.com

Pievieno komentāru