AliSQL编译安装

  • 2019 年 12 月 13 日
  • 筆記

1、下载AliSQL

源码https://github.com/alibaba/AliSQL

2、linux编译

若安装MySQL则 rm /etc/my.cnf卸载,否则忽略 卸载已安装的mysql

yum remove mysql mysql-server mysql-libs compat-mysql51 //51为版本  rm –rf /var/lib/mysql  rm /etc/my.cnf

查看是否还存在mysql软件

rpm -qa|grep mysql

若存在,则继续

yum –y remove 查询到的软件名

一、编译安装AliSQL前的准备工作 1、编译源码所需的工具和库

yum install gcc gcc-c++ ncurses-devel perl 

2、安装cmake,或从https://cmake.org/download/下载所需版本

wget --no-check-certificate http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz  tar -zxvf cmake-2.8.10.2.tar.gz  cd cmake-2.8.10.2  ./bootstrap ; make ; make install  cd ../

3、安装bison,从http://ftp.gnu.org/gnu/bison/下载所需版本

wget http://ftp.gnu.org/gnu/bison/bison-2.7.tar.gz  tar -xvzf bison-2.7.tar.gz  cd bison-2.7  ./configure  make && make install  cd ../

二、设置AliSQL用户和组 1、增加AliSQL用户和组

groupadd mysql

2、新增AliSQL用户

useradd -r -g mysql mysql

三、AliSQL所需目录 1、新建AliSQL安装目录

mkdir –p /usr/local/mysql

2、新建AliSQL数据库数据文件目录

mkdir -p /data/mysqldb

四、下载AliSQL源码并解压 从https://github.com/alibaba/AliSQL下载源码

解压unzip AliSQL-master.zip  cd AliSQL-master

五、编译安装AliSQL

1、设置编译参数

         cmake           -DCMAKE_INSTALL_PREFIX=/usr/local/mysql            -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock            -DDEFAULT_CHARSET=utf8            -DDEFAULT_COLLATION=utf8_general_ci            -DWITH_INNOBASE_STORAGE_ENGINE=1            -DWITH_ARCHIVE_STORAGE_ENGINE=1            -DWITH_BLACKHOLE_STORAGE_ENGINE=1            -DMYSQL_DATADIR=/data/mysqldb            -DMYSQL_TCP_PORT=3306            -DENABLE_DOWNLOADS=1  或者:   cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DDEFAULT_CHARSET=utf8   -DDEFAULT_COLLATION=utf8_general_ci -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DMYSQL_DATADIR=/data/mysqldb -DMYSQL_TCP_PORT=3306 -DENABLE_DOWNLOADS=1

注:重新运行配置,需要删除CMakeCache.txt文件

         rm CMakeCache.txt 

2、编译源码

make

3、安装

make install

六、修改AliSQL目录所有者和组

1、修改AliSQL安装目录

1)、cd  /usr/local/mysql  2)、chown -R mysql:mysql .

2、修改AliSQL数据库文件目录

1)、cd  /data/mysqldb  2)、chown -R mysql:mysql .

七、初始化AliSQL数据库

cd  /usr/local/mysql  scripts/mysql_install_db  --user=mysql  --datadir=/data/mysqldb

注:初始化数据库出现错误:

 FATAL ERROR:please install the following Perl modules before executingscripts/mysql_install_db:  Data::Dumper 安装:autoconf库 命令:yum –y install autoconf  //此包安装时会安装Data::Dumper 再次执行初始化AliSQL数据库命令

八、复制AliSQL服务启动配置文件

cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf

注:如果/etc/my.cnf文件存在,则覆盖

九、复制AliSQL服务启动脚本及加入path路径

cp  support-files/mysql.server  /etc/init.d/mysqld  vim  /etc/profile          PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH          export PATH   source/etc/profile

十、系统在/usr/bin下面做链接

ln -s /usr/local/mysql/bin/mysql /usr/bin

