Loading... ### 引言 `MySQL`的源码安装,向来是各种运维的基础功底,趁着有空,拿台服务器安装一下最新版的`MySQL8.2.0`。 #### 踩坑传送门(ಥ _ ಥ) 下面这里是我总结的一些踩过的坑,和一些方便执行的命令,知道怎么搭建的,从这里复制一些方便的安装命令就行,对这些不大熟的可以跟着我往下看。 ```shell # 补充依赖 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编译时报错 ```shell # 获取要增加的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 命令查看 ``` #### 修订记录 | 序号 | 修订日期 | 修订内容 | | :--: | ---------- | -------------------------------- | | 1 | 2023.9.18 | 初始 | | 2 | 2023.12.22 | 修正解压参数错误,补充依赖项安装 | ### 下载源码包 #### 1. 找到甲骨文的`MySQL`官网 输入网址[www.mysql.com](https://www.mysql.com)进入`MySQL`的官网,然后找到`DOWNLOADS`菜单 就像我下面这张图一样 ![MySQL官网](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/3937100773.png) 然后选择你需要的版本,我们这里选择的是`Community`版本,也就是社区版(俗称免费版) 找到下面的链接,点进去 ![下载菜单中,选择版本](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/3290215007.png) #### 2. 下载程序包/复制链接 在打开的页面里,选择社区服务器,这里主要是做一个初始的版本筛选 ![选择社区服务器](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/56885558.png) 然后打开有几个复选框,注意选择`General`标准的,不要选旧的版本 ![选择最新](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/154576658.png) 有几个`Select`,选择最新版的`Linunx`版就行 ![最新的8.2.0](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/1054381046.png) 然后选择下载包的形式,这里选源码包`SourceCode` ![选择源码包](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/2099507282.png) 其他的基本是一键解压的程序包,不在本次教程的讲解范围内 这里有各个系统的版本选择,主要是红帽或者乌班图之类的,我们选择通用的源码包就行 ![系统版本选择](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/3145101186.png) 然后在剩下的两个选项里,选择带`boost`的那一个。 点击右侧的`Download`按钮 ![下载包](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/1076675664.png) 记得把这里显示的`MD5`留下来,后面会用到 这里可以直接点击`just start my download` ![直接选择下载](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/1273257945.png) 也可以像我一样,右键复制链接 ![复制下载链接](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/1772877308.png) 在服务器上找个位置,使用命令下载 当然,你也可以自己下载后上传到服务器上,毕竟这种方式可能会更快。 ```shell wget https://dev.mysql.com/get/Downloads/MySQL-8.2/mysql-boost-8.2.0.tar.gz ``` ![下载文件](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/2124092785.png) #### 3. 校验MD5文件(可选) 下载下来文件之后,可以通过命令校验下载下来的文件包是否被人篡改过,可以使用命令 ```shell # 计算文件散列值 md5sum mysql-boost-8.2.0.tar.gz # 或者另一种方式:用计算出来的值进行查找,看下是否符合官网提供的MD5散列值 md5sum mysql-boost-8.2.0.tar.gz | grep 704ad9fb4779e76ce5e327285813c97c ``` 这里命令执行后会稍微等一下,这个命令会计算这个文件的信息,最后显示出来这个文件的`MD5`散列值,你可以拿这个文件散列值跟上面提到的散列值进行对比,如果一致,就可以确定这个文件没有经过篡改,就是你官网上下载下来的文件。 ![计算文件散列](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/2491018218.png) ![检测是否与提供散列值一致](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/1864205610.png) ### 编译、安装 #### 1. 安装依赖(踩过的坑) 这里会描述很多我踩过的坑,如果你不想跟着我一块再踩一次的话,建议你在正式开始`cmake`之前,先去安装相关依赖先,免得浪费大量的时间。 安装命令如下 ```shell # 安装依赖(我自己一步一步踩坑摸索出来的) sudo yum -y install cmake gcc g++ ncurses-devel libtirpc-devel rpcgen ``` 各位读者大大,如果觉得我写的对您还有点帮助的话,可以帮忙关注一下公众号吗?拜谢了~ ![微信公众号-拓行](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/3108864191.jpg) #### 2. 解压 刚刚我们说到用`wget`指令下载了一个名叫`mysql-boost-8.2.0.tar.gz`的压缩包,下面我们用`tar`命令来进行解压。 ```shell tar -xzvf mysql-boost-8.2.0.tar.gz ``` ![下载下来的压缩包](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/2579035386.png) 可以看到,命令执行完之后,就出现了一个`mysql-8.2.0`的源码包文件夹。 ![解压后的目录](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/3690911685.png) #### 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的数据目录和服务目录](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/413416366.png) 这里最好在`MySQL`源码包内,额外新增一个`myMakeDir`的目录(当然,目录名称你自己随意改) 目的是为了在之后编译失败的时候,可以方便清除预编译的结果,再次重新开始的时候方便。 ```shell mkdir myMakeDir cd myMakeDir ``` ![创建编译目录](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/3197613505.png) 创建完成后进入这个目录,我们要进入正题了。 #### 4. 开始第一次预编译(cmake) 如果你跟我一样,出现这个错误,不用怀疑,乖乖回到上面`引言`部分,安装依赖吧。(后面还有几处类似的问题,如果你已经安装了依赖,基本不可能再出现了。。。想想就心酸) ![未安装cmake程序](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/1499845681.png) 我这一次安装的时候,还是比较天真,以为就安装一个就完了,结果后面……无穷无尽的报错等着我。 ![安装依赖的样子](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/4211869150.png) ![cmake版本](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/255371464.png) ![安装gcc和g++必备编译工具](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/2160708182.png) 然后用这个命令进行预编译: ```shell 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文件](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/1530717470.png) 这里我们按照他提示的链接,使用`wget`工具进行下载 ```shell wget https://boostorg.jfrog.io/artifactory/main/release/1.77.0/source/boost_1_77_0.tar.bz2 ``` ![下载提示的boost包](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/3855666441.png) 下载下来的这个文件,我们给它用命令解压 ```shell tar -jxvf boost_1_77_0.tar.bz2 ``` 注意一下,这里的命令跟之前解压`tar.gz`文件不一样,`tar`命令带的参数是`-jxvf`因为这里后缀是`tar.bz2` ![解压boost包](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/3886697907.png) 我这里没看清楚,还傻傻的去下载了`unzip`依赖,,闹笑话了。 然后创建好存放的目录(就是上面第3步的目录,如果已创建好,可以跳过) ```shell mkdir -p /server/plugins/boost/boost_1_77_0 ``` ![创建boost包存放目录](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/2565339298.png) 创建好之后将这个文件包内的内容移动过去,也可以复制后删除(个人习惯问题) ```shell mv /server/data/packages/boost_1_77_0/* /server/plugins/boost/boost_1_77_0/ ``` #### 5. 清除预编译生成的文件 这时候我们可以进行第二次预编译了?答案是不行! 记得之前创建了个目录吗?进到这个目录里,把之前预编译生成的文件删掉,直接用命令就行: **注意:每次预编译失败后,打算进行下一次预编译,都需要删掉这个`myMakeDir/`目录下的所有文件** ```shell rm -rf /server/data/packages/mysql-8.2.0/myMakeDir/* ``` ![删除上次预编译生成的文件](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/2339267382.png) #### 6. 开始第二次预编译 然后开始运行编译程序,发现又有报错。 ![缺少依赖appropriate](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/554944016.png) 没说的,,安装呗。按照下面提示的包名进行安装 ![安装依赖……](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/3061666394.png) 结束之后,再进行清除编译生成的文件 ![清除编译文件](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/195443040.png) #### 7. 第NNNNN次预编译成功 等排除万难之后(基本就是上面的坑踩完,就能看到命令停了,没有报错) 大概是这个样子的: ![cmake成功](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/1904832565.png) 然后…… 万里长征,走了一小半了。 #### 8. 开始编译前,配置交换内存 我现在是写教程,当时测的时候是一把梭下去的,如果你不想踩坑,最好听我一句劝,在这里,先配置一下交换内存(土豪配置拉满的话,当我没说) 命令很简单—— 可临时增加服务器的交换内存大小,防止MySQL编译时报错 ```shell # 获取要增加的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. 开始实际编译 这时候,很简单的一行命令 ```shell make ``` 就可以执行了。 可能是我的服务器比较拉跨,2核2G,网上说可以加参数, ```shell make -j4 ``` 用4个编译器同时进行工作,速度会很快,但我用这种命令,进度到了`23%`就死活不走了,`CPU`倒是不高,但`io`拉满(查看服务器信息是读的操作居多,怀疑是多个编辑器同时工作导致`CPU`不断从磁盘抢着读导致问题),最后无奈重启。 ![四个编译器同时工作](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/3550237421.png) 我建议大家如果不赶时间的话,最好还是简单`make`就好了。 哦对了,如果中途中断或者报错后,记得使用下面命令进行编译数据清除(不是删除文件了,别弄错) ```shell make clean ``` 一路上,各种绿色的画面,是最赏心悦目的了!!! ![编译中……](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/3600529267.png) 如果,你看到你的编译进程突然停下来了,左侧的进度数,达到了`100%`,不用怀疑,你成了! ![编译成功](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/2115083407.png) #### 10. 开始安装 这时候输入命令: ```shell make install ``` 手不抖,,心不慌。 等着。 ![开始安装](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/1593425998.png) 有很多网上教程都是教的要`make && make install`,我就不建议这样做,因为2个命令夹杂在一起,很容易出现问题,报错都不知道是哪个原因导致的。 然后看到下面的效果,就代表安装完成了! ![安装完成](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/3317616914.png) 这时候可以看一下你的服务目录下是否有文件: ![查看服务文件是否存在](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/2904215391.png) 至此安装完成。 ### 配置MySQL信息 #### 1. 初始化`MySQL` 首先来到`mysql`的安装目录下,比如我的是: `/server/mysql/` 使用命令: ```shell ./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`参数,这将会产生一个临时密码,随机的 ![初始化数据库](https://aliyun-yuesha-public-oss.oss-cn-zhangjiakou.aliyuncs.com/usr/uploads/2023/12/859435378.png) 这里可以看到有提示,显示已经初始化`root`账号了。 #### 2. 尝试启动服务 跟初始化一样,这里可以用命令启动 ```shell ./mysqld --character-set-server=utf8mb4 ``` 注意!这里千万不能带`--initialize-insecure`这个参数,已经初始化的`MySQL`如果想要再次初始化,需要先删除数据目录,或者指定新的数据目录。 第一次启动`mysqld`进程时,我建议不要用`&`符号启动,便于观察问题 启动后如果没有任何报错,那么,就算是启动成功了。 **此时你的命令行应该是被`mysqld`服务给占用了,我们重新打开一个新的终端。** 使用`ps`命令来查看一下进程信息 ```shell ps -aux | grep mysqld ``` 你会看到有一个进程是当前用户启动的,也能看到进程号。 那么就是启动成功了。 这时候还可以去检测一下端口号 ```shell netstat -anp | grep mysql ``` 会发现这种新版`MySQL`,监测了`2个`端口,分别是`3306`和`33060`端口 那么我们现在杀掉刚刚的进程号,使用命令 ```shell kill 进程号 ``` 然后发现刚刚那个被占用的终端就停止了,原本`Ctrl + C`都停不下来的`MySQL`也没了,查看进程信息和端口占用也没有了。 #### 3. 正式启动服务并挂起 还是我们刚刚那个命令,不同的是要加上`&`符号,表示常驻 ```shell ./mysqld --character-set-server=utf8mb4 & ``` 这时候发现会有打印,但控制台不会一直占用了。 再次检测端口和进程信息,也是正常的。 #### 4. 使用`mysql`脚本尝试连接`MySQL`服务 我们可以看到,在`./bin`目录下,有一些脚本文件,这是`MySQL`官方提供给我们便捷使用的脚本,我们可以用其中的`mysql`脚本进行测试连接。 输入命令: ```shell ./bin/mysql -uroot -p ``` **如果你上面初始化的时候用的是`--initialize-insecure`参数,那这里连接的时候,请不要加上`-p`参数,并且连接命令应该为:`mysql -u root --skip-password`** 如果你用的是`--initialize`参数,可以在输入`-p`参数回车之后,输入你初始化时提示的默认密码然后回车。 当你看到你的控制台有`MySQL`版本信息输出的时候,就代表你连接成功了。 ```shell 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`语句: ```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://dev.mysql.com/doc/refman/8.2/en/data-directory-initialization.html) ### 参考链接和资料 [https://blog.csdn.net/glovenone/article/details/132409821](https://blog.csdn.net/glovenone/article/details/132409821) 这个大佬的博客确实能够创建出交换内存,但不知道为什么,依然会卡死,无法继续编译 [https://blog.csdn.net/web_snail/article/details/112323634](https://blog.csdn.net/web_snail/article/details/112323634) 这个大佬的博文确实能够正常创建,也能够继续编译成功,但会有提示权限问题 欢迎关注拓行公众号,分享各种技术博客文章拓行——奋勇进取,开拓未来,砥砺前行 最后修改:2023 年 12 月 22 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果您对各种技术博客文章感兴趣,欢迎关注拓行公众号,分享各种专业技术知识~