De databank beskikber meitsje foar ferbining op ôfstân

Litte wy begjinne mei it feit dat der gefallen binne as jo in applikaasje meitsje moatte mei in ferbining mei in databank. Dit wurdt dien om net te folle yn 'e backend-ûntwikkeling te ferdjipjen en te konsintrearjen op' e frontend troch in gebrek oan hannen en feardichheden. Ik kin net sizze dat myn oplossing feilich sil wêze, mar it wurket.

Om't ik net graach betelje foar hosting, haw ik it netwurk op myn wurk brûkt, d'r is in wite IP dêr. Hjir is har struktuer:

De databank beskikber meitsje foar ferbining op ôfstân

Ik haw tagong ta ferskate kompjûters, krekter 192.168.1.2 (aka 192.168.0.2) mei Linux ynstallearre dêr en 192.168.0.3 mei Windows. Yn 't algemien keas ik mysql foar myn applikaasje en seach nei wat beskikber wie op Linux. It wie al ynstallearre dêr, mar gjinien wit it wachtwurd, en dejingen dy't wisten fergeat (dejingen dy't wurke foar my). Nei't ik learde dat gjinien it nedich wie, haw ik it wiske en besocht it opnij te ynstallearjen. D'r wie net genôch ûnthâld, en om't ik om dizze flater te reparearjen in monitor en toetseboerd mei in mûs deroan moatte ferbine, besleat ik dizze saak op te jaan. Boppedat, de masine mei Windows is folle machtiger en plus, ik haw it op myn laptop thús. Yn prinsipe sil ik de ynstallaasje sels net beskriuwe; d'r binne in protte hânboeken en fideo's oer. Nei't ik mysql op in Windows-masine ynstalleare, besleat ik de tabellen fan myn laptop nei myn wurkstasjon te meitsjen.

It is sa dien (yn myn gefal):

mysqldump -uroot -p your_base > dump_file.sql

Dêrnei meitsje wy in databank yn 'e nije databank en restaurearje de reservekopy op' e "nije" masine.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


It reservekopybestân moat wurde pleatst op 'e nije masine en, miskien, as net yn' e map mei it hulpprogramma, dan it folsleine paad dernei. (Ik haw de reservekopy krekt upload nei GitHub en klonen op in nije masine). Ik soe tafoegje hoe't de tabellen sels wurde makke, mar ik haw net bewarre de screenshots, en ik tink dat it net dreech sels foar in 2-3 jier studint.

As alle tabellen wersteld binne, is it tiid om tagong op ôfstân ta de databank beskikber te meitsjen. Yn 't algemien liede sokke kommando's net ta sukses (it joech allinich lêzen tastimming om te selektearjen)

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

Mear krekter, ik koe ferbine mei de database allinich mei it kommando,

mysql -h localhost -u client -pclient

mar dizze koe it net mear

mysql -h 192.168.0.3 -u client -pclient

Dit wurke net foar my en ik koe net ferbine fia dit adres as root.

It mysql workbench-programma holp; yn 'e ynstellings feroarje localhost nei % en it wurket, hoewol de kliïnt net holp. No kinne jo ferbine mei de database fan 'e konsole of fan koade fan elk adres.

De databank beskikber meitsje foar ferbining op ôfstân

Jo moatte ek in hûs- of bedriuwsnetwurk meitsje en de Windows-firewall útsette, oars kinne jo dizze masine net iens pinge (lit stean ferbine mei de databank).

De helte is dien, no moat ik fan hûs ôf ferbine kinne mei de databank.

Sa't jo sjen kinne fan it netwurkdiagram, om nei it ynternet te kommen, moatte jo gean fan 192.168.0.3 nei 192.168.1.1 (router), litte wy yn 'e tsjinoerstelde rjochting gean. Litte wy de rûte fan 192.168.1.1 nei 192.168.1.2 sa ynstelle:

De databank beskikber meitsje foar ferbining op ôfstân

Yn 't algemien is de foto net te sjen, dus ik skriuw it mei de hân:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Dit kin allinich dien wurde yn ien subnet, dat is, jo kinne net fuortendaliks trochstjoere nei it adres 192.168.0.2 of 192.168.0.3

Dit is nedich sadat de router wit wêr't it subnet 192.168.0.0/24 leit (learen fan de basis fan netwurken is nuttich).

No foegje wy poarte trochstjoere 3306 ta (de standert mysql-poarte (as jo it net feroare hawwe tidens de ynstallaasje)) oan it adres 192.168.1.2

De databank beskikber meitsje foar ferbining op ôfstân

It dreechste ding dat oerbleaun is om te dwaan is trochstjoeren te dwaan op in Linux-masine (it hat twa netwurkkaarten 192.168.1.2 (enp3s1-ynterface) en 192.168.0.2 (enp3s0-ynterface) sadat de netwurkkaarten witte wat se moatte oerdrage fan 192.168.1.2 nei 192.168.0.2, en dan nei ús Windows-masine mei 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

Dy. De 1e rigel betsjut dat wy de earste ferbining akseptearje, de 2e en 3e dat wy pakketten yn beide rjochtingen kinne stjoere, de 4e en 5e betsjut it feroarjen fan de bestimming en boarne adressen. En voila, jo kinne fan hûs ôf ferbine fia mysql. En as lêste, myn C ++-koade dy't dit docht:

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

No kinne jo dit programma feilich stjoere nei elkenien, en jo hoege it net te herskriuwen om it lokaal te wurkjen.

Boarne: www.habr.com

Add a comment