首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 嵌入式版本 開發入門:libmysqld 編譯、配置與最小可行程序示例

     編輯:MySQL 綜合教學

背景

MySQL 嵌入式服務器 讓應用**無獨立進程、無網絡通信**,直接鏈接 `libmysqld` 在進程內運行完整 MySQL 服務。適用於桌面應用、邊緣設備、測試框架、CI/CD 隔離環境。

一、編譯安裝嵌入式庫

產物:`libmysqld.a` / `libmysqld.so`(在 `lib/` 目錄)

二、最小可行程序

2.1 目錄結構

2.2 GNUmakefile

2.3 my.cnf(嵌入式服務器配置)

2.4 main.cc 核心代碼


#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;
}

三、運行流程

  1. 編譯:make → 生成 main 可執行文件
  2. 初始化數據目錄:
    cd /home/mysql && scripts/mysql_install_db --defaults-file=/home/mysql/my.cnf
  3. 運行:./main

四、關鍵 API 與客戶端模式對比

API嵌入式模式客戶端模式
初始化mysql_library_init()無(或 mysql_library_init(0,NULL,NULL))
連接mysql_real_connect(..., NULL, NULL, NULL, ...) host=NULLmysql_real_connect(..., "host", "user", "pwd", ...)
關閉mysql_server_end()mysql_close()
鏈接庫-lmysqld-lmysqlclient
進程單進程內獨立 mysqld 進程
網絡無TCP/Unix Socket

五、適用場景與限制

  • ✅ 單機桌面應用(SQLite 替代,功能更強)
  • ✅ 單元/集成測試:每用例獨立嵌入式實例,無汙染、無併發衝突
  • ✅ 邊緣計算/離線設備:零運維、零配置
  • ❌ 高併發、多客戶端、遠程訪問 → 必須用獨立服務器
  • ❌ 官方 8.0 已棄用嵌入式服務器,建議新項目評估 SQLite / DuckDB / 獨立 MySQL

六、總結

MySQL 嵌入式版本通過 libmysqld 將完整服務器能力內嵌進應用進程:**編譯帶 WITH_EMBEDDED_SERVER → 鏈接 -lmysqld → mysql_library_init 啟動 → host=NULL 連接 → 業務 SQL → mysql_server_end 關閉**。雖官方已棄用,但其「進程內數據庫」架構思想在測試隔離、邊緣計算場景仍有參考價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved