ทำให้ฐานข้อมูลพร้อมใช้งานสำหรับการเชื่อมต่อระยะไกล

เริ่มจากข้อเท็จจริงที่ว่ามีหลายกรณีที่คุณจำเป็นต้องสร้างแอปพลิเคชันที่มีการเชื่อมต่อกับฐานข้อมูล สิ่งนี้ทำเพื่อไม่ให้เจาะลึกการพัฒนาแบ็กเอนด์มากเกินไปและมุ่งความสนใจไปที่ส่วนหน้าเนื่องจากขาดมือและทักษะ ฉันไม่สามารถพูดได้ว่าโซลูชันของฉันจะปลอดภัย แต่ใช้งานได้

เนื่องจากฉันไม่ชอบจ่ายค่าโฮสติ้ง ฉันจึงใช้เครือข่ายในที่ทำงาน มี 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

สิ่งนี้ใช้ไม่ได้สำหรับฉันและฉันไม่สามารถเชื่อมต่อผ่านที่อยู่นี้ในฐานะรูทได้

โปรแกรม 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 ตั้งอยู่ที่ไหน (การเรียนรู้พื้นฐานของเครือข่ายจะมีประโยชน์)

ตอนนี้เราเพิ่มการส่งต่อพอร์ต 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;
};

ตอนนี้คุณสามารถส่งโปรแกรมนี้ให้ใครก็ได้อย่างปลอดภัย และคุณไม่จำเป็นต้องเขียนมันใหม่เพื่อให้มันทำงานในเครื่องได้

ที่มา: will.com

เพิ่มความคิดเห็น