安装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
[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的启动服务
[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终端上进行错误日志的文件跟踪:
在另一个终端上启动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:创建软链接文件
3. 配置MySQL¶
o. 进入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