Nyieun database sadia pikeun sambungan jauh

Hayu urang mimitian ku kanyataan yén aya waktos anjeun kedah ngadamel aplikasi sareng sambungan database. Hal ieu dilakukeun dina raraga teu delve teuing kana ngembangkeun back-end sarta konsentrasi dina front-tungtung alatan kurangna leungeun jeung kaahlian. Abdi teu bade disebutkeun yen solusi kuring bakal aman, tapi jalan.

Kusabab kuring henteu resep mayar hosting, kuring nganggo jaringan di tempat kerja kuring, aya IP bodas. Ieu strukturna:

Nyieun database sadia pikeun sambungan jauh

Kuring boga aksés ka sababaraha komputer, leuwih tepat 192.168.1.2 (alias 192.168.0.2) aya Linux Ubuntu jeung 192.168.0.3 kalawan Windows. Sacara umum, pikeun aplikasi kuring, kuring milih mysql sareng ningali naon anu aya dina Linux. Éta parantos dipasang di dinya, tapi teu aya anu terang kecap konci, sareng anu terang hilap (jalma anu damel sateuacan kuring). Saatos diajar yén teu aya anu peryogi éta, kuring ngahapus sareng nyobian masang deui. Aya teu cukup memori, sarta saprak ngalereskeun kasalahan ieu kuring kudu nyambungkeun monitor jeung keyboard jeung mouse ka dinya, Kuring mutuskeun kaluar usaha ieu. Sumawona, mesin Windows langkung kuat, sareng sadayana, kuring sorangan gaduh éta dina laptop kuring di bumi. Sacara prinsip, kuring moal ngajelaskeun pamasangan sorangan, aya seueur manual sareng pidéo ngeunaan éta. Saatos dipasang mysql dina mesin Windows, kuring mutuskeun pikeun nyadangkeun tabel tina laptop ka workstation.

Hal ieu dilakukeun sapertos kieu (dina kasus kuring):

mysqldump -uroot -p your_base > dump_file.sql

Salajengna, urang nyieun database dina database anyar jeung malikkeun cadangan dina mesin "anyar".

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


File sareng cadanganna kedah dipasang dina mesin énggal, sareng upami henteu aya dina diréktori kalayan utiliti, teras jalan anu lengkep tiasa waé. (Kuring ngan unggah cadangan ka github sarta diklon ka mesin anyar). Kuring bakal nambahan kumaha tabel sorangan dijieun, tapi kuring henteu nyimpen Potret layar, sarta kuring pikir teu hese malah keur 2-3 murid taun.

Nalika kuring malikkeun sakabéh tabel, éta waktu sangkan aksés jauh ka database sadia. Sacara umum, paréntah sapertos kitu henteu ngakibatkeun kasuksésan (ngan dipasihan hak pikeun maca pilih)

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

Langkung tepatna, kuring ngan ukur tiasa nyambung ka pangkalan data kalayan paréntah,

mysql -h localhost -u client -pclient

sareng ieu teu tiasa

mysql -h 192.168.0.3 -u client -pclient

Teu cocog kuring, Kuring ogé teu bisa nyambung via alamat ieu salaku root.

Program mysql workbench ngabantosan, aya dina setélan anjeun ngarobih localhost ka% sareng tiasa dianggo, sanaos klien henteu ngabantosan. Ayeuna anjeun tiasa nyambung ka pangkalan data tina konsol atanapi tina kode tina alamat mana waé.

Nyieun database sadia pikeun sambungan jauh

Anjeun ogé kedah ngadamel jaringan bumi atanapi perusahaan sareng mareuman firewall Windows, upami henteu, anjeun moal tiasa ping mesin ieu (henteu yén éta bakal nyambung ka pangkalan data).

Satengah tina padamelan parantos réngsé, teras kuring kedah tiasa nyambung ka pangkalan data ti bumi.

Sakumaha anjeun tiasa tingali tina diagram jaringan, anjeun kedah angkat ka Internét tina 192.168.0.3 ka 192.168.1.1 (router), hayu urang angkat ka arah anu sabalikna. Hayu urang nyetél rute ti 192.168.1.1 ka 192.168.1.2 sapertos kieu:

Nyieun database sadia pikeun sambungan jauh

Sacara umum, gambar henteu nunjukkeun - kuring bakal nyerat nganggo leungeun kuring:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Ieu ngan ukur tiasa dilakukeun dina hiji subnet, nyaéta, anjeun moal tiasa langsung neraskeun ka alamat 192.168.0.2 atanapi 192.168.0.3.

Ieu diperlukeun ku kituna router weruh dimana lokasina 192.168.0.0/24 subnet (diajar dasar jaringan mangpaat).

Ayeuna urang tambahkeun port diteruskeun 3306 (port mysql sacara standar (upami anjeun henteu ngarobih nalika instalasi)) kana alamat 192.168.1.2.

Nyieun database sadia pikeun sambungan jauh

Ayeuna hal anu paling hese dilakukeun nyaéta pikeun neraskeun dina mesin Linux (mibanda dua kartu jaringan 192.168.1.2 (antarmuka enp3s1) sareng 192.168.0.2 (antarmuka enp3s0) supados kartu jaringan terang naon anu kedah ditransfer tina 192.168.1.2. ka 192.168.0.2, lajeng ka mesin Windows urang kalawan 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

Jelema. Baris 1st hartina urang nampi sambungan kahiji, 2nd jeung 3rd nu kasebut nyaéta dimungkinkeun pikeun ngirim pakét dina duanana arah, 4 jeung 5 hartina ngagantian tujuan jeung alamat sumber. Sareng voila, anjeun tiasa nyambung ti bumi nganggo mysql. Tungtungna, kode C ++ kuring anu ngalakukeun ieu:

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

Ayeuna anjeun aman tiasa ngalungkeun program ieu ka saha waé, sareng anjeun henteu kedah nyerat deui supados tiasa dianggo sacara lokal.

sumber: www.habr.com

Tambahkeun komentar