mysql5.x编译选项参考


一、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的语句:
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
二、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
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 版。