一、环境介绍

Centos 6.7  2.6.32-573.el6.x86_64 
软件包:percona-server-5.7.18-16.tar.gz
下载地址:https://www.percona.com/downloads/Percona-Server-LATEST/

二、编译安装

1、安装依赖包
#yum install cmake gcc-c++ git ncurses ncurses-devel bison bison-devel readline readline-devel -y
2、下载boost
地址:
下载的版本是boost_1_59_0.tar.gz  至于为什么是这个版本,后面会解释!
创建目录boost
#mkdir /usr/local/boost
#cp boost_1_59_0.tar.gz /usr/local/boost 
注:boost是编译安装percona-server的必备软件包,否则会报错的,后面会解释。
3、开始编译
编译之前创建自定义数据存放目录:
#mkdir -pv /opt/app/mysql5 
然后开始解压--编译--安装
#tar xf percona-server-5.7.18-16.tar.gz
#cd percona-server-5.7.18-16
#cmake ./ -DCMAKE_INSTALL_PREFIX=/opt/app/mysql5 \
         -DDEFAULT_CHARSET=utf8 \
         -DDEFAULT_COLLATION=utf8_general_ci \
         -DWITH_BOOST=/usr/local/boost
cmake过程中可能会出现各种奇葩的报错,根据错误信息解决问题,后面会解释!
如果依赖包都安装上之后,cmake之后,输出的信息(部分)如下
………………
-- Library perconaserverclient depends on OSLIBS -lpthread;/usr/lib64/libz.so;m;rt;dl
-- Check size of long long
-- Check size of long long - done
-- Check size of long
-- Check size of long - done
-- Check size of int
-- Check size of int - done
-- Check if the system is big endian
-- Searching 16 bit integer
-- Using unsigned short
-- Check if the system is big endian - little endian
-- Googletest was not found. gtest-based unit tests will be disabled. You can run cmake . -DENABLE_DOWNLOADS=1 to automatically download and build required components from source.
-- If you are inside a firewall, you may need to use an https proxy: export https_proxy=http://example.com:80
-- Performing Test HAVE_UNUSED_TYPEDEFS
-- Performing Test HAVE_UNUSED_TYPEDEFS - Failed
-- Performing Test HAVE_MISLEADING_INDENTATION
-- Performing Test HAVE_MISLEADING_INDENTATION - Failed
-- Library mysqlserver depends on OSLIBS -lpthread;/usr/lib64/libz.so;m;rt;crypt;dl
-- INSTALL perconaserverclient.pc lib/pkgconfig
-- Skipping deb packaging on unsupported platform .
-- CMAKE_BUILD_TYPE: RelWithDebInfo
-- COMPILE_DEFINITIONS: _GNU_SOURCE;_FILE_OFFSET_BITS=64;HAVE_CONFIG_H;HAVE_LIBEVENT1
-- CMAKE_C_FLAGS:  -Wall -Wextra -Wformat-security -Wvla -Wwrite-strings -Wdeclaration-after-statement
-- CMAKE_CXX_FLAGS:  -Wall -Wextra -Wformat-security -Wvla -Woverloaded-virtual -Wno-unused-parameter
-- CMAKE_C_LINK_FLAGS: 
-- CMAKE_CXX_LINK_FLAGS: 
-- CMAKE_C_FLAGS_RELWITHDEBINFO: -O3 -D_FORTIFY_SOURCE=2 -g -fabi-version=2 -fno-omit-frame-pointer -fno-strict-aliasing -DDBUG_OFF
-- CMAKE_CXX_FLAGS_RELWITHDEBINFO: -O3 -D_FORTIFY_SOURCE=2 -g -fabi-version=2 -fno-omit-frame-pointer -fno-strict-aliasing -DDBUG_OFF
-- Configuring done
-- Generating done
-- Build files have been written to: /root/percona-server-5.7.18-16
#make          #make的时间会很长,耐心等待。
………………
Linking CXX static library libsql_embedded.a
[ 99%] Built target sql_embedded
[ 99%] Generating mysqlserver_depends.c
Scanning dependencies of target mysqlserver
[ 99%] Building C object libmysqld/CMakeFiles/mysqlserver.dir/mysqlserver_depends.c.o
Linking C static library libmysqld.a
/usr/bin/ar: creating /root/percona-server-5.7.18-16/libmysqld/libmysqld.a
[ 99%] Built target mysqlserver
Scanning dependencies of target mysql_client_test_embedded
[ 99%] Building C object libmysqld/examples/CMakeFiles/mysql_client_test_embedded.dir/__/__/testclients/mysql_client_test.c.o
Linking CXX executable mysql_client_test_embedded
[ 99%] Built target mysql_client_test_embedded
Scanning dependencies of target mysql_embedded
[ 99%] Building CXX object libmysqld/examples/CMakeFiles/mysql_embedded.dir/__/__/client/completion_hash.cc.o
[ 99%] Building CXX object libmysqld/examples/CMakeFiles/mysql_embedded.dir/__/__/client/mysql.cc.o
[ 99%] Building CXX object libmysqld/examples/CMakeFiles/mysql_embedded.dir/__/__/client/readline.cc.o
Linking CXX executable mysql_embedded
[ 99%] Built target mysql_embedded
Scanning dependencies of target mysqltest_embedded
[ 99%] Building CXX object libmysqld/examples/CMakeFiles/mysqltest_embedded.dir/__/__/client/mysqltest.cc.o
Linking CXX executable mysqltest_embedded
[ 99%] Built target mysqltest_embedded
Scanning dependencies of target my_safe_process
[100%] Building CXX object mysql-test/lib/My/SafeProcess/CMakeFiles/my_safe_process.dir/safe_process.cc.o
Linking CXX executable my_safe_process
[100%] Built target my_safe_process
#make install      #这一步也需要一些时间,不过比make 快
………………
-- Installing: /opt/app/mysql5/mysql-test/./extra/binlog_tests/database.test
-- Installing: /opt/app/mysql5/mysql-test/./extra/binlog_tests/binlog_mysqlbinlog_fill.inc
-- Installing: /opt/app/mysql5/mysql-test/./extra/binlog_tests/binlog_row_kill_create_select.test
-- Installing: /opt/app/mysql5/mysql-test/./extra/binlog_tests/enforce_gtid_consistency_trx_nontrx_consistent.test
-- Installing: /opt/app/mysql5/mysql-test/./extra/binlog_tests/tmp_table.test
-- Installing: /opt/app/mysql5/mysql-test/./extra/binlog_tests/binlog_mysqlbinlog_start_stop.inc
-- Installing: /opt/app/mysql5/mysql-test/./Makefile
-- Installing: /opt/app/mysql5/mysql-test/./asan.supp
-- Installing: /opt/app/mysql5/mysql-test/./mtr
-- Up-to-date: /opt/app/mysql5/mysql-test/mtr
-- Up-to-date: /opt/app/mysql5/mysql-test/mysql-test-run
-- Installing: /opt/app/mysql5/mysql-test/lib/My/SafeProcess/my_safe_process
-- Up-to-date: /opt/app/mysql5/mysql-test/lib/My/SafeProcess/my_safe_process
-- Installing: /opt/app/mysql5/mysql-test/lib/My/SafeProcess/Base.pm
-- Installing: /opt/app/mysql5/support-files/mysqld_multi.server
-- Installing: /opt/app/mysql5/support-files/mysql-log-rotate
-- Installing: /opt/app/mysql5/support-files/magic
-- Installing: /opt/app/mysql5/share/aclocal/mysql.m4
-- Installing: /opt/app/mysql5/support-files/mysql.server
到这里percona-server就编译安装好了,接下来开始配置。

