使数据库可用于远程连接

首先,有时需要创建一个与数据库连接的应用程序。 这样做是为了避免由于缺乏手和技能而深入研究后端开发并专注于前端。 我不敢说我​​的解决方案将是安全的,但它确实有效。

由于我不喜欢支付托管费用,因此我在工作中使用了网络,因此那里有一个白色IP。 这是它的结构:



我可以访问几台计算机,更精确地访问192.168.1.2(aka 192.168.0.2)Linux,使用Windows访问192.168.0.3。 通常,对于我的应用程序,我选择mysql并查看Linux上的功能。 它已经安装在这里了,但是没人知道密码,还有那些忘记了密码的人(在我之前工作的人)。 发现没有人需要他后,我将其删除并尝试重新安装。 没有足够的内存,并且由于必须用鼠标连接显示器和键盘来解决此错误,因此我决定退出此业务。 而且,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 

它不适合我,也无法通过该地址和根连接。

mysql workbench程序帮助设置,将localhost更改为%即可,尽管客户端没有帮助。 现在,您可以从控制台或任何地址的代码连接到数据库。



您还需要建立家庭或企业网络并关闭Windows防火墙,否则您甚至无法ping通这台计算机(不是它已连接到数据库)。

完成一半的工作,那么我需要能够在家中连接数据库。

从网络图中可以看出,然后您需要从192.168.0.3到192.168.1.1(路由器)连接到Internet,让我们朝相反的方向前进。 设置从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,然后再传输到我们的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 

即 第1行表示我们接受第一个连接,第2行和第3行表示您可以在两侧启动数据包,第4行和第5行表示替换目标地址和源。 瞧,您可以通过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/zh-CN461503/


All Articles