AliSQL的編譯使用

一、下載源碼

git clone https://github.com/alibaba/AliSQL.git

Linux下編譯

二、編譯

編譯前須要安裝好gcc cmake bison等。(若是缺乏其餘依賴,debian系的可使用sudo apt-get build-dep mysql-server快速安裝)html

cd AliSQL
# 建立並進入構建目錄
make build_linux && cd build_linux
# 生成 makefile
cmake -DCMAKE_INSTALL_PREFIX=/home/x/alisql   ..    #指定安裝路徑/home/x/alisql
# 編譯
make -j4

三、安裝使用

make install    # 安裝

安裝完成後能夠進入安裝目錄下的bin目錄mysql

/home/x/alisql/bin [o@o-s] [11:42]
> ./mysql_config 
Usage: ./mysql_config [OPTIONS]
Options:
        --cflags         [-I/home/x/alisql/include   -g -fabi-version=2 -fno-omit-frame-pointer -fno-strict-aliasing]
        --cxxflags       [-I/home/x/alisql/include   -g -fabi-version=2 -fno-omit-frame-pointer -fno-strict-aliasing]
        --include        [-I/home/x/alisql/include]
        --libs           [-L/home/x/alisql/lib -lmysqlclient -lpthread -lm -ldl]
        --libs_r         [-L/home/x/alisql/lib -lmysqlclient -lpthread -lm -ldl]
        --plugindir      [/home/x/alisql/lib/plugin]
        --socket         [/tmp/mysql.sock]
        --port           [0]
        --version        [5.6.32]
        --libmysqld-libs [-L/home/x/alisql/lib -lmysqld -lpthread -lm -lcrypt -ldl -laio]
        --variable=VAR   VAR is one of:
                pkgincludedir [/home/x/alisql/include]
                pkglibdir     [/home/x/alisql/lib]
                plugindir     [/home/x/alisql/lib/plugin]

alisql建立一個my.cnf文件,寫入配置文件信息。
啓動mysqllinux

./bin/mysqld

mysql配置文件說明(注意,配置文件應該是UTF-8編碼無BOM標識的,不然可能出錯)
http://www.cnblogs.com/captain_jack/archive/2010/10/12/1848496.htmlgit

windows下VS2013編譯

一、生成VS2013工程

windows下使用VS2013進行編譯github

mkdir build_msvc
cd build_msvc
cmake -DCMAKE_INSTALL_PREFIX=D:\AliSQL -G "Visual Studio 12 Win64" ..

執行cmake前須要安裝好bison
點擊下載sql

二、編譯安裝

執行完成cmake後生成VS工程文件
使用VS2013 開發人員命令提示進入build_msvc目錄,執行下面命令進行編譯shell

msbuild ALL_BUILD.vcxproj   # 編譯
msbuild INSTALL.vcxproj     # 安裝

能夠在後面添加/p:Configuration="Release"參數來指定編譯release版本。由於文件比較多,可使用/maxcpucount:8來指定使用的CPU核心數,並行編譯。bootstrap

三、使用

安裝後在安裝目錄下創建my.ini文件,具體寫法能夠百度。
新建一個start.batwindows

::
START bin\mysqld --standalone --console

雙擊start.bat啓動便可。socket

四、編譯錯誤解決

錯誤1:alisql\sql\binlog.h(236): error C2065: 「asm」: 未聲明的標識符

定位到錯誤代碼

#define barrier() __asm volatile("" ::: "memory")

這個宏是GCC下作編譯屏障的宏,VS2013不支持(x64編譯也不支持內聯彙編),使用windows下的替代版本

#define barrier() MemoryBarrier()

具體的能夠看MemoryBarrier macro
參考http://book.51cto.com/art/201504/474436.htm

錯誤2:alisql\storage\innobase\include\trx0trx.h(54): error C2146: 語法錯誤: 缺乏「,」(在標識符「attribute」的前面)

由於__attribute__gcc的擴展,因此VC不支持也很正常。
trx0trx.h文件最前面添加#define __attribute__(...)便可。
相似的問題還出如今sql_connect.cc等文件中,能夠將上面的宏添加到預編譯指令中。

錯誤3:AliSQL\storage\innobase\handler\ha_innodb.cc(16222): error C2440: 「初始化」: 沒法從「ulint 」轉換爲「unsigned long

ha_innodb.cc中的

static MYSQL_SYSVAR_ULONG(adaptive_hash_index_parts, btr_search_index_num,
  PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
  "Number of InnoDB adaptive hash index partitions",
  NULL, NULL, 8, 1, 512, 0);

修改成

static unsigned long& btr_search_index_num_ul = (unsigned long&)btr_search_index_num;
static MYSQL_SYSVAR_ULONG(adaptive_hash_index_parts, btr_search_index_num_ul,
  PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
  "Number of InnoDB adaptive hash index partitions",
  NULL, NULL, 8, 1, 512, 0);

錯誤4:AliSQL\storage\innobase\read\read0read.cc(507): error C3861: 「min」: 找不到標識符

read0read.cc中代碼(506-508行)

if (view->n_descr > 0) {
        view->up_limit_id = min(view->up_limit_id, view->descriptors[0]);
    }

修改成

if (view->n_descr > 0) {
        view->up_limit_id = (view->up_limit_id < view->descriptors[0])?
                            view->up_limit_id : view->descriptors[0];
    }