三、配置并启动

1、创建mysql用户以及datadir等目录
#useradd -u2001 -d /dev/null -s /sbin/nologin -M mysql
#mkdir /opt/logs/mysql5 -p && chown mysql.mysql /opt/logs/mysql5 -R
#mkdir -p /opt/app/mysql5/{etc,logs,var,varinnodb,tmp} 
#chown mysql.mysql /opt/app/mysql5 -R
2、初始化数据库
注意:percona-server-server 5.7已经不能使用mysql_install_db 来初始化,否则会报错!!!
#cd /opt/app/mysql5/
#./bin/mysqld --initialize --basedir=/opt/app/mysql5/ --datadir=/opt/app/mysql5/var --user=mysql
注意:如果不希望初始化后自动生成一个临时密码,可以使用--initialize-insecure 来初始化,然后自己设置密码
3、配置my.cnf配置文件
[client]
port            = 3306
socket          = /opt/app/mysql5/var/mysql.sock
default-character-set   = utf8

[mysqld]
port            = 3306
socket          = /opt/app/mysql5/var/mysql.sock
datadir = /opt/app/mysql5/var
key_buffer_size = 512M
max_allowed_packet = 32M
table_open_cache = 512
#sort_buffer_size = 4M
sort_buffer_size = 64M
net_buffer_length = 1M
read_buffer_size = 16M
read_rnd_buffer_size = 16M
myisam_sort_buffer_size = 64M
max_connections = 1024
max_connect_errors = 1024
old_passwords = 0
query_cache_type = 1
server-id = 89
skip-external-locking
skip-name-resolve
pid-file = /opt/app/mysql5/var/mysql.pid
tmpdir = /opt/app/mysql5/tmp
max_heap_table_size = 512M
tmp_table_size = 512M
interactive_timeout = 30
wait_timeout = 30
character-set-server = utf8

