mysql5.x编译选项参考
2012-10-09 13:05:37 阿炯

一、MySQL 5.1

二、MySQL 5.5 plus

--------------------------------------------------------------------
一、MySQL 5.1


静态编译
-static
--with-client-ldflags=-all-static
--with-mysqld-ldflags=-all-static
 静态链接可以使性能提高13%。

Unix Socket
--with-unix-socket path=/usr/local/mysql/tmp/mysql.sock
使用unix套接字链接提高7.5%性能。

--enable-assembler
The --enable-assembler options of configure allows for compiling in x86 (and sparc) versions of common string operations, which should result in more performance.
汇编x86的普通操作符,可以提高性能

--with-extra-charsets =complex    字符支持
--enable-thread-safe-client #Compile the client with threads. 让客户端支持线程

--with-big-tables
There is a limit of 232 (~4.295E+09) rows in a MyISAM  table. If you build MySQL with the --with-big-tables  option, the row limitation is increased to (232 )2 (1.844E+19) rows

--with-ssl
--with-embedded-server    #编译成embedded MySQL library (libmysqld.a  ),
--enable-local-infile #让mysql支持从本地文件 导入数据库,否则在加载数据文件时会报以下错误:
load data local infile '/usr/test' into table test fields terminated by ' ';
ERROR 1148 (42000): The used command is not allowed with this MySQL version)

--with-plugins=innobase 存储引擎
Mysql5.1开始,编译添加innodb插件就从--with-innodb 改成了--with-plugins=innobase
 
--with-plugins=PLUGIN[[[,PLUGIN..]]]
Plugins to include in mysqld. (default is : none) Must be a configuration name or a comma separated  list of plugins. Available configurations are: none max max-no-ndb all. Available plugins are: partition daemon_example ftexample archive blackhole csv example federated heap innobase myisam myisammrg ndbcluster
如果多个插件,可以写成:--with-plugins=partition,blackhole,heap,innobase,myisam,ndbcluster 用逗号分开

实例:
./configure –prefix=/usr/local/mysql/ --enable-assembler --with-unix-socket-path=/tmp/mysql.sock --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static  --with-extra-charsets=gbk,gb2312,utf8 --enable-thread-safe-client --with-big-tables --enable-local-infile

./configure --prefix=/usr/local/mysql --enable-static --with-mysqld-user=mysql --enable-profiling --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --with-mysqld-ldflags=-ltcmalloc --with-extra-charsets=all --with-system-type --with-machine-type --with-pthread --with-plugins=max-no-ndb --enable-thread-safe-client --enable-local-infile --with-server-suffix=-freeoa

----------------------------------
google-perftools里的tcmalloc比glibc的malloc的分配效率和性能要搞多了,所以经常用来优化以提高mysql大并发下有效的性能。

--with-mysqld-ldflags="-all-static -ltcmalloc"
make的时候结果出错。
 
把--with-mysqld-ldflags="-all-static -ltcmalloc" 改成 --with-mysqld-ldflags="-all-static -ltcmalloc -lunwind"
make 一样出错,只是少了错误。是mysql的静态模式下是不支持外挂吗?可以去掉静态,也就是--with-mysqld-ldflags="-ltcmalloc -lunwind" 可以通过。

其实只要分开写,即可:
--with-mysqld-ldflags=-all-static --with-mysqld-ldflags=-ltcmalloc


这样就可以将TCMalloc加入到mysqld的运行环境中,且是静态化编译的。不然只有在mysqld的启动脚本中加入预先载入它的库'export LD_PRELOAD=/usr/local/lib/libtcmalloc.so'才行。

使用lsof命令查看tcmalloc是否起效:
/usr/sbin/lsof -n | grep tcmalloc

如果发现以下信息,说明tcmalloc已经起效:
mysqld     6879     mysql  mem       REG                8,2     1941038    4251945 /usr/local/lib/libtcmalloc.so.4.1.0

提示:configure支持的选项非常多,详细的参数及说明建议参考官方文档,也可以通过./configure --help查看,这里仅列出常用及推荐使用的选项。
--prefix=PREFIX:指定程序安装路径;
--enable-assembler:使用汇编模式;
--enable-local-infile:启用对LOAD DATA LOCAL INFILE语法的支持(默认不支持);
--enable-profiling:Build a version with query profiling code (req.community-features)
--enable-thread-safe-client:使用编译客户端;
--with-big-tables:启用32位平台对4G大表的支持;
--with-charset=CHARSET:指定字符集;
--with-collation=:默认collation;
--with-extra-charsets=CHARSET,CHARSET,...:指定附加的字符集;
--with-fast-mutexes:Compile with fast mutexes
--with-readline:
--with-ssl:启用SSL的支持;
--with-server-suffix=:添加字符串到版本信息,如加入'-freeoa',在'show status'可以看到'5.1.66-freeoa'的字样;
--with-embedded-server:编译embedded-server;
--with-pthread:强制使用pthread类库;
--with-mysqld-user=:指定mysqld守护进程的用户;
--with-mysqld-ldflags=:静态编译MySQL服务器端;
--with-client-ldflags=:静态编译MySQL客户端;
--with-plugins=PLUGIN,PLUGIN,...:MySQL服务器端支持的组件(默认为空),可选值较多:
 partition:MySQL Partitioning Support;
 daemon_example:This is an example plugin daemon;
 ftexample:Simple full-text parser plugin;
 archive:Archive Storage Engine;
 blackhole:Basic Write-only Read-never tables;
 csv:Stores tables in text CSV format,强制安装;
 example:Example for Storage Engines for developers;
 federated:Connects to tables on remote MySQL servers;
 heap:Volatile memory based tables,强制安装;
 ibmdb2i:IBM DB2 for i Storage Engine;
 innobase:Transactional Tables using InnoDB;
 innodb_plugin:Transactional Tables using InnoDB;
 myisam:Traditional non-transactional MySQL tables,强制安装;
 myisammrg:Merge multiple MySQL tables into one,强制安装;
 ndbcluster:High Availability Clustered tables;
