跳转至

安装MysQL

一. 数据库

1. 数据库的基本概念

数据:描述事物的符号/data/mysql/data

数据库:数据的仓库

* 数据库中不仅仅有数据,还有其他如事物、索引、存储过程等。

2. 数据库的分类

Ⅰ. 关系型数据库:

数据 ----> 表 ----> 数据库

表/二维表由行和列组成。

常用的有:MySQL、PostreSQL、Oracle、SQL Server、达梦DM、人大金仓等。

非关系型数据库:

  • 键值对型:Redis、Memcached、Etcd等。
  • 文档型:MongoDB、Elastic Search/ES
  • 列示型:HBase
  • 图形型:Neo4j
  • 向量库型:Milvus(常在AI中使用)

相对固定不变的数据保存到关系型数据库中;

数据库不固定、经常变化的数据保存到非关系型数据库中;

智能推荐系统在Memcache中进行计算,数据可能保存到Milvus中。

3. MySQL的安装方式

a. dnf/yum安装

b. 源码包编译安装

c. 二进制安装

源码包编译安装的步骤:

解包:将压缩包解压到指定目录中

配置:指定安装位置及相应的功能模块

编译:根据配置好的内容,编译成二进制文件

安装:将编译好的二进制文件保存到安装位置,同时设置好运行环境

二. 安装MySQL

1. 解决准备安装的环境问题

a. 先查看系统是否支持glic2.28

[root@3 ~]# strings /lib64/libc.so.6|grep GLIBC_2.28
GLIBC_2.28
cnd_broadcast@GLIBC_2.28
mtx_unlock@GLIBC_2.28
thrd_detach@GLIBC_2.28
mtx_destroy@GLIBC_2.28
cnd_timedwait@GLIBC_2.28
tss_delete@GLIBC_2.28
tss_set@GLIBC_2.28
tss_get@GLIBC_2.28
thrd_exit@GLIBC_2.28
mtx_timedlock@GLIBC_2.28
mtx_lock@GLIBC_2.28
call_once@GLIBC_2.28
mtx_trylock@GLIBC_2.28
thrd_create@GLIBC_2.28
thrd_join@GLIBC_2.28
cnd_signal@GLIBC_2.28
cnd_wait@GLIBC_2.28
tss_create@GLIBC_2.28
cnd_init@GLIBC_2.28
cnd_destroy@GLIBC_2.28
mtx_init@GLIBC_2.28

b. 查看是否有已经安装的MySQL和Mariadb,如果有则删除

[root@3 ~]# rpm -q mysql mariadb
未安装软件包 mysql 
未安装软件包 mariadb
[root@3 ~]# mount /dev/sr0 /media/cdrom
mount: /media/cdrom: WARNING: source write-protected, mounted read-only.
[root@3 ~]# dnf -y remove mysql* mariadb*
未找到匹配的参数: mysql-8.4.10-linux-glibc2.28-x86_64.tar.xz
未找到匹配的参数: mariadb*
没有软件包需要移除。
依赖关系解决。
无需任何处理。
完毕!

c. 安装所需的依赖包

[root@3 ~]# dnf -y install cmake make gcc gcc-c++ bison libaio libaio-devel rpcgen ncurses ncurses-devel openssl openssl-devel
...
已安装:
  annobin-12.92-1.el9.x86_64                               cmake-3.31.8-3.el9.x86_64                                
  cmake-data-3.31.8-3.el9.noarch                           cmake-filesystem-3.31.8-3.el9.x86_64                     
  cmake-rpm-macros-3.31.8-3.el9.noarch                     cpp-11.5.0-14.el9.x86_64                                 
  gcc-11.5.0-14.el9.x86_64                                 gcc-c++-11.5.0-14.el9.x86_64                             
  gcc-plugin-annobin-11.5.0-14.el9.x86_64                  libaio-devel-0.3.111-13.el9.x86_64                       
  libmpc-1.2.1-4.el9.x86_64                                libstdc++-devel-11.5.0-14.el9.x86_64                     
  libuv-1:1.42.0-2.el9_4.x86_64                            make-1:4.3-8.el9.x86_64                                  
  ncurses-c++-libs-6.2-12.20210508.el9.x86_64              ncurses-devel-6.2-12.20210508.el9.x86_64                 
  openssl-devel-1:3.5.5-4.el9_8.x86_64                     openssl-fips-provider-1:3.5.5-4.el9_8.x86_64             
  rpcgen-1.4-9.el9.x86_64                                 

