以下安装步骤基于阿里云 Linux 服务器,且使用 MySQL 5.7 版本。
先检查系统是否已经安装过 mysql 或是否有自带的 mysql 数据库
# rpm: 这是用于管理 RPM 包的命令行工具
# -qa: 这个选项告诉 RPM 命令查询系统上所有已安装的软件包
# |: 这是管道符号,用于将第一个命令的输出传递给第二个命令
# grep -i mysql: 这个部分使用 grep 命令来搜索包含 "mysql" 的文本,-i 表示不区分大小写,以便查找与 MySQL 相关的软件包
rpm -qa | grep -i mysql
# 上面的 rpm 命令只能查询到通过 rpm 包管理器安装的程序,如果是通过其他方式安装(比如源代码编译、或者其它第三方包管理器),就查询不到
# 所以可以需要再使用以下命令可查看正在运行的与 MySQL 相关的进程,确认是否安装了 MySQL
ps -ef | grep mysql
如果有 mysql 数据库存在,需要先停止 MySQL 的服务。所以先查询运行中的 MySQL 的服务
systemctl list-units --type=service | grep mysql
在查询结果中发现以下 2 个服务
依次停止 MySQL 相关服务
sudo systemctl stop mysqld.service
sudo systemctl stop mysqld_exporter.service
确认 MySQL 相关服务是否都已停止,如果查不到内容,说明都已停止。
systemctl list-units --type=service | grep mysql
接下来卸载掉 mysql 数据库的安装包,否则重复安装会出现报错。(安装包名称是最开始用 rpm -qa | grep -i mysql 命令检查出的)
# rpm: 这是用于管理 RPM 包的命令行工具
# -e: 这个选项告诉 rpm 命令要卸载一个已安装的软件包
# --nodeps: 这个选项告诉 rpm 命令在卸载软件包时不检查依赖关系。这意味着即使其他软件依赖于 MySQL 软件包,它们也不会阻止 MySQL 软件包的卸载。
rpm -e --nodeps mysql-5.7.32-linux-glibc2.12-x86_64
卸载后安装包后,查询所有 MySQL 的文件夹,然后对文件夹进行删除
# 该命令用于查找系统中与 MySQL 相关的程序、命令和文档的位置
# 当运行 whereis mysql 时,系统会返回类似以下的输出:mysql: /usr/bin/mysql /etc/mysql /usr/lib/mysql /usr/local/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz
# /usr/bin/mysql: 这是 MySQL 客户端程序的位置,通常用于与 MySQL 数据库进行交互。
# /etc/mysql: 这个目录通常包含 MySQL 的配置文件。
# /usr/lib/mysql: 这个目录可能包含 MySQL 的库文件。
# /usr/local/mysql: 这个目录通常是用户手动安装 MySQL 的位置,其中包含 MySQL 的二进制文件、库文件、配置文件等。
# /usr/share/mysql: 这个目录可能包含 MySQL 的共享数据和资源。
# /usr/share/man/man1/mysql.1.gz: 这是 MySQL 的手册页面文件的位置,用于查看 MySQL 客户端程序的帮助文档。
whereis mysql
# rm -rf 命令将会强制地递归删除这些目录及内容,rm -rf 是一个非常强大且危险的命令,它会永久删除指定的文件和目录,且无法恢复。
rm -rf /usr/lib64/mysql /usr/local/mysql /usr/share/mysql
# 验证是否删除完毕
whereis mysql
删除 MySQL 的数据目录,通常位于 /var/lib/mysql/,可以先 cd 到 /var/lib/ 目录看下。
sudo rm -rf /var/lib/mysql/
在系统内查询 MySQL 文件夹,确认是否删除干净了,把查询到的 MySQL 相关文件夹全部删除
# 从根目录开始查询
# -type d 是一个选项,用于指定 find 命令应该只搜索目录(directory)
# -name mysql 是另一个查询条件,用于指定搜索的文件或目录名称必须包含 mysql
sudo find / -type d -name mysql
#从某个文件夹目录开始查询
sudo find /var/etc -type d -name mysql
删除 MySQL 的配置文件,通常位于 /etc/my.cnf 或 /etc/mysql/my.cnf
rm -rf /etc/my.cnf
检查 linux 系统中有没有安装 libaio.so.1,如果没有的话,下面初始化数据库时会报错,所以需要先安装一下
# 检查 Linux 中是否安装了 libaio.so.1
# whereis libaio.so.1 命令用于查找系统中名为 libaio.so.1 的共享库文件的位置。
# libaio.so.1 是异步输入/输出(Asynchronous I/O)库的一个特定版本,它在许多 Linux 系统上用于支持异步 I/O 操作。
whereis libaio.so.1
# 如果没安装,则进行安装
# yum install -y libaio 命令的作用是在基于 RPM 包管理系统的 Linux 发行版上安装名为 libaio 的软件包,并使用 -y 参数自动确认安装过程中的提示信息。
yum install -y libaio
检查 mysql 的用户组和用户是否存在,如果没有,则创建
# 检查用户组是否存在
# cat /etc/group | grep mysql 命令的作用是在 /etc/group 文件中查找包含 "mysql" 字符串的行,并将结果输出到终端。
# cat /etc/group 用于显示 /etc/group 文件的内容,该文件包含了系统中所有组的信息。而 grep mysql 则是一个文本搜索工具,用于在输入中查找包含 "mysql" 的行。
# 如果有用户组存在,会输出这样的内容 mysql:x:1001:,这表示系统中存在一个名为 "mysql" 的组,其组ID为 1001。
cat /etc/group | grep mysql
# 检查用户是否存在
cat /etc/passwd | grep mysql
# 没有则创建
# 创建用户组。在执行 groupadd mysql 后,系统会在 /etc/group 文件中创建一个新的行,其中包含了名为 "mysql" 的用户组的相关信息,如组名、组 ID 等。
groupadd mysql
# 创建用户,并指定用户所属的起始的用户组(-r -g 的作用详见:https://blog.csdn.net/qq_32331073/article/details/76451664)
# -r 参数,它创建一个系统用户,也称为系统级用户或服务账户。系统用户通常用于运行特定的系统服务或应用程序,以提供安全和隔离的环境。
# -g mysql 参数指定了该用户的主要用户组为 "mysql",即将用户加入到名为 "mysql" 的用户组中。这样,用户 "mysql" 将继承该用户组的权限和配置。
useradd -r mysql -g mysql
一般我习惯于将软件安装在 /usr/local 目录下,所以先 cd 到该目录
cd /usr/local/
下载 MySQL 安装包文件
# wget 是一个在命令行中使用的下载工具,用于从网络上获取文件。(三个当中选一个下载即可)
wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz
wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz
wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
# 上面三个路径已经无效了,可以从官网下载(对应下图中的下载路径)
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz
当然也可以直接从 官网下载 对应版本,然后上传到 linux 系统的 /usr/local/ 目录下(上传方式多种多样,可自行百度)
正常情况下执行 wget 命令后应该开始下载文件,但如果 Linux 系统没有安装 wget 命令,则会报 wget:command not found 的错误,这种情况需要安装 wget
# yum -y install 命令的作用是在基于 RPM 包管理系统的 Linux 发行版上安装名为 wget 的软件包,并使用 -y 参数自动确认安装过程中的提示信息。
yum -y install wget
安装成功后会进行提示
这时候再次执行下载 MySQL 安装包文件的命令
# wget 是一个在命令行中使用的下载工具,用于从网络上获取文件。(三个当中选一个下载即可)
wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz
wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz
wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
# 上面三个路径已经无效了,可以从官网下载(对应下图中的下载路径)
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz
不出意外的应该会开始下载,文件下载成功如下
首先对下载好的安装包进行解压
# tar 是一个在命令行中使用的压缩和解压缩工具。在这个命令中,tar 以以下参数运行:
# -x: 解压缩模式,表示要从压缩文件中提取文件。
# -z: 使用 gzip 压缩格式解压缩文件,表示压缩文件是以 .gz 结尾的。
# -v: 显示详细信息,即在解压缩过程中显示每个文件的名称。
# -f: 指定要解压缩的文件名或路径。
tar -xzvf mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz
解压完成
将解压出的文件重新命名为 mysql
# mv 是一个用于移动或重命名文件和目录的命令,如果当前目录中存在名为 mysql 的文件或目录,则会将其覆盖或替换为 mysql-5.7.32-linux-glibc2.12-x86_64;如果不存在,则会将 mysql-5.7.32-linux-glibc2.12-x86_64 文件或目录重命名为 mysql。
mv mysql-5.7.32-linux-glibc2.12-x86_64 mysql
重命名成功
进入 mysql 文件夹
cd /usr/local/mysql
在 mysql 文件下创建 data 文件夹(下面编辑配置文件的时候会往 data 里面写入日志):
# mkdir 用于创建新的目录(文件夹),如果当前目录下不存在名为 data 的目录,那么将会创建一个新的名为 data 的目录;如果已经存在名为 data 的目录,则该命令将不会执行任何操作。
mkdir data
改变 mysql 目录下所有目录及文件夹所属的组和用户,以及权限
# 改变 /usr/local/mysql 目录所属的用户组和用户
# 用于更改文件或目录的所有者和所属组
# -R 递归地更改指定目录及其子目录和文件的所有者和所属组
# mysql:mysql: 指定新的所有者和所属组,格式为[用户]:[组]
chown -R mysql:mysql /usr/local/mysql
# 设置用户操作 /usr/local/mysql 目录的权限(chmod -R 755命令,详见:https://blog.csdn.net/abc_123_linbin/article/details/100529554/)
# chmod 用于更改文件或目录的权限
# -R 递归地更改指定目录及其子目录和文件的权限
# 755 指定新的权限。数字 755 是权限表示法中的一种形式,其中第一个数字表示所有者(owner)的权限,第二个数字表示所属组(group)的权限,第三个数字表示其他用户的权限。每个数字都是一个三位八进制数,其中每一位代表一个权限位(读取、写入、执行),分别对应数值为 4(读取)、2(写入)和 1(执行)。因此,755 表示所有者具有读取、写入和执行权限,而所属组和其他用户只有执行权限。
chmod -R 755 /usr/local/mysql
进入 mysql/bin 目录下
cd /usr/local/mysql/bin
进行安装
# ./mysqld 是启动 MySQL 服务器的命令
# --defaults-file=/etc/my.cnf 用于指定 MySQ 默认配置文件的位置,必须在第一个,否则会报 unknown variable 'defaults-file=/etc/my.cnf' 的错误
# --initialize 告诉 MySQL 初始化数据库
# --user=mysql 指定了 MySQL 服务器将以 mysql 用户的身份运行
# --basedir=/usr/local/mysql/ 参数指定了 MySQL 安装的基础目录
# --datadir=/usr/local/mysql/data 指定了 MySQL 数据文件存储的目录
./mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data
执行命令后,可能提示以下错误,这是 Linux-centos 版本的问题,有的版本缺少 libaio.so.1 文件,需要手动下载
./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
手动下载 libaio.so.1 文件
# 检查 Linux 中是否安装了 libaio.so.1
whereis libaio.so.1
# 如果没安装,则进行安装
yum install -y libaio
安装完成后可能会报以下错误,表示缺少 my.cnf 文件
mysqld: [ERROR] Could not open required defaults file: /etc/my.cnf
在 /etc/ 目录下,创建 my.cnf 文件
# touch 命令用于修改文件的访问和修改时间戳,如果指定的文件不存在,则会创建一个空文件。
# 在 MySQL 中,my.cnf 文件通常用于存储 MySQL 服务器的配置信息,包括数据库引擎、端口、日志文件位置等。然而,通过 touch 命令创建的空文件并没有包含任何配置信息,需要用户手动编辑该文件,并添加相应的配置信息才能发挥作用。
touch /etc/my.cnf
my.cnf 文件创建完成后 ,再次执行安装数据库的命令,本次应该会提示安装成功。初始化成功(记住红框中的密码,此为mysql管理员临时登录密码)
打开配置文件,按 i 进入修改模式
# vi 是一个强大的文本编辑器,用于在 Unix 和类 Unix 系统中编辑文本文件。通过执行 vi /etc/my.cnf 命令,系统将会使用 Vi 编辑器打开 /etc/my.cnf 文件,用户可以在其中添加、修改或删除 MySQL 服务器的配置参数,以满足特定的需求或要求。
# 编辑完成后,用户可以使用 Vi 编辑器的保存和退出命令(通常是按下 Esc 键,然后输入 :wq 并按下 Enter 键)保存所做的修改并退出编辑器。
vi /etc/my.cnf
添加配置如下
[mysqld]
datadir=/usr/local/mysql/data
port=3306
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
symbolic-links=0
max_connections=600
# 指定是否将每个表的数据单独存储。1 表示单独存储,0 表示关闭独立表空间,可以通过查看数据目录,查看文件结构的区别
innodb_file_per_table=1
# 指定是否区分大小写。1 表示存储时表名为小写,操作时不区分大小写;0 表示区分大小写;不能动态设置,修改后必须重启才能生效。
lower_case_table_names=1
# 设置数据库默认字符集,如果不设置默认为 latin1
character_set_server=utf8
socket=/usr/local/mysql/mysql.sock
[mysqld_safe]
log-error=/usr/local/mysql/data/mysql.log
pid-file=/usr/local/mysql/data/mysql.pid
# 因为之后的步骤里在启动数据库时会报错,当将上面的 "socket=/usr/local/mysql/mysql.sock" 注释才不报错了,据说是因为没有配置客户端的 socket 造成的。
# 所以我在这里添加了针对 [client]的 socket 配置,这样就不用注释上面的代码了
[client]
socket=/usr/local/mysql/mysql.sock
测试启动 MySQL 数据库
/usr/local/mysql/support-files/mysql.server start
如下结果,说明可以正常启动
将 mysql.server 文件 copy 到 init.d 里,并命名为 mysql
# 通过 cp(复制)命令将 MySQL 的服务控制脚本从其原始位置复制到系统服务目录 /etc/init.d/ 下,并将其命名为 mysql,以便系统能够通过该脚本来启动、停止和管理 MySQL 服务。
# 如果设置开机启动数据库,也是设需要将 mysql.server 复制到 init.d 里的
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
重启数据库
service mysql restart
可查看一下 MySQL 进程
# ps -ef | grep mysql 命令的作用是查找正在运行的与 MySQL 相关的进程
# ps 用于报告当前系统进程状态
# -ef 指定了显示所有进程的详细信息
# 通过使用管道符 | 将 ps -ef 的输出传递给 grep 命令,可以过滤出包含 "mysql" 关键字的进程信息
ps -ef | grep mysql
到此为止,说明 MySQL 安装并启动成功
先 cd 到 mysql 的 bin 目录
cd /usr/local/mysql/bin/
登录 mysql 数据库,密码为初始化时生成的临时密码
# 输入密码时,Enter password 后面不会有任何显示,此时实际是输入成功的,输入完密码后直接回车即可
./mysql -u root -p
输入密码后回车,可能报下面的错误
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
网上搜索了一番,说是 my.cnf 文件里配置了 socket,但是客户端没有配置 socket,将 my.cnf 里的 socket 配置删掉就可以了(后来我在上面的 my.cnf 文件里添加了客户端的 socket 的配置,现在已经不需要删除了)
打开配置文件,按 i 进入修改模式,删除 socket 的配置
# 编辑完成后,用户可以使用 Vi 编辑器的保存和退出命令(通常是按下 Esc 键,然后输入 :wq 并按下 Enter 键)保存所做的修改并退出编辑器
vi /etc/my.cnf
删掉了之后,重启数据库即可
service mysql restart
再次登录 myql 数据库,成功
./mysql -u root -p
为 root 用户设置密码(必须对安装时生成的临时密码进行重置,否则无法执行 SQL 语句)
set password for root@localhost = password('hmily');
使用 mysql 数据库(安装成功后,默认有 4 个数据库,其中一个数据库名称就叫 mysql)
--查看存在的数据库
show databases;
--使用数据库
use mysql;
在 MySQL 数据库中,user 表存储了所有用户的权限和连接信息。User 列表示用户名,Host 列表示允许连接到 MySQL 服务器的主机名或 IP 地址。
通过下面的代码,将 user 表中 User 列为 'root' 的记录的 Host 列值修改为 '%',表示允许 root 用户从任何主机连接到 MySQL 服务器,而不仅限于特定的主机。
update user set user.Host='%' where user.User='root';
刷新权限
flush privileges;
不执行下面的步骤,MySQL 数据库不会开机启动,需要人工启动。
赋予可执行权限
# 这个命令将 /etc/init.d/mysql 文件的权限更改为可执行
# chmod 是 Linux/Unix 中改变文件权限的命令
# +x 表示添加可执行权限
# /etc/init.d/mysql 是要修改权限的文件路径
chmod +x /etc/init.d/mysql
添加服务
# chkconfig 这是用于管理系统服务的命令
# --add mysql 这个部分告诉 chkconfig 命令将名为 "mysql" 的服务添加到系统服务管理中
chkconfig --add mysql
显示服务列表
# chkconfig --list 是一个用于查看系统中安装的服务及其运行级别配置的命令
chkconfig --list
# 启动 mysql 数据库
service mysql start
# 重启 mysql 数据库
service mysql restart
# 停止 mysql 数据库
service mysql stop
# 查看 mysql 数据库状态
service mysql status
# 查看数据库启用的端口
netstat -ntl