Мэдээллийн санг алсаас холбох боломжтой болгож байна

Өгөгдлийн сангийн холболттой программ хийх шаардлагатай үе байдаг тул яриагаа эхэлье. Энэ нь гар, ур чадвар дутмаг учраас арын талын хөгжилд хэт гүнзгий орж, урд талдаа анхаарлаа төвлөрүүлэхгүйн тулд хийгддэг. Миний шийдэл аюулгүй байх болно гэж би хэлэхгүй, гэхдээ энэ нь ажилладаг.

Хостинг мөнгө төлөх дургүй болохоор ажил дээрээ сүлжээ ашигласан, цагаан IP байна. Түүний бүтэц энд байна:

Мэдээллийн санг алсаас холбох боломжтой болгож байна

Би хэд хэдэн компьютерт хандах боломжтой, илүү нарийвчлалтай 192.168.1.2 (192.168.0.2 гэх мэт) дээр Линукс, Windows үйлдлийн системтэй 192.168.0.3 байна. Ерөнхийдөө би програмынхаа хувьд mysql-г сонгоод Линукс дээр юу байгааг харлаа. Тэнд аль хэдийн суулгасан байсан, гэхдээ хэн ч нууц үгээ мэдэхгүй, мэддэг хүмүүс мартсан (надаас өмнө ажиллаж байсан хүмүүс). Хэнд ч хэрэггүй гэдгийг мэдээд устгаад дахин суулгах гэж оролдсон. Санах ой хангалтгүй байсан тул энэ алдааг засахын тулд монитор, гарыг хулганаар холбох шаардлагатай болсон тул би энэ бизнесээ орхихоор шийдсэн. Түүгээр ч барахгүй Windows машин нь илүү хүчирхэг бөгөөд үүнээс гадна би өөрөө үүнийг зөөврийн компьютер дээрээ гэртээ суулгадаг. Зарчмын хувьд би суулгацыг өөрөө тайлбарлахгүй, энэ талаар маш олон гарын авлага, видео бичлэгүүд байдаг. Windows компьютер дээр 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

Энэ нь надад тохирохгүй байсан, би бас энэ хаягаар 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 дэд сүлжээ хаана байрлаж байгааг мэдэхийн тулд зайлшгүй шаардлагатай (сүлжээний үндсийг сурах нь ашигтай).

Одоо бид 3306 хаяг руу порт дамжуулах 192.168.1.2 (анхдагчаар mysql порт (хэрэв та суулгах явцад үүнийг өөрчлөөгүй бол)) нэмдэг.

Мэдээллийн санг алсаас холбох боломжтой болгож байна

Одоо хийх хамгийн хэцүү зүйл бол Линукс машин дээр дамжуулалт хийх явдал юм (энэ нь 192.168.1.2 (enp3s1 интерфэйс) ба 192.168.0.2 (enp3s0 интерфейс) гэсэн хоёр сүлжээний карттай) бөгөөд сүлжээний картууд 192.168.1.2-оос юу дамжуулахаа мэддэг байх болно. 192.168.0.2 руу, дараа нь MySql-тэй манай Windows машин руу.

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

сэтгэгдэл нэмэх