完毕!

2. 开始安装MySQL

d. 从官网下载 mysql-8.4.10

[root@3 ~]# wget https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-8.4.10-linux-glibc2.28-x86_64.tar.xz
[root@3 ~]# ls
anaconda-ks.cfg  mysql-8.4.10-linux-glibc2.28-x86_64.tar.xz

e. 解压到/usr/local

[root@3 ~]# tar -xf mysql-8.4.10-linux-glibc2.28-x86_64.tar.xz -C /usr/local
[root@3 ~]# cd /usr/local
[root@3 local]# mv mysql-8.4.10-linux-glibc2.28-x86_64 mysql
[root@3 local]# ls
bin  etc  games  include  lib  lib64  libexec  mysql  sbin  share  src

f. 创建mysql用户和mysql组

[root@3 local]# groupadd -r mysql
[root@3 local]# useradd -r -M -g mysql -s /bin/false mysql
[root@3 local]# id mysql
用户id=27(mysql) 组id=27(mysql) 组=27(mysql)

g. 创建存放MySQL的数据和日志目录,然后修改目录权限

[root@3 local]# mkdir -p /data/mysql/{data,log}
[root@3 local]# chown -R mysql.mysql /data/mysql
[root@3 local]# chown -R mysql:mysql /usr/local/mysql/

h. 编写配置文件my.cnf

[root@3 local]# vi /etc/my.cnf
[client]
socket = /usr/local/mysql/mysql.sock        #客户连接使用的socket

[mysqld]
server_id=10                                #将这台 MySQL 服务器的 ID 指定为 10
port = 3306                                 #默认监听的端口为3306
user = mysql                                #mysql进程的维护用户为mysql
character-set-server = utf8mb4              #默认字符集
default_storage_engine = innodb             #默认存储引擎
log_timestamps = SYSTEM                     #日志时间戳使用系统时间
socket = /usr/local/mysql/mysql.sock        #服务端的socket文件存放的位置
basedir = /usr/local/mysql                  #mysql的安装目录
datadir = /data/mysql/data                  #mysql数据文件的存放目录
pid-file = /usr/local/mysql/mysql.pid       #mysql进程id存放位置
log_error = /data/mysql/log/mysql-error.log #mysql错误日志的存放位置
sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
#STRICT_TRANS_TABLES 严格模式核心 — 对事务表启用严格模式,插入/更新数据时若值无效(如类型错误、超出长度),直接报错而非发出警告
#NO_ZERO_IN_DATE 不允许月份或日为零的日期,例如 '2010-00-01'、'2024-01-00' 会被拦截。现已被废弃,但不会报错
# 不允许 '0000-00-00' 作为合法日期。现已被废弃,但不会报错
#ERROR_FOR_DIVISION_BY_ZERO 除零操作直接报错,而非返回 NULL 并给警告
#NO_ENGINE_SUBSTITUTION 建表时如果指定了被禁用的存储引擎(如 Memory 被禁用),直接报错,而非自动替换为默认引擎(InnoDB)
skip-name-resolve                           #跳过DNS反向解析

i. 初始化数据库

[root@3 local]# /usr/local/mysql/bin/mysqld \
  --initialize-insecure \
  --user=mysql \
  --basedir=/usr/local/mysql \
  --datadir=/data/mysql/data

j. 查看验证

[root@3 local]# ls /data/mysql/data
 auto.cnf          client-key.pem       ibdata1         mysql.ibd               public_key.pem    undo_001
 ca-key.pem       '#ib_16384_0.dblwr'  '#innodb_redo'   mysql_upgrade_history   server-cert.pem   undo_002
 ca.pem           '#ib_16384_1.dblwr'  '#innodb_temp'   performance_schema      server-key.pem
 client-cert.pem   ib_buffer_pool       mysql           private_key.pem         sys
