引言

MySQL的源码安装,向来是各种运维的基础功底,趁着有空,拿台服务器安装一下最新版的MySQL8.2.0

踩坑传送门(ಥ _ ಥ)

下面这里是我总结的一些踩过的坑,和一些方便执行的命令,知道怎么搭建的,从这里复制一些方便的安装命令就行,对这些不大熟的可以跟着我往下看。

# 补充依赖
sudo yum -y install cmake gcc g++ ncurses-devel libtirpc-devel rpcgen libxml2-devel sqlite-devel libpng-devel oniguruma-devel wget pcre-devel vim

# 下载
wget https://dev.mysql.com/get/Downloads/MySQL-8.2/mysql-boost-8.2.0.tar.gz

# 解压
tar -xzvf mysql-boost-8.2.0.tar.gz

# 进入编译目录
cd mysql-8.2.0
mkdir myMakeDir
cd myMakeDir

# 预编译
cmake .. \
-DCMAKE_INSTALL_PREFIX=你的MySQL安装目录 \
-DMYSQL_DATADIR=你的MySQL数据目录 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DMYSQL_TCP_PORT=你的MySQL端口 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_BOOST=你的MySQL依赖boost的路径

另外,如果你像我一样,mysql编译速度特别慢,甚至到23%之类的时候就卡死,甚至完全占满内存的情况,就可以用下面这里提供的命令来处理。

(非必须)可临时增加服务器的交换内存大小,防止MySQL编译时报错

# 获取要增加的4G的SWAP文件块
sudo dd if=/dev/zero of=/server/data/swapfile bs=1k count=4096000
# 给这个文件赋权(root账号所有的情况下,600权限,比较安全)
sudo chmod -R 600 /server/data/swapfile
# 创建SWAP文件
sudo mkswap /server/data/swapfile
# 激活SWAP文件
sudo swapon /server/data/swapfile

# 查看交换内存情况
sudo swapon -s
# 或可以用 sudo swapon --show 命令查看

修订记录

序号修订日期修订内容
12023.9.18初始
22023.12.22修正解压参数错误,补充依赖项安装

下载源码包

1. 找到甲骨文的MySQL官网

输入网址www.mysql.com进入MySQL的官网,然后找到DOWNLOADS菜单

就像我下面这张图一样

MySQL官网

然后选择你需要的版本,我们这里选择的是Community版本,也就是社区版(俗称免费版)

找到下面的链接,点进去

下载菜单中,选择版本

2. 下载程序包/复制链接

在打开的页面里,选择社区服务器,这里主要是做一个初始的版本筛选

选择社区服务器

然后打开有几个复选框,注意选择General标准的,不要选旧的版本

选择最新

有几个Select,选择最新版的Linunx版就行

最新的8.2.0

然后选择下载包的形式,这里选源码包SourceCode

选择源码包

其他的基本是一键解压的程序包,不在本次教程的讲解范围内

这里有各个系统的版本选择,主要是红帽或者乌班图之类的,我们选择通用的源码包就行

系统版本选择

然后在剩下的两个选项里,选择带boost的那一个。

点击右侧的Download按钮

下载包

记得把这里显示的MD5留下来,后面会用到

这里可以直接点击just start my download

直接选择下载

也可以像我一样,右键复制链接

复制下载链接

在服务器上找个位置,使用命令下载

当然,你也可以自己下载后上传到服务器上,毕竟这种方式可能会更快。

wget https://dev.mysql.com/get/Downloads/MySQL-8.2/mysql-boost-8.2.0.tar.gz

下载文件

3. 校验MD5文件(可选)

下载下来文件之后,可以通过命令校验下载下来的文件包是否被人篡改过,可以使用命令

# 计算文件散列值
md5sum mysql-boost-8.2.0.tar.gz

# 或者另一种方式:用计算出来的值进行查找,看下是否符合官网提供的MD5散列值
md5sum mysql-boost-8.2.0.tar.gz | grep 704ad9fb4779e76ce5e327285813c97c

这里命令执行后会稍微等一下,这个命令会计算这个文件的信息,最后显示出来这个文件的MD5散列值,你可以拿这个文件散列值跟上面提到的散列值进行对比,如果一致,就可以确定这个文件没有经过篡改,就是你官网上下载下来的文件。

计算文件散列

检测是否与提供散列值一致

编译、安装

1. 安装依赖(踩过的坑)

这里会描述很多我踩过的坑,如果你不想跟着我一块再踩一次的话,建议你在正式开始cmake之前,先去安装相关依赖先,免得浪费大量的时间。

安装命令如下

# 安装依赖(我自己一步一步踩坑摸索出来的)
sudo yum -y install cmake gcc g++ ncurses-devel libtirpc-devel rpcgen

各位读者大大,如果觉得我写的对您还有点帮助的话,可以帮忙关注一下公众号吗?拜谢了~

微信公众号-拓行

2. 解压

刚刚我们说到用wget指令下载了一个名叫mysql-boost-8.2.0.tar.gz的压缩包,下面我们用tar命令来进行解压。

tar -xzvf mysql-boost-8.2.0.tar.gz

下载下来的压缩包

