开发人员学Linux(6):CentOS7编译安装MySQL5.17.8多实例及主从复制

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

1.前言
上一篇讲述了如何在CentOS7下编译安装Nginx-1.12.0并如何配置反向代理,本篇将讲述如何编译安装MySQL5.7.18并配置多实例。
2.准备
2.1下载MySQL5.7.18源码
注意最新版本的MySQL需要Boost才能编译安装,在MySQL提供的下载中有不带boost的源码,还有带boost的源码,如果下载不带boost的源码还需要再去下载boost源码,为省事起见,建议下载带boost的源码,下载地址:https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-boost-5.7.18.tar.gz (可直接使用wget下载)
注:可以打开网页来下载,网页地址为:https://dev.mysql.com/downloads/mysql/,当前最新版本为5.7.18,在“Select Operating System:”处选择“Source Code”,然后在图中选择“Generic Linux (Architecture Independent), Compressed TAR Archive Includes Boost Headers 5.7.18 58.8M (mysql-boost-5.7.18.tar.gz)”,如下图所示:

wKiom1k9VIrCGCVTAAIJkrL6OUE334.png-wh_50

wKiom1k9VIyz_Sh0AAH6-nz1kjk478.png-wh_50
 
2.2安装epel
EPEL的全称叫 Extra Packages for Enterprise linux 。EPEL是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL之后,就相当于添加了一个第三方源。
在编译MySQL过程中需要一些依赖插件,安装epel后可直接通过yum install 来安装。
执行命令:

1
yum  install  epel-release –y

2.3安装cmake
不同于nginx使用make来编译和安装,MySQL使用CMake来编译和安装,安装命令:

1
yum  install  cmake –y


为将来方便还可以把相关的也一并安装了:

1
yum  install  autoconf automake libtool


2.4安装可能依赖库

1
2
3
4
5
yum  install  -y krb5 krb5-devel libidn libidn-devel openssl openssl-devel -y
yum  install  libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devdel -y
yum  install  zlib zlib-devel glibc glibc-devel glib2 glib2-devel  bzip2  bzip2 -devel -y
yum  install  ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel -y
yum  install  perl-Data_dumper python-devel -y

3.编译及安装
3.1解压文件
假定mysql-boost-5.7.18.tar.gz文件位于/root/目录下(不管是通过wget直接下载的还是通过下载工具上传的),首先解压文件:

1
2
tar  zxvf  /root/mysql-boost-5 .7.18. tar .gz
cd  /root/mysql-5 .7.18

3.2配置、编译及安装
首先进行参数配置,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cmake \
-DWITH_BOOST=boost \
-DCMAKE_INSTALL_PREFIX= /usr/local/mysql-5 .7.18 \
-DMYSQL_DATADIR= /usr/local/mysql-5 .7.18 /data  \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \
-DMYSQL_USER=mysql \
-DWITH_ZLIB=bundled \
-DWITH_READLINE=1 \
-DWITH_FAST_MUTEXES=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DWITH_DEBUG=0 \
-DWITH_SSL=system

这里要说明几点:
(1)当命令或参数过长时,为了便于直观显示,可以在其后加上”\”,当然”\”与正常命令之间需要有空格;
(2) -DWITH_BOOST=boost 指定boost类库的位置;
(3) -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.18 指定安装位置;
在上述配置过程中可能会有出错信息,根据出错信息调整响应参数或者安装缺失的类库,直到提示可以安装为止。
然后执行make进行编译,编译过程中没有错误的再执行make install安装,由于源代码体积有点大,编译耗费的时间比较长,在本人2G内存、4核的虚拟机上编译时间超过半小时以上。
安装成功之后,在/usr/local/mysql-5.7.18下就是安装后的文件目录。

4.数据库初始化
4.1创建my.cnf文件
my.cnf文件是MySQL的配置文件,在MySQL启动过程中会读取里面的配置信息。
在本篇中不满足于单实例的配置,本篇将利用3306和3307两个端口创建两个实例。
首先创建文件夹:

1
2
mkdir  –p  /usr/local/mysql-5 .7.18 /data/3306/data
mkdir  –p  /usr/local/mysql-5 .7.18 /data/3307/data

/usr/local/mysql-5.7.18/data/3306文件夹用于存放监听3306端口实例的相关配置信息、执行脚本和数据,/usr/local/mysql-5.7.18/data/3307文件夹用于存放监听3307端口实例的相关配置信息、执行脚本和数据。
因为mysql数据库将以nginx这个用户来运行,因此首先需要创建这个账户:

1
useradd  mysql -s  /sbin/nologin  –M


