Kufanya hifadhidata ipatikane kwa muunganisho wa mbali

Hebu tuanze na ukweli kwamba kuna wakati unahitaji kufanya maombi na uunganisho wa database. Hii inafanywa ili usiingie sana katika maendeleo ya nyuma na kuzingatia sehemu ya mbele kwa sababu ya ukosefu wa mikono na ujuzi. Sitasema kuwa suluhisho langu litakuwa salama, lakini linafanya kazi.

Kwa kuwa sipendi kulipia hosting, nilitumia mtandao kazini kwangu, kuna IP nyeupe. Hapa kuna muundo wake:

Kufanya hifadhidata ipatikane kwa muunganisho wa mbali

Nina ufikiaji wa kompyuta kadhaa, kwa usahihi zaidi kwa 192.168.1.2 (aka 192.168.0.2) kuna Linux na 192.168.0.3 na Windows. Kwa ujumla, kwa maombi yangu, nilichagua mysql na kuangalia ni nini kwenye Linux. Ilikuwa tayari imewekwa hapo, lakini hakuna mtu anayejua nenosiri, na wale waliojua walisahau (wale ambao walifanya kazi kabla yangu). Baada ya kujifunza kwamba hakuna mtu anayehitaji, niliifuta na kujaribu kuiweka tena. Hakukuwa na kumbukumbu ya kutosha, na kwa kuwa ili kurekebisha kosa hili ningelazimika kuunganisha kufuatilia na kibodi na panya kwake, niliamua kuacha biashara hii. Aidha, mashine ya Windows ina nguvu zaidi, na pamoja na kila kitu, mimi mwenyewe ninayo kwenye kompyuta yangu ya nyumbani. Kimsingi, sitaelezea usanikishaji yenyewe, kuna miongozo na video nyingi juu yake. Baada ya kusanikisha mysql kwenye mashine ya Windows, niliamua kuhifadhi nakala rudufu kutoka kwa kompyuta ndogo hadi kwenye kituo cha kazi.

Inafanywa kama hii (kwa upande wangu):

mysqldump -uroot -p your_base > dump_file.sql

Ifuatayo, tunaunda hifadhidata katika hifadhidata mpya na kurejesha nakala kwenye mashine "mpya".

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Faili iliyo na chelezo lazima iwekwe kwenye mashine mpya, na ikiwa sio kwenye saraka na matumizi, basi njia kamili ya hiyo inawezekana. (Nimepakia tu nakala rudufu kwa github na kuitengeneza kwa mashine mpya). Ningeongeza jinsi meza wenyewe zinaundwa, lakini sikuhifadhi viwambo vya skrini, na nadhani si vigumu hata kwa mwanafunzi wa miaka 2-3.

Niliporejesha meza zote, ni wakati wa kufanya ufikiaji wa mbali kwa hifadhidata upatikane. Kwa ujumla, amri kama hizo hazikuleta mafanikio (zilizopewa tu haki ya kusoma chagua)

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

Kwa usahihi zaidi, ningeweza tu kuunganisha kwenye hifadhidata na amri,

mysql -h localhost -u client -pclient

na huyu hakuweza

mysql -h 192.168.0.3 -u client -pclient

Haikunifaa, pia sikuweza kuunganishwa kupitia anwani hii kama mzizi.

Programu ya mysql workbench ilisaidia, hapo kwenye mipangilio unabadilisha localhost hadi% na inafanya kazi, ingawa mteja hakusaidia. Sasa unaweza kuunganisha kwenye hifadhidata kutoka kwa koni au kutoka kwa msimbo kutoka kwa anwani yoyote.

Kufanya hifadhidata ipatikane kwa muunganisho wa mbali

Unahitaji pia kutengeneza mtandao wa nyumbani au wa biashara na kuzima firewall ya Windows, vinginevyo hautaweza hata kubandika mashine hii (sio kwamba itaunganisha kwenye hifadhidata).

Nusu ya kazi imefanywa, basi ninahitaji kuwa na uwezo wa kuunganisha kwenye hifadhidata kutoka nyumbani.

Kama unaweza kuona kutoka kwa mchoro wa mtandao, unahitaji kwenda kwenye mtandao kutoka 192.168.0.3 hadi 192.168.1.1 (router), wacha tuende kinyume. Wacha tuweke njia kutoka 192.168.1.1 hadi 192.168.1.2 kama hii:

Kufanya hifadhidata ipatikane kwa muunganisho wa mbali

Kwa ujumla, picha haionyeshi - nitaandika kwa mikono yangu:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Hii inaweza tu kufanywa katika subnet moja, yaani, huwezi kusambaza mara moja kwa anwani 192.168.0.2 au 192.168.0.3

Hii ni muhimu ili router ijue ambapo subnet 192.168.0.0/24 iko (jifunze misingi ya mitandao ni muhimu).

Sasa tunaongeza usambazaji wa bandari 3306 (mlango wa mysql kwa chaguo-msingi (ikiwa hukuibadilisha wakati wa usakinishaji)) kwa anwani 192.168.1.2

Kufanya hifadhidata ipatikane kwa muunganisho wa mbali

Sasa jambo ngumu zaidi kufanya ni kufanya usambazaji kwenye mashine ya Linux (ina kadi mbili za mtandao 192.168.1.2 (enp3s1 interface) na 192.168.0.2 (enp3s0 interface) ili kadi za mtandao zijue nini cha kuhamisha kutoka 192.168.1.2 hadi 192.168.0.2, na kisha kwa mashine yetu ya Windows na 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

Wale. Mstari wa 1 unamaanisha kwamba tunakubali muunganisho wa kwanza, wa 2 na wa 3 kwamba inawezekana kutuma pakiti kwa pande zote mbili, ya 4 na ya 5 inamaanisha uingizwaji wa anwani ya marudio na chanzo. Na voila, unaweza kuunganisha kutoka nyumbani kupitia mysql. Na mwishowe, nambari yangu ya C ++ ambayo hufanya hivi:

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

Sasa unaweza kutupa programu hii kwa usalama kwa mtu yeyote, na huna haja ya kuiandika upya ili ifanye kazi ndani ya nchi.

Chanzo: mapenzi.com

Kuongeza maoni