در دسترس قرار دادن پایگاه داده برای اتصال از راه دور

بیایید با این واقعیت شروع کنیم که مواردی وجود دارد که باید یک برنامه کاربردی با اتصال به پایگاه داده ایجاد کنید. این کار به این منظور انجام می شود که به دلیل نداشتن دست و مهارت زیاد در توسعه باطن و تمرکز روی فرانت اند تمرکز نکنید. نمی توانم بگویم که راه حل من بی خطر خواهد بود، اما کار می کند.

از آنجایی که من دوست ندارم برای هاست هزینه کنم، از شبکه در محل کارم استفاده کردم، یک IP سفید در آنجا وجود دارد. در اینجا ساختار آن است:

در دسترس قرار دادن پایگاه داده برای اتصال از راه دور

من به چندین کامپیوتر دسترسی دارم، دقیق تر 192.168.1.2 (معروف به 192.168.0.2) با لینوکس نصب شده و 192.168.0.3 با ویندوز. به طور کلی، من mysql را برای برنامه خود انتخاب کردم و به آنچه در لینوکس موجود بود نگاه کردم. قبلاً در آنجا نصب شده بود ، اما هیچ کس رمز عبور را نمی داند و کسانی که می دانستند فراموش کردند (کسانی که قبل از من کار می کردند). من که فهمیدم کسی به آن نیاز ندارد، آن را حذف کردم و سعی کردم دوباره آن را نصب کنم. حافظه کافی وجود نداشت و از آنجایی که برای رفع این خطا باید مانیتور و کیبورد را با ماوس به آن وصل کنم، تصمیم گرفتم از این موضوع صرف نظر کنم. علاوه بر این، دستگاه با ویندوز بسیار قوی تر است و به علاوه، من آن را در لپ تاپ خود در خانه دارم. در اصل، من خود نصب را شرح نمی دهم؛ راهنماها و فیلم های زیادی در مورد آن وجود دارد. پس از نصب mysql بر روی یک دستگاه ویندوز، تصمیم گرفتم از جداول از لپ تاپ خود به ایستگاه کاری خود نسخه پشتیبان تهیه کنم.

این کار به این صورت انجام می شود (در مورد من):

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 را به % تغییر دهید و کار می کند، هرچند کلاینت کمکی نکرد. اکنون می توانید از طریق کنسول یا از طریق کد از هر آدرسی به پایگاه داده متصل شوید.

در دسترس قرار دادن پایگاه داده برای اتصال از راه دور

همچنین باید یک شبکه خانگی یا تجاری بسازید و فایروال ویندوز را خاموش کنید، در غیر این صورت حتی نمی توانید این دستگاه را پینگ کنید (چه رسد به اتصال به پایگاه داده).

نیمی از کار انجام شده است، اکنون باید بتوانم از خانه به پایگاه داده متصل شوم.

همانطور که از نمودار شبکه می بینید، برای دسترسی به اینترنت باید از 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 اضافه می‌کنیم.

در دسترس قرار دادن پایگاه داده برای اتصال از راه دور

سخت ترین کاری که باید انجام دهید این است که فورواردینگ را روی یک ماشین لینوکس انجام دهید (دارای دو کارت شبکه 192.168.1.2 (رابط enp3s1) و 192.168.0.2 (رابط enp3s0) است تا کارت های شبکه بدانند چه چیزی باید آنها را از 192.168.1.2 منتقل کنند. به 192.168.0.2، و سپس به دستگاه ویندوز ما با 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 متصل شوید. و در نهایت، کد سی پلاس پلاس من که این کار را انجام می دهد:

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

اضافه کردن نظر