Fè baz done a disponib pou koneksyon aleka

Ann kòmanse ak lefèt ke gen kèk fwa lè ou bezwen fè yon aplikasyon ak yon koneksyon baz done. Sa a se fè yo nan lòd yo pa fouye twòp nan devlopman back-end ak konsantre sou front-end la akòz yon mank de men ak konpetans. Mwen pa pral di ke solisyon mwen an pral an sekirite, men li travay.

Depi mwen pa renmen peye pou hosting, mwen itilize rezo a nan travay mwen, gen yon IP blan. Men estrikti li yo:

Fè baz done a disponib pou koneksyon aleka

Mwen gen aksè a plizyè òdinatè, pi jisteman nan 192.168.1.2 (aka 192.168.0.2) gen Linux ak 192.168.0.3 ak Windows. An jeneral, pou aplikasyon mwen an, mwen te chwazi mysql epi gade sa ki sou Linux. Li te deja enstale la, men pèsonn pa konnen modpas la, ak moun ki te konnen bliye (moun ki te travay anvan m '). Apre mwen fin aprann ke pèsonn pa bezwen li, mwen efase li epi mwen eseye enstale li ankò. Pa t 'gen ase memwa, e depi yo ranje erè sa a mwen ta dwe konekte yon monitè ak yon klavye ak yon sourit sou li, mwen deside kite biznis sa a. Anplis, yon machin Windows se pi plis pouvwa anpil, ak plis tout bagay, mwen menm mwen gen li sou laptop mwen nan kay la. Nan prensip, mwen pa pral dekri enstalasyon an tèt li, gen yon anpil nan manyèl ak videyo sou li. Èske w gen enstale mysql sou yon machin Windows, mwen deside fè backup tab soti nan yon laptop nan yon estasyon travay.

Li fèt konsa (nan ka mwen an):

mysqldump -uroot -p your_base > dump_file.sql

Apre sa, nou kreye yon baz done nan nouvo baz done a epi restore backup la sou "nouvo" machin nan.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Fichye a ak backup la dwe mete sou yon nouvo machin, epi si se pa nan anyè a ak sèvis piblik la, Lè sa a, chemen an plen nan li se posib. (Mwen jis telechaje yon backup nan github ak klonaj li nan yon nouvo machin). Mwen ta ajoute ki jan tab yo tèt yo kreye, men mwen pa t 'sove Ekran yo, e mwen panse ke li pa difisil menm pou yon elèv 2-3 ane.

Lè m 'retabli tout tab yo, li lè yo fè aksè aleka nan baz done a disponib. An jeneral, kòmandman sa yo pa te mennen nan siksè (yo bay sèlman dwa pou li chwazi)

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

Plis jisteman, mwen te kapab sèlman konekte nan baz done a ak lòd la,

mysql -h localhost -u client -pclient

ak yon sèl sa a pa t 'kapab

mysql -h 192.168.0.3 -u client -pclient

Li pa t 'kostim mwen, mwen menm mwen pa t' kapab konekte atravè adrès sa a kòm rasin.

Pwogram mysql workbench la te ede, gen nan anviwònman yo ou chanje localhost an% epi li travay, byenke kliyan an pa t ede. Koulye a, ou ka konekte nan baz done a soti nan konsole a oswa nan kòd la soti nan nenpòt adrès.

Fè baz done a disponib pou koneksyon aleka

Ou bezwen tou fè yon rezo kay oswa antrepriz epi fèmen firewall Windows la, otreman ou pa pral menm kapab ping machin sa a (pa ke li pral konekte nan baz done a).

Mwatye nan travay la fèt, Lè sa a, mwen bezwen pou kapab konekte nan baz done a soti nan kay la.

Kòm ou ka wè nan dyagram rezo a, ou bezwen ale nan entènèt la soti nan 192.168.0.3 a 192.168.1.1 (routeur), ann ale nan direksyon opoze a. Ann mete yon wout soti nan 192.168.1.1 a 192.168.1.2 tankou sa a:

Fè baz done a disponib pou koneksyon aleka

An jeneral, foto a pa montre - mwen pral ekri ak men mwen:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Sa a ka fèt sèlman nan yon sèl subnet, se sa ki, ou pa ka voye imedyatman nan adrès 192.168.0.2 oswa 192.168.0.3.

Sa nesesè pou routeur la konnen ki kote subnet 192.168.0.0/24 la ye (aprann baz rezo yo itil).

Koulye a, nou ajoute pò voye 3306 (mysql pò pa default (si ou pa t 'chanje li pandan enstalasyon)) nan adrès la 192.168.1.2

Fè baz done a disponib pou koneksyon aleka

Koulye a, bagay ki pi difisil pou fè se fè voye sou yon machin Linux (li gen de kat rezo 192.168.1.2 (enp3s1 koòdone) ak 192.168.0.2 (enp3s0 koòdone) pou kat rezo yo konnen ki sa yo transfere yo soti nan 192.168.1.2. nan 192.168.0.2, ak Lè sa a, nan machin Windows nou an ak 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

Moun sa yo. 1ye liy lan vle di ke nou aksepte premye koneksyon an, 2yèm ak 3yèm ke li posib pou voye pakè nan tou de direksyon, 4yèm ak 5yèm vle di ranplasman destinasyon ak adrès sous la. Ak vwala, ou ka konekte soti nan kay atravè mysql. Epi finalman, kòd C++ mwen an ki fè sa:

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

Koulye a, ou ka san danje jete pwogram sa a bay nenpòt moun, epi ou pa bezwen reekri li pou ke li travay lokalman.

Sous: www.habr.com

Add nouvo kòmantè