--with-plugin-PLUGIN:强制指定的插件链接至MySQL服务器;
--with-zlib-dir=:向MySQL提供一个自定义的压缩类库地址;
--without-server:仅安装MySQL客户端;
--without-query-cache:不要编译查询缓存;
--without-geometry:不要编译geometry-related部分;
--without-debug:编译为产品版,放弃debugging代码;
--without-ndb-debug:禁用special ndb debug特性;

问题解决:
1、执行Configure时如果报bin/rm: cannot remove `libtoolt¨: No such file or directory错误,可按照下列步骤解决:
1)、确认libtool是否已经安装,如果没有安装的话,则先安装libtool
# rpm -qa | grep libtool
# yum -y install libtool

2)、分别执行以下三条命令:
# autoreconf --force --install
# libtoolize --automake --force
# automake --force --add-missing
再重新编译安装,问题解决!

2、TCMalloc无法加载
修正libunwind在x86_64位操作系统下的编译错误,TCMalloc无法加载的问题。

涉及修改内容:
1)、libunwind的编译参数改为:
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install

2)、增加:
echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
/sbin/ldconfig

3)、修改MySQL加载TCMalloc的语句:

export LD_PRELOAD=/usr/local/lib/libtcmalloc.so

3、初始配置及加入自启动
# /usr/local/mysql/bin/mysql_install_db --user=mysql  #生成mysql系统数据库
# cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf #拷贝配置文件
# cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysqld #把Mysql加入系统启动
# chmod 755 /etc/init.d/mysqld #增加执行权限
# chkconfig mysqld on  #加入开机启动
# vim /etc/rc.d/init.d/mysqld  #编辑
basedir = /usr/local/mysql   #MySQL程序安装路径
datadir = datadir  #MySQl数据库存放目录

vim /etc/profile   #把mysql服务加入系统环境变量:在最后添加下面这一行
export PATH=$PATH:/usr/local/mysql/bin

下面这两行把myslq的库文件链接到系统默认的位置,这样你在编译类似PHP等软件时可以不用指定mysql的库文件地址。
ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql
ln -s /usr/local/mysql/include/mysql /usr/include/mysql

4、缺少bison组件引起的编译错误
make[1]: Leaving directory `/home/hto/sf/db/percona.sources.code/Percona-Server-5.1.66-rel14.1/vio'
Making all in sql
make[1]: Entering directory `/home/hto/sf/db/percona.sources.code/Percona-Server-5.1.66-rel14.1/sql'
d --verbose sql_yacc.yy
make[1]: d:命令未找到
make[1]: [sql_yacc.cc] 错误 127 (忽略)
...
sed '/^#/ s|y\.tab\.c|sql_yacc.cc|' y.tab.c >sql_yacc.cct && mv sql_yacc.cct sql_yacc.cc
sed:无法读取 y.tab.c:没有那个文件或目录
make[1]: *** [sql_yacc.cc] 错误 2
make[1]: Leaving directory `/home/hto/sf/db/percona.sources.code/Percona-Server-5.1.66-rel14.1/sql'
make: *** [all-recursive] 错误 1

# yum install bison

安装好后一定要'make clean'后重头再来,不然是不能通过编译的。


--------------------------------------------------------------------
二、MySQL 5.5 plus


MySQL 5.5版本以后,使用CMake编译工具。新的MySQL开始支持用jemalloc这个内存分配管理库来替代上文的谷歌的TCMalloc,开始编译前有必要添加一个相关用户:
useradd -d /home/mysql -g daemon -m -r -s /bin/bash -u 3306 mysql

安装相关的依赖包
[debian]
libncurses5-dev libreadline-dev byacc libbison-dev libboost-dev

如果缺少编译工具的话,安装基本开发包:build-essentials

[rhel]
yum install -y cmake ncurses-devel gmock-devel bison-devel readline-devel

apt-get install libaio-dev libnuma-dev
170312 16:42:11 mysqld_safe Adding '/home/percona56/lib/mysql/libjemalloc.so.1' to LD_PRELOAD for mysqld

5.4及以上使用的是cmake编译工具了,如果全部打成二进制包,可参考如下:MariaDB starting with 5.5 If the binaries are already built, you can generate a binary tarball with make package.

在用cmake配置mysql过程中找到一些主要的参数说明如下,供参考:

CMAKE_INSTALL_PREFIX mysql的安装路径
DEFAULT_CHARSET 默认的服务器编码
DEFAULT_COLLATION 也是关于编码的
MYSQL_DATADIR data目录
MYSQL_TCP_PORT TCP/IP端口,3306
MYSQL_UNIX_ADDR unix的socket文件,默认/tmp/mysql.sock
WITH_xxx_STORAGE_ENGINE 编译静态的存储引擎xxx
WITHOUT_xxx_STORAGE_ENGINE Exclude storage engine xxx from build
WITH_EXTRA_CHARSETS 扩展字符集
WIHT_ZLIB zlib支持

常用的选项有下边这些:

