Предоставяне на базата данни за отдалечена връзка

Да започнем с факта, че има случаи, когато трябва да направите приложение с връзка към база данни. Това се прави, за да не се задълбочава твърде много в backend разработката и да се концентрира върху frontend поради липса на ръце и умения. Не мога да кажа, че моето решение ще е безопасно, но работи.

Тъй като не обичам да плащам за хостинг, използвах мрежата на работа, там има бял IP. Ето структурата му:

Предоставяне на базата данни за отдалечена връзка

Имам достъп до няколко компютъра, по-точно 192.168.1.2 (известен още като 192.168.0.2) с инсталиран Linux там и 192.168.0.3 с Windows. Като цяло избрах mysql за моето приложение и погледнах какво има в Linux. Вече беше инсталиран там, но никой не знае паролата, а тези, които знаеха, забравиха (тези, които работеха преди мен). След като научих, че никой не се нуждае от него, го изтрих и се опитах да го инсталирам отново. Нямаше достатъчно памет и тъй като за да поправя тази грешка, трябваше да свържа към него монитор и клавиатура с мишка, реших да се откажа от този въпрос. Освен това машината с Windows е много по-мощна и плюс, имам я на лаптопа си вкъщи. По принцип няма да описвам самата инсталация, има много ръководства и видеоклипове за това. След като инсталирах mysql на машина с Windows, реших да архивирам таблиците от моя лаптоп на моята работна станция.

Това се прави така (в моя случай):

mysqldump -uroot -p your_base > dump_file.sql

След това създаваме база данни в новата база данни и възстановяваме архива на „новата“ машина.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Архивният файл трябва да бъде поставен на новата машина и може би, ако не в директорията с помощната програма, тогава пълният път до нея. (Току-що качих резервното копие в GitHub и го клонирах на нова машина). Бих добавил как се създават самите таблици, но не запазих екранните снимки и мисля, че не е трудно дори за ученик от 2-3 години.

Когато всички таблици са възстановени, е време да направите отдалечен достъп до базата данни. Като цяло такива команди не доведоха до успех (дадоха само разрешение за четене за избор)

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

По-точно, можех да се свържа с базата данни само с командата,

mysql -h localhost -u client -pclient

но този не можеше да го направи повече

mysql -h 192.168.0.3 -u client -pclient

Това не работи за мен и не можах да се свържа през този адрес като root.

Програмата mysql workbench помогна; в настройките променете localhost на % и работи, въпреки че клиентът не помогна. Сега можете да се свържете с базата данни от конзолата или от код от всеки адрес.

Предоставяне на базата данни за отдалечена връзка

Трябва също така да създадете домашна или бизнес мрежа и да изключите защитната стена на Windows, в противен случай дори няма да можете да пингвате тази машина (да не говорим за връзка с базата данни).

Половината работа е свършена, сега трябва да мога да се свържа с базата данни от вкъщи.

Както можете да видите от диаграмата на мрежата, за да стигнете до интернет, трябва да преминете от 192.168.0.3 до 192.168.1.1 (рутер), нека да отидем в обратната посока. Нека конфигурираме маршрута от 192.168.1.1 до 192.168.1.2 по следния начин:

Предоставяне на базата данни за отдалечена връзка

Като цяло снимката не се показва, така че ще я напиша на ръка:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Това може да се направи само в една подмрежа, тоест не можете незабавно да пренасочите към адрес 192.168.0.2 или 192.168.0.3

Това е необходимо, така че рутерът да знае къде се намира подмрежата 192.168.0.0/24 (изучаването на основите на мрежите е полезно).

Сега добавяме пренасочване на порт 3306 (портът на mysql по подразбиране (ако не сте го променили по време на инсталацията)) към адреса 192.168.1.2

Предоставяне на базата данни за отдалечена връзка

Най-трудното нещо, което остава да направите, е да направите пренасочване на машина с Linux (има две мрежови карти 192.168.1.2 (интерфейс enp3s1) и 192.168.0.2 (интерфейс enp3s0), така че мрежовите карти да знаят какво да ги прехвърлят от 192.168.1.2 към 192.168.0.2 и след това към нашата Windows машина с 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

Тези. 1-ви ред означава, че приемаме първата връзка, 2-ри и 3-ти, че можем да изпращаме пакети в двете посоки, 4-ти и 5-ти означават промяна на адреса на местоназначението и източника. И готово, можете да се свържете от вкъщи чрез mysql. И накрая, моят C++ код, който прави това:

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

Сега можете безопасно да изпратите тази програма на всеки и не е нужно да я пренаписвате, за да работи локално.

Източник: www.habr.com

Добавяне на нов коментар