Yum Mysql 前置

添加yum储存库

首先,将 MySQL Yum 存储库添加到系统的存储库列表中。这是一次性操作,可以通过安装MySQL提供的RPM来执行。

  1. 转至MySQL 开发人员专区中的 下载 MySQL Yum 存储库页面 ( https://dev.mysql.com/downloads/repo/yum/ )。

  2. 选择并下载适合您平台的发行包。

  3. 使用以下命令安装下载的发布包,替换 platform-and-version-specific-package-name 为下载的RPM包的名称:

    $> sudo yum install platform-and-version-specific-package-name.rpm

可以通过以下命令检查 MySQL Yum 存储库是否已成功添加(对于启用 dnf 的系统,请将命令中的yum替换为dnf):

$> yum repolist enabled | grep "mysql.*-community.*"

笔记

一旦您的系统上启用了 MySQL Yum 存储库,则通过yum update 命令(或启用 dnf 的系统的dnf 升级) 进行的任何系统范围更新都会升级您系统上的 MySQL 软件包,并替换任何本机第三方软件包(如果 Yum 找到替代品)在 MySQL Yum 存储库中找到它们;请参阅 第 2.10.7 节“使用 MySQL Yum 存储库升级 MySQL”,有关其对系统可能产生的一些影响的讨论,请参阅 升级共享客户端库

选择发布系列(可以跳过)

使用MySQL Yum存储库时,默认选择安装最新的GA系列(当前为MySQL 8.0)。如果这是您想要的,您可以跳到下一步, 安装 MySQL

在 MySQL Yum 存储库中,MySQL 社区服务器的不同版本系列托管在不同的子存储库中。最新GA系列(当前为MySQL 8.0)的子存储库默认启用,所有其他系列(例如MySQL 8.0系列)的子存储库默认禁用。使用此命令查看 MySQL Yum 存储库中的所有子存储库,并查看其中哪些子存储库已启用或禁用(对于启用 dnf 的系统,请将命令中的 yum 替换为 dnf )

$> yum repolist all | grep mysql

要安装最新 GA 系列的最新版本,无需进行任何配置。要安装最新 GA 系列以外的特定系列的最新版本,请在运行安装命令之前禁用最新 GA 系列的子存储库并启用特定系列的子存储库。如果您的平台支持 yum-config-manager,您可以通过发出以下命令来做到这一点,这将禁用 5.7 系列的子存储库并启用 8.0 系列的子存储库:

$> sudo yum-config-manager --disable mysql57-community
$> sudo yum-config-manager --enable mysql80-community

对于支持 dnf 的平台:

$> sudo dnf config-manager --disable mysql57-community
$> sudo dnf config-manager --enable mysql80-community

除了使用yum-config-manager或 dnf config-manager命令外,您还可以通过手动编辑文件来选择版本系列 /etc/yum.repos.d/mysql-community.repo 。这是文件中发布系列子存储库的典型条目:

[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/6/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
       file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

找到您要配置的子存储库的条目,然后编辑该enabled选项。指定 enabled=0禁用子存储库或 enabled=1启用子存储库。例如,要安装 MySQL 8.0,请确保您具有 enabled=0MySQL 5.7 的上述子存储库条目,以及 enabled=18.0 系列的条目:

# Enable to use MySQL 8.0
[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/6/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
       file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

您在任何时候都应该只为一个版本系列启用子存储库。当启用多个版本系列的子存储库时,Yum 将使用最新的系列。

通过运行以下命令并检查其输出来验证是否已启用和禁用正确的子存储库(对于启用 dnf 的系统,请将命令 中的 yum替换为dnf):

$> yum repolist enabled | grep mysql

禁用默认 MySQL 模块(可以跳过)

(仅限 EL8 系统)基于 EL8 的系统(例如 RHEL8 和 Oracle Linux 8)包含默认启用的 MySQL 模块。除非禁用此模块,否则它会屏蔽 MySQL 存储库提供的包。要禁用包含的模块并使 MySQL 存储库包可见,请使用以下命令(对于启用 dnf 的系统,请将 命令中的 yum替换为dnf):

$> sudo yum module disable mysql

APT Mysql 前置

首先,将 MySQL APT 存储库添加到系统的软件存储库列表中。按着这些次序:

  1. 转至 MySQL APT 存储库的下载页面,网址为 https://dev.mysql.com/downloads/repo/apt/

  2. 选择并下载适合您的 Linux 发行版的发行包。

  3. 使用以下命令安装下载的发行包,替换 version-specific-package-name 为下载的包的名称(如果您没有在包所在的文件夹中运行该命令,则前面加上其路径):

    $> sudo dpkg -i /PATH/version-specific-package-name.deb

例如,对于 w.x.y-z包的版本,命令是:

$> sudo dpkg -i mysql-apt-config_w.x.y-z_all.deb

请注意,同一软件包适用于所有受支持的 Debian 和 Ubuntu 平台。

  1. 在安装包的过程中,系统会要求您选择要安装的 MySQL 服务器和其他组件(例如 MySQL Workbench)的版本。如果您不确定选择哪个版本,请不要更改为您选择的默认选项。 如果您不想安装特定组件,也可以选择“无” 。完成所有组件的选择后,选择“确定”,完成发布包的配置和安装。

笔记

创新轨道从 MySQL 8.1 开始,在组件名称中包含“-innovation-”。

您以后可以随时更改版本的选择;有关说明,请参阅选择主要发行版本 。

  1. 使用以下命令从 MySQL APT 存储库更新包信息(_此步骤是强制性的_):

    $> sudo apt-get update

安装MySQL

yum安装

通过以下命令安装 MySQL(对于启用 dnf 的系统,将命令中的 yum替换为dnf):

$> sudo yum install mysql-community-server

这将安装 MySQL 服务器的软件包 ( mysql-community-server) 以及运行服务器所需的组件的软件包,包括客户端的软件包 ( mysql-community-client)、客户端和服务器的常见错误消息和字符集 ( mysql-community-common) 以及共享客户端库 ( mysql-community-libs) 。

APT安装

通过以下命令安装MySQL:

$> sudo apt-get install mysql-server

启动 MySQL 服务器

使用以下命令启动 MySQL 服务器:

$> systemctl start mysqld

您可以使用以下命令检查MySQL服务器的状态:

$> systemctl status mysqld

如果操作系统启用了 systemd,则应使用标准 systemctl(或者参数 相反的service)命令(例如stopstart、 statusrestart )来管理 MySQL 服务器服务。该 mysqld服务默认启用,并在系统重新引导时启动。有关更多信息,请参阅第 2.5.9 节“使用 systemd 管理 MySQL 服务器”

在服务器初始启动时,假设服务器的数据目录为空,则会发生以下情况:

  • 服务器已初始化。

  • SSL证书和密钥文件在数据目录中生成。

  • validate\_password 已安装并启用。

  • 超级用户帐户'root'@'localhost已创建。设置超级用户的密码并将其存储在错误日志文件中。要显示它,请使用以下命令: $> sudo grep 'temporary password' /var/log/mysqld.log

使用生成的临时密码登录并为超级用户帐户设置自定义密码,尽快更改 root 密码:

$> mysql -uroot -p

修改密码

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';

笔记

validate\_password 默认安装。实施的默认密码策略validate\_password要求密码至少包含1个大写字母、1个小写字母、1个数字和1个特殊字符,并且密码总长度至少为8个字符。

创建外网用户

-- 创建用户,所有外网都可以访问
create user 'username'@'%' identified by 'password';

-- 如果上面这种方式无法登录就以mysql_native_password加密方式创建用户
CREATE USER 'username'@'host' IDENTIFIED WITH mysql_native_password BY 'password';

-- 授权(所有库所有权限)
grant all privileges on *.* to 'test'@'%';

-- 查看授权
show grants;

所有命令

-- 查看帮助
help create user;

-- 创建用户,仅限本地访问
create user 'username'@'localhost' identified by 'password';

-- 创建用户,所有外网都可以访问
create user 'username'@'%' identified by 'password';

-- 以mysql_native_password加密方式创建用户
CREATE USER 'username'@'host' IDENTIFIED WITH mysql_native_password BY 'password';

-- 创建带过期时间的用户
CREATE USER `test`@`%` IDENTIFIED BY 'test' PASSWORD EXPIRE INTERVAL 90 DAY;

-- 创建一个带账户锁的用户
CREATE USER 'username'@'host' IDENTIFIED BY 'password' ACCOUNT LOCK;

-- 刷新权限
flush privileges;

-- 修改密码
Alter user 'test'@'%' identified by '123456';

-- 修改密码为永不过期
ALTER USER 'test'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;

-- 修改密码并指定加密规则为mysql_native_password
ALTER USER 'test'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

-- 刷新权限
flush privileges;

-- 锁定用户
ALTER USER 'test'@'%' ACCOUNT LOCK;

-- 用户解锁
ALTER USER 'test'@'%' ACCOUNT UNLOCK;

-- 删除用户
DROP USER 'username'@'host';

编码问题

1. MySQL 存储编码:用 UTF-8 还是 UTF-16?

MySQL 支持多种存储编码,如果存储中文,可以选用 GB2312、UTF-8 或 UTF-16(UCS2) 作为存储编码。如果还要考虑国际化,那么就只能用 UTF-8 或 UTF-16。

这两者中,究竟使用哪种编码更好呢?

UTF-8 使用 1 个字节表示数字和英文字母,使用 2 个或 3 个字节表示一个汉字,而 UTF-16 则固定使用 2 个字节。因此,在中文的比重比较大的情况下,使用 UTF-16 会更节省空间。

但是,如果你的 MySQL 是作为 Web 的后端存储,就不能只考虑存储时的编码了,还需要考虑查询和输出的编码。由于网页中 HTML 标签的代码比重较大,所以在国际化的网站(如 Google)中,网页上采用的是 UTF-8 编码,以减小页面文件大小,降低带宽压力。

这种情况下,如果存储时采用了 UTF-16,那么在提交数据到 MySQL,或把查询结果输出到页面时,必定要进行编码转,无疑增加了服务器的压力。

因此,对存储编码的选择,最终还是对时间和空间的选择。

在大部分情况下,我们的数据中的中文比重并不是太大,所以,建议使用 UTF-8 作为存储编码。

2. MySQL 存储编码:用 UTF-8 还是 UTF8mb4?

a. utf8 与 utf8mb4 异同

先看 官方手册 https://dev.mysql.com/doc/refman/5.6/en/charset-unicode-utf8mb4.html 的说明:

The character set named utf8 uses a maximum of three bytes per character and contains only BMP characters.The utf8mb4 character set uses a maximum of four bytes per character supports supplementary characters:– For a BMP character, utf8 and utf8mb4 have identical storage characteristics: same code values, same encoding, same length.– For a supplementary character, utf8 cannot store the character at all, whereas utf8mb4 requires four bytes to store it. Because utf8 cannot store the character at all, you have no supplementary characters in utf8 columns and need not worry about converting characters or losing data when upgrading utf8 data from older versions of MySQL.

MySQL在 5.5.3 之后增加了 utf8mb4 字符编码,mb4即 most bytes 4。简单说 utf8mb4 是 utf8 的超集并完全兼容utf8,能够用四个字节存储更多的字符。

但抛开数据库,标准的 UTF-8 字符集编码是可以用 1~4 个字节去编码21位字符,这几乎包含了是世界上所有能看见的语言了。然而在MySQL里实现的utf8最长使用3个字节,也就是只支持到了 Unicode 中的 基本多文本平面(U+0000至U+FFFF),包含了控制符、拉丁文,中、日、韩等绝大多数国际字符,但并不是所有,最常见的就算现在手机端常用的表情字符 emoji和一些不常用的汉字,如 “墅” ,这些需要四个字节才能编码出来。

注:QQ里面的内置的表情不算,它是通过特殊映射到的一个gif图片。一般输入法自带的就是。

也就是当你的数据库里要求能够存入这些表情或宽字符时,可以把字段定义为 utf8mb4,同时要注意连接字符集也要设置为utf8mb4,否则在 严格模式 下会出现 Incorrect string value: /xF0/xA1/x8B/xBE/xE5/xA2… for column 'name'这样的错误,非严格模式下此后的数据会被截断。

提示:另外一种能够存储emoji的方式是,不关心数据库表字符集,只要连接字符集使用 latin1,但相信我,你绝对不想这个干,一是这种字符集混用管理极不规范,二是存储空间被放大(读者可以想下为什么)。

要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以后的才支持(查看版本: select version();)。我觉得,为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8.  对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议,使用 VARCHAR  替代 CHAR。

b. utf8mb4_unicode_ci 与 utf8mb4_general_ci 如何选择

字符除了需要存储,还需要排序或比较大小,涉及到与编码字符集对应的 排序字符集(collation)。ut8mb4对应的排序字符集常用的有 utf8mb4\_unicode\_ciutf8mb4\_general\_ci,到底采用哪个在 stackoverflow 上有个讨论,What’s the difference between utf8_general_ci and utf8_unicode_ci

主要从排序准确性和性能两方面看:

  • 准确性utf8mb4\_unicode\_ci 是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序utf8mb4\_general\_ci 没有实现Unicode排序规则,在遇到某些特殊语言或字符是,排序结果可能不是所期望的。但是在绝大多数情况下,这种特殊字符的顺序一定要那么精确吗。比如Unicode把ߌ当成ssOE来看;而general会把它们当成se,再如ÀÁÅåāă各自都与 A 相等。

  • 性能utf8mb4\_general\_ci 在比较和排序的时候更快utf8mb4\_unicode\_ci 在特殊情况下,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。但是在绝大多数情况下,不会发生此类复杂比较。general理论上比Unicode可能快些,但相比现在的CPU来说,它远远不足以成为考虑性能的因素,索引涉及、SQL设计才是。 我个人推荐是 utf8mb4\_unicode\_ci,将来 8.0 里也极有可能使用变为默认的规则。相比选择哪一种collation,使用者应该更关心字符集与排序规则在db里要统一就好。

这也从另一个角度告诉我们,不要可能产生乱码的字段作为主键或唯一索引。我遇到过一例,以 url 来作为唯一索引,但是它记录的有可能是乱码,导致后来想把它们修复就特别麻烦。

c. utf8_general_ci 和utf8_general_cs

  • utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用。

  • utf8_general_cs 区分大小写,如果用户名和邮箱用这个 就会造成不良后果。

  • utf8_bin:字符串每个字符串用二进制数据编译存储。 区分大小写,而且可以存二进制的内容。

  • utf8_general_ci校对速度快,但准确度稍差。

  • utf8_unicode_ci准确度高,但校对速度稍慢。