MySQL 嵌入式服務器 讓應用**無獨立進程、無網絡通信**,直接鏈接 `libmysqld` 在進程內運行完整 MySQL 服務。適用於桌面應用、邊緣設備、測試框架、CI/CD 隔離環境。
產物:`libmysqld.a` / `libmysqld.so`(在 `lib/` 目錄)
#include
#include
using namespace std;
// 服務器啟動參數
const char *server_options[] = {
"mysql_test",
"--defaults-file=my.cnf",
NULL
};
int num_elements = (sizeof(server_options) / sizeof(char *)) - 1;
const char *server_groups[] = { "libmysqld_server", "libmysqld_client", NULL };
bool is_server_started = false;
MYSQL *MySQL = NULL;
const char *db = NULL;
void start_server() {
cout << "enter start_server()" << endl;
if (mysql_library_init(num_elements, (char**)server_options, (char**)server_groups)) {
is_server_started = false;
cout << "ERROR: start server failed." << endl;
} else {
is_server_started = true;
cout << "INFO: start server OK." << endl;
}
}
void stop_server() {
cout << "enter stop_server()" << endl;
mysql_server_end();
}
bool connect_server() {
cout << "enter connect_server()" << endl;
bool rc = true;
MySQL = mysql_init(NULL);
if (!MySQL) return rc;
// host=NULL 表示嵌入式本地連接
if (mysql_real_connect(MySQL, NULL, NULL, NULL, db, 0, NULL, 0))
rc = false;
MySQL->reconnect = 1;
return rc;
}
void output_rows(MYSQL_RES *res) {
MYSQL_ROW row;
unsigned long n = 0;
while ((row = mysql_fetch_row(res)) != 0) {
mysql_field_seek(res, 0);
for (unsigned int i = 0; i < mysql_num_fields(res); i++)
cout << "row[" << n++ << "]:" << row[i] << endl;
}
}
bool get_dbs() {
MYSQL_RES *res;
if (!is_server_started) return true;
if (!(res = mysql_list_dbs(MySQL, "%"))) return true;
output_rows(res);
mysql_free_result(res);
return false;
}
int main(int argc, char *argv[]) {
start_server();
if (is_server_started) {
cout << "server started." << endl;
if (!connect_server()) {
get_dbs();
}
stop_server();
}
return 0;
}
make → 生成 main 可執行文件cd /home/mysql && scripts/mysql_install_db --defaults-file=/home/mysql/my.cnf./main| API | 嵌入式模式 | 客戶端模式 |
|---|---|---|
| 初始化 | mysql_library_init() | 無(或 mysql_library_init(0,NULL,NULL)) |
| 連接 | mysql_real_connect(..., NULL, NULL, NULL, ...) host=NULL | mysql_real_connect(..., "host", "user", "pwd", ...) |
| 關閉 | mysql_server_end() | mysql_close() |
| 鏈接庫 | -lmysqld | -lmysqlclient |
| 進程 | 單進程內 | 獨立 mysqld 進程 |
| 網絡 | 無 | TCP/Unix Socket |
MySQL 嵌入式版本通過 libmysqld 將完整服務器能力內嵌進應用進程:**編譯帶 WITH_EMBEDDED_SERVER → 鏈接 -lmysqld → mysql_library_init 啟動 → host=NULL 連接 → 業務 SQL → mysql_server_end 關閉**。雖官方已棄用,但其「進程內數據庫」架構思想在測試隔離、邊緣計算場景仍有參考價值。