#安装目录
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DCMAKE_INSTALL_PREFIX=dir_name
该选项指定了mysql的安装目录,除了在编译时指定此值,我们也可月使用--basedir在mysql启动时设置基准目录。在编译时,INSTALL_XXX格式的选项是相对于PREFIX的相对路径,这是需要注意的一点。
#数据库存放目录
-DMYSQL_DATADIR=/usr/local/mysql/data
#系统配置目录
-DSYSCONFDIR=/etc
#Unix socket 文件路径
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock
#安装 myisam 存储引擎
-DWITH_MYISAM_STORAGE_ENGINE=1
#安装 innodb 存储引擎
-DWITH_INNOBASE_STORAGE_ENGINE=1
#安装 archive 存储引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1
#安装 blackhole 存储引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
#安装数据库分区
-DWITH_PARTITION_STORAGE_ENGINE=1
#允许从本地导入数据
-DENABLED_LOCAL_INFILE=1
#shell快捷键功能
-DWITH_READLINE=1
#支持 SSL
-DWITH_SSL=yes
#使用 utf8 字符
-DDEFAULT_CHARSET=utf8
#校验字符
-DDEFAULT_COLLATION=utf8_general_ci
#安装所有扩展字符集
-DEXTRA_CHARSETS=all
#MySQL 监听端口
-DMYSQL_TCP_PORT=3306
-DCMAKE_EXE_LINKER_FLAGS='-ljemalloc'#这个是之前安装过的 jemalloc 优化内存

1.命令语法:

MariaDB 编译源码所需的工具和库
yum -y install gcc gcc-c++ cmake bison perl ncurses-devel

cmake与configure不同之处:
./configure    cmake .    检查配置选项,生成编译配置文件
./configure --help    cmake . -LH or ccmake .    查看配置选项
make clean    rm -fv CMakeCache.txt    清理此前的编译状态

编译安装 jemalloc
# tar xjf jemalloc-nn.tar.bz2
# cd jemalloc
# LDFLAGS="-L/usr/local/lib -lrt" ./configure
# make -j 2 && make install
# unset LDFLAGS

64位系统用这个
# ln -s /usr/local/lib/libjemalloc.so.2 /usr/lib64/libjemalloc.so.1

运行程序时可能会报找不到库 将jemalloc的库加载到系统中
# echo '/usr/local/lib' >/etc/ld.so.conf.d/local.conf
# ldconfig

编译安装 libevent
重新编译时,需要清除旧的对象文件和缓存信息
# make clean
# rm -fv CMakeCache.txt

在缺少一些组件时,会报出如下一些错误,后面会有一些需要安装对应软件包的汇总。

-- Could NOT find Curses (missing:  CURSES_LIBRARY CURSES_INCLUDE_PATH)
CMake Error at cmake/readline.cmake:65 (MESSAGE):
  Curses library not found.  Please install appropriate package,

remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel.
Call Stack (most recent call first):
  cmake/readline.cmake:173 (FIND_CURSES)
  CMakeLists.txt:329 (MYSQL_CHECK_READLINE)

-- Configuring incomplete, errors occurred!

-- Skip aws_key_management - AWS SDK requires c++11 -capable compiler (minimal supported versions are g++ 4.8, clang 3.3, VS2103)
-- Looking for event.h
-- Looking for event.h - not found
Warning: Bison executable not found in PATH
-- Configuring done
-- Generating done
-- Build files have been written to: /root/sf/mariadb-10.2.8

-- Running cmake version 2.8.12.2
-- MariaDB 10.2.8
-- Packaging as: mariadb-10.2.8-Linux-x86_64
-- checking for one of the modules 'libsystemd;libsystemd-daemon'
== Configuring MariaDB Connector/C
-- Could NOT find CURL (missing:  CURL_LIBRARY CURL_INCLUDE_DIR)
SYSTEM processor: x86_64
-- Could NOT find LibXml2 (missing:  LIBXML2_LIBRARIES LIBXML2_INCLUDE_DIR)
Warning: Bison executable not found in PATH
-- Configuring done
-- Generating done

可能要安装的开发组件包:
libevent-devel bison-devel bison lz4-devel xz-devel libcurl-devel libcurl curl libxml2-devel libxml2 ncurses-devel

2.安装选项

CMAKE_INSTALL_PREFIX值是安装的基本目录,其他cmake选项值是不包括前缀,是相对路径名,绝对路径包括CMAKE_INSTALL_PREFIX路径。如-DINSTALL_SBINDIR=sbin的绝对路径是/usr/local/mysql/sbin

3.存储引擎选项

mysql存储引擎是插件式的,因此插件控制选项可以指定那个存储引擎安装。

configure编译插件选项--with-plugins=csv,myisam,myisammrg,heap,innobase,

archive,blackhole在cmake中没有直接对应的相同选项。对于csv,myisam,myisammrg,heap在cmake中是不需要明确指定存储引擎的名称,因为它们是强制性安装。

可以使用以下选择来安装innodb,archive,blackhole存储引擎
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_ARCHIVE_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
(1可以使用on代替)

如果既不是-DWITH_<ENGINE>_STORAGE_ENGINE 也不是 -DWITHOUT_<ENGINE>_STORAGE_ENGINE 来指定存储引擎,该存储引擎将安装成共享模块式的。如果不是共享模块式的将排除在外。共享模块安装时必须使用INSTALL PLUGIN语句或--plugin-load才可以使用。

4.其他选项

之前MySQL的编译选项大多数都支持。新旧版本之间的安装选项映射成大写字母,删除选项前面破折号,中间字符间的破折号替换成下划线。如:
--with-debug => WITH_DEBUG=1
--with-embedded-server => WITH_EMBEDDED_SERVER

5.调试配置过程

使用configure编译完将生成config.log和config.status文件。使用cmake编译完在CMakeFiles目录下生成CMakeError.log 和CMakeOutput.log文件。