[root@3 local]# ls /data/mysql/log  

k. 设置MySQL的启动服务

[root@3 local]# cd
[root@3 ~]# vi /lib/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/mysql/bin/mysqld  --defaults-file=/etc/my.cnf
User=mysql
Group=mysql
TimeoutSec=300
PrivateTmp=true

[Install]
WantedBy=multi-user.target

l. 重载后启动服务,然后设置开机自动启动并验证

[root@3 ~]# systemctl daemon-reload                     #修改.server后执行,让 systemd 重新读取所有服务配置文件(.service 文件)。
[root@3 ~]# systemctl start mysqld
[root@3 ~]# systemctl enable mysqld
Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.
[root@3 ~]# ss -tuanp|grep mysql
tcp   LISTEN 0      70                   *:33060               *:*     users:(("mysqld",pid=23178,fd=18))                     
tcp   LISTEN 0      151                  *:3306                *:*     users:(("mysqld",pid=23178,fd=21))                     
[root@3 ~]# systemctl status mysqld
● mysqld.service - MySQL Server
     Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; preset: disabled)
     Active: active (running) since Fri 2026-06-19 19:32:25 CST; 1min 2s ago
   Main PID: 23178 (mysqld)
      Tasks: 34 (limit: 10841)
     Memory: 429.2M
        CPU: 1.468s
     CGroup: /system.slice/mysqld.service
             └─23178 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf

6月 19 19:32:25 3 systemd[1]: Started MySQL Server.

m. mysqld服务启动故障

故障现象:

[root@3 ~]# systemctl start mysqld
Job for mysql.service failed because the control process exited with error code.See "systemctl status mysqld.service" and "journalctlxe" for details.

故障排查思路:

查找错误日志:错误日志位置在my.cnf文件中有记录

查看错误日志:

在另一个ssh终端上进行错误日志的文件跟踪:

[root@3 ~]# tail -0f /data/mysql/log/mysql-error.log

在另一个终端上启动mysqld服务

[root@3 ~]# chmod 700 /usr/local/mysql
[root@3 ~]# chown root.root /usr/local/mysql
[root@3 ~]# systemctl restart mysq
ld

回到原主机查看问题

[root@3 ~]# tail -0f /data/mysql/log/mysql-error.log

2026-06-20T11:45:10.615138+08:00 0 [ERROR] [MY-000068] [Server] unknown option '--),直接报错而非发出警告'.

分析其中错误日志的信息:

配置项出现了不认识的中文符号")"

查看配置文件

[root@3 nginx]# cat -n /etc/my.cnf
     1  [client]
     2  socket = /usr/local/mysql/mysql.sock        #客户连接使用的socket
     3
     4  [mysqld]
     5  server_id=10                                #将这台 MySQL 服务器的 ID 指定为 10                            
     6  port = 3306                                 #默认监听的端口为3306
     7  user = mysql                                #mysql进程的维护用户为mysql
     8  character-set-server = utf8mb4              #默认字符集
     9  default_storage_engine = innodb             #默认存储引擎
    10  log_timestamps = SYSTEM                     #日志时间戳使用系统时间
    11  socket = /usr/local/mysql/mysql.sock        #服务端的socket文件存放的位置
    12  basedir = /usr/local/mysql                  #mysql的安装目录
    13  datadir = /data/mysql/data                  #mysql数据文件的存放目录
    14  pid-file = /usr/local/mysql/mysql.pid       #mysql进程id存放位置
    15  log_error = /data/mysql/log/mysql-error.log #mysql错误日志的存放位置
    16  sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
    17  #STRICT_TRANS_TABLES    严格模式核心 — 对事务表启用严格模式,插入/更新数据时若值无效(如类型错误、超出长度>
    18  ),直接报错而非发出警告
    19  #NO_ZERO_IN_DATE        不允许月份或日为零的日期,例如 '2010-00-01'、'2024-01-00' 会被拦截。现已被废弃,但>
    20  不会报错
    21  #NO_ZERO_DATE   不允许 '0000-00-00' 作为合法日期。现已被废弃,但不会报错
    22  #ERROR_FOR_DIVISION_BY_ZERO     除零操作直接报错,而非返回 NULL 并给警告
    23  #NO_ENGINE_SUBSTITUTION 建表时如果指定了被禁用的存储引擎(如 Memory 被禁用),直接报错,而非自动替换为默认>
    24  引擎(InnoDB)
    25  skip-name-resolve                           #跳过DNS反向解析    

