MySQL 的安装与卸载
# MySQL 的安装与卸载
以安装 MySQL 8.x.x 为例。
# Windows 下安装
Windows 下的 MySQL 不能用于生产,一般用于开发目的或者尝鲜体验。
# 安装 MySQL
我比较喜欢免安装版本的,轻便干净,删起来方便。
到官网的开发者专区下载 MySQL(Community版)免安装软件包:
- 下载地址 (opens new window)
- 安装包名字:mysql-8.0.28-winx64.zip
当前最新版本是 8.0,如果需要下载其它版本,可以点击页面中的 Looking for previous GA versions?(网站可能会更新,未来入口也许会变化)
# 解压压缩包
将下载的软件包解压并重命名到 D:\mysql-8.0
目录下。
├── mysql-8.0
│── bin
│── docs
│── include
│── lib
│── share
│── LICENSE
└── README
2
3
4
5
6
7
8
# 进入命令行终端
以 Window10 为例,有两种方法能以管理员身份运行 CMD 命令提示符:
- 在开始菜单上,单击鼠标右键,在出现的菜单中,选择 命令提示符(管理员) 点击打开这样即可。
- 点击开始菜单,在 Windows 系统中找到命令提示符,然后这时候在命令提示符上单击鼠标右键,选择以管理员身份打开命令提示符。
进入终端后,在终端中依次输入如下指令:
d:
cd D:\mysql-8.0\bin
2
# 初始化 MySQL
初始化可以选择带有随机密码或无密码,建议采用无密码初始化(可以设置密码),以免随机密码丢失。
# 随机密码
.\mysqld --initialize
# 无密码
.\mysqld --initialize-insecure
2
3
4
5
执行完初始化命令后,可以发现解压路径下多了一个 data
的文件夹,在里面找到 计算机名.err
的文件,并打开。如果你设置了随机密码,在里面就能找到初始密码:root@localhost: (这个位置的字符串就是临时密码)
。
# 安装 mysqld
继续在当前路径下执行下列命令,安装 Windows 服务:
.\mysqld -install
PS:mysql
用于执行 SQL 命令,mysqld
用于执行数据库命令:
# 启动 MySQL 服务
安装提示 success 后,可以准备启动数据库并连接了。
# 启动数据库
net start mysql
# 使用 root 连接数据库,没有密码的话直接回车即可
.\mysql -u root -p
# 关闭数据库
net stop mysql
2
3
4
5
6
7
8
# 添加/修改 root 账号登录密码
启动数据库并登录 MySQL:
net start mysql
.\mysql -u root -p
2
查询用户密码,可以看到,root 用户的密码是空的:
select host,user,authentication_string from mysql.user;
修改 root 用户的密码,执行命令:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
这里的密码就随意填写,生产环境不建议使用过于简单的 123456
、root
、admin
之类的密码。该命令执行完毕会得到结果:Query OK, 0 rows affected (0.01 sec)
。
接着需要继续执行命令:
flush privileges;
该命令作用是刷新 MySQL 的系统权限相关表,这样才能使刚刚的密码修改成功。
每次 MySQL 新设置用户或更改密码后都需要用 flush privileges;
来刷新 MySQL 的系统权限相关表,否则会出现拒绝访问。还有一种方法,就是重新启动 MySQL 服务,来使新设置生效。
退出登录,并重新登录,此时必须使用刚才添加的密码才能登录 MySQL:
# 退出登录
quit
# 重新登录
.\mysql -u root -p
2
3
4
5
# 卸载 MySQL
同样是以管理员身份运行命名提示符,先停止服务,然后执行卸载命令卸载:
net stop mysql
# 进入 MySQL 安装目录下的 bin/ 目录
.\mysqld --remove mysql
2
3
# Ubuntu 20.04 下安装
# 安装 MySQL
对于 Ubuntu 20.04 及以上版本,直接通过 apt install mysql-server
安装时就会安装 MySQL 8.0.x 版本。
# 以下命令均使用 root 用户
# 更新系统安装源
apt-get update
# MySQL 安装过程中可能需要用到系统对话框来配置一些信息,否则会跳过这些配置,后续会很麻烦
apt install dialog
# 安装 MySQL
apt install mysql-server
# 检查 MySQL 安装是否成功
mysql -V
# 查看 MySQL 启动状态,没启动就启动一下
service mysql status
# 初始化 MySQL 的相关配置
# 执行命令之后会出现需要设置的选项
# 对于是否开启密码验证组件,安全起见建议都 y,具体看个人需求
mysql_secure_installation
# 查看 MySQL 启动状态
service mysql status
# 测试登录 MySQL
mysql -uroot -p
# 修改 MySQL 的 home 目录,安装时默认创建的服务账户无 home 目录,会在后续抛出警告:
# su: warning: cannot change directory to /nonexistent: No such file or director
service mysql stop
usermod -d /var/lib/mysql/ mysql
service mysql start
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
MySQL 的配置文件在 /etc/mysql/mysql.conf.d/mysqld.cnf
,如有需要可以去修改,记得修改后重启 MySQL 服务即可。
# 新建用户并分配权限
如果在 MySQL 中创建用户时想要使用简单密码,则修改 MySQL 配置文件:
vim /etc/mysql/mysql.conf.d/mysqld.cnf`
在文件末添加如下内容:
[mysqld]
...
#
# * Validate Settings
#
validate_password.policy=LOW
2
3
4
5
6
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary
保存并关闭文件,重启 MySQL 服务使更改生效。
# 重启服务
service mysql restart
# 登录 MySQL
mysql -uroot -p
# 查看当前的密码策略要求,确认 validate_password.policy 的值
SHOW VARIABLES LIKE 'validate_password%';
2
3
4
5
6
在 MySQL 中新建用户的步骤如下:
# 以下命令均使用 root 用户
# 登录 MySQL
mysql -uroot -p
# 新建用户("主机名" 指允许访问 MySQL 的主机,如果想允许来自任何主机的访问,可以使用 "%")
CREATE USER '[用户名]'@'[主机名]' IDENTIFIED BY '[密码]';
# 对安全不严格的话就通过下面命令创建 developer 用户:
CREATE USER 'developer'@'%' IDENTIFIED BY 'password';
# 将所有权限授予新用户的命令
GRANT ALL PRIVILEGES ON [数据库名].[表名] TO '[用户名]'@'[连接地址]' WITH GRANT OPTION;
# 或者指定增删改查权限
GRANT SELECT, UPDATE, DELETE, INSERT ON [数据库名].[表名] TO '[用户名]'@'[连接地址]' WITH GRANT OPTION;
# 对安全不严格的话就通过下面命令把所有数据库的所有表的所有权限给 developer 用户:
GRANT ALL PRIVILEGES ON *.* TO 'developer'@'%' WITH GRANT OPTION;
# 如果要使用 root 用户撤销权限
REVOKE ALL PRIVILEGES FROM [用户名];
# 刷新权限,每一次权限更改后都刷新一下
FLUSH PRIVILEGES;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 卸载 MySQL
# 以下命令均使用 root 用户
# 停止所有 MySQL 服务
service mysql stop
# 检查所有已安装的 MySQL 软件包,并确认是否有多于一个软件包
dpkg --list | grep mysql
# 通过软件包名称来删除软件包(把上面列出来的几个全删了)
apt-get remove --purge mysql-client-8.0 mysql-client-core-8.0 mysql-common mysql-server mysql-server-8.0 mysql-server-core-8.0
# 删除 MySQL 配置文件和数据
rm -rf /etc/mysql /var/lib/mysql
# 删除不再需要的依赖项
apt-get autoremove
# 清理下载的软件包缓存
apt-get autoclean
# 删除安装 MySQL 时自动创建的 mysql 这个服务账户
userdel -r mysql
# 显示出所有的含有 mysql 文件名的路径,逐一手动删除掉
find / -name mysql -print
# 验证卸载结果
mysql --version
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# CentOS 7.6 下安装
# 安装对比
MySQL 有两种安装方式:
- yum 安装:安装过程人为无法干预,不能按需安装。rpm 包里面有什么就安装什么,安装的版本也比较低。
- 源码包安装:分为编译安装和免编译安装:可以设定参数,按照需求进行安装,并且安装的版本,可以自己选择,灵活性比较大。
这里我们采用源码包 - 免编译的方式安装 MySQL。
# 下载并解压安装包
MySQL 源码包下载地址:https://dev.mysql.com/downloads/mysql/ (opens new window)
CentOS 是基于红帽的,因此操作系统选择 Red Hat,OS 版本选择 Linux 7 (x86, 64-bit)。
选择 Compressed TAR Archive 点击 Download,获取到下载链接如下:
https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.28-el7-x86_64.tar.gz
登录服务器,切换到 /opt
目录并新建一个 mysql
文件夹,下载 MySQL 安装包(如果下载慢的话,可以在本地下载后传到服务器):
# 切换目录
cd /opt
# 新建一个文件夹用于放 mysql
mkdir mysql
# 切换目录
cd mysql/
# 下载安装包
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.28-el7-x86_64.tar.gz
2
3
4
5
6
7
8
解压并重命名:
# 解压
tar -zxvf mysql-8.0.28-el7-x86_64.tar.gz
# 重命名,原来的名字太长了
mv ./mysql-8.0.28-el7-x86_64 mysql-8.0
2
3
4
# 创建数据文件夹以及用户并赋予权限
以下步骤需要在 /opt/mysql/
目录下执行。
创建数据文件夹:
# 创建 data 目录(用于放置 mysql 数据文件)
mkdir data
2
创建用户组,并授权操作:
# 为 MySQL 创建一个不能 ssh 登陆的用户,且不创建用户主目录
useradd mysql -s /sbin/nologin -M
# 修改文件所有者
chown -R mysql:mysql /opt/mysql/
2
3
4
在 useradd 命令后跟了两个参数,它们分别表示:
- -s:表示指定用户所用的 shell,此处为
/sbin/nologin
,表示不登录- -M:表示不创建用户主目录
# 初始化数据库
以下步骤需要在 /opt/mysql/
目录下执行。
初始化数据库:
/opt/mysql/mysql-8.0/bin/mysqld --initialize --user=mysql --basedir=/opt/mysql/mysql-8.0/ --datadir=/opt/mysql/data/ --lower_case_table_names=1
MySQL 8.0 后,在 Linux 端,对于
lower_case_table_names
参数,只又在初始化的时候设置才有效,若初始化的时候没设置,后面修改配置文件后再启动服务就会报错了。
在这行命令的输出中,这里我们会看到初始密码(应该实在最后一行),记下来:
A temporary password is generated for root@localhost: (这个位置的字符串就是临时密码)
# 创建 MySQL 配置文件 my.cnf
通过阅读 support-files/mysql.server
这个脚本知道,如果我们的 MySQL 不是安装在默认的 /usr/local/mysql
里,就需要新建一个 /etc/my.cnf
文件,在 [mysqld]
段中设置 basedir
参数。
新建文本文档 my.cnf
:
# 该配置文件必须建立在该目录下
vim /etc/my.cnf
2
将下面的内容添加到该配置文件中(此处是学习用的配置示例,生产环境需要根据实际情况定制,详细参数见官网 (opens new window)):
[mysqld]
# mysql 服务的唯一编号,每个 mysql 服务 id 需唯一
server-id=1
# mysql 服务端口号,默认 3306
port=3306
# mysql 安装目录,默认 /usr
basedir=/opt/mysql/mysql-8.0
# mysql 数据文件放置位置
datadir=/opt/mysql/data
# 记录的是当前 mysqld 进程的 pid
pid-file=/opt/mysql/mysql-8.0/mysql.pid
# 设置 socket 文件所在目录
socket=/opt/mysql/mysql-8.0/mysql.sock
# 设置用来保存临时文件的目录
tmpdir=/opt/mysql/mysql-8.0/tmp
# 用户
user=mysql
# 允许访问的 IP 网段(系统默认配置监听所有网卡,即允许所有 IP 访问)
# 生产环境下建议设置为:127.0.0.1(只允许本机访问)或某个网卡的 IP
bind-address=0.0.0.0
# 数据库默认字符集为 utf8,并支持一些特殊表情符号(占用 4 个字节)
character-set-server=utf8mb4
# 数据库字符集对应一些排序等规则,注意要和 character-set-server 对应
collation-server=utf8mb4_general_ci
# 是否对 sql 语句大小写敏感,1 表示不敏感
lower_case_table_names=1
# 允许最大连接进程数
max_connections=400
# 最大错误连接数,这是为了防止有人从该主机试图攻击数据库系统
# 如果某个用户发起的连接 error 超过该数值,则该用户的下次连接将被阻塞,直到管理员执行 flush hosts
max_connect_errors=100
# TIMESTAMP 如果没有显示声明 NOT NULL,允许 NULL 值
explicit_defaults_for_timestamp=true
# SQL 数据包发送的大小,如果有 BLOB 对象建议修改成 1G
max_allowed_packet=128M
# MySQL连接闲置超过一定时间后(秒)将会被强行关闭
# MySQL 默认的 wait_timeout 值为 8 个小时,interactive_timeout 参数需要同时配置才能生效
interactive_timeout=1800
wait_timeout=1800
# 内部内存临时表的最大值,设置成 128M
# 比如大数据量的 group by,order by 时可能用到临时表
# 超过了这个值将写入磁盘,系统 IO 压力增大
tmp_table_size=128M
max_heap_table_size=128M
# 数据库错误日志文件
log-error=/opt/mysql/mysql-8.0/err/mysqld.err
# 数据库日志文件存放的位置(一般不会开启该功能,因为 log 的量会非常庞大)
general_log_file=/opt/mysql/mysql-8.0/log/mysql.log
# 日志文件是否开启(0 是关闭、1 是开启)
general_log=0
[client]
# 默认路径是在 /tmp/mysql.sock
# 因为我们修改了默认的路径,所以需要在 [client] 段再指定一下
# 如果不指定,虽然数据库能正常启动,但使用 mysql 命令时还是会报找不到 mysql.sock 错误
socket=/opt/mysql/mysql-8.0/mysql.sock
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
创建配置文件中所需的目录:
mkdir /opt/mysql/mysql-8.0/err /opt/mysql/mysql-8.0/tmp
echo "" > /opt/mysql/mysql-8.0/err/mysqld.err
# 新建了文件,需要再次修改文件所有者
chown -R mysql:mysql /opt/mysql/
2
3
4
# 配置全局环境变量
MySQL 命令默认读取的是 /usr/local/bin
目录,由于我们修改了 MySQL 的默认安装路径。为了可直接使用 mysql
命令,而不用 /opt/mysql/mysql-8.0/bin/mysql
这样一大串,可以添加环境变量:
vim /etc/profile
在最下面添加这两行代码:
# MySQL
export PATH=$PATH:/opt/mysql/mysql-8.0/bin
2
保存文件后,执行刷新操作:
source /etc/profile
# 启动 MySQL 服务并修改密码
# 启动 MySQL 服务
/opt/mysql/mysql-8.0/support-files/mysql.server start
# 登录 root 用户,记得输入之前默认生成的密码
mysql -uroot -p
2
3
4
5
通过下面这句代码就可直接修改密码,不用像之前的老版本一样那么复杂:
# 注意跟 5.7 版本的改密命令不同
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
2
接着需要继续执行命令:
# 刷新权限
flush privileges;
2
# 开机自启配置
下面的命令是将服务文件拷贝到 /etc/init.d/
下,并重命名为 mysqld
:
cp /opt/mysql/mysql-8.0/support-files/mysql.server /etc/init.d/mysqld
赋予可执行权限:
chmod +x /etc/init.d/mysqld
添加服务:
chkconfig --add mysqld
显示服务列表:
chkconfig --list
注:如果看到 mysqld 的服务,并且 3,4,5 都是 on
的话则成功,如果是 off
,则:
chkconfig --level 345 mysqld on
测试开机自启,重启电脑:
reboot
# 重启后查看 mysql 服务是否开机自启
ps -ef | grep mysql
2
3
接下来可以通过一些命令操作 MySQL 服务:
- 启动 MySQL 服务:
service mysql start
- 停止 MySQL 服务:
service mysql stop
- 查看错误日志(如果上面两个命令执行后没效果):
systemctl status mysqld
# 开放远程连接
先通过 mysql -uroot -p
命令连接 MySQL,然后在 MySQL 窗口下执行如下命令:
# 选择 mysql 这个数据库
use mysql;
# 查看原来数据,方便修改以后重置回来
select host, user, authentication_string, plugin from user;
# 修改值
update user set host='%' where user='root' limit 1;
# 刷新权限
flush privileges;
2
3
4
5
6
7
8
host='%'
指的是允许访问 MySQL 的 IP,默认是localhost
或127.0.0.1
,可以指定具体的某个 IP,也可以是%
(所有 IP 均可访问)。user='root'
表示用于访问 MySQL 的用户名,可以改为你自己定义的用户名。
如果使用 Navicat 连接时报 2003 - Can't connect to MySQL server on ...
错误,就要先看下服务器是不是开启了防火墙但又没开放端口(你可以选择不开防火墙,或者开完防火墙后记得开放 MySQL 监听的端口号)。
# 查看状态,发现当前是 dead 状态,即防火墙未开启
systemctl status firewalld
# 开启防火墙,没有任何提示即开启成功
# 再次查看状态,显示 running 即已开启了
systemctl start firewalld
# 开放默认端口号 3306,提示 success,表示设置成功
firewall-cmd --permanent --zone=public --add-port=3306/tcp
# 修改后需要重新加载配置才生效
firewall-cmd --reload;
# 查看已经开放的端口
firewall-cmd --permanent --list-port
# 关闭默认的端口号 3306(如果需要的话,执行这个命令就行了)
firewall-cmd --permanent --zone=public --remove-port=3306/tcp
# 关闭防火墙(如果需要的话,执行这个命令就行了)
systemctl stop firewalld
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
另外,如果使用的是阿里云等云厂家的服务器,无法连接的原因可能是需要去云管理平台进行一些设置。大致的入口是:
进入云服务管理控制平台 ——> 进入云服务器 ——> 选择实例 ——> 管理。
- 阿里云就找到:本实例安全组 --> 配置规则 --> 添加安全组规则,端口范围写
3306/3306
,授权对象写0.0.0.0/0
。 - 腾讯云就找到:防火墙 --> 管理规则 --> 添加规则,应用类型下拉框选择 MySQL(3306) 就可以了。
- 如果改了 MySQL 的默认端口,或者想进行更多限制,或者是别的云服务商,稍微摸索下即可,这个没多少坑。
# 卸载 MySQL
首先输入命令 ps -ef | grep mysql
检查一下 MySQL 服务是否在运行,在卸载之前需要先停止服务:
service mysql stop
关闭并删除自启动脚本:
cd /etc/init.d
# 查看该服务进程状态
chkconfig --list mysqld
# 删除 chkconfig 管理的 MySQL 启动服务
chkconfig --del /etc/init.d/mysqld
# 删除自启动脚本
rm -rf /etc/init.d/mysqld
2
3
4
5
6
7
删除 MySQL 安装目录(如果是按照我上文的步骤安装, 删除安装目录的命令如下):
rm -rf /opt/mysql/
删除 MySQL 配置文件:
rm /etc/my.cnf
删除环境变量:
vim /etc/profile
删掉之前添加的 MySQL 相关的代码后,保存文件后,执行刷新操作:
source /etc/profile
find 查找相关文件并删除:
# 查找相关文件
find / -name mysql
# 判断是否能删除后,执行删除命令
...
2
3
4
5
删除 mysql 用户和用户组:
id mysql
userdel -rf mysql
groupdel mysql
2
3
注意:
-rf
参数表示删除当前已登陆的用户,并删除与其相关的所有文件。慎用
-r
选项,如果用户目录下有重要文件,删除前请备份。
# 参考资料
(完)