源码安装MySQL 5.6

准备工作

运行环境

# 系统版本
Linux version 3.10.0-514.2.2.el7.x86_64 (builder@kbuilder.dev.centos.org)(gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) ) #1 SMP Tue Dec 6 23:06:41 UTC 2016
# MySQL版本
5.6.35

确认你的安装版本

mysql分为开发版本和稳定版本(GA):
开发版本拥有最新的特性,但是并不稳定,也没有完全经过测试,可能存在严重的bug;
稳定版本是经过了长时间的测试,消除了具有已知的bug,其稳定性和安全性都得到一定的保障。

对于一个mysql的版本号如:mysql-5.6.1-m1,这个版本号意味着什么呢?
对于5.6.1的解释
第一个数字5代表了文件格式,第二个数字6代表了发行级别,第三个数字1代表了版本号。更新幅度较小时,最后的数字会增加,出现了重大特性更新时,第二个数字会增加,文件格式改变时,第一个数字会增加。
对于m1的解释
这是用来表明这个mysql版本的稳定性级别的,如果没有这个后缀,那么这个版本就是一个稳定版(GA);如果这个后缀是mN(例如m1,m2)格式,表明了这个版本加入了一些经过彻底测试的新特性,可以认为这是一个试生产的模具;如果这个后缀是rc,表明了这是一个候选版本,已经修改了已知的重要bug,但是没有经过足够长时间的使用来确认所有的bug已经被修复。

一旦选择了版本号,就要选择使用哪个发行版,你可以使用二进制发行版如RPM包或Zip压缩包等。
如果你要实现如下的功能,就要选择源码安装:
1. 把mysq安装到指定位置
2. 使用mysql的一些特性(标准的二进制版本中并没有这些特性)如:TCP封包支持,调试mysql
3. 二进制版本中默认支持所有的字符集,但你可以在编译安装源码时指定字符集,从而使得安装的mysql更小

下载MySQL