解决方法:解决换行问题

n. 优化MySQL执行路径

  • 方法1:配置环境变量
[root@3 ~]# echo "export PATH=/usr/local/mysql/bin:$PATH">>/etc/profile.d/mysql.sh
#配置环境变量
[root@3 ~]# source /etc/profile               #让环境变量生效
[root@3 ~]# echo $PATH                        #检查环境变量是否添加成功
/usr/local/mysql/bin:/root/.vscode-server/data/User/globalStorage/github.copilot-chat/debugCommand:/root/.vscode-server/data/User/globalStorage/github.copilot-chat/copilotCli:/root/.vscode-server/cli/servers/Stable-fcf604774b9f2674b473065736ee75077e256353/server/bin/remote-cli:/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/go/bin:/usr/local/go/bin
  • 方法2:创建软链接文件
[root@3 ~]# ln -s /usr/local/mysql/bin/* /usr/local/bin/

3. 配置MySQL

o. 进入MySQL

[root@3 nginx]# mysql -uroot -p
Enter password:                     #因为没有设置密码,直接回车就行
...
mysql>

p. 设置修改初始密码

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Abcd1234';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> exit
Bye
#或
[root@3 nginx]# mysqladmin -u root -p password 'Abcd1234'
#或
[root@3 nginx]# mysql -uroot -p
Enter password: 
...
mysql> SET PASSWORD FOR 'root'@'localhost' = 'Abcd1234';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> \q
Bye

q. 使用修改后的密码登录MySQL

[root@3 nginx]# mysql -uroot -p
Enter password:                                                   #输入设置的密码Abcd1234
...
mysql> select version();                                          #查看MySQL的版本
+-----------+
| version() |
+-----------+
| 8.4.10    |
+-----------+
1 row in set (0.00 sec)

mysql> select user(),database(),version(),now();                  #查看当前用户,数据库,版本,和当前时间
+----------------+------------+-----------+---------------------+
| user()         | database() | version() | now()               |
+----------------+------------+-----------+---------------------+
| root@localhost | NULL       | 8.4.10    | 2026-06-20 12:30:14 |
+----------------+------------+-----------+---------------------+
1 row in set (0.01 sec)

4. 数据库的常见命令

mysql> create database test50;                  #创建数据库test50
Query OK, 1 row affected (0.03 sec)

mysql> show databases;                          #查看数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test50             |
+--------------------+
5 rows in set (0.09 sec)

mysql> create user 'root'@'192.168.100.99' identified by '123.comAA';
Query OK, 0 rows affected (0.17 sec)            #创建用户root在192.168.100.99上能访问数据库,并设置密码123.comAA

mysql> grant all on test50.* to 'root'@'192.168.100.99';
Query OK, 0 rows affected (0.05 sec)            #给刚创建的用户root赋予test50数据库的所有权限

mysql> revoke all on test50.* from 'root'@'192.168.100.99';
Query OK, 0 rows affected (0.09 sec)            #撤销用户"'root'@'192.168.100.99'"在数据库test50中的所有权限

mysql> drop user 'root'@'192.168.100.99';
Query OK, 0 rows affected (0.09 sec)            #删除用户"'root'@'192.168.100.99'"

mysql> create user 'root'@'%' identified by '123.comAA';
Query OK, 0 rows affected (0.18 sec)            #创建用户root在所有IP下均能访问数据库,密码为123.comAA

mysql> grant all on test50.* to 'root'@'%';
Query OK, 0 rows affected (0.01 sec)            #给刚刚创建的用户root赋予所有权限

mysql> exit                                     #退出数据库连接
Bye