编译参数参考:
BUILD_CONFIG 采用官方发行版一致的编译参数
CMAKE_BUILD_TYPE 指定产品编译说明信息 RelWithDebInf
CMAKE_INSTALL_PREFIX 指定MySQL安装路径 /usr/local/mysql
CPACK_MONOLITHIC_INSTALL是否建立单个安装包文件 OFF 5.5.7
DEFAULT_CHARSET MYSQL 默认字符集 latin1 5.5.7
DEFAULT_COLLATION MYSQL 默认排序字符集 latin1_swedish_ci5.5.7
ENABLE_DEBUG_SYNC 是否启用同步调试功能 ON 5.5.7
ENABLE_DOWNLOADS 是否下载可选文件 OFF 5.5.7
ENABLE_DTRACE 是否包含 DTrace 支持 5.5.7
ENABLE_GCOV 是否包含 Gcov 支持 5.5.14
ENABLED_LOCAL_INFILE 是否启用本地 LOAD DATA INFILEOFF 5.5.7
ENABLED_PROFILING 是否启用代码查询分析 ON 5.5.7
INSTALL_BINDIR MySQL 主执行文件目录 PREFIX/bin 5.5.7
INSTALL_DOCDIR 文档安装路径 PREFIX/docs 5.5.7
INSTALL_DOCREADMEDIR 自述文件目录 PREFIX 5.5.7
INSTALL_INCLUDEDIR 头文件目录 PREFIX/include 5.5.7
INSTALL_INFODIR 关于信息文件目录 PREFIX/docs 5.5.7
INSTALL_LAYOUT 选择预定义的安装 STANDALONE 5.5.7
INSTALL_LIBDIR 库文件目录 PREFIX/lib 5.5.7
INSTALL_MANDIR 手册页面目录 PREFIX/man 5.5.7
INSTALL_MYSQLSHAREDIR 共享数据目录 PREFIX/share 5.5.7
INSTALL_MYSQLTESTDIR mysql-test 目录 PREFIX/mysql-test 5.5.7
INSTALL_PLUGINDIR 插件目录 PREFIX/lib/plugin5.5.7
INSTALL_SBINDIR 服务器超级用户执行文件目录 PREFIX/bin 5.5.7
INSTALL_SCRIPTDIR 脚本目录 PREFIX/scripts 5.5.7
INSTALL_SHAREDIR aclocal/mysql.m4 安装目录PREFIX/share 5.5.7
INSTALL_SQLBENCHDIR sql-bench 性能测试工具目录PREFIX 5.5.7
INSTALL_SUPPORTFILESDIR 扩展支持文件目录 PREFIX/support-files 5.5.7
MYSQL_DATADIR 数据库存放目录 5.5.7
MYSQL_MAINTAINER_MODE 是否启用MySQL的维护环境 OFF 5.5.7
MYSQL_TCP_PORT TCP/IP 端口号 3306 5.5.7
MYSQL_UNIX_ADDR Unix Socket 套接字文件 /tmp/mysql.sock 5.5.7
SYSCONFDIR 选项配置文件目录 5.5.7
WITH_COMMENT 编译环境发表评论 5.5.7
WITH_DEBUG 是否包括调试支持 OFF 5.5.7
WITH_EMBEDDED_SERVER 是否要建立嵌入式服务器 OFF 5.5.7
WITH_xxx_STORAGE_ENGINE 静态编译xxx 存储引擎到服务器 5.5.7
WITH_EXTRA_CHARSETS 额外的字符集,包括 all 5.5.7
WITH_LIBWRAP 是否包括支持libwrap(TCP包装) OFF 5.5.7
WITH_READLINE 使用捆绑的readline OFF 5.5.7
WITH_SSL 是否支持SSL no 5.5.7
WITH_ZLIB 是否支持Zlib system 5.5.7
WITHOUT_xxx_

安装参数选项
在下表中,"CMAKE_INSTALL_PREFIX"的值表示的是安装根目录,其他参数值的路径都是相对于根目录的,当然你也可以直接使用绝对路径,具体如下:
参数值说明     配置选项     CMak选项
安装根目录     --prefix=/usr     -DCMAKE_INSTALL_PREFIX=/usr
mysqld目录     --libexecdir=/usr/sbin     -DINSTALL_SBINDIR=sbin
数据存储目录     --localstatedir=/var/lib/mysql     -DMYSQL_DATADIR=/var/lib/mysql
配置文件(my.cnf)目录     --sysconfdir=/etc/mysql     -DSYSCONFDIR=/etc/mysql
插件目录     --with-plugindir=/usr/lib64/mysql/plugin     -DINSTALL_PLUGINDIR=lib64/mysql/plugin
手册文件目录     --mandir=/usr/share/man     -DINSTALL_MANDIR=share/man
共享数据目录     --sharedstatedir=/usr/share/mysql     -DINSTALL_SHAREDIR=share
Library库目录     --libdir=/usr/lib64/mysql     -DINSTALL_LIBDIR=lib64/mysql
Header安装目录     --includedir=/usr/include/mysql     -DINSTALL_INCLUDEDIR=include/mysql
信息文档目录     --infodir=/usr/share/info     -DINSTALL_INFODIR=share/info

存储引擎选项
存储引擎是以插件的形式存在的,所以该选项可以控制插件的构建,比如指定使用某个特定的引擎。--with-plugins配置选项接受两种形式的参数值,它没有对应的CMake配置参数:
1、以逗号(,)分隔的引擎名称列表
2、a "group name" value that is shorthand for a set of engines

在CMake中,引擎被作为单个的选项来进行控制,假设有以下配置选项:
--with-plugins=csv,myisam,myisammrg,heap,innobase,archive,blackhole  

上面的参数指定MySQL数据库可以支持哪些数据库引擎,将上述编译选项转换成CMake编译选项时,下面的几个引擎名字可以被省略,因为编译时,默认就支持:
csv myisam myisammrg heap

然后使用下面的编译参数,以启用InnoDB、ARCHIVE和BLACKHOLE引擎支持:
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_ARCHIVE_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1

