Facendo a base de datos dispoñible para a conexión remota

Comecemos polo feito de que hai casos nos que precisa facer unha aplicación cunha conexión a unha base de datos. Isto faise para non afondar demasiado no desenvolvemento do backend e concentrarse no frontend debido á falta de mans e habilidades. Non podo dicir que a miña solución sexa segura, pero funciona.

Como non me gusta pagar por hospedaxe, usei a rede no meu traballo, alí hai unha IP branca. Velaquí a súa estrutura:

Facendo a base de datos dispoñible para a conexión remota

Teño acceso a varios ordenadores, máis precisamente 192.168.1.2 (tamén coñecido como 192.168.0.2) con Linux instalado alí e 192.168.0.3 con Windows. En xeral, escollín mysql para a miña aplicación e mirei o que estaba dispoñible en Linux. Xa estaba instalado alí, pero ninguén sabe o contrasinal, e os que o sabían esquecérono (os que traballaron antes que min). Despois de enterarme de que ninguén o necesitaba, elimineino e intentei instalalo de novo. Non había memoria suficiente, e como para solucionar este erro tería que conectarlle un monitor e un teclado cun rato, decidín renunciar a este asunto. Ademais, a máquina con Windows é moito máis potente e, ademais, téñoa no meu portátil na casa. En principio, non vou describir a instalación en si; hai moitos manuais e vídeos sobre ela. Despois de instalar mysql nunha máquina con Windows, decidín facer unha copia de seguridade das táboas do meu portátil á miña estación de traballo.

Faise así (no meu caso):

mysqldump -uroot -p your_base > dump_file.sql

A continuación, creamos unha base de datos na nova base de datos e restauramos a copia de seguridade na "nova" máquina.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


O ficheiro de copia de seguridade debe colocarse na nova máquina e, quizais, se non está no directorio coa utilidade, entón a ruta completa a ela. (Acabo de cargar a copia de seguridade en GitHub e clonala nunha nova máquina). Engadiría como se crean as táboas, pero non gardei as capturas de pantalla e creo que non é difícil nin sequera para un alumno de 2-3 anos.

Cando se restauraron todas as táboas, é hora de facer dispoñible o acceso remoto á base de datos. En xeral, tales comandos non levaron ao éxito (só deu permiso de lectura para seleccionar)

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

Máis precisamente, podería conectarme á base de datos só co comando,

mysql -h localhost -u client -pclient

pero este xa non podía facelo

mysql -h 192.168.0.3 -u client -pclient

Isto non funcionou para min e non puiden conectarme a través deste enderezo como root.

O programa mysql workbench axudou; na configuración, cambia localhost a % e funciona, aínda que o cliente non axudou. Agora podes conectarte á base de datos desde a consola ou desde o código de calquera enderezo.

Facendo a base de datos dispoñible para a conexión remota

Tamén cómpre facer unha rede doméstica ou empresarial e desactivar o firewall de Windows, se non, nin sequera poderás facer ping a esta máquina (e menos conectar á base de datos).

A metade do traballo está feito, agora teño que poder conectarme á base de datos desde casa.

Como podes ver no diagrama de rede, para chegar a Internet hai que pasar de 192.168.0.3 a 192.168.1.1 (router), imos na dirección contraria. Imos configurar a ruta de 192.168.1.1 a 192.168.1.2 así:

Facendo a base de datos dispoñible para a conexión remota

En xeral, a imaxe non se mostra, así que escribirei a man:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Isto só se pode facer nunha subrede, é dicir, non pode reenviar inmediatamente ao enderezo 192.168.0.2 ou 192.168.0.3

Isto é necesario para que o enrutador saiba onde se atopa a subrede 192.168.0.0/24 (é útil aprender os conceptos básicos das redes).

Agora engadimos o reenvío de portos 3306 (o porto mysql predeterminado (se non o cambiou durante a instalación)) ao enderezo 192.168.1.2

Facendo a base de datos dispoñible para a conexión remota

O máis difícil que queda é facer o reenvío nunha máquina Linux (ten dúas tarxetas de rede 192.168.1.2 (interfaz enp3s1) e 192.168.0.2 (interfaz enp3s0) para que as tarxetas de rede saiban que transferir desde 192.168.1.2. a 192.168.0.2 e despois á nosa máquina Windows con 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

Eses. A 1a liña significa que aceptamos a primeira conexión, a 2a e a 3a que podemos enviar paquetes en ambas direccións, a 4a e 5a significa cambiar os enderezos de destino e orixe. E listo, podes conectarte desde casa a través de mysql. E, finalmente, o meu código C++ que fai isto:

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

Agora podes enviar este programa a calquera persoa con seguridade e non tes que reescribilo para que funcione localmente.

Fonte: www.habr.com

Engadir un comentario