下载 MySQL
新建用户和用户组
创建一个名为 mysql
且没有登录权限的用户和一个名为 mysql
的用户组:
groupadd -r mysql && useradd -r -g mysql -s /bin/false -M mysql
从官网下载 5.7.18 版本
可以选择先下载到本地,再上传至服务器,或者直接在服务器下载:
wget -c http://cdn.mysql.com/Downloads/MySQL-5.7/mysql-5.7.18.tar.gz
若速度很慢或者链接失效,可以选择从我的 GitHub 备份地址下载
wget -c https://github.com/SpanishOnion/MyLNMP/raw/master/package/MySQL/mysql-5.7.18.tar.gz
# md5校验
md5sum mysql-5.7.18.tar.gz
# 9fb9aeff41d36ccb9be0820afe4b2d8a mysql-5.7.18.tar.gz
解压 MySQL
tar -zxf mysql-5.7.18.tar.gz && cd mysql-5.7.18
下载编译工具
根据官方文档提示,由于从 MySQL 5.5 版本开始弃用了常规的 configure
编译方法,所以需要下载 CMake 编译器
、Boost 库
、ncurses 库
、GNU 分析器生成器 Bison
和gmock 框架
共 5 种工具。从 MySQL 5.7 版本开始,安装 MySQL 需要依赖 Boost
的 C++ 扩展,而且只能是 1.59.0
版本。
下载 gmock
Google 的 c++ mock 框架,从 MySQL 5.6 开始支持
wget -c https://github.com/SpanishOnion/MyLNMP/raw/master/package/MySQL/googlemock-master.zip
解压 gmock
安装 unzip
, 并将 gmock 解压到 MySQL5.7.18 的 source_downloads
目录下
yum list | grep zip/unzip
yum install zip
yum install unzip
# 在 mysql-5.7.18 目录下进行解压
unzip googlemock-master.zip -d source_downloads
安装 CMake 编译工具
可以直接 yum 安装
yum -y install cmake
或者选择编译安装,此工具安装过程大约耗时10分钟
wget -c https://github.com/SpanishOnion/MyLNMP/raw/master/package/MySQL/cmake-3.8.2.tar.gz
tar -zxf cmake-3.8.2.tar.gz && cd cmake-3.8.2
./configure
# 默认安装路径是/usr/local/bin
make && make install
# 查看cmake版本
cmake --version
安装 Ncurses
Ncurses 提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库,直接 yum 安装即可:
yum -y install ncurses-devel
安装 Bison
这是一个 GNU 分析器生成器,使用编译安装:
wget -c https://github.com/SpanishOnion/MyLNMP/raw/master/package/MySQL/bison-3.0.tar.gz
tar -zxf bison-3.0.tar.gz && cd bison-3.0/ && ./configure
make && make install
安装 Boost 库
这是一个开源可移植的 C++ 库,是 C++ 标准化进程的开发引擎之一,使用编译安装:
wget -c https://github.com/SpanishOnion/MyLNMP/raw/master/package/MySQL/boost_1_59_0.tar.bz2
yum install bzip2
tar -jxf boost_1_59_0.tar.bz2 && cd boost_1_59_0/
./bootstrap.sh
./b2 stage threading=multi link=shared
./b2 install threading=multi link=shared
编译前的准备工作
进入 Mysql-5.7.18
目录后,输入 cmake \
并回车,然后直接复制以下配置再次回车,开始设置 MySQL 的编译配置。
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/mydata/mysql/data \
-DSYSCONFDIR=/etc \
-DMYSQL_USER=mysql \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/var/run/mysql/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_DEBUG=0 \
-DMYSQL_MAINTAINER_MODE=0 \
-DWITH_SSL:STRING=bundled \
-DWITH_ZLIB:STRING=bundled
以上配置对应的注释如下:
[root@leo mysql-5.7.18]# cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ # [MySQL安装的根目录]
-DMYSQL_DATADIR=/mydata/mysql/data \ # [MySQL数据库文件存放目录]
-DSYSCONFDIR=/etc \ # [MySQL配置文件所在目录]
-DMYSQL_USER=mysql \ # [MySQL用户名]
-DWITH_MYISAM_STORAGE_ENGINE=1 \ # [MySQL的数据库引擎]
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ # [MySQL的数据库引擎]
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \ # [MySQL的数据库引擎]
-DWITH_MEMORY_STORAGE_ENGINE=1 \ # [MySQL的数据库引擎]
-DWITH_READLINE=1 \ # [MySQL的readline library]
-DMYSQL_UNIX_ADDR=/var/run/mysql/mysql.sock \ # [MySQL的通讯目录]
-DMYSQL_TCP_PORT=3306 \ # [MySQL的监听端口]
-DENABLED_LOCAL_INFILE=1 \ # [启用加载本地数据]
-DENABLE_DOWNLOADS=1 \ # [编译时允许自主下载相关文件]
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \ # [使MySQL支持所有的扩展字符]
-DDEFAULT_CHARSET=utf8 \ # [设置默认字符集为utf8]
-DDEFAULT_COLLATION=utf8_general_ci \ # [设置默认字符校对]
-DWITH_DEBUG=0 \ # [禁用调试模式]
-DMYSQL_MAINTAINER_MODE=0 \
-DWITH_SSL:STRING=bundled \ # [通讯时支持ssl协议]
-DWITH_ZLIB:STRING=bundled # [允许使用zlib library]
创建交换分区
这是为了避免 MySQL 编译过程中出现内存不足而导致编译失败,4 G 及以上内存的主机直接跳过此步即可。
(1)创建分区文件, 大小 2 G
dd if=/dev/zero of=/swapfile bs=1k count=2048000
(2)生成 swap 文件系统
mkswap /swapfile
(3)激活 swap 文件
swapon /swapfile
如果你想以后开机自动启动交换分区,可以进行下面这部操作:
vi /etc/fstab
# 在文件中新增如下代码,然后使用 wq 命令保存并退出
/swapfile swap swap defaults 0 0
编译安装及安装后的配置工作
使用 make
命令编译时,会比较吃 CPU 与内存,我的主机配置是单核 2 G,并且增加了 2 G 的交换分区,编译过程大约花费 1 个小时,所以如果主机内存为 1 G,并且不增加交换分区的情况下,并不建议直接编译安装 5.7 版本的 MySQL!
编译
进入 MySQL 目录直接开始编译:
cd mysql-5.7.18
make
编译成功后出现如下图提示:
安装
接下来开始安装 MySQL:
make intall
安装成功出现如下图提示:
查看安装成功后的 MySQL 安装目录
使用命令查看 MySQL 的安装目录 /usr/local/mysql/
下面是否生成了相关目录文件(最重要的当然是 bin
、sbin
和 lib
目录)。
ls -lrt /usr/local/mysql/lib/
如果 lib
目录下面没有生成如下图所示的 .so
动态库文件和 .a
静态库文件,那么说明安装不成功(即使成功了也可能会导致 php
进程无法找到 mysql
的相关库文件)。
设置配置文件 my.cnf
先把编译生成的 my.cnf
文件备份,然后从我的 GitHub
上获取配置文件,再上传到服务器的 /etc/
目录下即可。
wget -c https://github.com/SpanishOnion/MyLNMP/raw/master/config/MySQL/my.cnf
mv /etc/my.cnf /etc/my.cnfbak
mv ~/my.cnf /etc/my.cnf
添加环境变量并创建日志存放目录
将 MySQL 编译生成的 bin 目录添加到当前 Linux 系统的环境变量中:
echo -e '\n\nexport PATH=/usr/local/mysql/bin:$PATH\n' >> /etc/profile && source /etc/profile
创建一个目录 /mydata/mysql/data
,用于存放 MySQL 的数据库文件。同时设置其用户和用户组为之前创建的 mysql
,权限为 777
。这样其它用户是无法进行读写的,尽量保证数据库的安全。
mkdir -p /mydata/mysql/data && chown -R root:mysql /usr/local/mysql
chown -R mysql:mysql /mydata/mysql/data
chmod -R go-rwx /mydata/mysql/data
下面配置的 MySQL 日志存放目录以及权限都是根据前面 my.cnf
文件写的,也就是说两者需要保持一致。
mkdir -p /var/run/mysql && mkdir -p /var/log/mysql
chown -R mysql:mysql /var/log/mysql && chown -R mysql:mysql /var/run/mysql
配置开机自启动
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# 增加可执行权限
chmod +x /etc/init.d/mysqld
# 添加到sysV服务
chkconfig --add mysqld
chkconfig mysqld on
初始化 MySQL 自身的数据库并启动服务
在 /usr/local/mysql/bin
文件夹中,执行 mysqld
命令,初始化 MySQL 自身的数据库。
cd /usr/local/mysql/bin
mysqld \
--initialize-insecure --user=mysql \
--basedir=/usr/local/mysql \
--datadir=/mydata/mysql/data
# 输入完以上命令后,回车
参数 user
表示用户,参数 basedir
表示 MySQL 的安装路径,参数 datadir
表示数据库文件存放路径
查看是否生成了 MySQL 自身的数据库文件
ls /mydata/mysql/data
如已生成,则如下图所示:
在完成上面的操作后,就可以正式使用 MySQL 服务了,启动 MySQL 进程服务的命令如下:
mysqld_safe --user=mysql --datadir=/mydata/mysql/data --log-error=/var/log/mysql/error.log &
# 运行命令后会出现如下提示
[1] 10274
150513 21:28:16 mysqld_safe Logging to '/var/log/mysql/error.log'.
150513 21:28:16 mysqld_safe Starting mysqld daemon with databases from /mydata/mysql/data
上面这条命令会在后台继续执行,所以直接回车即可。接着启动 MySQL:
service mysqld start
# 启动成功,出现以下提示:
Starting MySQL.[ OK ] [启动成功]
查看 MySQL 服务
# 查看进程
ps -ef | grep mysql
# 查看端口监听情况
netstat -tunpl | grep 3306
初始化 MySQL 的 root 用户密码
和 Oracle 数据库一样,MySQL 数据库也默认自带了一个 root 用户(这个和当前 Linux 系统中的 root 用户是完全不搭边的),我们在设置好 MySQL 数据库的安全配置后初始化 root 用户的密码。
mysql_secure_installation
配置过程中,一路输入 y
就行了。这里说明下 MySQL 5.7 版本中,用户密码策略分成低级 LOW
、中等 MEDIUM
和超强 STRONG
三种,推荐使用 中等 MEDIUM
级别!
将 MySQL 的动态链接库共享至系统链接库
一般 MySQL 还会被类似于 PHP 等服务调用,所以我们需要将 MySQL 编译后的 lib 库
文件添加至当前 Linux 系统的链接库 /etc/ld.so.conf.d/
下,这样 MySQL 服务就可以被其它服务调用了。
echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf
# 使其生效
ldconfig
# 查看效果
ldconfig -v |grep mysql
# 运行完以下命令上会出现如下提示
ldconfig: Path `/usr/lib' given more than once
ldconfig: Path `/usr/lib64' given more than once
ldconfig: Can't stat /usr/libx32: No such file or directory
/usr/lib64/mysql:
libmysqlclient.so.18 -> libmysqlclient.so.18.0.0
/usr/local/mysql/lib:
libmysqlclient.so.20 -> libmysqlclient_r.so.20.3.5
创建其它 MySQL 数据库用户
使用 MySQL 的 root 用户登录后,可以管理数据库的其他用户了。
mysql -uroot -p
登录进 MySQL 后创建数据库:
use mysql;
create database c78_licong DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
创建名为 licong
的用户,并让它拥有 blog
数据库中每个表的全部权限,密码为 lcgod666.com
grant all privileges on blog.* to licong@'%' identified by 'lcgod666.com' with grant option;
# 查看用户表
select host,user from mysql.user;
# 更改root用户远程登录权限
update user set host = '%' where user = 'root';
# 刷新权限
flush privileges;
# 退出
exit;
以上,编译安装 MySQL 就大功告成了,快去动手尝试吧。
后续重启可能会遇到的问题
检查 MySQL 服务的状态:
systemctl status mysqld.service
出现如下提示:
● mysqld.service - LSB: start and stop MySQL
Loaded: loaded (/etc/rc.d/init.d/mysqld; bad; vendor preset: disabled)
Active: failed (Result: exit-code) since Wed 2022-04-13 15:34:57 CST; 18s ago
Docs: man:systemd-sysv-generator(8)
Process: 10355 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=1/FAILURE)
按提示启动 MySQL 服务:
/etc/rc.d/init.d/mysqld start
出现如下报错:
Starting MySQL.2022-04-13T07:35:35.848445Z mysqld_safe Directory '/var/run/mysql' for UNIX socket file don't exists.
ERROR! The server quit without updating PID file (/var/log/mysql/mysql.pid).
修复:
mkdir -p /var/run/mysql
chown -R mysql:mysql /var/run/mysql
重新启动:
/etc/rc.d/init.d/mysqld start
Starting MySQL..... SUCCESS!
