Дерекқорды қашықтан қосылу үшін қолжетімді ету

Дерекқорға қосылу арқылы қосымшаны жасау қажет болатын жағдайлар бар екенінен бастайық. Бұл қолдар мен дағдылардың жетіспеуіне байланысты бэкендті әзірлеуге тым көп кіріспеу және фронтендке шоғырланбау үшін жасалады. Менің шешімім қауіпсіз болады деп айта алмаймын, бірақ ол жұмыс істейді.

Мен хостингке ақы төлеуді ұнатпайтындықтан, желіні жұмысымда пайдаландым, ол жерде ақ IP бар. Міне, оның құрылымы:

Дерекқорды қашықтан қосылу үшін қолжетімді ету

Менде бірнеше компьютерге, дәлірек айтқанда, Linux орнатылған 192.168.1.2 (192.168.0.2) және Windows жүйесі бар 192.168.0.3 қолжетімді. Жалпы, мен қосымшам үшін 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 порты (егер сіз оны орнату кезінде өзгертпеген болсаңыз))

Дерекқорды қашықтан қосылу үшін қолжетімді ету

Желілік карталар оларды 192.168.1.2 нұсқасынан не тасымалдау керектігін білуі үшін Linux құрылғысында қайта жіберуді орындау (оның 3 (enp1s192.168.0.2 интерфейсі) және 3 (enp0s192.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;
};

Енді сіз бұл бағдарламаны кез келген адамға қауіпсіз жібере аласыз және оны жергілікті жерде жұмыс істеуі үшін қайта жазудың қажеті жоқ.

Ақпарат көзі: www.habr.com

пікір қалдыру