当然也可以使用“ON”来替代数字1,它们是等效的。如果你想除去对某种引擎的支持,则在CMake编译选项中使用-DWITHOUT_<ENGINE>_STORAGE_ENGINE,例如:
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1
-DWITHOUT_PARTITION_STORAGE_ENGINE=1

库文件加载选项
该选项指明Mysql使用库的情况:
参数值说明     配置选项     CMak选项
readline库     --with-readline     -DWITH_READLINE=1
SSL库     --with-ssl=/usr     -DWITH_SSL=system
zlib库     --with-zlib-dir=/usr     -DWITH_ZLIB=system
libwrap库     --without-libwrap     -DWITH_LIBWRAP=0

其他选项
CMake编译选项支持大部分之前版本的MySQL编译选项,新老编译选项的差别在于:之前的是小写,现在全部变成了大写,之前采用双横线,现在使用单横线,之前使用的破折号,现在取而代之的是使用下划线,例如:
--with-debug => WITH_DEBUG=1
--with-embedded-server => WITH_EMBEDDED_SERVER

下面是编译MySQL的新老参数对照表:
参数值说明     配置选项     CMak选项
TCP/IP端口     --with-tcp-port-=3306     -DMYSQL_TCP_PORT=3306
UNIX socket文件     --with-unix-socket-path=/tmp/mysqld.sock     -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock
启用加载本地数据     --enable-local-infile     -DENABLED_LOCAL_INFILE=1
扩展字符支持     --with-extra-charsets=all(默认:all)     -DEXTRA_CHARSETS=all(默认:all)
默认字符集     --with-charset=utf8     -DDEFAULT_CHARSET=utf8
默认字符校对     --with-collation=utf8_general_ci     -DDEFAULT_COLLATION=utf8_general_ci
Build the server     --with-server     无
嵌入式服务器     --with-embedded-server     -DWITH_EMBEDDED_SERVER=1
libmysqld权限控制     --with-embedded-privilege-control     无
安装文档     --without-docs     无
Big tables支持     --with-big-tables, --without-big-tables     无
mysqld运行用户     --with-mysqld-user=mysql     -DMYSQL_USER=mysql
调试模式     --without-debug(默认禁用)     -DWITH_DEBUG=0(默认禁用)
GIS支持     --with-geometry     无
社区功能     --enable-community-features     无
Profiling     --disable-profiling(默认启用)     -DENABLE_PROFILING=0(默认启用)
pstack     --without-pstack     无(新版移除该功能)
汇编字符串函数     --enable-assembler     无
构建类型     --build=x86_64-pc-linux-gnu     没有等效参数
交叉编译主机     --host=x86_64-pc-linux-gnu     没有等效参数
客户端标志     --with-client-ldflags=-lstdc++     无
线程安全标志     --enable-thread-safe-client     无
注释存储类型     --with-comment='string'     -DWITH_COMMENT='string'
Shared/static binaries     --enable-shared --enable-static     无
内存使用控制     --with-low-memory     无


开始编译

最终选用这个编译参数

安装到/usr/local/mysql目录下:

cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DWITH_LIBWRAP=0 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_CSV_STORAGE_ENGINE=1 \
-DWITH_HEAP_STORAGE_ENGINE=1 \
-DWITH_TOKUDB_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_ROCKSDB_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DENABLED_PROFILING=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DMYSQL_USER=mysql \
-DWITH_READLINE=system \
-DWITH_EMBEDDED_SERVER=0 \
-DWITH_EMBEDDED_SHARED_LIBRARY=0 \
-DWITH_COMMENT='freeoa-sourcompiled-5.6' \
-DCMAKE_EXE_LINKER_FLAGS='-ljemalloc'

安装到/usr目录下,主要是目录相关的配置,不然mysql的各个文件会放置的相当混乱。

cmake \
-DCMAKE_INSTALL_PREFIX=/usr \
-DBUILD_CONFIG=mysql_release \
-DINSTALL_LIBDIR=lib \
-DINSTALL_SBINDIR=sbin \
-DINSTALL_SCRIPTDIR=bin \
-DINSTALL_PLUGINDIR=lib/mysql/plugin \
-DINSTALL_MANDIR=share/man \
-DINSTALL_MYSQLSHAREDIR=share/mysql \
-DINSTALL_SUPPORTFILESDIR=share/mysql \
-DINSTALL_MYSQLTESTDIR=share/mysql/test \
-DINSTALL_SQLBENCHDIR=share/mysql/bench \
-DWITH_LIBWRAP=0 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_CSV_STORAGE_ENGINE=1 \
-DWITH_HEAP_STORAGE_ENGINE=1 \
-DWITH_TOKUDB_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_ROCKSDB_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DENABLED_PROFILING=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DMYSQL_USER=mysql \
-DWITH_READLINE=system \
-DWITH_EMBEDDED_SERVER=0 \
-DWITH_EMBEDDED_SHARED_LIBRARY=0 \
-DWITH_COMMENT='freeoa-sourcompiled-5.6' \
-DCMAKE_EXE_LINKER_FLAGS='-ljemalloc'

相对参照的位置:
-DBUILD_CONFIG=mysql_release \
-DINSTALL_LAYOUT=RPM \
-DCMAKE_INSTALL_PREFIX=/usr \
-DSYSCONFDIR=/etc \

启动对应的实例:
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/mysql/mymd.cnf --nowatch


