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)”,如下图所示:
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客户端中的效果:
上面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
}
|