分别在/usr/local/mysql-5.7.18/data/3306和/usr/local/mysql-5.7.18/data/3307创建my.cnf文件,可以使用vim创建并粘贴内容。
/usr/local/mysql-5.7.18/data/3306/my.cnf的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
[client]
port        = 3306
socket        =  /usr/local/mysql-5 .7.18 /data/3306/mysql .sock
[mysqld_safe]
log-error        =  /usr/local/mysql-5 .7.18 /data/3306/mysql .err
pid- file         /usr/local/mysql-5 .7.18 /data/3306/mysql .pid
[mysqld]
#
# * Basic Settings
#
server- id    = 1
log-bin=  /usr/local/mysql-5 .7.18 /data/3306/mysql-bin
user        = mysql
pid- file     /usr/local/mysql-5 .7.18 /data/3306/mysql .pid
socket        =  /usr/local/mysql-5 .7.18 /data/3306/mysql .sock
port        = 3306
basedir        =  /usr/local/mysql-5 .7.18
datadir        =  /usr/local/mysql-5 .7.18 /data/3306/data
tmpdir        =  /tmp
open_files_limit=1024
external-locking =  false
character- set -server=utf8
default-storage-engine=MyISAM
bind-address        = 0.0.0.0
max_allowed_packet    = 8M
thread_stack        = 192K
thread_cache_size       = 8
max_connections        = 800
max_connect_errors    = 300
#table_cache            = 64
#thread_concurrency     = 10
query_cache_limit    = 1M
query_cache_size        = 2M
join_buffer_size=1M
sort_buffer_size=1M
long_query_time = 1
relay-log =  /usr/local/mysql-5 .7.18 /data/3306/relay-bin
relay-log-info- file  = /usr/local/mysql-5 .7.18 /data/3306/relay-log .info
binlog_cache_size = 1M
max_binlog_cache_size = 1M
max_binlog_size = 2M
key_buffer_size=16M
read_buffer_size = 1M
read_rnd_buffer_size = 1M
bulk_insert_buffer_size = 1M
lower_case_table_names = 1
skip-name-resolve
slave-skip-errors =1032,1062
replicate-ignore-db = mysql
#innodb_additional_mem_pool_size = 4M
innodb_buffer_pool_size = 32M
innodb_data_file_path = ibdata1:12M:autoextend
#innodb_file_io_threads = 4
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 4M
#innodb_log_files_in_groups = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = 0
[mysqldump]
quick
quote-names
max_allowed_packet    = 16M

/usr/local/mysql-5.7.18/data/3307/my.cnf的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
[client]
port        = 3307
socket        =  /usr/local/mysql-5 .7.18 /data/3307/mysql .sock
[mysqld_safe]
log-error        =  /usr/local/mysql-5 .7.18 /data/3307/mysql .err
pid- file         /usr/local/mysql-5 .7.18 /data/3307/mysql .pid
[mysqld]
#
# * Basic Settings
#
server- id    = 2
user        = mysql
pid- file     /usr/local/mysql-5 .7.18 /data/3307/mysql .pid
socket        =  /usr/local/mysql-5 .7.18 /data/3307/mysql .sock
port        = 3307
basedir        =  /usr/local/mysql-5 .7.18
datadir        =  /usr/local/mysql-5 .7.18 /data/3307/data
tmpdir        =  /tmp
open_files_limit=1024
external-locking =  false
character- set -server=utf8
default-storage-engine=MyISAM
bind-address        = 0.0.0.0
max_allowed_packet    = 8M
thread_stack        = 192K
thread_cache_size       = 8
max_connections        = 800
max_connect_errors    = 300
#table_cache            = 64
#thread_concurrency     = 10
query_cache_limit    = 1M
query_cache_size        = 2M
join_buffer_size=1M
sort_buffer_size=1M
long_query_time = 1
relay-log =  /usr/local/mysql-5 .7.18 /data/3307/relay-bin
relay-log-info- file  = /usr/local/mysql-5 .7.18 /data/3307/relay-log .info
binlog_cache_size = 1M
max_binlog_cache_size = 1M
max_binlog_size = 2M
key_buffer_size=16M
read_buffer_size = 1M
read_rnd_buffer_size = 1M
bulk_insert_buffer_size = 1M
lower_case_table_names = 1
skip-name-resolve
slave-skip-errors =1032,1062
replicate-ignore-db = mysql
#innodb_additional_mem_pool_size = 4M
innodb_buffer_pool_size = 32M
innodb_data_file_path = ibdata1:12M:autoextend
#innodb_file_io_threads = 4
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 4M
#innodb_log_files_in_groups = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = 0
[mysqldump]
quick
quote-names
max_allowed_packet    = 16M

