在 centOS9 上编译安装 MySQL8(源码编译 Source Code)
- MySQL Community Server:社区版本,开源免费,但不提供官方技术支持。
- MySQL Enterprise Edition:企业版本,需付费,可以试用30天。
- MySQL Cluster:集群版,开源免费。可将几个 MySQL Server 封装成一个 Server。
- MySQL Cluster CGE:高级集群版,需付费。
- MySQL Workbench(GUITOOL):一款专为 MySQL 设计的ER/数据库建模工具。它是著名的数据库设计工具 DBDesigner4 的继任者。MySQLWorkbench又分为两个版本:
- MySQL Workbench OSS:社区版。
- MySQL WorkbenchSE:商用版。
MySQL Community Server 是开源免费的,这也是我们通常用的 MySQL 服务器的版本。
Mysql 四种安装方式:
- 源安装:在 centOS 8+中,使用命令
dnf install mysql
。适合对数据库要求不太高的场合,例如并发不大,公司内部,企业内部的一些应用场景。 - rpm包安装:在 centOS 中,选择下载mysql-8.0.32-1.el9.x86_64.rpm-bundle.tar类型的包,来安装。适合对数据库要求不太高的场合,例如并发不大,公司内部,企业内部的一些应用场景。
- Linux Generic:通用二进制包安装,在 centOS 中,选择下载mysql-8.0.32-linux-glibc2.17-x86_64-minimal.tar类型的包,来安装。官方已经编译好的,不需要自己编译的通用二进制包。
- Source Code:源码编译安装,在 centOS 中,选择下载mysql-boost-8.0.32.tar.gz类型的包。需要自己使用
cmake
来编译。
卸载旧版本的MySql
我们安装之前,首先要卸载干净自己系统上面的原有数据库包,卸载旧版本的MySql(没有的话,则跳过此步骤)
1、查看旧版本MySql
rpm -qa | grep mysql
2、逐个删除掉旧的组件。--nodeps参数不要加,若有参数可能会删除其他软件包的依赖包。
rpm -e {file-name}
- --nodeps:在rpm安装包时,不检查依赖关系,例如安装B,B依赖C导致无法安装,使用--nodeps就可以安装成功。
- --force:强制安装。
3、卸载干净后删除/etc/my.cnf
cd /etc/ rm -f my.cnf
安装 myslq 依赖
安装 libtirpc、libtirpc-level。
dnf -y install libtirpc
然后根据版本到清华源搜索libtirpc-devel
cd /usr/local/srcwget -c https://mirrors.tuna.tsinghua.edu.cn/centos-stream/9-stream/CRB/x86_64/os/Packages/libtirpc-devel-1.3.3-1.el9.x86_64.rpmrpm -ivh libtirpc-devel-1.3.3-1.el9.x86_64.rpm
下载解压MySQL8
官网:https://dev.mysql.com/downloads/mysql/
这里选择了与平台无关的的源代码进行下载,注意这里需要包含 boost,mysql 安装依赖 bootst 库。
- rpm bundle:是该版本所有包的集合。一般是把服务器端要用的都安装上。
- rpm package:是某个特定的包,比如server,client,shared lib等。
- Compressed TAR Archive:是源码,必须用源码方式安装。这个是源码,需要自己编译的,也有编译好,但不是安装包的。
cd /usr/local/srcwget -c https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-boost-8.0.32.tar.gz --no-check-certificate # 解压tar -zxvf mysql-boost-8.0.32.tar.gz
-z
:代表 gzip,使用 gzip 工具进行压缩或解压。-x
:代表 extract,解压文件(压缩文件是-c)。-v
:代表 verbose,显示解压过程(文件列表)。-f
:代表 file,指定要解压的文件名(or 要压缩成的文件名)。
# 查看文件ls -l # 进入文件目录cd mysql-8.0.32 # 创建编译目录mkdir build # 进入编译目录cd build
若不创建编译目录,编译运行 CMake,进行建议提示 Please do not build in-source. Out-of source builds are highly
# 配置 cmake .. \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/usr/local/mysql/data \ -DMYSQL_UNIX_ADDR=/usr/local/mysql/run/mysql.sock \ -DSYSCONFDIR=/etc \ -DSYSTEMD_PID_DIR=/usr/local/mysql \ -DDEFAULT_CHARSET=utf8mb4 \ -DDEFAULT_COLLATION=utf8mb4_unicode_ci \ -DENABLED_LOCAL_INFILE=ON \ -DWITH_SSL=system \ -DMYSQL_TCP_PORT=3306 \ -DDOWNLOAD_BOOST=0 \ -DWITH_BOOST=../boost
# 配置,方便复制黏贴 cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DMYSQL_UNIX_ADDR=/usr/local/mysql/run/mysql.sock -DSYSCONFDIR=/etc -DSYSTEMD_PID_DIR=/usr/local/mysql -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DENABLED_LOCAL_INFILE=ON -DWITH_SSL=system -DMYSQL_TCP_PORT=3306 -DDOWNLOAD_BOOST=0 -DWITH_BOOST=../boost
# 编译 make # 安装 make install
cmake ..
:使用当前自建编译目录上级CMakeLists.txt文件作为起始点,在当前build目录中生成makefile。make
命令,在此之后执行,使用生成的 makefile 作为输入构建程序。这样可以方便地保存源代码并在不同的文件夹中构建结果。- DDEFAULT_CHARSET:指定默认字符集为 utf8mb4,因为历史遗留问题,MySQL 中的 utf8 不是真正的 utf8,而是阉割版的,最长只有三个字节,当遇到四个字节的 utf8 编码时,会导致存储异常。从5.5.3开始,使用 utf8mb4 实现完整的 utf8。
- DDEFAULT_COLLATION:排序规则,默认为utf8mb4_0900_ai_ci,属于 utf8mb4_unicode_ci 的一种。0900 指的是 Unicode 校对算法版本,ai是指口音不敏感(as表示敏感),ci指不区分大小写(cs表示区分)。utf8mb4_unicode_ci 表示基于标准的的Unicode来排序和比较,能够在各种语言之间精确排序,而utf8mb4_general_ci遇到某些特殊的字符集时排序结果可能不一致,准确性较差,但是性能较好,比较和排序时候更快。
- DENABLED_LOCAL_INFILE:表示能否使用 load data 命令。
- DWITH_SSL:表示使用系统的SSL库,若不使用系统的请自定义路径。
- DCMAKE_INSTALL_PREFIX:MySQL安装目录。
- DMYSQL_UNIX_ADDR:Unix socket 文件路径。
- DSYSCONFDIR:配置文件目录。
- DSYSTEMD_PID_DIR:PID 文件存储路径。
- DMYSQL_DATADIR:MySQL数据目录,初始时为空。
- DMYSQL_TCP_PORT:端口,默认3306。
- DDOWNLOAD_BOOST:取值0或1,是否下载Boost库。
- DWITH_BOOST:若不下载 Boost 库的话,是本地 Boost 库的位置,若下载 Boost 表示下载位置。
如果在 cmake 的过程中有报错,当报错解决后,需要删除 cmake 产生的缓存文件,即编译目录build下:cmake_install.cmake、CMakeCache.txt、CMakeFiles文件,以及 CMakeFiles 文件夹。然后再重新 cmake,不然还会报错。办法只能是删除build目录,再次重新创建,再次进入:
cd ../rm -rf buildmkdir buildcd build
如果在 make 的过程中有报错,清除缓存,使用命令:make clean
创建 mysql 用户
# 检查 mysql 用户组是否存在cat /etc/group | grep mysql # 检查 mysql 用户是否存在cat /etc/passwd | grep mysql # 添加 mysql 用户组groupadd mysql # 添加用户useradd -r mysql -g mysql -M -s /sbin/nologin
-r
:建立系统用户,不能登录。-g
:指定用户所属的群组。-M
:不建立根目录。-s
:指定用户登入使用的 shell。/sbin/nologin,不使用 shell。
添加 MySQL 命令到 PATH 变量
修改配置文件/etc/profile
vim /etc/profile
在末尾,添加:
export PATH=$PATH:/usr/local/mysql/bin
保存退出,然后刷新环境变量,使之立即生效:
source /etc/profile
或者在 Linux 环境下,直接输入:
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profilesource /etc/profile
MySQL 主要提供的命令行工具如下:
- msql2mysql:用来将mSQL编写的应用转换成MySQL。
- myisamchk:验证MyISAM表的完整性并修复侦测到的错误。
- mysql:MySQL的SQL解释器。可以在此执行SQL,以分号或\g 结束。
- mysql_upgrade:安装了新版本的MySQL后,可以用它检查表以确定是否与新版本兼容,在每次更新升级MySQL时都应该运行此命令。
- mysqladmin:mysql 的管理接口程序。主要任务有:
- create databasename:创建指定的数据库。
- drop databasename:删除指定的数据库。
- extended-status:提供扩展的状态消息。
- flush-hosts:刷新所有缓存的主机。
- flush-logs:刷新所有日志。
- flush-status:刷新所有状态变量。
- flush-tables:刷新所有表。
- flush-threads:刷新线程缓冲。
- flush-privileges:强制重载所有授权表。
- kill id[,id]:终止指定的线程。
- password new_password:设置新的密码。
- ping:验证mysqld是否在运行。
- processlist:显示激活的MySQL线程,这些线程可使用mysqladmin kill命令终止。
- reload:重载授权表。
- refresh:刷新所有表,关闭所有日志文件,然后重新打开它们。
- shutdown:关闭MySQL。
- status:显示简短的服务器状态信息。
- variables:输出现有的变量。
- version:显示服务器的版本信息。
- mysqlaccess:管理用户的接口,可看作SQL的GRANT命令的快捷方式。
- mysqlcheck:与myisamchk很相似的数据完整性验证工具,主要的差别在于此工具可在MySQL运行时使用。
- mysqld:MySQL服务器进程。***不要直接使用它,而应该用 mysqld_safe 替代。
- mysqld_safe:服务器进程管理器。用于启动mysqld服务器进程并在其崩溃时重启。
- mysqldump:将MySQL数据库的状态或数据库集合转储到文本文件,以便于此后恢复数据库。
- mysqlimport:导入文本文件到数据库,其文件名需要与导入的表相匹配。
- mysqlshow:显示指定数据库对象(如数据库、表或列)的结构。
- mysqlslap:在MySQL服务器上仿真客户端负载的工具。
配置 Mysql
vim /etc/my.cnf
配置内容如下:
[mysqld] # default_authentication_plugin=mysql_native_password datadir=/usr/local/mysql/data socket=/usr/local/mysql/run/mysqld.sock user=mysql port=3306 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4' skip-character-set-client-handshake=true skip-name-resolve [mysqld_safe] pid-file=/usr/local/mysql/run/mysqld.pid log-error=/var/log/mysql/mysqld.log [mysql] port=3306 default-character-set=utf8mb4 [client] default-character-set=utf8mb4 socket=/usr/local/mysql/run/mysqld.sock [mysqldump] quick max_allowed_packet=1024M default-character-set=utf8mb4
查看配置信息的命令:
# 查看配置文件的位置mysqld --verbose --help | grep -A 1 'Default options are read' # 读取指定配置文件mysqld --defaults-file=path # mysqld会去读取[server]、[mysqld]或[mysqld-8.0]组mysqld --verbose --help | grep 'groups are read' # mysqld_safe除了读取mysqld读的组外,还会读取[mysqld_safe]组 # mysqldump会去读[mysqldump]和[client]组 # mysqladmin会去读[mysqladmin]和[client]组 # mysql会去读 [mysql]和[client]组
创建配置相应 mysql 目录文件
完成my.cnf配置后,还需要创建目录文件以及修改权限。因为这些配置的目录文件是自定义的,非 myslq 默认。
mkdir -p /usr/local/mysql/runtouch /usr/local/mysql/run/mysql.pidtouch /usr/local/mysql/run/mysql.sockchown -R mysql:mysql /usr/local/mysqlmkdir -p /var/log/mysqltouch /var/log/mysql/mysqld.logchown -R mysql:mysql /var/log/mysql
初始化完成,会自动生成存放数据的data目录。所以不需要提前创建。
初始化 Mysql
初始安装数据库,并记录随机密码:
mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data # 显示结果如下: 2023-02-24T20:32:48.765747Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.32) initializing of server in progress as process 803031 2023-02-24T20:32:48.772214Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2023-02-24T20:32:49.010359Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 2023-02-24T20:32:50.448583Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: 4o=;W=0?gv/j
记录下来,初始化产生的随机密码:4o=;W=0?gv/j
也可以无密码方式,初始安装数据库:
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
使用的是无密码初始化,初始化完成后,会有如下警告:[Warning][MY-010453][Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
启动 mysqld
/usr/local/mysql/support-files/mysql.serverstart
MySQL 8 中,能启动 MySQL 服务的脚本有三个:
- /usr/local/mysql/bin/mysqld
- /usr/local/mysql/bin/mysqld_safe
- /usr/local/mysql/support-files/mysql.server
- /usr/local/mysql/support-files/mysqld_multi.server
mysqld
mysqld:是 MySQL 的核心程序,用于管理 MySQL 的数据库文件以及用户的请求操作。mysqld 可以读取my.cnf配置文件中的[mysqld]的部分。虽然直接使用 mysqld 来启动 MySQL 服务,当服务器使用,是最少见的,因为太简单粗暴。
mysqld 指定读取my.cnf配置文件来启动 MySQL 服务,末尾加一个&
实现后台启动 MySQL 服务,终端不会被阻塞。
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf &
mysqld_safe
mysqld_safe 本质也是去调用 mysqld,但添加了一些安全功能,启动 MySQL 服务后,继续监控其运行情况,在发生错误时重启服务器以及将运行时信息记录到错误日志中,所以一般更推荐使用 mysqld_safe 来启动MySQL服务器。停止原理:kill mysql_pid
需要注意的是,在一些平台中并不会安装 mysqld_safe 脚本,这是因为这些平台在系统上支持 mysql 的启动与关闭,因此 mysqld_safe 便不需要了。
/usr/local/mysql/bin/ysqld_safe –defaults-file=/etc/my.cnf & # root 管理员密码丢失使用这个命令启动 /usr/local/mysql/bin/ysqld_safe --skip-grant-tables --skip-networking &
使用 mysqld 和 mysqld_safe 启动优势:可以额外加参数启动,命令行高于配置文件 my.cnf 里的配置。
mysql.server
mysql.server 底层调用的是 mysqld_safe 脚本。以服务的方式来启动 MySQL 服务。
与 mysqld_safe 一样,在一些支持 mysql 启动与关闭的平台上,并不会安装 mysql.server 脚本。
/usr/local/mysql/support-files/mysql.server stop|start|restart
mysqld_multi.server
mysqld_multi.server 是 MySQL 提供的用于管理多个 MySQL 服务器的脚本,可以同时启动或停止多个 MySQL 服务器,当我们运行 mysqld_multie 脚本时,该脚本会在配置文件中查找名称为[mysqldN]的选项,N可以是任意的正整数。
登录 Mysql 修改密码
mysql -u root -p
进入 MySQL,输入初始化密码。若是无密码方式初始化直接回车就可以进入 MySQL。等录 mysql 后,修改密码:
alter user 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '这里改成自己需要设定的密码';flush privileges;
也可以使用 mysqladmin 工具来修改,密码:
mysqladmin -u root -p password '这里改成自己需要设定的密码'
登录 mysql 后,身份验证方式。
SELECT USER,PLUGIN FROM mysql.`user`; # 显示如下: +------------------+-----------------------+ | USER | PLUGIN | +------------------+-----------------------+ | mysql.infoschema | caching_sha2_password | | mysql.session | caching_sha2_password | | mysql.sys | caching_sha2_password | | root | caching_sha2_password | +------------------+-----------------------+
登录 mysql 后,查看配置的字符集。
show variables like '%character%';show variables like '%collation%'; # 查看完毕,推出 mysql exit;
MySQL8 身份验证
在 MySQL 8 新增加身份验证插件caching_sha2_password
,这个方式默认成为新的链接 MySQL 8 身份验证插件机制,默认在/etc/my.cnf中,带注释的。
[mysqld] # default_authentication_plugin=mysql_native_password
在 PHP 链接 MySQL 8 时,需要以此caching_sha2_password
加密方式,来验证身份。还有 docker 链接 MySQL 8,会使用到。
在修改密码的时候,使用:
alter user 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '这里改成自己需要设定的密码';flush privileges;
在/etc/my.cnf中将mysql_native_password
前面的注释去掉。即以 MySQL 5 的身份验证机制mysql_native_password,来链接 MySQL 8。
在修改密码的时候,使用:
alter user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '这里改成自己需要设定的密码';flush privileges;
设置 mysqld 开机自启动
首先,停止MySQL服务
/usr/local/mysql/support-files/mysql.serverstop
vim /usr/lib/systemd/system/mysqld.service
[Unit] Description=MySQL Server Documentation=mysqld.service After=network.target After=syslog.target [Service] User=mysql Group=mysql Type=forking TimeoutSec=0 PermissionsStartOnly=true ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf LimitNOFILE=5000 Restart=on-failure RestartSec=10 RestartPreventExitStatus=1 PrivateTmp=false [Install] WantedBy=multi-user.target
# 设置开机自启动systemctl enable mysqld
# 重载 mysqld 配置文件systemctl daemon-reload # 启动 mysqld 服务systemctl start mysqld # 停止 mysqld 服务systemctl stop mysqld # 重启 mysqld 服务systemctl restart mysqld # 查看 mysqld 服务状态systemctl status mysqld
查看 mysql 的启动状态
pidof mysqldps aux | grep mysqld