# log
#general_log = 1
#general_log_file = /opt/app/mysql5/logs/query.log
log-error = /opt/app/mysql5/logs/error.log
expire_logs_days = 7

# slow query
slow_query_log = 1
#slow_query_log_file = /opt/app/mysql5/logs/mysql-slow.log
slow_query_log_file = /opt/logs/mysql5/mysql-slow.log
long_query_time = 3

#################### master ####################
log-bin = /opt/app/mysql5/logs/bin-log
max_binlog_size = 1G
binlog_format = mixed
#################### end ######################

#################### slave #####################
#log-slave-updates = 1
#skip-slave-start = 1
#read-only = 1
#master-host = 192.168.1.1
#master-port = 3306
#master-user = dbslave
#master-password = ruichuang@dbslave
#master-connect-retry = 30

#replicate_do_db = mysql

#relay-log = /opt/app/mysql5/logs/relay-log
#max_relay_log_size = 1G
#################### end ######################

# Uncomment the following if you are using InnoDB tables
innodb_data_home_dir = /opt/app/mysql5/varinnodb
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /opt/app/mysql5/varinnodb
innodb_buffer_pool_size = 4G
#innodb_additional_mem_pool_size = 512M
innodb_log_file_size = 1G
innodb_log_buffer_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_lock_wait_timeout = 50

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
prompt = "\\u@\\h: \\d \\R:\\m:\\s>"
no-auto-rehash 

