Маалыматтар базасын алыстан туташуу үчүн жеткиликтүү кылуу

Маалыматтар базасына туташуу менен тиркемени жасоо керек болгон учурлар бар экендигинен баштайлы. Бул колдун жана көндүмдөрдүн жетишсиздигинен улам бэкэндди иштеп чыгууга көп көңүл бурбоо жана фронтко топтолбоо үчүн жасалат. Менин чечимим коопсуз болот деп айта албайм, бирок ал иштейт.

Мен хостинг төлөгөндү жактырбагандыктан, тармакты жумушумда колдондум, ал жерде ак IP бар. Бул жерде анын түзүмү болуп саналат:

Маалыматтар базасын алыстан туташуу үчүн жеткиликтүү кылуу

Менде бир нече компьютерлер бар, тагыраагы 192.168.1.2 (ака 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

Бул мен үчүн иштеген жок жана мен бул дарек аркылуу тамыр катары туташа алган жокмун.

MySQL Workbench программасы жардам берди; жөндөөлөрдөн localhostту % деп өзгөртүп, кардар жардам бербесе да иштейт. Эми сиз маалымат базасына консолдон же каалаган даректен коддон туташа аласыз.

Маалыматтар базасын алыстан туташуу үчүн жеткиликтүү кылуу

Сиз ошондой эле үй же бизнес тармагын түзүп, Windows брандмауэрин өчүрүшүңүз керек, антпесе сиз бул машинаны пинг кыла албай каласыз (базага туташуу мындай турсун).

Жумуштун жарымы бүттү, эми мен үйдөн базага кошула алышым керек.

Тармак диаграммасынан көрүнүп тургандай, Интернетке кирүү үчүн 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 субнетинин кайда жайгашканын билиши үчүн зарыл (тармактардын негиздерин үйрөнүү пайдалуу).

Эми 3306 дарегине порт багыттоо 192.168.1.2 (демейки MySQL порту (эгер сиз аны орнотуу учурунда өзгөртпөсөңүз)) кошобуз.

Маалыматтар базасын алыстан туташуу үчүн жеткиликтүү кылуу

Эң кыйын нерсе Linux машинасында багыттоо (анын эки тармактык картасы 192.168.1.2 (enp3s1 интерфейси) жана 192.168.0.2 (enp3s0 интерфейси) бар), андыктан тармак карталары аларды 192.168.1.2ден эмнени которууну билишет. 192.168.0.2, андан кийин MySql менен Windows машинабызга.

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

Комментарий кошуу