十一、启动AliSQL服务并加入开机自启动(可选)

service mysqld start  chkconfig --level 35 mysqld on

十二、检查服务是否启动

netstat -tulnp | grep 3306  mysql -u root -p

防火墙设置参考http://www.ilkhome.cn/?post=156

给root账号授权,root账号使用123456从任何主机连接到mysql服务器:mysql>

<span style="color:#E56600;font-size:14px;">GRANT</span>
<span style="color:#E56600;font-size:14px;">ALL</span>
<span style="color:#E56600;font-size:14px;">PRIVILEGES</span>
<span style="color:#E56600;font-size:14px;">ON</span>
<span style="color:#E56600;font-size:14px;">*.*</span>
<span style="color:#E56600;font-size:14px;">TO</span>
<span style="color:#E56600;font-size:14px;">'root'</span>
<span style="color:#E56600;font-size:14px;">@</span>
<span style="color:#E56600;font-size:14px;">'%'</span>
<span style="color:#E56600;font-size:14px;">IDENTIFIED</span>
<span style="color:#E56600;font-size:14px;">BY</span>
<span style="color:#E56600;font-size:14px;">'123456'</span>
<span style="color:#E56600;font-size:14px;">WITH</span>
<span style="color:#E56600;font-size:14px;">GRANT</span>
<span style="color:#E56600;font-size:14px;">OPTION</span>
<span style="color:#E56600;font-size:14px;">;</span>

3.windows下VS2013编译

1、生成VS2013工程 windows下使用VS2013进行编译 mkdir build_msvc cd build_msvc cmake -DCMAKE_INSTALL_PREFIX=D:AliSQL -G "Visual Studio 12 Win64" .. 执行cmake前需要安装好bison。 点击下载 2、编译安装 执行完成cmake后生成VS工程文件 使用VS2013 开发人员命令提示进入build_msvc目录,执行下面命令进行编译 msbuild ALL_BUILD.vcxproj   # 编译 msbuild INSTALL.vcxproj     # 安装 可以在后面添加/p:Configuration="Release"参数来指定编译release版本。因为文件比较多,可以使用/maxcpucount:8来指定使用的CPU核心数,并行编译。 3、使用 安装后在安装目录下建立my.ini文件,具体写法可以百度。 新建一个start.bat :: START binmysqld –standalone –console 双击start.bat启动即可。 4、编译错误解决 错误1:alisqlsqlbinlog.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:alisqlstorageinnobaseincludetrx0trx.h(54): error C2146: 语法错误: 缺少“,”(在标识符“attribute”的前面) 因为__attribute__是gcc的扩展,所以VC不支持也很正常。 在trx0trx.h文件最前面添加#define __attribute__(…)即可。 类似的问题还出现在sql_connect.cc等文件中,可以将上面的宏添加到预编译指令中。 错误3:AliSQLstorageinnobasehandlerha_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:AliSQLstorageinnobasereadread0read.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:AliSQLstorageinnobasereadread0read.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:AliSQLsqlsql_filter.cc(134): error C3861: “__sync_add_and_fetch”: 找不到标识符 这样的错误有多个 4>E:AliSQLsqlsql_filter.cc(134): error C3861: “__sync_add_and_fetch”:  找不到标识符 4>E:AliSQLsqlsql_filter.cc(356): error C3861: “__sync_add_and_fetch”:  找不到标识符 4>E:AliSQLsqlsql_filter.cc(362): error C3861: “__sync_bool_compare_and_swap”:  找不到标识符 4>E:AliSQLsqlsql_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:AliSQLsqlsql_locale.cc(789): error C2146: 语法错误: 缺少“}”(在标识符“嗒忇喃嵿嗒苦”的前面) 这是因为VS对utf-8的支持不好(编译器支持不好),将其保存为带BOM标记的UTF-8编码即可。 错误8:AliSQLsqlsql_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:AliSQLsqlsql_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)MSBuildMicrosoft.Cppv4.0V120Microsoft.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