إتاحة قاعدة البيانات للاتصال عن بُعد

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

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


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



تحتاج أيضًا إلى إنشاء شبكة منزلية أو مؤسسة وإيقاف تشغيل جدار حماية 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 (تعرف على أساسيات الشبكات ، وهذا مفيد).

الآن قم بإضافة منفذ probros 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 ، ثم لدينا آلة ويندوز مع 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-descriptor\n"); //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: %s\n", 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: %s\n", 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; }; 

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

Source: https://habr.com/ru/post/ar461503/


All Articles