جعل قاعدة البيانات متاحة للاتصال عن بعد

لنبدأ بحقيقة أن هناك أوقاتًا تحتاج فيها إلى إنشاء تطبيق باستخدام اتصال قاعدة البيانات. يتم ذلك من أجل عدم الخوض كثيرًا في التطوير الخلفي والتركيز على الواجهة الأمامية بسبب نقص الأيدي والمهارات. لن أقول إن الحل الخاص بي سيكون آمنًا ، لكنه يعمل.

نظرًا لأنني لا أرغب في الدفع مقابل الاستضافة ، فقد استخدمت الشبكة في عملي ، وهناك عنوان 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;


يجب وضع الملف الذي يحتوي على النسخة الاحتياطية على جهاز جديد ، وإذا لم يكن في الدليل الذي يحتوي على الأداة المساعدة ، فمن الممكن أن يكون المسار الكامل إليه ممكنًا. (لقد قمت للتو بتحميل نسخة احتياطية على جيثب واستنسخها على جهاز جديد). أود أن أضيف كيف يتم إنشاء الجداول نفسها ، لكنني لم أحفظ لقطات الشاشة ، وأعتقد أنه ليس من الصعب حتى بالنسبة لطالب من سنتين إلى ثلاث سنوات.

عندما استعدت جميع الجداول ، حان الوقت لإتاحة الوصول عن بُعد إلى قاعدة البيانات. بشكل عام ، لم تؤد هذه الأوامر إلى النجاح (مع إعطاء الحق في القراءة فقط)

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 ، هناك في الإعدادات تقوم بتغيير المضيف المحلي إلى٪ وهو يعمل ، على الرغم من أن العميل لم يساعد. يمكنك الآن الاتصال بقاعدة البيانات من وحدة التحكم أو من الرمز من أي عنوان.

جعل قاعدة البيانات متاحة للاتصال عن بعد

تحتاج أيضًا إلى إنشاء شبكة منزلية أو مؤسسة وإيقاف تشغيل جدار حماية Windows ، وإلا فلن تتمكن حتى من اختبار اتصال هذا الجهاز (لا يعني أنه سيتصل بقاعدة البيانات).

تم الانتهاء من نصف العمل ، ثم أحتاج إلى أن أكون قادرًا على الاتصال بقاعدة البيانات من المنزل.

كما ترى من الرسم التخطيطي للشبكة ، فأنت بحاجة إلى الانتقال إلى الإنترنت من 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

أولئك. السطر الأول يعني أننا نقبل الاتصال الأول ، والثاني والثالث أنه من الممكن إرسال الحزم في كلا الاتجاهين ، والرابع والخامس يعني استبدال الوجهة وعنوان المصدر. وفويلا ، يمكنك الاتصال من المنزل عبر 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

إضافة تعليق