可以看到,命令执行完之后,就出现了一个mysql-8.2.0的源码包文件夹。

解压后的目录

3. 创建相关目录

解压好之后,先不急着进行编译处理,正所谓,工欲善其事必先利其器,这里最好先确定目录结构

比如我:

服务文件存放位置:/server/mysql/8.2.0/

数据文件存放位置:/server/data/mysql8.2.0/

boost文件存放位置:/server/plugins/boost/boost_1_77_0/


boost源码包存放位置:/server/data/packages/boost_1_77_0.tar.bz2(解压前)

MySQL源码包存放位置:/server/data/packages/mysql-8.2.0(解压后)

MySQL源码包存放位置:/server/data/packages/mysql-boost-8.2.0.tar.gz(解压前)

创建MySQL的数据目录和服务目录

这里最好在MySQL源码包内,额外新增一个myMakeDir的目录(当然,目录名称你自己随意改)

目的是为了在之后编译失败的时候,可以方便清除预编译的结果,再次重新开始的时候方便。

mkdir myMakeDir
cd myMakeDir

创建编译目录

创建完成后进入这个目录,我们要进入正题了。

4. 开始第一次预编译(cmake)

如果你跟我一样,出现这个错误,不用怀疑,乖乖回到上面引言部分,安装依赖吧。(后面还有几处类似的问题,如果你已经安装了依赖,基本不可能再出现了。。。想想就心酸)

未安装cmake程序

我这一次安装的时候,还是比较天真,以为就安装一个就完了,结果后面……无穷无尽的报错等着我。

安装依赖的样子

cmake版本

安装gcc和g++必备编译工具

然后用这个命令进行预编译:

cmake .. \
-DCMAKE_INSTALL_PREFIX=/server/mysql/8.2.0 \
-DMYSQL_DATADIR=/server/data/mysql8.2.0 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_USER=tx_mysql \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_BOOST=/server/plugins/boost/boost_1_77_0

然后重点来了,这里涉及到一个叫boost的东西,预编译的时候出现报错,导致整个命令断掉了。

缺少boost文件

这里我们按照他提示的链接,使用wget工具进行下载

wget https://boostorg.jfrog.io/artifactory/main/release/1.77.0/source/boost_1_77_0.tar.bz2

下载提示的boost包

下载下来的这个文件,我们给它用命令解压

tar -jxvf boost_1_77_0.tar.bz2

注意一下,这里的命令跟之前解压tar.gz文件不一样,tar命令带的参数是-jxvf因为这里后缀是tar.bz2

解压boost包

我这里没看清楚,还傻傻的去下载了unzip依赖,,闹笑话了。

然后创建好存放的目录(就是上面第3步的目录,如果已创建好,可以跳过)

mkdir -p /server/plugins/boost/boost_1_77_0

创建boost包存放目录

创建好之后将这个文件包内的内容移动过去,也可以复制后删除(个人习惯问题)

