Διαθέτοντας τη βάση δεδομένων για απομακρυσμένη σύνδεση

Ας ξεκινήσουμε με το γεγονός ότι υπάρχουν περιπτώσεις που πρέπει να κάνετε μια εφαρμογή με σύνδεση σε μια βάση δεδομένων. Αυτό γίνεται για να μην εμβαθύνουμε πολύ στην ανάπτυξη του backend και να επικεντρωθούμε στο frontend λόγω έλλειψης χεριών και δεξιοτήτων. Δεν μπορώ να πω ότι η λύση μου θα είναι ασφαλής, αλλά λειτουργεί.

Επειδή δεν μου αρέσει να πληρώνω για φιλοξενία, χρησιμοποίησα το δίκτυο στη δουλειά μου, υπάρχει μια λευκή IP εκεί. Εδώ είναι η δομή του:

Διαθέτοντας τη βάση δεδομένων για απομακρυσμένη σύνδεση

Έχω πρόσβαση σε αρκετούς υπολογιστές, πιο συγκεκριμένα 192.168.1.2 (γνωστός και ως 192.168.0.2) με Linux εγκατεστημένο εκεί και 192.168.0.3 με Windows. Γενικά, επέλεξα το mysql για την εφαρμογή μου και κοίταξα τι ήταν διαθέσιμο στο Linux. Ήταν ήδη εγκατεστημένο εκεί, αλλά κανείς δεν ξέρει τον κωδικό πρόσβασης, και όσοι ήξεραν ξέχασαν (όσοι εργάστηκαν πριν από εμένα). Έχοντας μάθει ότι δεν το χρειαζόταν κανείς, το διέγραψα και προσπάθησα να το εγκαταστήσω ξανά. Δεν υπήρχε αρκετή μνήμη και επειδή για να διορθώσω αυτό το σφάλμα θα έπρεπε να συνδέσω μια οθόνη και ένα πληκτρολόγιο με ένα ποντίκι σε αυτό, αποφάσισα να εγκαταλείψω αυτό το θέμα. Επιπλέον, το μηχάνημα με Windows είναι πολύ πιο ισχυρό και συν, το έχω στο laptop μου στο σπίτι. Κατ 'αρχήν, δεν θα περιγράψω την ίδια την εγκατάσταση· υπάρχουν πολλά εγχειρίδια και βίντεο σχετικά με αυτήν. Έχοντας εγκαταστήσει το 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, διαφορετικά δεν θα μπορείτε καν να κάνετε ping σε αυτό το μηχάνημα (πόσο μάλλον να συνδεθείτε στη βάση δεδομένων).

Η μισή δουλειά έχει γίνει, τώρα πρέπει να μπορώ να συνδεθώ στη βάση δεδομένων από το σπίτι.

Όπως μπορείτε να δείτε από το διάγραμμα δικτύου, για να φτάσετε στο Διαδίκτυο πρέπει να πάτε από το 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 (η εκμάθηση των βασικών δικτύων είναι χρήσιμη).

Τώρα προσθέτουμε το port forwarding 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η σημαίνει αλλαγή του προορισμού και των διευθύνσεων πηγής. Και voila, μπορείτε να συνδεθείτε από το σπίτι μέσω 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

Προσθέστε ένα σχόλιο