上面全功能的软件包的安装过程,下面仅安装链接包、开发头文件、插件等,安装服务器功能包的编译指令:
rm -fv CMakeCache.txt
cmake -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DINSTALL_DOCDIR=share/doc/mariadb \
-DINSTALL_MANDIR=share/man \
-DINSTALL_MYSQLSHAREDIR=share/mysql \
-DINSTALL_MYSQLTESTDIR=share/mysql/test \
-DINSTALL_PLUGINDIR=lib/mysql/plugin \
-DINSTALL_SBINDIR=sbin \
-DINSTALL_SCRIPTDIR=bin \
-DINSTALL_SQLBENCHDIR=share/mysql/bench \
-DINSTALL_SUPPORTFILESDIR=share/mysql \
-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock \
-DWITHOUT_SERVER=1 \
-DWITH_EXTRA_CHARSETS=all


编译过程很快,几分钟就能完成make。


安装启动排错


root@htcom:/home/percona# scripts/mysql_install_db --basedir=/home/percona  --datadir=/home/percona/data --user=mysql
Installing MySQL system tables...2017-03-13 12:05:03 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2017-03-13 12:05:03 0 [Note] Ignoring --secure-file-priv value as server is running with --bootstrap.
2017-03-13 12:05:03 0 [Note] /home/percona/bin/mysqld (mysqld 5.6.35-80.0) starting as process 7879 ...
2017-03-13 12:05:03 7879 [ERROR] Can't read from messagefile '/usr/share/mysql/english/errmsg.sys'
...
2017-03-13 12:05:03 7879 [Note] InnoDB: Waiting for purge to start
2017-03-13 12:05:03 7879 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.35-rel80.0 started; log sequence number 1606610
2017-03-13 12:05:03 7879 [ERROR] Aborting

因不能读取'/usr/share/mysql/english/errmsg.sys'的文件出不能完成数据库的初始,有网上文档说在配置文件中强指该文件的路径:
language = /home/percona/share/english/

加入language配置项,由于我是使用二进制分发包进行安装的,而默认的情况下,mysql会到/usr/local/mysql/share/english下查找该文件,但后来发现无效。后将系统的这个文件备份了一下,用二进制包的这个文件将它覆盖后就可以了。

一些配置相关的解析(5.5+)

#慢查询
slow_query_log = 1
long_query_time = 2
log-queries-not-using-indexes
slow_query_log_file = /data/logs/mariadb_logs/mariadb_slow.log
 
log-slow-admin-statements = 1
log-slow-slave-statements = 1
log-bin-trust-function-creators = 1

init-connect = 'SET NAMES utf8mb4'
character-set-server = utf8mb4
symbolic-links = 0
performance_schema = 0
 
#skip-locking
#禁止外网
skip-networking
#禁止域名解析
skip-name-resolve
#skip-grant-tables
#禁止锁定
skip-external-locking
skip_show_database
skip_symbolic_links
 
back_log = 300
max_connections = 1000
max_connect_errors = 6000
open_files_limit = 65535
#表缓存数
table_open_cache = 128

#最大表量
max_heap_table_size = 256M
tmp_table_size = 1G
#根据物理内存设置规则如下:1G=8 ; 2G=16; 3G=32; 3G>= =64
thread_cache_size = 8
#排序缓冲
sort_buffer_size=256M
 
#启动高速缓存
query_cache_type = 1
#查询缓存 很少有相同的查询,最好不要使用查询缓存
query_cache_size = 128M
query_cache_limit = 2M

flush_time = 0
#连续缓冲
join_buffer_size = 16M
 
group_concat_max_len=2048000
table_definition_cache = 1400
 
ft_min_word_len = 4
#预读缓冲
read_buffer_size = 2M
#次缓冲
read_rnd_buffer_size = 64M
query_cache_min_res_unit = 1MB
bulk_insert_buffer_size = 8M
#索引缓冲 比较理想的设置:Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 80%
key_buffer_size=64M
 
default_storage_engine = InnoDB
innodb_file_per_table = 1
innodb_open_files = 500
#参数的配置在物理内存的70%-80%之间
innodb_buffer_pool_size = 64M
#InnoDB 使用后台线程处理数据页上写 I/O(输入)请求的数量
innodb_write_io_threads = 4
#InnoDB 使用后台线程处理数据页上读 I/O(输出)请求的数量
innodb_read_io_threads = 4
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
#日志缓冲池,控制在8M-16M即可
innodb_log_buffer_size = 2M
#InnoDB 日志文件的大小
innodb_log_file_size = 256M
innodb_log_files_in_group = 3
#控制了 Dirty Page 在 Buffer Pool 中所占的比率
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
#缓冲区刷新到磁盘时,刷新脏页数量,ssd磁盘或做了raid后,可将此值设置较大
innodb_io_capacity = 200
innodb_adaptive_flushing = OFF

innodb_autoextend_increment = 64
innodb_buffer_pool_instances = 8
innodb_concurrency_tickets = 5000
innodb_old_blocks_time = 1000
innodb_stats_on_metadata = 0


--------------------------------------------------------------------
MySQL 5.6 使用过程中的排错


问题一

Filling help tables...2017-02-06 15:02:31 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).

解决之法:
从 5.6.6开始,timestamp 的默认行为已经是 deprecated 了。在MySQL 5.6.6之前,TIMESTAMP的默认行为:

•TIMESTAMP列如果没有明确声明NULL属性,默认为NOT NULL。(而其他数据类型,如果没有显示声明为NOT NULL,则允许NULL值。)设置TIMESTAMP的列值为NULL,会自动存储为当前timestamp。
•表中的第一个TIMESTAMP列,如果没有声明NULL属性、DEFAULT或者 ON UPDATE,会自动分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 属性。
•表中第二个TIMESTAMP列,如果没有声明为NULL或者DEFAULT子句,默认自动分配'0000-00-00 00:00:00′。插入行时没有指明改列的值,该列默认分配'0000-00-00 00:00:00′,且没有警告。

要关闭警告,需要加入下面的参数:
[mysqld]
explicit_defaults_for_timestamp=true