下载地址:[http://dev.mysql.com/downloads/mysql/]
Tip: 下载完后需要检查文件的MD5,以确认是否从官网下载的原版本(以防被人篡改过该软件)。
从windows下载后上传到linux后,使用md5sum命令来检查:

md5sum mysql-5.6.35.tar.gz

输出 e4f170f6f73aa94c0d8da90019545908 mysql-5.6.35.tar.gz
可以看出,与上图中的MD5是一致的,如果不一致,就要更换一个镜像地址来下载mysql。

安装MySQL

准备安装环境

# 首先检查是否已经安装过mysql
rpm -qa | grep mysql
# 有的话就卸载掉以前安装的mysql
rpm -e --nodeps xxx(xxx是搜索结果)

并删除所有的相关文件:/etc/my.cnf

编译和安装

# 安装编译代码所需要的包
yum install autoconf make gcc gcc-c++ cmake bison bison-devel ncurses-devel
# 解压安装包
tar zxvf mysql-5.6.35.tar.gz -C /usr/local/src
cd /usr/local/src/mysql-5.6.35
# 编译安装
cmake . \
 -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
 -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \
 -DMYSQL_DATADIR=/usr/local/mysql/data \
 -DSYSCONFDIR=/etc \
 -DWITH_SSL:STRING=bundled \
 -DWITH_ZLIB:STRING=bundled \
 -DMYSQL_TCP_PORT=3306 \
 -DWITH_INNOBASE_STORAGE_ENGINE=1 \
 -DWITH_PARTITION_STORAGE_ENGINE=1 \
 -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
 -DWITH_MYISAM_STORAGE_ENGINE=1 \
 -DWITH_EDITLINE=bundled \
 -DENABLED_LOCAL_INFILE=1 \
 -DENABLE_DOWNLOADS=1 \
 -DDEFAULT_CHARSET=utf8 \
 -DDEFAULT_COLLATION=utf8_general_ci \
 -DWITH_EXTRA_CHARSETS=all

make
make install

至此,mysql安装完成。

配置MySQL

创建mysql用户

# 检查系统是否已经有mysql用户,如果没有则创建。
cat /etc/passwd | grep mysql
cat /etc/group | grep mysql
# 创建mysql用户(但是不能使用mysql账号登陆系统)。
groupadd mysql -s /sbin/nologin
useradd -g mysql -r mysql

修改权限

chown -R mysql:mysql /usr/local/mysql

MySQL配置

Tip: 下面有两种配置方式,推荐按照多实例配置的方式。

单实例配置

执行初始化配置脚本,创建系统自带的数据库和表

/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql

Tip: 在启动MySQL服务时,会按照一定次序搜索my.cnf,先在/etc目录下找,找不到则会搜索”$basedir/my.cnf”,在本例中就是 /usr/local/mysql/my.cnf,这是新版MySQL的配置文件的默认位置!
Tip: 在CentOS 7版操作系统的最小安装完成后,在/etc目录下会存在一个my.cnf,需要将此文件更名为其他的名字,如:/etc/my.cnf.bak,否则,该文件会干扰源码安装的MySQL的正确配置,造成无法启动。
Tip: 在使用”yum update”更新系统后,需要检查下/etc目录下是否会多出一个my.cnf,如果多出,将它重命名成别的。否则,MySQL将使用这个配置文件启动,可能造成无法正常启动等问题。

启动MySQL

添加服务,拷贝服务脚本到init.d目录,并设置开机启动

# 添加服务,拷贝服务脚本到init.d目录,并设置开机启动
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
chkconfig mysql on
service mysql start
# 查看mysql是否启动成功
netstat -lntp | grep 3306

Tip: 如果mysql没有启动成功,到目录/usr/local/mysql/data下查看错误日志。

多实例配置

  什么是多实例?简单地说,就是在一台机器上开启多个不同的服务端口,运行多个mysql服务进程,这些服务进程通过不同socket监听不同服务端口来提供各自的服务。
  这些mysql多实例公用一套mysql安装程序,使用不同的my.cnf配置文件、启动程序、数据文件,在提供服务时,多实例在逻辑上看起来是各自独立的,多个实例之间根据配置文件的设定值,来取得相关服务器的硬件资源。

多实例配置方法:
Tip: 在本文中,通过在mysql上开启两个端口(3306和3307来配置多实例,因为下面的主从同步要使用这两个端口来模拟)。

创建目录(log目录是存放mysql日志的地方)

mkdir -p /usr/local/mysql/data/{3306,3307}/data
mkdir -p /usr/local/mysql/data/{3306,3307}/log

创建my.cnf

vi /usr/local/mysql/data/3306/my.cnf
# 把如下内容拷贝到该文件中
[client]
port = 3306
socket = /usr/local/mysql/data/3306/mysql.sock

[mysqld]
port=3306
socket = /usr/local/mysql/data/3306/mysql.sock
pid-file = /usr/local/mysql/data/3306/data/mysql.pid
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data/3306/data
server-id=1
#log-bin=mysql-bin
#log-bin-index= mysql-bin.index

# LOGGING
log_error=/usr/local/mysql/data/3306/log/mysql-error.log
slow_query_log_file=/usr/local/mysql/data/3306/log/mysql-slow.log
slow_query_log=1

同样地,在/usr/local/mysql/data/3307中新建my.cnf(把上面的3306改为3307,还有server-id的值)。
检查一下目录结构,看看有没有把文件放错地方:

tree /usr/local/mysql/data
# 输出
/usr/local/mysql/data
├── 3306
│ ├── data
│ ├── log
│ └── my.cnf
└── 3307
│ ├── data
│ ├── log
│ └── my.cnf

创建启动文件

vi /usr/local/mysql/data/3306/mysql

把如下内容拷贝到该文件中:

#!/bin/sh
port=3306
mysql_user="root"
mysql_pwd=""
CmdPath="/usr/local/mysql/bin"

#startup function

function_start_mysql()
{
printf "Starting MySQL...\n"
/bin/sh {CmdPath}/mysqld_safe --defaults-file=/usr/local/mysql/data/{port}/my.cnf 2>&1 > /dev/null &
}

#stop function

function_stop_mysql()
{
printf "Stoping MySQL...\n"
{CmdPath}/mysqladmin -u{mysql_user} -p{mysql_pwd} -S /usr/local/mysql/data/{port}/mysql.sock shutdown
}

#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/data/{port}/mysql {start|stop|restart}\n"
esac

同理,在/usr/local/mysql/data/3307中新建一个mysql启动文件。

修改文件拥有者和权限

chown -R mysql:mysql /usr/local/mysql/data
chmod +x /usr/local/mysql/data/3306/mysql
chmod +x /usr/local/mysql/data/3307/mysql

添加MySQL启动路径

echo 'export PATH=PATH:/usr/local/mysql/bin' >>/etc/profile
source /etc/profile
echoPATH

输出 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin
可以看到mysql路径已经添加到了启动路径中。

初始化数据库

/usr/local/mysql/scripts/mysql_install_db --defaults-file=/usr/local/mysql/data/3306/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/3306/data
/usr/local/mysql/scripts/mysql_install_db --defaults-file=/usr/local/mysql/data/3307/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/3307/data

启动MySQL

/usr/local/mysql/data/3306/mysql start
# 输出
Starting MySQL...

/usr/local/mysql/data/3307/mysql start
# 输出
Starting MySQL...

netstat -lntp | grep 330
# 输出
tcp6 0 0 :::3306 :::* LISTEN 33556/mysqld
tcp6 0 0 :::3307 :::* LISTEN 34204/mysqld

可以看到两个端口都已经启动成功。

登陆MySQL

刚安装完的mysql是没有登陆密码的。

mysql -S /usr/local/mysql/data/3306/mysql.sock

Tip: 如果不成功,检查/data/3306/log目录下的mysql-error.log日志,逐一排除错误。

如果登陆成功,下面就修改登录密码。
Tip: 不建议在shell环境下修改密码,否则别人只要查看命令历史就能看到密码(前提是你没有清空命令历史)。

mysql> update mysql.user set password=password("123456") where user='root';
mysql> flush privileges;

同理,使用上面的方法修改3307的登陆密码。
要把上面更改后的密码写回到mysql的启动文件中(否则每次启动、关闭、重启mysql都要输入密码)。

sed -i 's/mysql_pwd=\"\"/mysql_pwd=\"123456\"/g' /usr/local/mysql/data/3306/mysql
sed -i 's/mysql_pwd=\"\"/mysql_pwd=\"123456\"/g' /usr/local/mysql/data/3307/mysql

Tip: 注意把上面的123456改为设置的密码。

重启MySQL

/usr/local/mysql/data/3306/mysql restart

同理可以重启3307端口。

发表评论