如何在 CentOS 7 上安装 MySQL

how to install mysql on centos 7


随着 CentOS 7 的发布,世界上最受欢迎的开源关系型数据库 MySQL 将从 CentOS 系统的默认镜像源中移除,而 MariaDB 成为了 CentOS 的默认数据库,MariaDB 是 MySQL 的一个分支,主要由开源社区在维护,完全兼容 MySQL,包括API和命令行,所以使之能轻松成为 MySQL 的代替品。

下面,我们将通过这个教程,教你如何在 CentOS 7 的系统中安装 MySQL。

注意:如果你想要安装 MariaDB,则可以通过这个教程来安装。

开始前的准备

1、更新你的系统:

sudo yum update

2、下载 wget,如果你的系统中已经有了,则不必重复安装:

yum install wget

安装 MySQL

MySQL 一定要从 community repository 这里安装。

1、 下载并添加这个仓库,然后更新一下:

//  下载官方源
wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm

//  添加仓库
sudo rpm -ivh mysql80-community-release-el7-3.noarch.rpm

//  更新仓库,中途会有几个问题,一直输入 `y`,然后回车即可
yum update

2、安装 MySQL。在安装的过程中,会有几个问题,如果没有报错,每次都输入 'y',然后回车即可:

//  安装 MySQL Server(安装的过程可能比较慢)
sudo yum install mysql-server

//  启动
sudo systemctl start mysqld

MySQL 默认会绑定到 localhost (127.0.0.1)。

注意:不建议 MySQL 绑定到公网 IP,你可以在 /etc/my.cnf 这个文件中修改 bind-address 这个参数,来修改 MySQL 绑定的地址。

如果你一定要将 MySQL 绑定到公网 IP 的话,你可以启动防火墙,限定只允许特定的 IP 连接服务。

加强 MySQL 服务

1、运行 mysql_secure_installation 这个脚本,来解决默安装 MySQL 服务出现的几个安全问题。

sudo mysql_secure_installation

你可以定制更改以下几个问题:

  • 修改 MySQL root 账户的密码
  • 删除匿名用户的账户
  • 只允许在 localhost(主机)上使用 root 账户登录

这些选项,建议你都选择 yes,更多关于此脚本的选项可以查看这里

注意:如果你安装的 MySQL 是 5.7 以后的版本,那么你需要在 /var/log/mysql.log 这个文件中查找安装时生成的临时密码,你也可以通过如下命令,快速找到这个密码:

sudo grep 'temporary password' /var/log/mysqld.log

使用 MySQL

在安装 mysql-server 时,会默认安装一个自带的基础 MySQL 客户端用于和 Server 交互。客户端需要在终端使用。

以 root 账号登录

1、以 root 的身份去登录 MySQL,如果你执行了上面的 mysql_secure_installation 脚本,输入密码时,记得用你更新过后的密码。

mysql -u root -p

注意,在输入密码的时候,你将看不到输入的内容,放心输入即可,完成之后按下 enter(回车键) 即可提交密码。

2、登录成功之后,你将会看到如下输出:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

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>

3、输入 \h,MySQL 就会列出所有的命令列表:

mysql> \h

For information about MySQL products and services, visit:
   http://www.mysql.com/
For developer information, including the MySQL Reference Manual, visit:
   http://dev.mysql.com/
To buy MySQL Enterprise support, training, or other products, visit:
   https://shop.mysql.com/

