• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 在 centOS9 上编译安装 MySQL8(源码编译 Source Code)


    MySQL 版本名称含义
    • 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/src
    wget -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.rpm
    
    rpm -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/src
    wget -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目录中生成makefilemake命令,在此之后执行,使用生成的 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 build
    mkdir build
    cd 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/profile
    source /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/run
    touch /usr/local/mysql/run/mysql.pid
    touch /usr/local/mysql/run/mysql.sock
    chown -R mysql:mysql /usr/local/mysql
    
    mkdir -p /var/log/mysql
    touch /var/log/mysql/mysqld.log
    chown -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.server start
    

    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.server stop
    
    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 mysqld
    ps aux | grep mysqld