ريموٽ ڪنيڪشن لاءِ ڊيٽابيس کي دستياب ڪرڻ

اچو ته حقيقت سان شروع ڪريون ته اهڙا ڪيس آهن جڏهن توهان کي ڊيٽابيس سان ڪنيڪشن سان ايپليڪيشن ٺاهڻ جي ضرورت آهي. اهو ڪيو ويو آهي انهي لاءِ ته پس منظر جي ترقي ۾ تمام گهڻو ڌيان نه ڏيڻ ۽ هٿن ۽ صلاحيتن جي کوٽ جي ڪري فرنٽ اينڊ تي توجه ڏيڻ. مان اهو نٿو چئي سگهان ته منهنجو حل محفوظ هوندو، پر اهو ڪم ڪري ٿو.

جيئن ته مان هوسٽنگ لاءِ ادا ڪرڻ پسند نٿو ڪريان، مون پنهنجي ڪم تي نيٽ ورڪ استعمال ڪيو، اتي هڪ اڇو 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

اهي. پهرين لڪير جو مطلب آهي ته اسان پهريون ڪنيڪشن قبول ڪريون ٿا، ٻيو ۽ ٽيون جيڪو اسان ٻنهي طرفن ۾ پيڪيٽ موڪلي سگهون ٿا، چوٿين ۽ پنجين جو مطلب آهي منزل ۽ ماخذ پتي کي تبديل ڪرڻ. ۽ 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

تبصرو شامل ڪريو