Danîna databasê ji bo girêdana dûr

Ka em bi vê rastiyê dest pê bikin ku hin rewş hene ku hûn hewce ne ku serîlêdanek bi girêdana databasê re çêbikin. Ev tê kirin ji bo ku ji ber kêmbûna dest û jêhatîbûnê pir zêde nekeve nav pêşkeftina paşîn û balê bikişîne ser pêşiyê. Ez nikarim bibêjim ku çareseriya min dê ewle be, lê ew dixebite.

Ji ber ku ez ji dayîna dayîna mêvandariyê hez nakim, min di karê xwe de torê bikar anî, li wir IP-ya spî heye. Li vir avahiya wê ye:

Danîna databasê ji bo girêdana dûr

Ez gihîştim çend komputeran, bi rastî 192.168.1.2 (aka 192.168.0.2) ku Linux li wir hatî saz kirin û 192.168.0.3 bi Windows. Bi gelemperî, min ji bo serîlêdana xwe mysql hilbijart û li tiştê ku li Linux-ê heye nihêrî. Ew jixwe li wir hate saz kirin, lê kes şîfreyê nizane, û yên ku dizanibûn ji bîr kirin (yên ku beriya min xebitîn). Dema ku ez fêr bûm ku hewcedariya kesî bi wê tune, min ew jêbirin û hewl da ku wê dîsa saz bikim. Bîranînek têr tune bû, û ji ber ku ji bo ku ez vê xeletiyê rast bikim divê ez monitor û klavyeyê bi mişkê pê ve girêbidim, min biryar da ku dev ji vê mijarê berdim. Digel vê yekê, makîneya bi Windows-ê pir bi hêztir û zêde ye, min ew li ser laptopa xwe ya li malê heye. Di prensîbê de, ez ê sazkirinê bixwe nebêjim; di derbarê wê de gelek destan û vîdyoyan hene. Piştî ku mysql li ser makîneyek Windows-ê saz kir, min biryar da ku tabloyên ji laptopê berbi stasyona xebata xwe vegerînim.

Ew bi vî rengî tête kirin (di doza min de):

mysqldump -uroot -p your_base > dump_file.sql

Dûv re, em databasek di databasa nû de çêdikin û paşvekêşanê li ser makîneya "nû" vedigerînin.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Pêdivî ye ku pelê hilanînê li ser makîneya nû were danîn û, belkî, heke ne di pelrêça bi kargêriyê de be, wê hingê riya tevahî ya wê. (Min tenê hilanînê li GitHub bar kir û li ser makîneyek nû klon kir). Ez ê lê zêde bikim ka tablo bi xwe çawa têne çêkirin, lê min dîmenan hilneda, û ez difikirim ku ew ji bo xwendekarek 2-3 salî jî ne dijwar e.

Dema ku hemî tablo hatin nûve kirin, ew dem e ku meriv ji dûr ve gihîştina databasê peyda bike. Bi gelemperî, fermanên weha nebûn serketinê (ew tenê destûra xwendinê da ku hilbijêrin)

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

Zêdetir, min dikaribû tenê bi fermanê bi databasê ve girêbide,

mysql -h localhost -u client -pclient

lê ev yek êdî nikaribû

mysql -h 192.168.0.3 -u client -pclient

Ev ji bo min nexebitî û min nekarî bi vê navnîşanê wekî root ve girêbide.

Bernameya workbench mysql arîkar kir; di mîhengan de, localhost bi% biguhezînin û ew dixebite, her çend xerîdar ne alîkar be. Naha hûn dikarin ji konsolê an ji kodê ji her navnîşanê bi databasê ve girêdin.

Danîna databasê ji bo girêdana dûr

Di heman demê de pêdivî ye ku hûn torgilokek xanî an karsaziyê jî çêbikin û dîwarê dîwarê Windows-ê vekin, wekî din hûn ê nikaribin vê makîneyê ping bikin (bila bi databasê ve girêdin).

Nîvê kar qediya, naha divê ez bikaribim ji malê bi databasê ve girêbidim.

Wekî ku hûn ji diyagrama torê jî dibînin, ji bo ku hûn bigihîjin Înternetê hûn hewce ne ku ji 192.168.0.3 biçin 192.168.1.1 (rûter), em berovajî vê yekê biçin. Ka em riya ji 192.168.1.1 berbi 192.168.1.2 bi vî rengî mîheng bikin:

Danîna databasê ji bo girêdana dûr

Bi gelemperî, wêne xuya nake, ji ber vê yekê ez ê bi destê xwe binivîsim:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Ev tenê di yek subnetê de dikare were kirin, ango hûn nekarin tavilê bişînin navnîşana 192.168.0.2 an 192.168.0.3

Ev pêdivî ye ku router zanibe ku subnet 192.168.0.0/24 li ku derê ye (hînbûna bingehên torê kêrhatî ye).

Naha em şandina portê 3306 (porta xwerû ya mysql (heke we di dema sazkirinê de neguherand)) li navnîşana 192.168.1.2 zêde dikin

Danîna databasê ji bo girêdana dûr

Tişta herî dijwar a ku were kirin ev e ku meriv şandina li ser makîneyek Linux bike (du kartên torê 192.168.1.2 (navbera enp3s1) û 192.168.0.2 (navbera enp3s0) heye, da ku kartên torê zanibin ku wan ji 192.168.1.2 veguhezînin. bi 192.168.0.2, û paşê bi makîneya meya Windows-ê ya bi MySql re.

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

Ewan. Rêza 1em tê vê wateyê ku em girêdana yekem qebûl dikin, ya 2mîn û 3mîn ku em dikarin pakêtan di her du alîyan de bişînin, ya 4emîn û 5emîn tê vê wateyê ku navnîşanên meqsed û çavkaniyê biguherînin. Û voila, hûn dikarin ji malê bi rêya mysql ve girêdayî bibin. Û di dawiyê de, koda min a C ++ ku vê yekê dike:

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

Naha hûn dikarin bi ewlehî vê bernameyê ji her kesî re bişînin, û hûn ne hewce ne ku wê ji nû ve binivîsin da ku ew li herêmî bixebite.

Source: www.habr.com

Add a comment