重启MySQL后错误消失,这时TIMESTAMP的行为如下:
•TIMESTAMP如果没有显示声明NOT NULL,是允许NULL值的,可以直接设置改列为NULL,而没有默认填充行为。
•TIMESTAMP不会默认分配DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP属性。
•声明为NOT NULL且没有默认子句的TIMESTAMP列是没有默认值的。往数据表中插入列,又没有给TIMESTAMP列赋值时,如果是严格SQL模式,会抛出一 个错误,如果严格SQL模式没有启用,该列会赋值为'0000-00-00 00:00:00′,同时出现一个警告。(这和MySQL处理其他时间类型数据一样,如DATETIME)

也就是 explicit_defaults_for_timestamp 关闭了 timestamp 类型字段锁拥有的一些会让人感到奇怪的默认行为,加入了该参数之后,如果还需要为 timestamp类型的字段指定默认行为,那么就需要显示的在创建表时显示的指定。explicit_defaults_for_timestamp 也就是这个意思:显示指定默认值为timestamp类型的字段。

问题二

2017-02-09 15:09:54 11124 [Warning] 'user' entry 'root@freeoadb' ignored in --skip-name-resolve mode.
2017-02-09 15:09:54 17849 [Warning] 'proxies_priv' entry '@ root@freeoadb' ignored in --skip-name-resolve mode.

解决之法:
启用skip-name-resolve模式时出现Warning的处理办法,skip-name-resolve是禁用dns解析,避免网络DNS解析服务引发访问MYSQL的错误,禁用解析会提高登录速度,不使用skip-name-resolve选项的,这样从其它主机的连接会比较慢,因为mysql会对这个ip做dns反向查询,导致大量的连接处于 login状态。一般应当启用。

启用后,在mysql的授权表中就不能使用主机名了,只能使用IP ,出现此警告是由于mysql 表中已经存在有 localhost.localdomain 帐号信息。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求。

移除本机名(非localhost)和用户名为空的用户:
delete from mysql.user where host='yuqing-db-1' or user='';
delete from mysql.proxies_priv where host='yuqing-db-1';

注意:'localhost'这个要保留着,不然从本地登录(socket)会有问题。可以通过两个参数来disable这个功能,在MYSQL的配置文件中[mysqld]中加入下面的参数:
skip-host-cache
skip-name-resolve

问题三

[Note] Plugin 'FEDERATED' is disabled.

解决之法:
在my.cnf中的mysqld节点下增加一行参数
federated  

然后重启mysql,问题就可以解决。

问题四

2017-02-09 15:09:54 17849 [Warning] Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed!! Please use '--relay-log=mydbslave-relay-bin' to avoid this problem.

解决之法:
这个警告提示本身的意思,作为slave,为防止因为主机名变更导致relay log文件名无效的问题,最好设置'--relay-log=freeoa-relay-bin'。但问题是我这机器根本就没有开启slave模式,而且数据目录下一直有freeoa-relay-bin.000001,relay的出现并且堆积,上网搜索总结一下原因:

  该实例原先是一个Slave--导致relay-log 和 relay-log.index的存在

  该实例目前已经不是Slave--由于没有了IO-Thread,导致relay-log-purge 没有起作用( 这也是其他Slave实例没有这种情况的原因,因为IO-thread会做自动rotate操作)。

  该实例每天会进行日常备份--Flush logs的存在,导致每天会生成一个relay-log

  该实例没有配置expire-logs-days--导致flush logs时,也不会做relay-log清除

简而言之就是: 一个实例如果之前是Slave,而之后停用了(stop slave),且没有配置expire-logs-days的情况下,会出现relay-log堆积的情况。

顺带也和大家分享下MySQL 内部Logrotate(Binary Log rotate)机制:
Rotate:每一条binary log写入完成后,都会判断当前文件是否超过 max_binlog_size,如果超过则自动生成一个binlog file
Delete:expire-logs-days 只在 实例启动时 和 flush logs 时判断,如果文件访问时间早于设定值,则purge file
 
Relay Log rotate 机制:
Rotate:每从Master fetch一个events后,判断当前文件是否超过 max_relay_log_size 如果超过则自动生成一个新的relay-log-file
Delete:purge-relay-log 在SQL Thread每执行完一个events时判断,如果该relay-log 已经不再需要则自动删除

因此建议当slave不再使用时,一定要通过reset slave来取消relaylog,不然即使重启mysql,问题还是一样存在。另外在MySQL5.6中支持将relay-log.info设置为TABLE。

把relay-log.info记录在表里有两个好处:
1、relay.info明文存储不安全,把relay.info中的信息记录在table中相对安全。

2、可以避免relay.info更新不及时,SLAVE 重启后导致的主从复制出错。

执行下述查询,检查relay_log_info_repository,master_info_repository值是否为table,relay_log_recovery 是否开启:
SHOW VARIABLES WHERE variable_name IN ('relay_log_recovery','relay_log_info_repository','master_info_repository');

relay_log_info_repository,master_info_repository值如果为FILE,建议将其修改为TABLE.

修改步骤如下:
1. stop slave;
2. set GLOBAL  relay_log_info_repository='TABLE';
3.在my.cnf中设置
relay_log_info_repository = TABLE
master_info_repository  = TABLE
relay_log_recovery = on
4.重启mysql
5.start slave;
6. 检查relay_log_info_repository是否修改成功。
show variables where variable_name in  ('relay_log_info_repository','master_info_repository');

在relay_log_info_repository,master_info_repository这两个值设置为TABLE后,可以利用如下SQL查询主从同步的信息:
select * from mysql.slave_master_info\G
select * from mysql.slave_relay_log_info\G

问题五

关于卸载上面编译出来的软件指令

