Gör databasen tillgänglig för fjärranslutning

Låt oss börja med att det finns tillfällen då du behöver göra en applikation med en databasanslutning. Detta görs för att inte fördjupa sig för mycket i back-end-utveckling och koncentrera sig på front-end på grund av brist på händer och färdigheter. Jag tänker inte säga att min lösning kommer att vara säker, men den fungerar.

Eftersom jag inte gillar att betala för hosting använde jag nätverket på jobbet, det finns en vit IP. Här är dess struktur:

Gör databasen tillgänglig för fjärranslutning

Jag har tillgång till flera datorer, närmare bestämt till 192.168.1.2 (alias 192.168.0.2) det finns Linux och 192.168.0.3 med Windows. I allmänhet, för min applikation, valde jag mysql och tittade på vad som finns på Linux. Det var redan installerat där, men ingen känner till lösenordet, och de som visste glömde (de som jobbade före mig). Efter att ha lärt mig att ingen behöver det, tog jag bort det och försökte installera det igen. Det fanns inte tillräckligt med minne, och eftersom jag skulle behöva ansluta en bildskärm och ett tangentbord med en mus för att åtgärda det här felet, bestämde jag mig för att avsluta den här verksamheten. Dessutom är en Windows-maskin mycket kraftfullare, och plus allt har jag den på min bärbara dator hemma. I princip kommer jag inte att beskriva själva installationen, det finns många manualer och filmer om det. Efter att ha installerat mysql på en Windows-maskin bestämde jag mig för att säkerhetskopiera tabeller från en bärbar dator till en arbetsstation.

Det görs så här (i mitt fall):

mysqldump -uroot -p your_base > dump_file.sql

Därefter skapar vi en databas i den nya databasen och återställer säkerhetskopian på den "nya" maskinen.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Filen med säkerhetskopian måste läggas på den nya maskinen, och om den inte finns i katalogen med verktyget är hela sökvägen till den möjlig. (Jag laddade precis upp en säkerhetskopia till github och klonade den till en ny maskin). Jag skulle lägga till hur själva tabellerna skapas, men jag sparade inte skärmdumparna, och jag tror att det inte är svårt även för en 2-3-årig student.

När jag återställde alla tabeller är det dags att göra fjärråtkomst till databasen tillgänglig. I allmänhet ledde sådana kommandon inte till framgång (med enbart rätten att läsa välj)

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

Mer exakt, jag kunde bara ansluta till databasen med kommandot,

mysql -h localhost -u client -pclient

och den här kunde inte

mysql -h 192.168.0.3 -u client -pclient

Det passade inte mig, jag kunde inte heller ansluta via denna adress som root.

Mysql workbench-programmet hjälpte till, där i inställningarna ändrar du localhost till% och det fungerar, även om klienten inte hjälpte. Nu kan du ansluta till databasen från konsolen eller från koden från valfri adress.

Gör databasen tillgänglig för fjärranslutning

Du måste också skapa ett hem- eller företagsnätverk och stänga av Windows-brandväggen, annars kommer du inte ens kunna pinga den här maskinen (inte för att den kommer att ansluta till databasen).

Hälften av arbetet är gjort, sedan behöver jag kunna koppla upp mig till databasen hemifrån.

Som du kan se från nätverksdiagrammet måste du gå till Internet från 192.168.0.3 till 192.168.1.1 (router), låt oss gå i motsatt riktning. Låt oss ställa in en rutt från 192.168.1.1 till 192.168.1.2 så här:

Gör databasen tillgänglig för fjärranslutning

I allmänhet visas inte bilden - jag kommer att skriva med mina händer:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Detta kan bara göras i ett subnät, det vill säga du kan inte omedelbart vidarebefordra till adressen 192.168.0.2 eller 192.168.0.3

Detta är nödvändigt så att routern vet var undernätet 192.168.0.0/24 finns (lär dig grunderna i nätverk är användbart).

Nu lägger vi till portvidarebefordran 3306 (mysql-port som standard (om du inte ändrade den under installationen)) till adressen 192.168.1.2

Gör databasen tillgänglig för fjärranslutning

Nu är det svåraste att göra vidarebefordran på en Linux-maskin (den har två nätverkskort 192.168.1.2 (enp3s1-gränssnitt) och 192.168.0.2 (enp3s0-gränssnitt) så att nätverkskorten vet vad de ska överföra dem från 192.168.1.2 till 192.168.0.2 och sedan till vår Windows-maskin med 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

De där. Den 1:a raden betyder att vi accepterar den första anslutningen, den 2:a och 3:e att det är möjligt att skicka paket i båda riktningarna, den 4:e och 5:e innebär ersättning av destination och källadress. Och voila, du kan ansluta hemifrån via mysql. Och slutligen, min C++-kod som gör detta:

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

Nu kan du säkert kasta bort det här programmet till vem som helst, och du behöver inte skriva om det så att det fungerar lokalt.

Källa: will.com

Lägg en kommentar