List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
?         (\?) Synonym for `help'.
clear     (\c) Clear the current input statement.
connect   (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
edit      (\e) Edit command with $EDITOR.
ego       (\G) Send command to mysql server, display result vertically.
exit      (\q) Exit mysql. Same as quit.
go        (\g) Send command to mysql server.
help      (\h) Display this help.
nopager   (\n) Disable pager, print to stdout.
notee     (\t) Don't write into outfile.
pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.
print     (\p) Print current command.
prompt    (\R) Change your mysql prompt.
quit      (\q) Quit mysql.
rehash    (\#) Rebuild completion hash.
source    (\.) Execute an SQL script file. Takes a file name as an argument.
status    (\s) Get status information from the server.
system    (\!) Execute a system shell command.
tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
use       (\u) Use another database. Takes database name as argument.
charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings  (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.
resetconnection(\x) Clean session context.

For server side help, type 'help contents'

mysql>

比如输入 exit,即可退出 MySQL。

mysql> exit
Bye

创建一个新的用户和数据库

1、下面的例子中,testdb 是数据库的名称,testuser 是用户名,password 是用户的密码。

create database testdb;
create user 'testuser'@'localhost' identified by 'password';
grant all privileges on testdb.* to 'testuser'@'localhost';

注意,MySQL 8.0 以上的版本,创建用户时,密码的加密方式比较特别,会造成 Navicat 等客户端无法连接的问题。可以查看最下方,修改用户密码加密方式的部分解决这个问题。具体为什么,有待查证。

2、退出 MySQL

exit

创建一个表

1、使用 testuser 这个用户重新登录

mysql -u testuser -p

2、创建一个叫做 customers 的表,里面包含 idname 这两个字段

use testdb;
create table customers (id int not null auto_increment primary key, name text);

3、查看

show tables;

//  输出

mysql> show tables;
+-----------------------+
| Tables_in_kaifazhinan |
+-----------------------+
| customers             |
+-----------------------+
1 row in set (0.00 sec)

4、退出 MySQL

exit

重置 MySQL root 密码

如果你忘记了 MySQL root 账号的密码,那么你可以通过下列步骤进行重置。

1、停止 MySQL 服务,然后通过如下命令,启动 MySQL 可以实现不输入密码进行登录:

//  关闭 MySQL 服务
sudo systemctl stop mysqld
//  启动 MySQL 服务,加入无需密码登录的参数
sudo mysqld_safe --skip-grant-tables &

注意:在 Linux 系统中,如果你是通过 RPM 或者 Debian packages 安装的 MySQL,mysqld_safe 模块将不会被默认安装,具体可以看这里

2、使用 root 账户登录 MySQL:

mysql -u root

3、通过如下命令重置 root 账户的密码:

//  切换到 mysql 数据库
use mysql;
//  修改密码,记得将 password 改为你要设置的密码
update user SET PASSWORD=PASSWORD("password") WHERE USER='root';
flush privileges;
//  退出
exit

4、然后重启 MySQL

//  关闭 MySQL 服务
sudo systemctl stop mysqld
//  启动 MySQL 服务
sudo systemctl start mysqld

MySQL 调优

MySQL Tuner 是一个 Perl 实现的脚本,它通过连接到你正在运行的 MySQL 实例中,根据实例的工作负载理想的配置建议。MySQL 实例应该至少运行 24 小时之后在使用此脚本,实例运行的越久,脚本给出的建议就越好。

1、下载 MySQL Tuner 脚本

wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl

2、运行

perl ./mysqltuner.pl

脚本将会让你输入数据库的用户名和密码,然后会输出两个比较有意义的参数:一般建议和需要调整的变量。

如何取消限制外网登录 MySQL

1、查看 MySQL 的配置文件

/etc/my.cnf 文件中找到 bind-address=127.0.0.1 这一行,将其注释即可,这一行的作用就是只允许在本地登录。

如果找不到这一行,则可以直接跳过,看第 2 步,然后重启 MySQL。

2、登录 MySQL

//  使用 root 账户登录 MySQL
mysql -u root -p
//  切换到 mysql 数据库
use mysql;
//  查询
select user,host from user;
//  输出
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | localhost |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
+------------------+-----------+

看看你的 root 用户是否是 localhost,如果是的话,可以运行如下命令,将其修改为 %

update user set host='%' where user='root';

然后刷新:

flush privileges;

你现在就可以在 Navicat 上试试能不能链接到服务器里面的 MySQL 了。

如果,你还是不能链接,你可以检查一下你服务器的安全组,可能这里你还没有放开 3306 端口。

当然,root 用户还是十分不建议你放开限制的。这个操作十分危险。

修改用户密码加密方式

MySQL 8.0 以上的版本,密码输入正确,也放开了登录限制,却还是无法登录。

在 Navicat 等客户端中,登录时会提示如下错误:

1251 -Client does not support authentication protocol requested by server; consider upgrading MYSQL client

可以通过如下步骤,修改用户密码的默认加密方式:

1、登录 MySQL

mysql -u root -p

2、切换到 mysql 数据库

use mysql;

3、修改密码

alter user 'root'@'localhost' identified with mysql_native_password by '********';

4、刷新

flush privileges;

参考