Տվյալների բազան հասանելի դարձնելով հեռակա կապի համար

Սկսենք նրանից, որ լինում են դեպքեր, երբ անհրաժեշտ է կատարել հավելված՝ տվյալների բազայի միացումով։ Սա արվում է, որպեսզի շատ չխորանանք հետնամասի զարգացման մեջ և կենտրոնանանք ճակատի վրա՝ ձեռքերի և հմտությունների բացակայության պատճառով: Չեմ կարող ասել, որ լուծումս անվտանգ կլինի, բայց այն աշխատում է։

Քանի որ ես չեմ սիրում վճարել հոսթինգի համար, ես իմ աշխատանքի ժամանակ օգտագործել եմ ցանցը, այնտեղ սպիտակ IP կա։ Ահա նրա կառուցվածքը.

Տվյալների բազան հասանելի դարձնելով հեռակա կապի համար

Ես մուտք ունեմ մի քանի համակարգիչներ, ավելի ճիշտ 192.168.1.2 (aka 192.168.0.2) այնտեղ տեղադրված Linux-ով և 192.168.0.3 Windows-ով: Ընդհանուր առմամբ, ես ընտրեցի mysql-ն իմ հավելվածի համար և նայեցի, թե ինչ կա Linux-ում։ Այնտեղ արդեն տեղադրված էր, բայց ոչ ոք չգիտի գաղտնաբառը, իսկ ովքեր գիտեին, մոռացել են (նրանք, ովքեր աշխատել են ինձանից առաջ): Իմանալով, որ դա ոչ մեկին պետք չէ, ես ջնջեցի այն և նորից փորձեցի տեղադրել։ Հիշողությունը բավարար չէր, և քանի որ այս սխալը շտկելու համար ես պետք է մկնիկով մոնիտոր և ստեղնաշար միացնեի դրան, որոշեցի հրաժարվել այս գործից: Ավելին, Windows-ով մեքենան շատ ավելի հզոր է և գումարած, ես այն ունեմ իմ նոթբուքի վրա տանը: Սկզբունքորեն, ես չեմ նկարագրի ինքնին տեղադրումը, դրա մասին կան բազմաթիվ ձեռնարկներ և տեսանյութեր: Տեղադրելով mysql-ը Windows ապարատի վրա՝ ես որոշեցի կրկնօրինակել աղյուսակները իմ նոութբուքից մինչև իմ աշխատանքային կայան:

Դա արվում է այսպես (իմ դեպքում).

mysqldump -uroot -p your_base > dump_file.sql

Հաջորդը, մենք ստեղծում ենք տվյալների բազա նոր տվյալների բազայում և վերականգնում ենք կրկնօրինակը «նոր» մեքենայի վրա:

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Պահուստային ֆայլը պետք է տեղադրվի նոր մեքենայի վրա և, հնարավոր է, եթե ոչ կոմունալ ծառայության գրացուցակում, ապա դրա ամբողջական ուղին: (Ես հենց նոր վերբեռնեցի կրկնօրինակը GitHub և կլոնավորեցի այն նոր մեքենայի վրա): Ես կավելացնեի, թե ինչպես են ստեղծվում աղյուսակները, բայց ես չեմ պահպանել սքրինշոթերը, և կարծում եմ, որ դա դժվար չէ նույնիսկ 2-3 տարեկան ուսանողի համար:

Երբ բոլոր աղյուսակները վերականգնվեն, ժամանակն է հասանելի դարձնել տվյալների բազայի հեռավոր մուտքը: Ընդհանրապես, նման հրամանները հաջողության չեն հանգեցրել (ընտրելու թույլտվություն է տվել միայն կարդալու համար)

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

Ավելի ճիշտ, տվյալների բազային կարող էի միանալ միայն հրամանով,

mysql -h localhost -u client -pclient

բայց այս մեկն այլևս չէր կարող դա անել

mysql -h 192.168.0.3 -u client -pclient

Սա ինձ մոտ չաշխատեց, և ես չկարողացա միանալ այս հասցեի միջոցով որպես root:

Mysql workbench ծրագիրը օգնեց, կարգավորումներում փոխեք localhost-ը % և այն աշխատում է, չնայած հաճախորդը չօգնեց: Այժմ դուք կարող եք միանալ տվյալների շտեմարանին վահանակից կամ կոդից ցանկացած հասցեից:

Տվյալների բազան հասանելի դարձնելով հեռակա կապի համար

Դուք նաև պետք է տնային կամ բիզնես ցանց ստեղծեք և անջատեք Windows-ի firewall-ը, հակառակ դեպքում դուք նույնիսկ չեք կարողանա այս մեքենան ping անել (չխոսելով տվյալների բազայի հետ միանալու մասին):

Գործի կեսն ավարտված է, հիմա պետք է կարողանամ տնից միանալ տվյալների բազային։

Ինչպես տեսնում եք ցանցի դիագրամից, ինտերնետ հասնելու համար անհրաժեշտ է 192.168.0.3-ից գնալ 192.168.1.1 (երթուղիչ), գնանք հակառակ ուղղությամբ։ Եկեք կարգավորենք երթուղին 192.168.1.1-ից մինչև 192.168.1.2 այսպես.

Տվյալների բազան հասանելի դարձնելով հեռակա կապի համար

Ընդհանուր առմամբ, նկարը չի երևում, ուստի ես այն կգրեմ ձեռքով.

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Դա կարելի է անել միայն մեկ ենթացանցում, այսինքն՝ դուք չեք կարող անմիջապես փոխանցել 192.168.0.2 կամ 192.168.0.3 հասցեներին։

Սա անհրաժեշտ է, որպեսզի երթուղիչը իմանա, թե որտեղ է գտնվում 192.168.0.0/24 ենթացանցը (ցանցերի հիմունքները սովորելը օգտակար է):

Այժմ մենք ավելացնում ենք port forwarding 3306 (կանխադրված mysql պորտը (եթե այն չեք փոխել տեղադրման ժամանակ)) 192.168.1.2 հասցեին:

Տվյալների բազան հասանելի դարձնելով հեռակա կապի համար

Ամենադժվարը, որ մնում է անել, վերահասցեավորում կատարելն է Linux մեքենայի վրա (այն ունի երկու ցանցային քարտ 192.168.1.2 (enp3s1 ինտերֆեյս) և 192.168.0.2 (enp3s0 ինտերֆեյս), որպեսզի ցանցային քարտերը իմանան, թե ինչ փոխանցել դրանք 192.168.1.2-ից: դեպի 192.168.0.2, այնուհետև մեր Windows ապարատին՝ 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

Նրանք. 1-ին տողը նշանակում է, որ մենք ընդունում ենք առաջին կապը, 2-րդ և 3-րդ, որ մենք կարող ենք ուղարկել փաթեթներ երկու ուղղություններով, 4-րդ և 5-րդը նշանակում է փոխել նպատակակետը և աղբյուրի հասցեները: Եվ voila, դուք կարող եք միանալ տնից mysql-ի միջոցով: Եվ վերջապես, իմ C++ կոդը, որն անում է սա.

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

Այժմ դուք կարող եք ապահով կերպով ուղարկել այս ծրագիրը որևէ մեկին, և դուք ստիպված չեք լինի այն վերաշարադրել, որպեսզի այն աշխատի տեղական մակարդակում:

Source: www.habr.com

Добавить комментарий