錯誤5:AliSQL\storage\innobase\read\read0read.cc(603): error C2664: 「lint win_xchg_and_add(volatile lint ,lint)」: 沒法將參數 1 從「ulint 」轉換爲「volatile lint *」

read0read.cc中代碼(601-604行)

os_atomic_decrement_lint(&srv_read_views_memory,
                 sizeof(read_view_t) +
                 view->max_descr * sizeof(trx_id_t));

修改成

os_atomic_decrement_lint((volatile lint*)&srv_read_views_memory,
                 sizeof(read_view_t) +
                 view->max_descr * sizeof(trx_id_t));

這樣的錯誤還有幾個,都是作這樣的修改便可。

錯誤6:AliSQL\sql\sql_filter.cc(134): error C3861: 「__sync_add_and_fetch」: 找不到標識符
這樣的錯誤有多個

4>E:\AliSQL\sql\sql_filter.cc(134): error C3861: 「__sync_add_and_fetch」:  找不到標識符
4>E:\AliSQL\sql\sql_filter.cc(356): error C3861: 「__sync_add_and_fetch」:  找不到標識符
4>E:\AliSQL\sql\sql_filter.cc(362): error C3861: 「__sync_bool_compare_and_swap」:  找不到標識符
4>E:\AliSQL\sql\sql_filter.cc(455): error C3861: 「__sync_sub_and_fetch」:  找不到標識符

這是gcc提供的built-in函數,用於提供加減和邏輯運算的原子操做。參考http://www.cnblogs.com/FrankTan/archive/2010/12/11/1903377.html
能夠對應VC下的Interlocked函數族。
參考http://jishublog.iteye.com/blog/1898518
https://technet.microsoft.com/zh-cn/library/ms683504
Exchange的函數返回的是更新前的值,不帶的返回更新後的值。

因此這裏能夠在sql_filter.h(多個文件中都須要用到)文件頭部添加以下宏定義來實現替換

// 返回更新前的值
#define __sync_fetch_and_add(ptr,value, ...)    InterlockedExchangeAdd64((LONG64 volatile *)ptr,value)
#define __sync_fetch_and_sub(ptr, value, ...)   InterlockedExchangeAdd64((LONG64 volatile *)ptr,-value)
#define __sync_fetch_and_or(ptr, value, ...)
#define __sync_fetch_and_and(ptr, value, ...)
#define __sync_fetch_and_xor(ptr, value, ...)
#define __sync_fetch_and_nand(ptr, value, ...)

// 返回更新後的值
#define __sync_add_and_fetch(ptr, value, ...)   InterlockedAdd64((LONG64 volatile *)ptr,value)
#define __sync_sub_and_fetch(ptr, value, ...)   InterlockedAdd64((LONG64 volatile *)ptr,-value)
#define __sync_or_and_fetch(ptr, value, ...)
#define __sync_and_and_fetch(ptr, value, ...)
#define __sync_xor_and_fetch(ptr, value, ...)
#define __sync_nand_and_fetch(ptr, value, ...)

#define __sync_bool_compare_and_swap(ptr, oldval,newval, ...) InterlockedCompareExchange64(ptr,newval,oldval)

錯誤7:AliSQL\sql\sql_locale.cc(789): error C2146: 語法錯誤: 缺乏「}」(在標識符「嗒忇喃嵿嗒苦」的前面)

這是由於VS對utf-8的支持很差(編譯器支持很差),將其保存爲帶BOM標記的UTF-8編碼便可。

錯誤8:AliSQL\sql\sql_show.cc(3896): error C2059: 語法錯誤:「(」

先看一下這一段代碼

// Sends the global table stats back to the client.
int fill_schema_table_stats(THD* thd, TABLE_LIST* tables, Item* __attribute__((unused)))
{
  TABLE *table= tables->table;
  DBUG_ENTER("fill_schema_table_stats");
  char *table_full_name, *table_schema;
  TABLE_SHARE *share;
  uint indx;

這裏函數中出現了__attribute__((unused))這個東西,須要處理一下。
在文件sql_show.cc開頭添加(在mysqld.cc中也須要)

#define __attribute__(...)

錯誤9:AliSQL\sql\sql_show.cc(3922): error C3861: 「strsep」: 找不到標識符

這個函數在linux下是有的,windows下沒有就使用下面的來替代

char *strsep(char **stringp, const char *delim)
{
    char *s;
    const char *spanp;
    int c, sc;
    char *tok;
    if ((s = *stringp)== NULL)
        return (NULL);
    for (tok = s;;) {
        c = *s++;
        spanp = delim;
        do {
            if ((sc =*spanp++) == c) {
                if (c == 0)
                    s = NULL;
                else
                    s[-1] = 0;
                *stringp = s;
                return (tok);
            }
        } while (sc != 0);
    }
    /* NOTREACHED */
}

錯誤10:C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets(170,5): error MSB6006: 「cmd.exe」已退出,代碼爲 1。

由於編譯ALL_BUILD工程完成後會去執行下面操做

Executing E:/AliSQL/build_msvc/sql/Debug/mysqld.exe --no-defaults --console --bootstrap --lc-messages-dir=E:/windows-software/AliSQL/build_msvc/sql/share --basedir=. --datadir=. --default-storage-engine=MyISAM --default-tmp-storage-engine=MyISAM --loose-skip-ndbcluster --max_allowed_packet=8M --net_buffer_length=16K
相關文章
相關標籤/搜索