mv /server/data/packages/boost_1_77_0/* /server/plugins/boost/boost_1_77_0/

5. 清除预编译生成的文件

这时候我们可以进行第二次预编译了?答案是不行!

记得之前创建了个目录吗?进到这个目录里,把之前预编译生成的文件删掉,直接用命令就行:

注意:每次预编译失败后,打算进行下一次预编译,都需要删掉这个myMakeDir/目录下的所有文件

rm -rf /server/data/packages/mysql-8.2.0/myMakeDir/*

删除上次预编译生成的文件

6. 开始第二次预编译

然后开始运行编译程序,发现又有报错。

缺少依赖appropriate

没说的,,安装呗。按照下面提示的包名进行安装

安装依赖……

结束之后,再进行清除编译生成的文件

清除编译文件

7. 第NNNNN次预编译成功

等排除万难之后(基本就是上面的坑踩完,就能看到命令停了,没有报错)

大概是这个样子的:

cmake成功

然后……

万里长征,走了一小半了。

8. 开始编译前,配置交换内存

我现在是写教程,当时测的时候是一把梭下去的,如果你不想踩坑,最好听我一句劝,在这里,先配置一下交换内存(土豪配置拉满的话,当我没说)

命令很简单——

可临时增加服务器的交换内存大小,防止MySQL编译时报错

# 获取要增加的4G的SWAP文件块
sudo dd if=/dev/zero of=/server/data/swapfile bs=1k count=4096000
# 给这个文件赋权(root账号所有的情况下,600权限,比较安全)
sudo chmod -R 600 /server/data/swapfile
# 创建SWAP文件
sudo mkswap /server/data/swapfile
# 激活SWAP文件
sudo swapon /server/data/swapfile

# 查看交换内存情况
sudo swapon -s
# 或可以用 sudo swapon --show 命令查看

一行行执行下去就好了,我这里当时忘了截图

应该是没啥问题的。

如果有问题,欢迎联系我,讨论讨论解决。

9. 开始实际编译

这时候,很简单的一行命令

make

就可以执行了。

可能是我的服务器比较拉跨,2核2G,网上说可以加参数,

make -j4

用4个编译器同时进行工作,速度会很快,但我用这种命令,进度到了23%就死活不走了,CPU倒是不高,但io拉满(查看服务器信息是读的操作居多,怀疑是多个编辑器同时工作导致CPU不断从磁盘抢着读导致问题),最后无奈重启。

四个编译器同时工作

我建议大家如果不赶时间的话,最好还是简单make就好了。

哦对了,如果中途中断或者报错后,记得使用下面命令进行编译数据清除(不是删除文件了,别弄错)

make clean

一路上,各种绿色的画面,是最赏心悦目的了!!!

编译中……

如果,你看到你的编译进程突然停下来了,左侧的进度数,达到了100%,不用怀疑,你成了!

编译成功

10. 开始安装

这时候输入命令:

make install

手不抖,,心不慌。

等着。

开始安装

有很多网上教程都是教的要make && make install,我就不建议这样做,因为2个命令夹杂在一起,很容易出现问题,报错都不知道是哪个原因导致的。

然后看到下面的效果,就代表安装完成了!

安装完成

这时候可以看一下你的服务目录下是否有文件:

查看服务文件是否存在

至此安装完成。

配置MySQL信息

1. 初始化MySQL

首先来到mysql的安装目录下,比如我的是:

/server/mysql/

使用命令:

./mysqld --initialize-insecure --character-set-server=utf8mb4

解释:

  1. 首先,这里是执行mysqld的脚本,这个脚本是MySQL的服务程序
  2. 这个--initialize-insecure表示用空密码进行root账号的初始
  3. --character-set-server=utf8mb4代表指定字符集,这种字符集是MySQL推荐使用的
  4. 可以使用--defaults-file参数进行指定配置文件所在位置(有个小坑,要注意放在最前面)
  5. 另外还支持一个--user=mysql的方式指定启动账号(需要root权限)
  6. 如果你不使用上面的--initialize-insecure,也可以用--initialize参数,这将会产生一个临时密码,随机的

初始化数据库

这里可以看到有提示,显示已经初始化root账号了。

2. 尝试启动服务

跟初始化一样,这里可以用命令启动

./mysqld --character-set-server=utf8mb4

注意!这里千万不能带--initialize-insecure这个参数,已经初始化的MySQL如果想要再次初始化,需要先删除数据目录,或者指定新的数据目录。

第一次启动mysqld进程时,我建议不要用&符号启动,便于观察问题

启动后如果没有任何报错,那么,就算是启动成功了。

此时你的命令行应该是被mysqld服务给占用了,我们重新打开一个新的终端。

使用ps命令来查看一下进程信息

ps -aux | grep mysqld

你会看到有一个进程是当前用户启动的,也能看到进程号。

那么就是启动成功了。

这时候还可以去检测一下端口号

netstat -anp | grep mysql

会发现这种新版MySQL,监测了2个端口,分别是330633060端口

那么我们现在杀掉刚刚的进程号,使用命令

kill 进程号

然后发现刚刚那个被占用的终端就停止了,原本Ctrl + C都停不下来的MySQL也没了,查看进程信息和端口占用也没有了。

3. 正式启动服务并挂起

还是我们刚刚那个命令,不同的是要加上&符号,表示常驻

./mysqld --character-set-server=utf8mb4 &

这时候发现会有打印,但控制台不会一直占用了。

再次检测端口和进程信息,也是正常的。

4. 使用mysql脚本尝试连接MySQL服务

我们可以看到,在./bin目录下,有一些脚本文件,这是MySQL官方提供给我们便捷使用的脚本,我们可以用其中的mysql脚本进行测试连接。

输入命令:

./bin/mysql -uroot -p

如果你上面初始化的时候用的是--initialize-insecure参数,那这里连接的时候,请不要加上-p参数,并且连接命令应该为:mysql -u root --skip-password

如果你用的是--initialize参数,可以在输入-p参数回车之后,输入你初始化时提示的默认密码然后回车。

当你看到你的控制台有MySQL版本信息输出的时候,就代表你连接成功了。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 16
Server version: 8.2.0 Source distribution

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

5. 修改密码

当你连接上服务之后,需要进行密码修改,否则你什么操作都无法完成!

修改的SQL语句:

# 修改新密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '你root账号的新密码';
# 刷新写入磁盘
flush privileges;

注意,这里的SQL语句,每一句后面都需要有分号结尾!

好了,到此为止,MySQL就已经完全安装到你的机器上了,至于更多的内容,可以参考MySQL官方文档。

附上这部分的官网文档链接:

https://dev.mysql.com/doc/refman/8.2/en/data-directory-initialization.html

参考链接和资料

https://blog.csdn.net/glovenone/article/details/132409821

这个大佬的博客确实能够创建出交换内存,但不知道为什么,依然会卡死,无法继续编译

https://blog.csdn.net/web_snail/article/details/112323634

这个大佬的博文确实能够正常创建,也能够继续编译成功,但会有提示权限问题


欢迎关注拓行公众号,分享各种技术博客文章

拓行——奋勇进取,开拓未来,砥砺前行

最后修改:2023 年 12 月 22 日
如果您对各种技术博客文章感兴趣,欢迎关注拓行公众号,分享各种专业技术知识~