Почнемо з того, що бувають випадки, коли потрібно робити додаток з підключенням до бази даних. Це робиться для того, щоб особливо не копатися в розробці бекенд і сконцентруватися на фронтенді через брак рук і навичок. Я не беруся казати, що моє рішення буде безпечним, але воно працює.
Оскільки я не люблю платити за хостингя скористався мережею на своїй роботі, там є білий 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 курсу.
Коли відновив усі таблиці, настав час зробити доступним віддалений доступ до бд. Загалом такі команди до успіху не привели (видав тільки право на читання select).
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 на % і працює, хоча client це не допомогло. Тепер ви можете підключатися до бд з консолі або коду з будь-якої адреси.

Еще нужно сделать сеть домашней или предприятия и выключить брандмауэр Windows иначе не сможете даже сделать пинг этой машины(не то чтобы подключится к бд).
Підлога справи зроблено, далі потрібно, щоб я міг з дому підключитися до бази даних.
Як видно із схеми мережі, то до інтернету треба пройти шлях від 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, а потом на нашу 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. І насамкінець мій код на с++ який це робить:
//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;
};
Тепер можна сміливо скидати цю програму будь-кому, і не треба переписувати щоб вона працювала локально.
Джерело: habr.com