注:在3306及3307配置中都提到了mysql.err这个文件,这个文件是用来记录MySQL启动过程的错误信息的,不过悲催的是如果这个文件不存在,那么是会启动出错的,可又没有地方可以查看错误,因此需要提前创建好文件并设置权限。

1
2
3
4
touch  /usr/local/mysql-5 .7.18 /data/3306/mysql .err
touch  /usr/local/mysql-5 .7.18 /data/3307/mysql .err
chmod  766  /usr/local/mysql-5 .7.18 /data/3306/mysql .err
chmod  766  /usr/local/mysql-5 .7.18 /data/3307/mysql .err

注:如果嫌每次输入完整的文件路径麻烦可以切换到程序的安装目录,甚至还可以创建软链接,所谓的软链接有点类似于Windows下的快捷方式,如ln –s /usr/local/mysql-5.7.18 /usr/local/mysql就是创建了mysql-5.7.18的软链接,甚至如果你喜欢,还可以在用户根目录下创建软链接,如:ln –s /usr/local/mysql-5.7.18 /root /mysql。
通过命令查看,如下图所示是在SSH客户端中的效果:
wKiom1k9VU-A87sxAAB4fOhGxo0207.png-wh_50 
上面mysql,nginx及tomcat都是创建的软链接(文件属性的第一个字符是”l”表明是软链接),其对应的真实路径分别为当前路径下的mysql-5.7.18、nginx-1.12.0及apache-tomcat-8.5.15目录。
4.2创建MySQL的启动文件
分别在/usr/local/mysql-5.7.18/data/3306和/usr/local/mysql-5.7.18/data/3307创建mysql文件。可用vim来创建文件,这个文件是用来启动MySQL实例的,所以在创建完成不要忘记chmod 755设置。
/usr/local/mysql-5.7.18/data/3306/mysql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/sh
port=3306
mysql_user= "root"
mysql_pwd= "mypassword"
cmd_path= "/usr/local/mysql-5.7.18/bin"
mysql_sock= "/usr/local/mysql-5.7.18/data/${port}/mysql.sock"
#startup function
function_start_mysql()
{
     if  [ ! -e  "$mysql_sock"  ]; then
       printf  "Starting MySQL...\n"
       /bin/sh  ${cmd_path} /mysqld_safe  --defaults- file = /usr/local/mysql-5 .7.18 /data/ ${port} /my .cnf 2>&1 >  /dev/null  &
     else
       printf  "MySQL is running...\n"
       exit
     fi
}
#stop function
function_stop_mysql()
{
     if  [ ! -e  "$mysql_sock"  ]; then
        printf  "MySQL is stopped...\n"
        exit
     else
        printf  "Stoping MySQL...\n"
        ${cmd_path} /mysqladmin  -u ${mysql_user} -p${mysql_pwd} -S  /usr/local/mysql-5 .7.18 /data/ ${port} /mysql .sock  shutdown
    fi
}
#restart function
function_restart_mysql()
{
     printf  "Restarting MySQL...\n"
     function_stop_mysql
     sleep  2
     function_start_mysql
}
case  $1  in
start)
     function_start_mysql
;;
stop)
     function_stop_mysql
;;
restart)
     function_restart_mysql
;;
*)
     printf  "Usage: /usr/local/mysql-5.7.18/data/${port}/mysql {start|stop|restart}\n"
esac

/usr/local/mysql-5.7.18/data/3307/mysql文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/sh
port=3307
mysql_user= "root"
mysql_pwd= "mypassword"
cmd_path= "/usr/local/mysql-5.7.18/bin"
mysql_sock= "/usr/local/mysql-5.7.18/data/${port}/mysql.sock"
#startup function
function_start_mysql()
{
     if  [ ! -e  "$mysql_sock"  ]; then
       printf  "Starting MySQL...\n"
       /bin/sh  ${cmd_path} /mysqld_safe  --defaults- file = /usr/local/mysql-5 .7.18 /data/ ${port} /my .cnf 2>&1 >  /dev/null  &
     else
       printf  "MySQL is running...\n"
       exit
     fi
}
#stop function
function_stop_mysql()
{
     if  [ ! -e  "$mysql_sock"  ]; then
        printf  "MySQL is stopped...\n"
        exit
     else
        printf  "Stoping MySQL...\n"
        ${cmd_path} /mysqladmin  -u ${mysql_user} -p${mysql_pwd} -S  /usr/local/mysql-5 .7.18 /data/ ${port} /mysql .sock  shutdown
    fi
}