1.MySQL 简介
约 3489 字大约 12 分钟
2025-05-27
存储数据为什么不使用文件而是使用数据库呢?文件存储有一些显见的缺点:
- 不利于文件安全
- 不利于数据查询和数据管理(文件没有给程序员提供良好的数据管理能力,都需要程序员来在代码中做繁琐的操作)
- 不利于海量数据存储
- 不利于程序控制
我们可以使用数据库来解决这些问题。
主流的数据库有:
SQL Server
:微软产品,深受.Net
程序员喜欢,适用于中大型项目Oracle
:甲骨文产品,适合大型项目,复杂业务逻辑和并发可能不如MySQL
MySQL
:甲骨文产品,最受欢迎的数据库,并发性好,但是不适用于复杂的业务逻辑PostgreSQL
:加州大学伯克利分校计算机系开发的关系型数据库,可私用、商用、学术研究用,并且可以任意修改和分发SQLite
:轻型数据库,遵循ACID
的关系型数据库管理系统,包含在一个相对小的C
库中,其设计目的是嵌入式的,占用资源较低,常用于嵌入式设备H2
:用Java
开发的嵌入式数据库,本身是一个类库,可直接嵌入应用项目中
2.MySQL 安装
由于我的 MySQL
主要是用在 Linux
的,所以这里只简单介绍一下云服务器下使用 XShell
关于 CentOS 7
的 MySQL
安装,其他操作系统的可能需要其他的方法。
2.1.切换用户
一般涉及到启动系统服务的操作都需要使用 root
权限,因此您最好提前切换到 root
账户。
2.2.检查环境
- 使用
ps ajx | grep mysql或mariadb
检查是否存在mysql或mariadb
(会显示一串目录),有就无需看后续的安装了。 - 但是如果您想体验一下下载
MySQL
的流程,请使用systemctl stop mysql或mariadb.service
指令停止mysql或mariadb
服务。 - 然后使用
rpm -qa | grep mysql
检查mysql或mariadb
的安装包 - 使用
rpm -qa | grep mysql或mariadb | xargs yum -y remove
卸载这些关于mysql
的安装包,此时您的系统就成功卸载了MySQL或mariadb
。
补充:
MariaDB
是一个开源的关系型数据库管理系统(RDBMS
),它是 MySQL 的一个分支,由MySQL
的创始人之一Michael Widenius
(又称Monty
)创建。MariaDB
基于MySQL
的代码,并且在GPL
许可证下发布,使得它可以免费使用和分发。MariaDB
旨在提供高性能、可扩展性、稳定性和安全性。
MariaDB
和MySQL
拥有类似的命令和语法,而且它们非常相似,但是MariaDB
包含了一些新的功能,例如更好的性能、更好的安全性、更好的可扩展性和更丰富的功能。MariaDB
中还包含一些MySQL
没有的特性,例如虚拟列、动态列、回收站等功能。此外,MariaDB 也支持多个存储引擎,例如InnoDB
、MyISAM
、XtraDB
等。
MariaDB
还提供了与MySQL
兼容的API
和命令行工具,使得用户可以很容易地将其现有的MySQL
数据库迁移到MariaDB
上。对于使用MySQL
的应用程序或网站,转换到MariaDB
也非常简单。
2.3.更新 yum 源
在 MySQL 官方链接上 查找适合自己的
MySQL yum
源版本(否则有可能出现兼容问题)。[FILE] mysql80-community-release-el7-..> 18-Apr-2018 05:24 25k [FILE] mysql80-community-release-el7-..> 23-Aug-2023 17:38 11k [FILE] mysql80-community-release-el7-..> 18-Jan-2019 06:02 25k [FILE] mysql80-community-release-el7-..> 24-Apr-2019 18:29 25k [FILE] mysql80-community-release-el7-..> 04-Nov-2021 10:25 7k [FILE] mysql80-community-release-el7-..> 14-Jan-2022 10:21 11k [FILE] mysql80-community-release-el7-..> 24-Apr-2022 13:02 11k [FILE] mysql80-community-release-el7-..> 26-Aug-2022 18:56 11k [FILE] mysql80-community-release-el7-..> 25-Jul-2023 18:43 11k [FILE] mysql80-community-release-el7-..> 25-Jul-2023 18:41 11k [FILE] mysql80-community-release-el7.rpm 23-Aug-2023 17:38 11k
或者右键该网页界面,然后“查看网页源代码”,可以显示较多的信息
<IMG SRC="/icons/generic.gif" ALT="[FILE]"> <A HREF="mysql57-community-release-el5-7.noarch.rpm">mysql57-community-release-el5-..></A> 12-Nov-2015 07:58 8k <IMG SRC="/icons/generic.gif" ALT="[FILE]"> <A HREF="mysql57-community-release-el5-8.noarch.rpm">mysql57-community-release-el5-..></A> 07-Apr-2017 07:28 24k <IMG SRC="/icons/generic.gif" ALT="[FILE]"> <A HREF="mysql57-community-release-el5.rpm">mysql57-community-release-el5.rpm</A> 07-Apr-2017 07:28 24k <IMG SRC="/icons/generic.gif" ALT="[FILE]"> <A HREF="mysql57-community-release-el6-10.noarch.rpm">mysql57-community-release-el6-..></A> 07-Apr-2017 07:28 25k <IMG SRC="/icons/generic.gif" ALT="[FILE]"> <A HREF="mysql57-community-release-el6-11.noarch.rpm">mysql57-community-release-el6-..></A> 27-Apr-2017 10:45 25k <IMG SRC="/icons/generic.gif" ALT="[FILE]"> <A HREF="mysql57-community-release-el6-7.noarch.rpm">mysql57-community-release-el6-..></A> 12-Nov-2015 07:58 9k <IMG SRC="/icons/generic.gif" ALT="[FILE]"> <A HREF="mysql57-community-release-el6-8.noarch.rpm">mysql57-community-release-el6-..></A> 11-Apr-2016 09:13 9k <IMG SRC="/icons/generic.gif" ALT="[FILE]"> <A HREF="mysql57-community-release-el6-9.noarch.rpm">mysql57-community-release-el6-..></A> 12-Sep-2016 13:05 9k <IMG SRC="/icons/generic.gif" ALT="[FILE]"> <A HREF="mysql57-community-release-el6.rpm">mysql57-community-release-el6.rpm</A> 27-Apr-2017 10:45 25k <IMG SRC="/icons/generic.gif" ALT="[FILE]"> <A HREF="mysql57-community-release-el7-10.noarch.rpm">mysql57-community-release-el7-..></A> 07-Apr-2017 07:28 25k <IMG SRC="/icons/generic.gif" ALT="[FILE]"> <A HREF="mysql57-community-release-el7-11.noarch.rpm">mysql57-community-release-el7-..></A> 27-Apr-2017 10:45 25k <IMG SRC="/icons/generic.gif" ALT="[FILE]"> <A HREF="mysql57-community-release-el7-7.noarch.rpm">mysql57-community-release-el7-..></A> 12-Nov-2015 07:58 9k <IMG SRC="/icons/generic.gif" ALT="[FILE]"> <A HREF="mysql57-community-release-el7-8.noarch.rpm">mysql57-community-release-el7-..></A> 11-Apr-2016 09:13 9k <IMG SRC="/icons/generic.gif" ALT="[FILE]"> <A HREF="mysql57-community-release-el7-9.noarch.rpm">mysql57-community-release-el7-..></A> 12-Sep-2016 13:05 9k <IMG SRC="/icons/generic.gif" ALT="[FILE]"> <A HREF="mysql57-community-release-el7.rpm">mysql57-community-release-el7.rpm</A> 27-Apr-2017 10:45 25k
这里我根据我的系统版本选择了 mysql57-community-release-el7-9.noarch.rpm(点击即可下载)
(1)这里的
57
是MySQL yum
源的版本(这个版本用的人较多)(2)
el
指CentOS
(3)
7-9
就是指CentOS 7-9
版本(如果您使用的是CentOS 7
系统但是没有找到对应的版本,就下载 mysql57-community-release-el7.rpm 即可)。然后得到一个
MySQL
的.rpm
后缀的文件。新建一个
MySQL
目录,如果您之前下载的安装包在Windows
下,就使用rz
指令将其上传到XShell
下的CentOS 7
系统内刚刚新建的MySQL
目录里。# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
# mkdir MySQL # cd MySQL # rz # ls mysql57-community-release-el7-9.noarch.rpm
接下来使用
rpm -ivh mysql57-community-release-el7-9.noarch.rpm
更新yum
源(可以使用ls /etc/yum.repos.d/ -l
来看文件列表前后是否发生变化)。# ls /etc/yum.repos.d/ -l total 52 -rw-r--r-- 1 root root 614 Jul 15 18:28 CentOS-Base.repo -rw-r--r-- 1 root root 1309 Nov 23 2020 CentOS-CR.repo -rw-r--r-- 1 root root 649 Nov 23 2020 CentOS-Debuginfo.repo -rw-r--r-- 1 root root 230 Jul 15 18:28 CentOS-Epel.repo -rw-r--r-- 1 root root 314 Nov 23 2020 CentOS-fasttrack.repo -rw-r--r-- 1 root root 630 Nov 23 2020 CentOS-Media.repo -rw-r--r-- 1 root root 1331 Nov 23 2020 CentOS-Sources.repo -rw-r--r-- 1 root root 8515 Nov 23 2020 CentOS-Vault.repo -rw-r--r-- 1 root root 616 Nov 23 2020 CentOS-x86_64-kernel.repo -rw-r--r-- 1 root root 1358 Sep 5 2021 epel.repo -rw-r--r-- 1 root root 1457 Sep 5 2021 epel-testing.repo # rpm -ivh mysql57-community-release-el7-9.noarch.rpm warning: mysql57-community-release-el7-9.noarch.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY Preparing... ################################# [100%] Updating / installing... 1:mysql57-community-release-el7-9 ################################# [100%] # ls /etc/yum.repos.d/ -l total 60 -rw-r--r-- 1 root root 614 Jul 15 18:28 CentOS-Base.repo -rw-r--r-- 1 root root 1309 Nov 23 2020 CentOS-CR.repo -rw-r--r-- 1 root root 649 Nov 23 2020 CentOS-Debuginfo.repo -rw-r--r-- 1 root root 230 Jul 15 18:28 CentOS-Epel.repo -rw-r--r-- 1 root root 314 Nov 23 2020 CentOS-fasttrack.repo -rw-r--r-- 1 root root 630 Nov 23 2020 CentOS-Media.repo -rw-r--r-- 1 root root 1331 Nov 23 2020 CentOS-Sources.repo -rw-r--r-- 1 root root 8515 Nov 23 2020 CentOS-Vault.repo -rw-r--r-- 1 root root 616 Nov 23 2020 CentOS-x86_64-kernel.repo -rw-r--r-- 1 root root 1358 Sep 5 2021 epel.repo -rw-r--r-- 1 root root 1457 Sep 5 2021 epel-testing.repo -rw-r--r-- 1 root root 1416 Sep 12 2016 mysql-community.repo #支持直接安装MySQL -rw-r--r-- 1 root root 1440 Sep 12 2016 mysql-community-source.repo #支持安装相关的资源
使用
yum list | grep mysql
检查是否已经更新,如果弹出很多的MySQL
相关资源文件,那就更新yum
源成功,而之前下载的mysql57-community-release-el7-9.noarch.rpm
就可以删除了(当然也可以选择不删除,主要是留着也没太多用处)。
2.4.安装 MySQL
使用 yum install -y mysql-community-server
一键安装 MySQL
即可。
2.5.安装问题
如果出现以下问题:
Failing package is: mysql-community-common-5.7.43-1.el7.x86_64
GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
那就是密钥过期的问题,可以使用下面命令来更新密钥:
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
然后重新使用 yum install -y mysql-community-server
即可。
2.6.检查安装
在 etc
下会多一个 my.cnf
文件,且使用 which mysql mysqld
可以打印出结果。
# which mysql mysqld
/usr/bin/mysql #这个是MySQL的客户端
/usr/sbin/mysqld #这个是MySQL的服务端
3.MySQL 启动
使用 systemctl start mysqld
启动 MySQL
的服务端,使用 ps
可以查看是否启动成功:
# systemctl start mysqld
# ps ajx | grep mysqld
1 8880 8879 8879 ? -1 Sl 27 0:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
10652 9013 9012 5510 pts/0 9012 S+ 0 0:00 grep --color=auto mysqld
此时可以使用 netstat -nltp
来查看端口号(后面会讲)
4.MySQL 登录
4.1.登录方法一
使用 sudo grep 'temporary password' /var/log/mysqld.log
获取临时 root
密码,较老的版本可以使用,新版本可能不行。然后使用 mysql -u root -p
输入临时密码即可,注意输入密码的时候不会回显。
4.2.登录方法二
直接使用 mysql -u root -p
登录。
4.3.登录方法三
使用 vim /etc/my.cnf
打开 MySQL
的配置文件,然后在文件的最后添加上 skip-grant-tables
选项,保存退出(该做法就是设置为“跳过密码验证”)。
使用 systemctl restart mysqld
重启 MySQL
服务,然后使用 mysql -u root -p
即可直接登录 MySQL
(可能还会显示输入密码,但是这次直接回车就可以)。
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.43
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>
补充:还可以直接使用一条
MySQL
指令而不登录客户端,只需要使用-D
指定数据库,-e
指定SQL
语句即可,例如mysql -u username -p -D my_database -e "SELECT * FROM users;"
4.4.登录方式四
还有一种最为常用的登陆方式就是直接使用编程语言的某些库来进行访问,这也是一种常见的方式,不过我们后面再来提及。
5.MySQL 配置
5.1.配置编码问题
打开 /etc/my.cnf
修改内容如下:
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
# ---My configuration_1---
# port=3306 # 可以不改,改了端口可能会出现一些问题,先使用默认的即可
# ------------------------
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# ---My configuration_2---
character-set-server=utf8
default-storage-engine=innodb
# ------------------------
然后使用 systemctl restart mysqld
重启 MySQL
服务即可。
5.2.配置开机启动
使用 systemctl enable mysqld
和 systemctl daemon-reload
即可。但是有一说一,云服务器一般不需要关机,几乎用不到这个功能。
5.3.配置远程连接
取得检查远程主机
IP
地址确认端口
3306
是MySQL
服务器监听的端口确保您的机器可以
ping
通远程MySQL
服务器的IP
地址。在远程服务器上使用
sudo systemctl status mysql
指令,检查MySQL
服务是否正在运行在远程
MySQL
服务器上,检查配置文件(通常是/etc/mysql/my.cnf
或/etc/mysql/mysql.conf.d/mysqld.cnf
),确保bind-address
参数设置为0.0.0.0
以允许远程连接在远程
MySQL
服务器上,检查防火墙是否允许来自你的IP
地址的3306
端口的流量。如果使用的是ufw
,可以使用sudo ufw allow 3306
开放3306
端口确保用户
ljp
有权限从您的IP
地址进行远程连接,可以本地登录到MySQL
服务器并使用SELECT Host, User FROM mysql.user WHERE User='user_name';
指令检查用户权限使用
sudo systemctl restart mysqld
重启MySQL
服务器在本地
MySQL
服务器上,使用SHOW VARIABLES LIKE 'bind_address';
指令查看MySQL
是否监听所有接口或仅监听本地接口
6.MySQL 作用
谈 MySQL
之前,我们需要先了解一些概念,其中,我们安装的 mysql
和 mysqld
对应数据库的客户端和服务端。
# 数据库的客户端和服务端
$ which mysql
/usr/bin/mysql
$ which mysqld
/usr/sbin/mysqld
补充:数据库的客户端和服务端区别类似于,我们平时称呼手机上的微信为“微信”,但实际上,“微信”并不仅仅是手机上的一个
app
,其背后一定有公司的后端服务。
因此 MySQL
本质是基于 CS
模式的一种网络服务,C
指 mysql
,S
指 mysqld
。
因此可以使用 netstat -lntp
查看当前 MySQL
绑定的端口号。
# 查看当前 MySQL 绑定的端口号
$ netstat -lntp
tcp6 0 0 :::3306 :::* LISTEN -
那 MySQL
究竟是什么服务呢?是提供数据存储服务的网络程序。
注意:注意一下术语的区分
MySQL
:提供数据存取的网络程序- 数据库:一般指的是,在磁盘或内存中存储的特定结构组织的数据(一套存储方案)
- 数据库服务:特指
mysqld