[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout
4、启动数据库
#/opt/app/mysql5/support-files/mysql.server start
Starting MySQL (Percona Server).2017-09-28T05:43:09.499023Z mysqld_safe error: log-error set to '/opt/app/mysql5/logs/error.log', however file don't exists. Create writable for user 'mysql'.
 ERROR! The server quit without updating PID file (/opt/app/mysql5/var/mysql.pid).
注意:mysql 5.7编译安装后,启动MySQL 要先创建error.log文件,再启动,否则就会报上面的错误。
#touch /opt/app/mysql5/logs/error.log
#chown mysql.mysql /opt/app/mysql5/logs/error.log
然后重新启动
#/opt/app/mysql5/support-files/mysql.server start
Starting MySQL (Percona Server)........ SUCCESS! 
注意:如果之前在服务器安装过mysql,有/etc/my.cnf文件,一定要删除!!!

5、连接mysql
在初始化数据库过程中,就会在/opt/app/mysql5/logs/error.log中打日志,并生成一个临时的密码
#cat error.log| grep "temporary password"
2017-09-28T06:13:26.805216Z 1 [Note] A temporary password is generated for root@localhost: vit?&BHae3k?
但是使用这个密码进入mysql之后,不能进行其他操作,需要修改密码,而且密码要足够复杂: 大小写
字符、数字、特殊字符等
#/opt/app/mysql5/bin/mysqladmin -uroot -p  password 'xxxxx'
Enter password:       #输入error.log中查到的临时密码
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.

密码修改成功,就可以使用新设置的密码连接MySQL了。

四、编译过程中遇到的问题

1、第1个问题: boost的问题
解压之后开始编译,如下参数
#cmake ./ -DCMAKE_INSTALL_PREFIX=/opt/app/mysql5 \
>          -DDEFAULT_CHARSET=utf8 \
>          -DDEFAULT_COLLATION=utf8_general_ci
-- Running cmake version 2.8.12.2
-- Could NOT find Git (missing:  GIT_EXECUTABLE) 
-- Configuring with MAX_INDEXES = 64U
-- The C compiler identification is GNU 4.4.7
-- The CXX compiler identification is GNU 4.4.7
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- CMAKE_GENERATOR: Unix Makefiles
-- Looking for SHM_HUGETLB
-- Looking for SHM_HUGETLB - found
-- Looking for sys/types.h
-- Looking for sys/types.h - found
-- Looking for stdint.h
-- Looking for stdint.h - found
-- Looking for stddef.h
-- Looking for stddef.h - found
-- Check size of void *
-- Check size of void * - done
-- SIZEOF_VOIDP 8
-- Performing Test HAVE_C_SHIFT_OR_OPTIMIZATION_BUG
-- Performing Test HAVE_C_SHIFT_OR_OPTIMIZATION_BUG - Failed
-- Performing Test HAVE_CXX_SHIFT_OR_OPTIMIZATION_BUG
-- Performing Test HAVE_CXX_SHIFT_OR_OPTIMIZATION_BUG - Failed
-- Performing Test HAVE_C_FLOATING_POINT_FUSED_MADD
-- Performing Test HAVE_C_FLOATING_POINT_FUSED_MADD - Failed
-- Performing Test HAVE_CXX_FLOATING_POINT_FUSED_MADD
-- Performing Test HAVE_CXX_FLOATING_POINT_FUSED_MADD - Failed
-- Performing Test HAVE_C_FP_CONTRACT_FLAG
-- Performing Test HAVE_C_FP_CONTRACT_FLAG - Failed
-- Performing Test HAVE_CXX_FP_CONTRACT_FLAG
-- Performing Test HAVE_CXX_FP_CONTRACT_FLAG - Failed
-- MySQL 5.7.18-16
-- Packaging as: percona-server-5.7.18-16-Linux-x86_64
-- Looked for boost/version.hpp in  and 
-- BOOST_INCLUDE_DIR BOOST_INCLUDE_DIR-NOTFOUND
-- LOCAL_BOOST_DIR 
-- LOCAL_BOOST_ZIP 
-- Could not find (the correct version of) boost.
-- MySQL currently requires boost_1_59_0

CMake Error at cmake/boost.cmake:81 (MESSAGE):
  You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BOOST=<directory>

  This CMake script will look for boost in <directory>.  If it is not there,
  it will download and unpack it (in that directory) for you.

  If you are inside a firewall, you may need to use an http proxy:

  export http_proxy=http://example.com:80

Call Stack (most recent call first):
  cmake/boost.cmake:238 (COULD_NOT_FIND_BOOST)
  CMakeLists.txt:465 (INCLUDE)

-- Configuring incomplete, errors occurred!
See also "/root/percona-server-5.7.18-16/CMakeFiles/CMakeOutput.log".
See also "/root/percona-server-5.7.18-16/CMakeFiles/CMakeError.log".

于是google、百度去搜索解决办法,发现需要安装boost,其实上面的信息已经告诉我们了!于是下载
下载地址:http://www.boost.org/users/history/ 我开始下载使用的是1.65.0的版本,地址:
https://dl.bintray.com/boostorg/release/1.65.0/source/
然后解压安装:
#tar xf boost_1_65_0.tar.gz
#mv boost_1_65_0 /usr/local/boost
#cd  /usr/local/boost
# ./bootstrap.sh 
Building Boost.Build engine with toolset gcc... tools/build/src/engine/bin.linuxx86_64/b2
Detecting Python version... 2.6
Detecting Python root... /usr
Unicode/ICU support for Boost.Regex?... not found.
Generating Boost.Build configuration in project-config.jam...

Bootstrapping is done. To build, run:

    ./b2
    
To adjust configuration, edit 'project-config.jam'.
Further information:

   - Command line help:
     ./b2 --help
     
   - Getting started guide: 
     http://www.boost.org/more/getting_started/unix-variants.html
     
   - Boost.Build documentation:
     http://www.boost.org/build/doc/html/index.html
然后继续执行:
#./b2     #需要很长一些时间

………………
common.mkdir bin.v2/libs/wave/build/gcc-4.4.7/release/threading-multi/cpplexer/re2clex
gcc.compile.c++ bin.v2/libs/wave/build/gcc-4.4.7/release/threading-multi/cpplexer/re2clex/aq.o
gcc.compile.c++ bin.v2/libs/wave/build/gcc-4.4.7/release/threading-multi/cpplexer/re2clex/cpp_re.o
gcc.link.dll bin.v2/libs/wave/build/gcc-4.4.7/release/threading-multi/libboost_wave.so.1.65.0
common.copy stage/lib/libboost_wave.so.1.65.0
ln-UNIX stage/lib/libboost_wave.so
...failed updating 54 targets...
...skipped 6 targets...
...updated 1107 targets...

当完成到这一步就证明已经完成了boost_1_65_0的安装,然后继续重新编译,添加了1个参数,如下:
# cmake ./ -DCMAKE_INSTALL_PREFIX=/opt/app/mysql5 \
>          -DDEFAULT_CHARSET=utf8 \
>          -DDEFAULT_COLLATION=utf8_general_ci \
>          -DWITH_BOOST=/usr/local/boost
-- Running cmake version 2.8.12.2
-- Configuring with MAX_INDEXES = 64U
-- CMAKE_GENERATOR: Unix Makefiles
-- SIZEOF_VOIDP 8
-- MySQL 5.7.18-16
-- Packaging as: percona-server-5.7.18-16-Linux-x86_64
-- Local boost dir /usr/local/boost
-- Found /usr/local/boost/boost/version.hpp 
-- BOOST_VERSION_NUMBER is #define BOOST_VERSION 106500
CMake Warning at cmake/boost.cmake:266 (MESSAGE):
  Boost minor version found is 65 we need 59
Call Stack (most recent call first):
  CMakeLists.txt:465 (INCLUDE)

-- BOOST_INCLUDE_DIR /usr/local/boost
-- LOCAL_BOOST_DIR /usr/local/boost
-- LOCAL_BOOST_ZIP LOCAL_BOOST_ZIP-NOTFOUND
-- Could not find (the correct version of) boost.
-- MySQL currently requires boost_1_59_0

CMake Error at cmake/boost.cmake:81 (MESSAGE):
  You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BOOST=<directory>

  This CMake script will look for boost in <directory>.  If it is not there,
  it will download and unpack it (in that directory) for you.

  If you are inside a firewall, you may need to use an http proxy:

  export http_proxy=http://example.com:80

Call Stack (most recent call first):
  cmake/boost.cmake:269 (COULD_NOT_FIND_BOOST)
  CMakeLists.txt:465 (INCLUDE)


-- Configuring incomplete, errors occurred!
See also "/root/percona-server-5.7.18-16/CMakeFiles/CMakeOutput.log".
See also "/root/percona-server-5.7.18-16/CMakeFiles/CMakeError.log".

但是依然继续报错……在网上又找到了另外一个解决方法于是按照此方法操作
删除boost目录下的所有文件:
#rm -rf /usr/local/boost/*

再添加1个编译参数,重新cmake,如下:
#cmake ./ -DCMAKE_INSTALL_PREFIX=/opt/app/mysql5 \
         -DDEFAULT_CHARSET=utf8 \
         -DDEFAULT_COLLATION=utf8_general_ci \
         -DDOWNLOAD_BOOST=1 \
         -DWITH_BOOST=/usr/local/boost
会输出如下信息:
-- Running cmake version 2.8.12.2
-- Configuring with MAX_INDEXES = 64U
-- CMAKE_GENERATOR: Unix Makefiles
-- SIZEOF_VOIDP 8
-- MySQL 5.7.18-16
-- Packaging as: percona-server-5.7.18-16-Linux-x86_64
-- Downloading boost_1_59_0.tar.gz to /usr/local/boost
可以看到在自己下载boost_1_59_0.tar.gz,这就是为什么开始的时候我选在下载1_59版本的原因!!!
但是会卡在这里,于是停止编译,自己在官网下载boost_1_59_0.tar.gz 放在/usr/local/boost目录

2、cmake 过程中的软件包依赖问题

然后删除percona-server-5.7.18-16目录,重新解压编译
#cmake ./ -DCMAKE_INSTALL_PREFIX=/opt/app/mysql5 \
>          -DDEFAULT_CHARSET=utf8 \
>          -DDEFAULT_COLLATION=utf8_general_ci \
>          -DWITH_BOOST=/usr/local/boost
-- Running cmake version 2.8.12.2
-- Configuring with MAX_INDEXES = 64U
-- CMAKE_GENERATOR: Unix Makefiles
-- SIZEOF_VOIDP 8
-- MySQL 5.7.18-16
-- Packaging as: percona-server-5.7.18-16-Linux-x86_64
-- Local boost zip /usr/local/boost/boost_1_59_0.tar.gz
-- cd /usr/local/boost; tar xfz /usr/local/boost/boost_1_59_0.tar.gz
……

-- Check size of wint_t - done
-- Could NOT find Curses (missing:  CURSES_LIBRARY CURSES_INCLUDE_PATH) 
CMake Error at cmake/readline.cmake:66 (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:190 (FIND_CURSES)
  cmake/readline.cmake:264 (FIND_SYSTEM_READLINE)
  CMakeLists.txt:493 (MYSQL_CHECK_EDITLINE)


-- Configuring incomplete, errors occurred!
See also "/root/percona-server-5.7.18-16/CMakeFiles/CMakeOutput.log".
See also "/root/percona-server-5.7.18-16/CMakeFiles/CMakeError.log".
结果又报了上面提示的错误,意思是找不到CURSES_LIBRARY,
解决方法:
#rm -f CMakeCache.txt
安装依赖包:
#yum install ncurses  ncurses-devel readline readline-devel -y
注意:所以上面第二步,才提到在cmake的时候会遇到各种奇葩问题,其实是很多依赖包没有安装,安装
之后,重新cmake就ok了。

mysql官方×××地址:https://downloads.mysql.com/archives/community/

不足之处,请多多指出!