前言
Debian 系统据说 stable
版本稳定如狗,坚不可摧。自从 CentOS 消息发布之后相信很多人都转战成 Debian,现在就来说下怎么在 Debian 上安装 MySQL。
在 Linux 上安装 MySQL 的通用方式都是解压安装,配置用户、权限以及数据目录。这种安装方式可以高度定制,但是对于小白来说很容易出错,所以,不推荐。
而 Debian 提供了 APT 包管理器,我们借助 APT 包管理器安装 mysql 就会无比的简单,仅仅需要几个命令。在 Debian 上安装 mysql 主要推荐如下两种安装方式:
- 使用
APT
包管理安装 - 使用
.deb-bundle
文件进行安装
注意:APT 包管理安装方式需要使用网络下载,而 mysql 又是国外产品。对于网络不够自信的童鞋推荐使用 .deb-bundle
方式进行安装。
准备工作
首先进入 MySQL 官网 ,在 MySQL 官网首页点击 DOWNLOADS 进入下载页面:
点击下载页面下方的 MySQL Community (GPL) Downloads »
:
点击后就会进入操作系统选择页面:
到这里就要选择是使用 APT
安装还是使用 .deb-bundle
文件进行安装了。
如果使用 APT
安装点击 MySQL APT Repository
就会进入对应的下载页面:
如果想要使用 .deb-bundle
文件进行安装需要点击 MySQL Community Server
进入对应的文件下载页面(默认展示的是当前最新版本):
安装 MySQL
对于网络好的童鞋在 Debian 系统上安装 MySQL 推荐使用 APT
进行安装,因为借助 APT
包管理器安装起来很简单。
网络不好的同学可以使用下载工具(如迅雷)将 .deb-bundle
文件下载到本地之后再上传至 Debian 进行安装。
与 Ubuntu 不同的是,Ubuntu 最新版(当前是 20)使用 APT
只能安装 MySQL 8.0 无法安装 5.7 版本。但是 Debian 最新版本(当前最新版本 10)却不受这个限制,可以随意选择 8.0 和 5.7。
在 Debian 上使用 APT
安装虽然很简单但是需要联网,而 MySQL 又是国外的软件,所以对于网络不够自信的同学还是建议使用 .deb-bundle
进行安装。
使用 APT 安装
下载 APT 源
Debian 官方镜像库不提供 MySQL 软件包,所以我们需要到 MySQL 官网下载源信息导入到系统中。
首先进入操作系统选择页面,因为我们是 Debian 所以选择 APT Repository,进入即可:
点击右侧的下载即可,比如我这里是在 /opt/mysql
目录:
sudo wget https://dev.mysql.com/get/mysql-apt-config_0.8.16-1_all.deb
下载完成后看下文件:
$ ls
mysql-apt-config_0.8.16-1_all.deb
开始安装
执行如下命令:
sudo dpkg -i mysql-apt-config_0.8.16-1_all.deb
接着就进入预配置界面:
在预配置页面可以设置要安装的版本,比如我这里要安装的是 mysql-5.7,所以 「Enter」进入选择:
选择好版本后 「Enter」进行确认,之后选择 OK 退出。
执行命令刷新源:
sudo apt-get update -y
现在就可以执行如下命令安装了,因为在之前已经做过预配置所以执行如下命令安装的就是之前预配置时选择的版本。如果不相信可以使用 apt search mysql-server
命令查看。
sudo apt-get install -y mysql-server
接着就会有一个设置 root 用户密码的提示:
不过,这里不建议设置。因为之后我们需要进行一下安全设置,在安全设置后会重新设置 root 用户密码。所以直接跳过即可。
在安装过程中什么都不要操作,一切默认即可,静静地等待执行完成,执行完成之后即表示安装完成了
安装完成之后就来看下 MySQL 进程信息:
$ ps -ef | grep mysql
mysql 3665 1 1 11:57 ? 00:00:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
webuser 3776 1068 0 11:58 pts/0 00:00:00 grep mysql
另外也可以使用 systemctl
命令查看服务状态:
$ systemctl status mysql
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2021-02-27 11:57:50 EST; 39s ago
Main PID: 3665 (mysqld)
Tasks: 27 (limit: 2330)
Memory: 177.8M
CGroup: /system.slice/mysql.service
└─3665 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
之后我们需要执行 安全设置 操作。
使用 Deb-Bundle 文件进行安装
下载安装包
按照上面的说明进入 MySQL Community Server
页面,在这个页面中默认的 MySQL 是最新版本(当前是 v8.0.23),如果想要选择其他版本可以点击 Archives
或者 Looking for previous GA versions?
这里我要选择的是 v5.7 所以我点击 Archives
进入归档页面。在归档页面选择 MySQL5.7 版本,操作系统选择 Debian 就会列出所有的适用文件:
在列出的文件中需要找到 DEB BUNDLE
文件,可以看到文件名都是以 .deb-bundle.tar
结尾。
另外,在下载时注意自己的操作系统的位数。文件下载完成后上传至自己的操作系统中,我这里上传的位置在 /opt/mysql
目录下:
$ cd /opt/mysql
$ ls
mysql-server_5.7.33-1debian10_amd64.deb-bundle.tar
开始安装
现在我们需要做的就是解压这个 .deb-bundle.tar
文件:
sudo tar -xvf mysql-server_5.7.33-1debian10_amd64.deb-bundle.tar
解压成功后可以看下解压文件:
$ ls
libmysqlclient-dev_5.7.33-1debian10_amd64.deb mysql-community-server_5.7.33-1debian10_amd64.deb
libmysqlclient20_5.7.33-1debian10_amd64.deb mysql-community-source_5.7.33-1debian10_amd64.deb
libmysqld-dev_5.7.33-1debian10_amd64.deb mysql-community-test_5.7.33-1debian10_amd64.deb
mysql-client_5.7.33-1debian10_amd64.deb mysql-server_5.7.33-1debian10_amd64.deb
mysql-common_5.7.33-1debian10_amd64.deb mysql-testsuite_5.7.33-1debian10_amd64.deb
mysql-community-client_5.7.33-1debian10_amd64.deb
这些文件包括服务端、客户端以及测试文件。
安装是需要依赖于 libaio1
软件包,如果当前机器上还没有需要进行安装:
sudo apt-get install -y libaio1
现在我们需要预先配置下的软件包:
sudo dpkg-preconfigure mysql-community-server_*.deb
在预配置软件包时可能会让你设置下 root
用户的密码:
建议直接 「Enter」键跳过。因为在后续步骤会进行重新设置 root
用户的密码。
之后就可以执行安装命令安装这个文件了:
sudo dpkg -i mysql-{common,community-client,client,community-server,server}_*.deb
在安装过程中如果提示类似如下的依赖问题
dpkg: dependency problems prevent configuration of mysql-community-client:
mysql-community-client depends on libtinfo5 (>= 6); however:
Package libtinfo5 is not installed.
dpkg: error processing package mysql-community-client (--install):
dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of mysql-client:
mysql-client depends on mysql-community-client (= 5.7.33-1ubuntu18.04); however:
Package mysql-community-client is not configured yet.
dpkg: error processing package mysql-client (--install):
dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of mysql-community-server:
mysql-community-server depends on mysql-client (= 5.7.33-1ubuntu18.04); however:
Package mysql-client is not configured yet.
mysql-community-server depends on libmecab2; however:
Package libmecab2 is not installed.
dpkg: error processing package mysql-community-server (--install):
dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of mysql-server:
mysql-server depends on mysql-community-server (= 5.7.33-1ubuntu18.04); however:
Package mysql-community-server is not configured yet.
dpkg: error processing package mysql-server (--install):
dependency problems - leaving unconfigured
可以执行如下命令进行修复,之后再次执行上面的安装命令进行安装。
sudo apt-get -f -y install
安装完成之后就来看下 MySQL 进程信息:
$ ps -ef | grep mysql
mysql 222312 1 0 15:49 ? 00:00:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
webuser 223156 218766 0 15:58 pts/1 00:00:00 grep --color=auto mysql
另外也可以使用 systemctl
命令查看服务状态:
$ ps -ef | grep mysql
mysql 4145 1 0 12:13 ? 00:00:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
webuser 4258 1068 0 12:14 pts/0 00:00:00 grep mysql
webuser@debian:/opt/mysql$ systemctl status mysql
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2021-02-27 12:13:33 EST; 1min 31s ago
Main PID: 4145 (mysqld)
Tasks: 27 (limit: 2330)
Memory: 177.2M
CGroup: /system.slice/mysql.service
└─4145 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
在预配置时有提示设置 root 用户密码,不过当时不建议设置。因为在安装完成后我们需要进行一些安全设置,这些设置就包括 root 用户密码,具体见 安全设置 。
安全设置
MySQL 安全设置包括初始化 root 用户的账户密码、设置验证密码强度以及测试数据库等等。现在就来开始设置:
sudo mysql_secure_installation
下面是输出以及验证信息:
VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?
Press y|Y for Yes, any other key for No:
这一步是要求设置验证密码强度,输入 y/Y
表示设置。
密码强度包括三级:
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
根据需要设置,不过如果是在生产环境强烈要求设置。如果是本地的话直接「Enter」跳过吧。
Please set the password for root here.
New password:
这一步是要求设置 root 用户的密码,不能直接「Enter」跳过!!!!
Remove anonymous users? (Press y|Y for Yes, any other key for No) :
Mysql 本身包括一些测试数据以及用户,这一步表示是否删除测试(匿名)用户, y/Y
表示删除。
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) :
默认情况下,MySQL 的 root 不能使用远程机器登录,只能使用当前机器 localhost
进行登录。 y/Y
表示禁止 root 用户远程登录,其他表示允许登录。
实际上这一步设置的没有任何卵用,我不管设置禁止还是允许都无法使用远程机器登录。
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) :
MySQL 默认是保留一些测试数据,如果需要删除就输入 y/Y
。
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) :
是否使上面的配置立即生效,当然是 y/Y
了~
配置文件与目录说明
- 所有的配置文件都在
/ect/mysql
目录下:
$ ls /etc/mysql/
conf.d my.cnf my.cnf.fallback mysql.cnf mysql.conf.d
- 所有的二进制文件以及依赖包都在
/usr/bin
和/usr/sbin
目录下(可以使用如下命令查看)
$ ls /usr/bin/ | grep mysql
$ ls /usr/sbin/ | grep mysql
- 所有的数据都在
/var/lib/mysql
目录下:
$ sudo ls /var/lib/mysql
auto.cnf client-cert.pem ib_logfile0 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile1 mysql public_key.pem sys
ca.pem ib_buffer_pool ibdata1 performance_schema server-cert.pem
默认情况下,MySQL 下的用户是无法远程登录的(比如在其他机器上使用 JAVA 客户端连接),所以我们需要进行一些设置。首先呢,当然是需要在机器上使用 root 用户进行登录了:
$ sudo mysql -u root -p
Enter password:
之后就连接上 MySQL 服务了:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.33 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, 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 的用户信息:
- MySQL 5.7(注意
plugin
信息中加密码加密插件)
mysql> use mysql;
mysql> select host, user, plugin from user;
+-----------+---------------+-----------------------+
| host | user | plugin |
+-----------+---------------+-----------------------+
| localhost | root | auth_socket |
| localhost | mysql.session | mysql_native_password |
| localhost | mysql.sys | mysql_native_password |
+-----------+---------------+-----------------------+
3 rows in set (0.00 sec)
- MySQL 8.0(注意
plugin
信息中加密码加密插件)
mysql> use mysql;
mysql> select host, user, plugin from user;
+-----------+------------------+-----------------------+
| host | user | plugin |
+-----------+------------------+-----------------------+
| localhost | debian-sys-maint | caching_sha2_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session | caching_sha2_password |
| localhost | mysql.sys | caching_sha2_password |
| localhost | root | auth_socket |
+-----------+------------------+-----------------------+
5 rows in set (0.00 sec)
可以看到不管是 5.7 还是 8.0 root
用户的密码验证插件都是 auth_socket
,而且访问主机只允许使用 localhost
。
如果想要使用远程主机访问有两种方式:
- 修改 root 用户的密码验证插件,设置访问主机为
%
- 新建一个具有 root 权限的用户
在实际使用中,为了安全还是推荐创建一个新的具有 root 权限的用户了。现在分别说下:
方式一:修改 root 用户设置
修改密码验证插件
- MySQL5.7:
将 root 用户的密码验证插件设置为 mysql_native_password
:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Your Root Pwd';
- MySQL8.0
将 root 用户的密码验证插件设置为 caching_sha2_password
:
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'Your Root Pwd';
之后修改访问主机:
update user set host = '%' where user = 'root' and host = 'localhost';
%
表示允许所有主机访问,之后刷新下权限即可:
FLUSH PRIVILEGES;
再次看下用户信息:
- MySQL5.7:
mysql> select host, user, plugin from user;
+-----------+---------------+-----------------------+
| host | user | plugin |
+-----------+---------------+-----------------------+
| % | root | mysql_native_password |
| localhost | mysql.session | mysql_native_password |
| localhost | mysql.sys | mysql_native_password |
+-----------+---------------+-----------------------+
- MySQL8.0
mysql> select host, user, plugin from user;
+-----------+------------------+-----------------------+
| host | user | plugin |
+-----------+------------------+-----------------------+
| % | root | caching_sha2_password |
| localhost | debian-sys-maint | caching_sha2_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session | caching_sha2_password |
| localhost | mysql.sys | caching_sha2_password |
+-----------+------------------+-----------------------+
5 rows in set (0.00 sec)
方式二:创建一个 root 权限用户
为什么不推荐使用 root 用户?因为 root 用户太过透明,因为大家几乎都是使用 root 用户。所以为了安全还是建议新建一个具有 root 权限的用户(实际上个人使用也没啥安全可言😷),比如这里创建一个 administrator
用户:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'administrator'@'%' IDENTIFIED BY 'Your Pwd';
之后刷新权限即可:
FLUSH PRIVILEGES;
再来看下用户信息:
mysql> select host, user, plugin from user;
+-----------+---------------+-----------------------+
| host | user | plugin |
+-----------+---------------+-----------------------+
| % | root | mysql_native_password |
| localhost | mysql.session | mysql_native_password |
| localhost | mysql.sys | mysql_native_password |
| % | administrator | mysql_native_password |
+-----------+---------------+-----------------------+
还是无法远程登录?
如果使用 root 或者自定义用户还是无法登陆的话就需要看下配置文件了。
比如我这里的配置文件都在 /etc/mysql
目录下,你需要逐个找配置文件,看这些配置文件是否有配置 bind-address
。我这里是在 /etc/mysql/mysql.conf.d/mysqld.cnf
文件中:
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
默认情况下 bind-address
的值都是 127.0.0.1
,表示只允许本地主机访问。想要远程机器能够访问就需要将该配置注释掉重启 mysql 服务就好了。
服务启动与停止
查看服务启动状态
sudo systemctl status mysql
启动服务
sudo systemctl start mysql
停止服务
sudo systemctl stop mysql
重启服务
sudo systemctl restart mysql
设置开机自启
sudo systemctl enable mysql
取消开机自启
sudo systemctl disable mysql
卸载 MySQL
| 注意 | | :—- | | 卸载操作是不可逆的,在卸载之前一定要保证对重要数据做了备份!!!! |
- 停止 MySQL 服务
sudo systemctl stop mysql
- 删除 MySQL 相关依赖
sudo apt-get purge -y mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-*
在卸载时可能会有如下提示,询问是否自动删除关联的数据目录以及在使用过程中产生的垃圾文件,根据需要进行选择 Yes 或 No!
- 可选:删除 MySQL 配置和数据
如果在上一步卸载时没有提示是否删除关联数据可以在这一步进行选择删除配置和数据。
sudo rm -rf /etc/mysql /var/lib/mysql
注意 |
---|
如果你之前修改了 MySQL 的配置目录 /etc/mysql 或者数据目录 /var/lib/mysql ,你需要将上面的目录进行相应的修改 |
- 可选:删除非必要的依赖包
在软件卸载时都建议执行如下命令进行删除非必要的依赖包:
sudo apt autoremove -y
- 可选:依赖包都删了还要缓存干什么?
sudo apt autoclean -y