由于Makefile中就没有写上'make uninstall'这条指令,所以在执行时会报错且无法执行成功。比如我在安装好mariadb-10.2.8后发现perl的mysql驱动包(DBD::mysql)就无法通过编译,而换成mariadb-10.1.8就没有问题。

不过在软件的根目录下有一个install_manifest.txt文件,其中记录了上次'make install'时安装了哪些文件到系统中,一行一个,那就逐个删除:
for i in $(cat install_manifest.txt);do rm -fv $i;done

--------------------------------------------------------------------
mariadb10.1 启用 tokudb


MariaDB [(none)]> INSTALL PLUGIN tokudb SONAME 'ha_tokudb.so';
ERROR 1123 (HY000): Can't initialize function 'tokudb'; Plugin initialization function failed.

错误日志

2018-04-27 10:14:18 139846134151936 [ERROR] TokuDB is not initialized because jemalloc is older than 2.3.0
2018-04-27 10:14:18 139846134151936 [ERROR] Plugin 'TokuDB' init function returned error.
2018-04-27 10:14:18 139846134151936 [ERROR] Plugin 'TokuDB' registration as a STORAGE ENGINE failed.

我系统中明明是jemalloc-5.0.1的库。执行# /usr/bin/jemalloc-config --version
0.0.0-0-g0000000000000000000000000000000000000000

发现输出居然是这样。发现只有在5.0以上这会这样,4.5版是正常的。那安装4.5的到另一目录下:
$ /usr/local/jemalloc/bin/jemalloc-config --version
4.5.0-0-g04380e79f1e2428bd0ad000bbc6e3d2dfc6b66a5

可以正常输出版本号。

在其配置文件(/etc/my36.cnf)加入内存分配库指向:
[mysqld_safe]
malloc-lib=/usr/local/jemalloc

启动
/opt/mysql36/bin/mysqld_safe --defaults-file=/etc/my36.cnf &

在错误日志中还是有:
180427 11:41:45 mysqld_safe Starting mysqld daemon with databases from /opt/mysql36/data
ERROR: ld.so: object '/usr/local/jemalloc' from LD_PRELOAD cannot be preloaded (cannot read file data): ignored.
ERROR: ld.so: object '/usr/local/jemalloc' from LD_PRELOAD cannot be preloaded (cannot read file data): ignored.
2018-04-27 11:41:45 140268097986304 [Note] /opt/mysql36/bin/mysqld (mysqld 10.1.28-MariaDB) starting as process 28247 ...
2018-04-27 11:41:45 140268097986304 [Note] Using unique option prefix 'myisam_recover' is error-prone and can break in the future. Please use the full name 'myisam-recover-options' instead.

那将配置文件中的预加载改为:/usr/local/jemalloc/lib

同样会报上面的错误。

在终端中强制设定预加载库:
LD_PRELOAD="/usr/local/jemalloc/lib/libjemalloc.so.2"
export LD_PRELOAD

再次启动MySQL并安装tokudb,这次终于正常了:
MariaDB [(none)]> INSTALL PLUGIN tokudb SONAME 'ha_tokudb.so';
Query OK, 0 rows affected (0.32 sec)

可在终端中查询一下:
printenv "LD_PRELOAD"

MariaDB [(none)]> show engines;
| TokuDB             | YES     | Percona TokuDB Storage Engine with Fractal Tree(tm) Technology | YES          | YES  | YES

man 8 ld-linux :

LD_PRELOAD
A whitespace-separated list of additional,  user-specified,  ELF shared  libraries  to  be loaded before all others.  This can be used  to  selectively  override  functions in other shared libraries. For setuid/setgid  ELF binaries, only libraries in the standard search directories that are  also  setgid  will  be loaded.

You could use LD_PRELOAD enviroment variable to preload the jemalloc.so before you run your application, if it runs in a single terminal. Like this:
export LD_PRELOAD=$LD_PRELOAD:/path_of_jemalloc/lib/jemalloc.so.1

For all the applications to be affected by the change you can add a new line in the file /etc/ld.so.preload with the path to your lib.

可在程序开启前执行'jemalloc.sh'脚本,由它来初始一些预加载库,该脚本由jemalloc程序自带,安装好它之后就有的。
jemalloc.sh your-program arguments &

执行jemalloc-config --help可查看该库自身一些环境信息。

将'plugin-load=ha_tokudb'写入配置文件中,这样可以在启动时自动加载。

2018-04-27 13:42:11 140278946056128 [Note] /opt/mysql36/bin/mysqld (mysqld 10.1.28-MariaDB) starting as process 30427 ...
2018-04-27 13:42:11 140278946056128 [ERROR] Plugin 'tokudb' already installed
2018-04-27 13:42:11 140278946056128 [ERROR] TokuDB: Recovery log is missing (persistent environment information is present) while looking for recovery log files in [/opt/tokudir/log]

2018-04-27 13:42:11 140278946056128 [ERROR] TokuDB unknown error 2
2018-04-27 13:42:11 140278946056128 [ERROR] Plugin 'TokuDB' init function returned error.
2018-04-27 13:42:11 140278946056128 [ERROR] Plugin 'TokuDB' registration as a STORAGE ENGINE failed.

看来即使写在配置文件中也未必能解决问题,最重要的是环境变量中要有库的路径和配置参数的正确。

#
# * Tokudb
#
plugin-load=ha_tokudb
tokudb_dir_per_db = 1
tokudb_data_dir = /opt/tokudir/data
tokudb_log_dir = /opt/tokudir/log

如果现已经使用了tkoudb后,再设置上面的几个参数可能导致数据库无法正确启动,目前通过重新对库进行初始后解决。


参考来源

2.9.4 MySQL Source-Configuration Options

官方编译选项可参考此处

TokuDB Introduction


该文章最后由 阿炯 于 2018-09-05 12:00:22 更新,目前是第 3 版。