Uzaqdan əlaqə üçün verilənlər bazasını əlçatan etmək

Başlayaq ki, verilənlər bazası bağlantısı ilə bir tətbiq etmək lazım olan vaxtlar olur. Bu, əllərin və bacarıqların olmaması səbəbindən arxa planın inkişafı ilə çox məşğul olmamaq və ön hissəyə diqqəti cəmləməmək üçün edilir. Mənim həllimin təhlükəsiz olacağını söyləmək fikrində deyiləm, amma işləyir.

Hostinq pulu verməyi sevmədiyim üçün şəbəkədən işimdə istifadə etdim, ağ IP var. Budur onun strukturu:

Uzaqdan əlaqə üçün verilənlər bazasını əlçatan etmək

Bir neçə kompüterə çıxışım var, daha doğrusu 192.168.1.2 (aka 192.168.0.2) Linux və Windows ilə 192.168.0.3 var. Ümumiyyətlə, tətbiqim üçün mysql-i seçdim və Linux-da olanlara baxdım. Artıq orda quraşdırılıb, amma parolu heç kim bilmir, bilənlər də unudub (məndən əvvəl işləyənlər). Heç kimə lazım olmadığını öyrəndikdən sonra onu sildim və yenidən quraşdırmağa çalışdım. Kifayət qədər yaddaş yox idi və bu səhvi düzəltmək üçün ona siçan ilə monitor və klaviatura qoşmalı olduğum üçün bu işi tərk etmək qərarına gəldim. Üstəlik, bir Windows maşını daha güclüdür və üstəlik, hər şey, mən özüm evdə laptopumda var. Prinsipcə, quraşdırmanın özünü təsvir etməyəcəyəm, bu barədə çoxlu təlimatlar və videolar var. MySQL-i bir Windows maşınına quraşdırdıqdan sonra masaların ehtiyat nüsxəsini noutbukdan iş stansiyasına köçürməyə qərar verdim.

Bu belə edilir (mənim vəziyyətimdə):

mysqldump -uroot -p your_base > dump_file.sql

Sonra, yeni verilənlər bazasında verilənlər bazası yaradırıq və "yeni" maşında ehtiyat nüsxəsini bərpa edirik.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Ehtiyat nüsxəsi olan fayl yeni bir maşına qoyulmalıdır və yardım proqramı ilə qovluqda deyilsə, ona tam yol mümkündür. (Mən sadəcə github-a ehtiyat nüsxəsini yüklədim və onu yeni maşına klonladım). Cədvəllərin özlərinin necə yaradıldığını əlavə edərdim, amma ekran görüntülərini saxlamadım və düşünürəm ki, 2-3 kurs tələbəsi üçün belə çətin deyil.

Bütün cədvəlləri bərpa etdikdə verilənlər bazasına uzaqdan girişi əlçatan etmək vaxtı gəldi. Ümumiyyətlə, bu cür əmrlər uğur gətirmədi (yalnız oxumaq hüququ verilir)

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

Daha doğrusu, verilənlər bazasına ancaq əmrlə qoşula bildim,

mysql -h localhost -u client -pclient

və bu bacarmadı

mysql -h 192.168.0.3 -u client -pclient

Mənə yaraşmadı, mən də bu ünvanla root olaraq qoşula bilmədim.

Mysql workbench proqramı kömək etdi, orada parametrlərdə localhost-u% dəyişdirirsiniz və müştəri kömək etməsə də işləyir. İndi verilənlər bazasına konsoldan və ya istənilən ünvandan koddan qoşula bilərsiniz.

Uzaqdan əlaqə üçün verilənlər bazasını əlçatan etmək

Siz həmçinin ev və ya müəssisə şəbəkəsi qurmalı və Windows təhlükəsizlik duvarını söndürməlisiniz, əks halda bu maşına ping də edə bilməyəcəksiniz (bazaya qoşulacağı deyil).

İşin yarısı tamamlandı, sonra mən evdən verilənlər bazasına qoşula bilməliyəm.

Şəbəkə diaqramından göründüyü kimi, 192.168.0.3-dən 192.168.1.1-ə (router) İnternetə getmək lazımdır, əks istiqamətdə gedək. 192.168.1.1-dən 192.168.1.2-yə qədər marşrutu belə quraq:

Uzaqdan əlaqə üçün verilənlər bazasını əlçatan etmək

Ümumiyyətlə, şəkil görünmür - əllərimlə yazacağam:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Bu, yalnız bir alt şəbəkədə edilə bilər, yəni siz dərhal 192.168.0.2 və ya 192.168.0.3 ünvanına yönləndirə bilməzsiniz.

Bu, marşrutlaşdırıcının 192.168.0.0/24 alt şəbəkəsinin harada yerləşdiyini bilməsi üçün lazımdır (şəbəkələrin əsaslarını öyrənmək faydalıdır).

İndi biz 3306 ünvanına 192.168.1.2 port yönləndirməsini (standart olaraq mysql portu (əgər quraşdırma zamanı dəyişməmisinizsə)) əlavə edirik.

Uzaqdan əlaqə üçün verilənlər bazasını əlçatan etmək

İndi etmək üçün ən çətin şey Linux maşınında yönləndirmə etməkdir (onun iki şəbəkə kartı 192.168.1.2 (enp3s1 interfeysi) və 192.168.0.2 (enp3s0 interfeysi) var ki, şəbəkə kartları onları 192.168.1.2-dən nə ötürəcəklərini bilsinlər. 192.168.0.2-ə, sonra MySql ilə Windows maşınımıza.

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

Bunlar. 1-ci sətir ilk əlaqəni qəbul etdiyimizi, 2-ci və 3-cü hər iki istiqamətdə paketlərin göndərilməsinin mümkünlüyünü, 4-cü və 5-cisi təyinat və mənbə ünvanının dəyişdirilməsini bildirir. Və voila, evdən mysql vasitəsilə qoşula bilərsiniz. Və nəhayət, bunu edən C++ kodum:

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

İndi bu proqramı hər kəsə təhlükəsiz şəkildə ata bilərsiniz və yerli olaraq işləməsi üçün onu yenidən yazmağa ehtiyac yoxdur.

Mənbə: www.habr.com

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