MySQL环境部署(5.7+8.0)(Win+Linux)

欢迎关注公众号:一介IT
本站博文抢先发布在公众号。
Alt

摘自个人网站,文章原文地址 https://l080l.com/mysql/basic/chapter02.html

本文 6.6万 字。涉及 MySQL5.7 & 8.0,以及在Windows 和 Linux 平台的部署,请按照目录阅读。

文章目录

1. MySQL 的卸载

为什么先卸载?从零开始嘛。

1.1 Windows 下 Mysql 的卸载

1.1.1 步骤1:停止 MySQL 服务

在卸载之前,先停止 MySQL8.0 的服务。按键盘上的 Ctrl + Alt + Delete 组合键,打开“任务管理器”对话框,可以在“服务”列表找到 MySQL8.0 的服务,如果现在“正在运行”状态,可以右键单击服务,选择“停止”选项停止 MySQL8.0 的服务,如图所示。

1.1.2 步骤2:软件的卸载

方式1:通过控制面板方式

卸载 MySQL8.0 的程序可以和其他桌面应用程序一样直接在“控制面板”选择“卸载程序”,并在程序列表中找到 MySQL8.0 服务器程序,直接双击卸载即可,如图所示。这种方式删除,数据目录下的数据不会跟着删除。

方式2:通过360或电脑管家等软件卸载

略。(这类软件可以更干净的删除相关文件和清除注册表信息,当然,如果你的电脑装了这类软件的话…)。

方式3:通过安装包提供的卸载功能卸载

你也可以通过安装向导程序进行 MySQL8.0 服务器程序的卸载。

① 再次双击下载的mysql-installer-community-8.0.26.0.msi文件,打开安装向导。安装向导会自动检测已安装的MySQL服务器程序。
② 选择要卸载的MySQL服务器程序,单击“Remove”(移除),即可进行卸载。

③ 单击“Next”(下一步)按钮,确认卸载。

④ 弹出是否同时移除数据目录选择窗口。如果想要同时删除MySQL服务器中的数据,则勾选“Remove the data directory”,如图所示。

⑤ 执行卸载。单击“Execute”(执行)按钮进行卸载。

⑥ 完成卸载。单击“Finish”(完成)按钮即可。如果想要同时卸载MySQL8.0的安装向导程序,勾选“Yes,Uninstall MySQL Installer”即可,如图所示。

1.1.3 步骤3:残余文件的清理

如果再次安装不成功,可以卸载后对残余文件进行清理后再安装。
(1). 服务目录:mysql 服务的安装目录
(2). 数据目录:默认在 C:\ProgramData\MySQL

如果自己单独指定过数据目录,就找到自己的数据目录进行删除即可。

注意:请在卸载前做好数据备份

在操作完以后,需要重启计算机,然后进行安装即可。如果仍然安装失败,需要继续操作如下步骤4。

1.1.4 步骤4:清理注册表(选做)

如果前几步做了,再次安装还是失败,那么可以清理注册表。 在系统的搜索框中输入regedit

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL服务 目录删除
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\MySQL服务 目录删除
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL服务 目录删除
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\MySQL服务 目录删除
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL服务目录删除
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL服务删除

注册表中的ControlSet001,ControlSet002,不一定是001和002,可能是ControlSet005、006之类。

1.1.5 步骤5:删除环境变量配置

找到 path 环境变量,将其中关于mysql的环境变量删除,切记不要全部删除。例如:删除 D:\develop_tools\mysql\MySQLServer8.0.26\bin; 这个部分。

1.2 Linux 下 MySQL 的卸载

1.2.1 查看是否安装过MySQL
  • 如果之前是用 rpm 安装, 检查一下RPM PACKAGE:
rpm -qa | grep -i mysql 
# -i 忽略大小写
  • 检查mysql service:
systemctl status mysqld.service
1.2.2 关闭 mysql 服务
systemctl stop mysqld.service
1.2.3 查看当前 mysql 安装状况
rpm -qa | grep -i mysql
# 或
yum list installed | grep mysql
1.2.4 卸载上述命令查询出的已安装程序
yum remove mysql-xxx mysql-xxx mysql-xxx mysqk-xxxx

务必卸载干净,反复执行rpm -qa | grep -i mysql确认是否有卸载残留。

1.2.5 删除 mysql 相关文件
  • 查找相关文件
find / -name mysql
  • 删除上述命令查找出的相关文件
rm -rf xxx
1.2.6 删除 my.cnf
rm -rf /etc/my.cnf

2. MySQL 的4大版本与下载

2.1 版本介绍

版本介绍
MySQL Community Server 社区版本开源免费,自由下载,但不提供官方技术支持,适用于大多数普通用户。
MySQL Enterprise Edition 企业版本需付费,不能在线下载,可以试用30天。提供了更多的功能和更完备的技术支持,更适合于对数据库的功能和可靠性要求较高的企业客户。
MySQL Cluster 集群版开源免费。用于架设集群服务器,可将几个MySQL Server封装成一个Server。需要在社区版或企业版的基础上使用。
MySQL Cluster CGE 高级集群版需付费。
  • 目前最新版本为8.0.27,发布时间2021年10月。此前,8.0.0 在 2016.9.12日就发布了。
  • 本课程中使用8.0.26版本

此外,官方还提供了MySQL WorkbenchGUITOOL)一款专为MySQL设计的图形界面管理工具MySQLWorkbench又分为两个版本,分别是社区版MySQL Workbench OSS)、商用版MySQL WorkbenchSE)。

2.2 社区版下载

2.2.1 下载

1.官网地址

官网:https://www.mysql.com

2.点击DOWNLOADS

然后,点击MySQL Community(GPL) Downloads

3.点击 MySQL Community Server

4.在General Availability(GA) Releases中选择适合的版本

2.2.2 Linux 平台

这里不能直接选择CentOS 7系统的版本,所以选择与之对应的 Red Hat Enterprise Linux。
https://downloads.mysql.com/archives/community/ 直接点Download下载RPM Bundle全量
包。包括了所有下面的组件。不需要一个一个下载了。

MySQL 5.7

MySQL 8.0

2.2.3 Windows 平台

Windows 平台下提供两种安装文件:MySQL 二进制分发版(.msi安装文件)和免安装版(.zip压缩文件)。一般来讲,应当使用二进制分发版,因为该版本提供了图形化的安装向导过程,比其他的分发版使用起来要简单,不再需要其他工具启动就可以运行MySQL。

  • 这里在Windows 系统下推荐下载MSI安装程序;点击Go to Download Page进行下载即可。

  • Windows下的MySQL8.0安装有两种安装程序
    • mysql-installer-web-community-8.0.26.0.msi 下载程序大小:2.4M;安装时需要联网安装组件。
    • mysql-installer-community-8.0.26.0.msi 下载程序大小:450.7M;安装时离线安装即可。推荐。
  • 如果安装MySQL5.7版本的话,选择Archives,接着选择MySQL5.7的相应版本即可。这里下载最近期的MySQL5.7.34版本。

3. Windows 下部署 MySQL 社区版

3.1 部署 MySQL8.0

3.1.1 安装

MySQL下载完成后,找到下载文件,双击进行安装,具体操作步骤如下。

步骤1:双击下载的 mysql-installer-community-8.0.26.0.msi 文件,打开安装向导。
步骤2:打开“Choosing a Setup Type”(选择安装类型)窗口,在其中列出了5种安装类型,分别是Developer Default(默认安装类型)、Server only(仅作为服务器)、Client only(仅作为客户端)、Full(完全安装)、Custom(自定义安装)。这里选择“Custom(自定义安装)”类型按钮,单击“Next(下一步)”按钮。

步骤3:打开“Select Products” (选择产品)窗口,可以定制需要安装的产品清单。例如,选择“MySQL Server 8.0.26-X64”后,单击“→”添加按钮,即可选择安装MySQL服务器,如图所示。采用通用的方法,可以添加其他你需要安装的产品。

此时如果直接“Next”(下一步),则产品的安装路径是默认的。如果想要自定义安装目录,则可以选中对应的产品,然后在下面会出现“Advanced Options”(高级选项)的超链接。

单击“Advanced Options”(高级选项)则会弹出安装目录的选择窗口,如图所示,此时你可以分别设置MySQL的服务程序安装目录和数据存储目录。如果不设置,默认分别在C盘的Program Files目录和ProgramData目录(这是一个隐藏目录)。如果自定义安装目录,请避免“中文”目录。另外,建议服务目录和数据目录分开存放。

步骤4:在上一步选择好要安装的产品之后,单击“Next”(下一步)进入确认窗口,如图所示。单击“Execute”(执行)按钮开始安装。

步骤5:安装完成后在“Status”(状态)列表下将显示“Complete”(安装完成),如图所示。

3.1.2 配置

MySQL安装之后,需要对服务器进行配置。具体的配置步骤如下。

步骤1:在上一个小节的最后一步,单击“Next”(下一步)按钮,就可以进入产品配置窗口。

步骤2:单击“Next”(下一步)按钮,进入MySQL服务器类型配置窗口,如图所示。端口号一般选择默认端口号3306。

其中,“Config Type”选项用于设置服务器的类型。单击该选项右侧的下三角按钮,即可查看3个选项,如图所示。

  • Development Machine(开发机器):该选项代表典型个人用桌面工作站。此时机器上需要运行多个应用程序,那么MySQL服务器将占用最少的系统资源。
  • Server Machine(服务器):该选项代表服务器,MySQL服务器可以同其他服务器应用程序一起运行,例如Web服务器等。MySQL服务器配置成适当比例的系统资源。
  • Dedicated Machine(专用服务器):该选项代表只运行MySQL服务的服务器。MySQL服务器配置成使用所有可用系统资源。

步骤3:单击“Next”(下一步)按钮,打开设置授权方式窗口。其中,上面的选项是MySQL8.0提供的新的授权方式,采用SHA256基础的密码加密方法;下面的选项是传统授权方法(保留5.x版本兼容性)。

步骤4:单击“Next”(下一步)按钮,打开设置服务器root超级管理员的密码窗口,如图所示,需要输入两次同样的登录密码。也可以通过“Add User”添加其他用户,添加其他用户时,需要指定用户名、允许该用户名在哪台/哪些主机上登录,还可以指定用户角色等。此处暂不添加用户,用户管理在MySQL高级特性篇中讲解。

步骤5:单击“Next”(下一步)按钮,打开设置服务器名称窗口,如图所示。该服务名会出现在Windows服务列表中,也可以在命令行窗口中使用该服务名进行启动和停止服务。本书将服务名设置为“MySQL80”。如果希望开机自启动服务,也可以勾选“Start the MySQL Server at System Startup”选项(推荐)。

下面是选择以什么方式运行服务?可以选择“Standard System Account”(标准系统用户)或者“Custom User”(自定义用户)中的一个。这里推荐前者。

步骤6:单击“Next”(下一步)按钮,打开确认设置服务器窗口,单击“Execute”(执行)按钮。

步骤7:完成配置,如图所示。单击“Finish”(完成)按钮,即可完成服务器的配置。

步骤8:如果还有其他产品需要配置,可以选择其他产品,然后继续配置。如果没有,直接选择“Next”(下一步),直接完成整个安装和配置过程。

步骤9:结束安装和配置。

3.1.3 环境变量

如果不配置MySQL环境变量,就不能在命令行直接输入MySQL登录命令。下面说如何配置MySQL的环境变量:

步骤1:在桌面上右击【此电脑】图标,在弹出的快捷菜单中选择【属性】菜单命令。
步骤2:打开【系统】窗口,单击【高级系统设置】链接。
步骤3:打开【系统属性】对话框,选择【高级】选项卡,然后单击【环境变量】按钮。
步骤4:打开【环境变量】对话框,在系统变量列表中选择path变量。
步骤5:单击【编辑】按钮,在【编辑环境变量】对话框中,将MySQL应用程序的bin目录(C:\Program Files\MySQL\MySQL Server 8.0\bin)添加到变量值中,用分号将其与其他路径分隔开。
步骤6:添加完成之后,单击【确定】按钮,这样就完成了配置path变量的操作,然后就可以直接输入MySQL命令来登录数据库了。

3.2 部署 MySQL5.7

3.2.1 安装

此版本的安装过程与上述过程除了版本号不同之外,其它环节都是相同的。所以这里省略了MySQL5.7.34版本的安装截图。

3.2.2 配置

配置环节与 MySQL8.0 版本确有细微不同。大部分情况下直接选择“Next”即可,不影响整理使用。

这里配置 MySQL5.7 时,重点强调:如果安装在同一台主机,与前面安装好的MySQL8.0不能使用相同的端口号。

3.3 安装失败问题

MySQL的安装和配置是一件非常简单的事,但是在操作过程中也可能出现问题,特别是初学者。

问题1:无法打开MySQL8.0软件安装包或者安装过程中失败,如何解决?
在运行 MySQL8.0 软件安装包之前,用户需要确保系统中已经安装了 .Net Framework 相关软件,如果缺少此软件,将不能正常地安装 MySQL8.0 软件。

解决方案:到这个地址https://www.microsoft.com/en-us/download/details.aspx?id=42642下载 Microsoft .NET Framework 4.5 并安装后,再去安装 MySQL。另外,还要确保Windows Installer正常安装。Windows 上安装 Mysql8.0 需要操作系统提前已安装好 Microsoft Visual C++ 2015-2019。

解决方案同样是,提前到微软官网 https://support.microsoft.com/en-us/topic/the-latest-supported-visual-c-downloads-2647da03-1eea-4433-9aff-95f26a218cc0,下载相应的环境。

问题2:卸载重装MySQL失败?
该问题通常是因为MySQL卸载时,没有完全清除相关信息导致的。
解决办法是,把以前的安装目录删除。如果之前安装并未单独指定过服务安装目录,则默认安装目录是“C:\Program Files\MySQL”,彻底删除该目录。同时删除MySQL的Data目录,如果之前安装并未单独指定过数据目录,则默认安装目录是“C:\ProgramData\MySQL”,该目录一般为隐藏目录。删除后,重新安装即可。

问题3:如何在Windows系统删除之前的未卸载干净的MySQL服务列表?
操作方法如下,在系统“搜索框”中输入“cmd”,按“Enter”(回车)键确认,弹出命令提示符界面。然后输入“sc delete MySQL服务名”,按“Enter”(回车)键,就能彻底删除残余的MySQL服务了。

4. Windows 下 MySQL 的登录

4.1 服务的启动与停止

MySQL 安装完毕之后,需要启动服务器进程,不然客户端无法连接数据库。在前面的配置过程中,已经将MySQL安装为Windows服务,并且勾选当Windows启动、停止时,MySQL也自动启动、停止。

方式1:使用图形界面工具
  • 步骤1:打开windows服务

    • 方式1:计算机(点击鼠标右键)→ 管理(点击)→ 服务和应用程序(点击)→ 服务(点击)
    • 方式2:控制面板(点击)→ 系统和安全(点击)→ 管理工具(点击)→ 服务(点击)
    • 方式3:任务栏(点击鼠标右键)→ 启动任务管理器(点击)→ 服务(点击)
    • 方式4:单击【开始】菜单,在搜索框中输入“services.msc”,按Enter键确认
  • 步骤2:找到MySQL80(点击鼠标右键)→ 启动或停止(点击)

方式2:使用命令行工具
# 启动 MySQL 服务命令:
net start MySQL服务名
# 停止 MySQL 服务命令:
net stop MySQL服务名

说明:

(1). start 和 stop 后面的服务名应与之前配置时指定的服务名一致。

(2). 如果当你输入命令后,提示“拒绝服务”,请以系统管理员身份打开命令提示符界面重新尝试。

4.2 自带客户端的登录与退出

当MySQL服务启动完成后,便可以通过客户端来登录MySQL数据库。注意:确认服务是开启的。

4.2.1 登录方式1:MySQL 自带客户端

开始菜单 → 所有程序 → MySQL → MySQL 8.0 Command Line Client

仅限于root用户

4.2.2 登录方式2:Windows 命令行
  • 格式:
mysql -h 主机名 -P 端口号 -u 用户名 -p密码
# -P 端口号的字母P要大写
  • 举例:
mysql -h localhost -P 3306 -u root -pabc123  
# 这里我设置的root用户的密码是abc123

# (1)-p与密码之间不能有空格,其他参数名与参数值之间可以有空格也可以没有空格。如:
mysql -hlocalhost -P3306 -uroot -pabc123
# (2)密码建议在下一行输入,保证安全
mysql -h localhost -P 3306 -u root -p
Enter password:****
# (3)客户端和服务器在同一台机器上,所以输入localhost或者IP地址127.0.0.1。同时,因为是连接本机:
#	-hlocalhost就可以省略,如果端口号没有修改:-P3306也可以省略
# 简写成:
mysql -u root -p
Enter password:****
# 连接成功后,有关于MySQL Server服务版本的信息,还有第几次连接的id标识。
# 也可以在命令行通过以下方式获取MySQL Server服务版本的信息:
c:\> mysql -V
# -V大写
c:\> mysql --version
# 或登录后,通过以下方式查看当前版本信息:
mysql> select version();
4.2.3 退出登录
exit
# 或
quit

5. Linux 下部署 MySQL 社区版

5.1 Linux 下安装 MySQL 的几种方式

  • 使用rpm命令安装扩展名为.rpm的软件包。安装方式特点:rpm 安装简单,灵活性差,无法灵活选择版本、升级。
  • rpm repository 安装包极小,版本安装简单灵活,升级方便,需要联网安装通用二进制包安装比较复杂,灵活性高,平台通用性好。
  • 源码包安装最复杂,时间长,参数设置灵活,性能好。
5.1.1 方式1:rpm 命令

需要手动下载 rpm 软件包,上传到服务器,也就是本节手动部署的方式。rpm包的一般格式:

5.1.2 方式2:yum命令

需联网,从互联网获取的yum源,直接使用yum命令安装。

5.1.3 方式3:编译安装源码包

针对 tar.gz 这样的压缩格式,要用tar命令来解压;如果是其它压缩格式,就使用其它命令。

5.2 CentOS7 下检查 MySQL 依赖

5.2.1 检查 /tmp 临时目录权限(必不可少)

由于 mysql 安装过程中,会通过 mysql 用户在 /tmp 目录下新建 tmp_db 文件,所以请给/tmp较大的权限。执行 :

chmod -R 777 /tmp
5.2.2 安装前,检查依赖
rpm -qa|grep libaio
rpm -qa|grep net-tools
# Linux 的 UI 部署模式下这些都是安装好的。
5.2.3 防火墙等
# 禁用防火墙
systemctl stop firewalld
systemctl disable firewalld
# Selinux
vim /etc/selinux/config
SELINUX=disabled

5.3 CentOS7 下 MySQL 安装过程

5.3.1 使用 rpm 安装下载的软件包
5.3.1.1 解压上传

将安装程序拷贝到 /opt 目录下,解压上传安装标记的 rpm 包。

5.3.1.2 rpm 安装

在 mysql 的安装文件目录下执行:(必须按照顺序执行)

# MySQL 8.0
rpm -ivh mysql-community-common-8.0.25-1.el7.x86_64.rpm 
rpm -ivh mysql-community-client-plugins-8.0.25-1.el7.x86_64.rpm 
rpm -ivh mysql-community-libs-8.0.25-1.el7.x86_64.rpm 
rpm -ivh mysql-community-client-8.0.25-1.el7.x86_64.rpm 
rpm -ivh mysql-community-server-8.0.25-1.el7.x86_64.rpm
# MySQL 5.7
rpm -ivh mysql-community-common-5.7.38-1.el7.x86_64.rpm 
rpm -ivh mysql-community-libs-5.7.38-1.el7.x86_64.rpm 
rpm -ivh mysql-community-client-5.7.38-1.el7.x86_64.rpm 
rpm -ivh mysql-community-server-5.7.38-1.el7.x86_64.rpm
  • rpm是 Redhat Package Manage 缩写,通过 RPM 的管理,用户可以把源代码包装成以 rpm 为扩展名的文件形式,易于安装。
  • -i, --install 安装软件包
  • -v, --verbose 提供更多的详细信息输出
  • -h, --hash 软件包安装的时候列出哈希标记 (和 -v 一起使用效果更好),展示进度条

若存在 mariadb-libs 问题,则执行 yum remove mysql-libs 即可。

5.3.2 yum 命令在线安装

推荐使用此方式,在线下载 mysql 并安装。根据文档在线安装 5.7 或 8.0。

https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html
https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html

5.3.2.1 MySQL 5.7
# 当前OS版本
[root@MySQL57 ~]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
# 下载安装MySQL 5.7的rpm包
wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
yum -y localinstall mysql57-community-release-el7-8.noarch.rpm
# 安装MySQL 5.7
yum -y install mysql-community-server

# 如果出现”Another app is currently holding the yum lock;”, 则强制关掉yum进程:
rm -f /var/run/yum.pid

# 提示信息如上
# 原因是Mysql的GPG升级了,需要重新获取,使用以下命令即可
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
# 再执行
yum install mysql-server
5.3.2.2 MySQL 8.0

根据 https://dev.mysql.com/downloads/repo/yum/ 获取最新 rpm 包。

# 当前OS版本
[root@MySQL80 ~]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
# 下载安装MySQL 8.0的rpm包
wget https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm
yum -y localinstall mysql80-community-release-el7-6.noarch.rpm
# 安装MySQL 8.0最新版
yum -y install mysql-community-server
	# 安装MySQL 8.0指定的版本版
	
# 如果出现”Another app is currently holding the yum lock;”, 则强制关掉yum进程:
rm -f /var/run/yum.pid

# 提示信息如上
# 原因是MySQL的GPG升级了,需要重新获取,使用以下命令即可
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
# 再执行
yum -install mysql-server

6. Linux 下企业版部署

6.1 下载

企业版是收费的,30天试用期,需要到 https://edelivery.oracle.com/ 下载,选择要下载的组件和相应的系统,此处以 Linux 平台为例。

6.2 上传解压

[root@node1 opt]# mkdir -p mysql80
[root@node1 opt]# cd mysql80/
[root@node1 mysql80]# unzip ../V1031501-01.zip 
Archive:  ../V1031501-01.zip
 extracting: mysql-commercial-backup-8.0.31-1.1.el7.x86_64.rpm  
 extracting: mysql-commercial-client-8.0.31-1.1.el7.x86_64.rpm  
 extracting: mysql-commercial-client-plugins-8.0.31-1.1.el7.x86_64.rpm  
 extracting: mysql-commercial-common-8.0.31-1.1.el7.x86_64.rpm  
 extracting: mysql-commercial-devel-8.0.31-1.1.el7.x86_64.rpm  
 extracting: mysql-commercial-embedded-compat-8.0.31-1.1.el7.x86_64.rpm  
 extracting: mysql-commercial-icu-data-files-8.0.31-1.1.el7.x86_64.rpm  
 extracting: mysql-commercial-libs-8.0.31-1.1.el7.x86_64.rpm  
 extracting: mysql-commercial-libs-compat-8.0.31-1.1.el7.x86_64.rpm  
 extracting: mysql-commercial-server-8.0.31-1.1.el7.x86_64.rpm  
 extracting: mysql-commercial-test-8.0.31-1.1.el7.x86_64.rpm  
 extracting: mysql-router-commercial-8.0.31-1.1.el7.x86_64.rpm  
 extracting: README.txt

6.3 安装

#默认安装在/var/lib/mysql中
[root@node1 ~]#
rpm -ivh /opt/mysql80/mysql-commercial-common-8.0.31-1.1.el7.x86_64.rpm
rpm -ivh /opt/mysql80/mysql-commercial-client-plugins-8.0.31-1.1.el7.x86_64.rpm
rpm -ivh /opt/mysql80/mysql-commercial-icu-data-files-8.0.31-1.1.el7.x86_64.rpm
rpm -ivh /opt/mysql80/mysql-commercial-libs-8.0.31-1.1.el7.x86_64.rpm
rpm -ivh /opt/mysql80/mysql-commercial-libs-compat-8.0.31-1.1.el7.x86_64.rpm
rpm -ivh /opt/mysql80/mysql-commercial-client-8.0.31-1.1.el7.x86_64.rpm
rpm -ivh /opt/mysql80/mysql-commercial-server-8.0.31-1.1.el7.x86_64.rpm

若存在 mariadb-libs 问题,则执行 yum remove mariadb-libs 即可。

7. Linux 下 MySQL 初始化

7.1 初始化

为了保证数据库目录与文件的所有者为 mysql 登录用户,如果你是以 root 身份运行 mysql 服务,需要执行下面的命令初始化:

# 初始化
[root@MySQL57 ~]# mysqld --initialize --user=mysql
# --initialize 			#会初始化datadir、创建root的初始化随机密码
# --initialize-insecure #会初始化datadir、但不会创建root的初始化随机密码
# 查看初始化密码
[root@MySQL57 ~]# cat /var/log/mysqld.log
2022-08-14T10:58:10.124191Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2022-08-14T10:58:10.820631Z 0 [Warning] InnoDB: New log files created, LSN=45790
2022-08-14T10:58:10.855586Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2022-08-14T10:58:10.919007Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: fc9cc74b-1bbf-11ed-8416-000c29428a3f.
2022-08-14T10:58:10.920332Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2022-08-14T10:58:11.420264Z 0 [Warning] A deprecated TLS version TLSv1 is enabled. Please use TLSv1.2 or higher.
2022-08-14T10:58:11.420349Z 0 [Warning] A deprecated TLS version TLSv1.1 is enabled. Please use TLSv1.2 or higher.
2022-08-14T10:58:11.421425Z 0 [Warning] CA certificate ca.pem is self signed.
2022-08-14T10:58:11.531418Z 1 [Note] A temporary password is generated for root@localhost: pwxNOC/C(2Od
# root@localhost: 后面就是初始化的密码

[root@MySQL80 ~]# mysqld --initialize --user=mysql
[root@MySQL80 ~]# cat /var/log/mysqld.log
2022-08-14T11:02:37.301236Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.30) initializing of server in progress as process 68365
2022-08-14T11:02:37.359130Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2022-08-14T11:02:37.921019Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2022-08-14T11:02:41.904835Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: .*KM?Apgr4zl

说明: --initialize 选项默认以“安全”模式来初始化,则会为 root 用户生成一个密码并将该密码标记为过期,登录后你需要设置一个新的密码。生成的临时密码会往日志中记录一份。

7.2 首次登录和修改密码及策略

通过mysql -hlocalhost -P3306 -uroot -p进行登录,在Enter password:录入初始化密码。

# 5.7首次登录,启动服务,登录输入临时密码
[root@MySQL57 ~]# systemctl start mysqld
[root@MySQL57 ~]# mysql -hlocalhost -P3306 -uroot -p
Enter password: 
# 修改密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.00 sec)
-----------------------------------------------------------------------------------
# 8.0首次登录,启动服务,登录输入临时密码
[root@MySQL80 ~]# systemctl start mysqld
[root@MySQL80 ~]# mysql -hlocalhost -P3306 -uroot -p
Enter password: 
# 修改密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
# MySQL8.0修改简单密码不符合策略

# == 测试环境使用简单密码解决办法 ==
# 1、先赋予个复杂的密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'XXXXXX';
# 2、查看mysql初始的密码策略
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.01 sec)
# 3、修改策略,及密码长度
set global validate_password.policy=0;
set global validate_password.length=1;
set global validate_password.check_user_name=OFF;
# 4、重新赋予简单密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.01 sec)

7.3 自启动 MySQL

# 加不加.service后缀都可以 
# 启动:
systemctl start mysqld.service 
# 关闭:
systemctl stop mysqld.service 
# 重启:
systemctl restart mysqld.service 
# 查看状态:
systemctl status mysqld.service
# 查看MySQL服务是否自启动
systemctl list-unit-files|grep mysqld.service
# 如不是enabled可以运行如下命令设置自启动
systemctl enable mysqld.service
# 如果希望不进行自启动,运行如下命令设置
systemctl disable mysqld.service

7.4 MySQL 密码策略初探

上面步骤已经展示部分内容。

7.4.1 MySQL 不同版本设置密码(可能出现)
# MySQL5.7中:成功
mysql> alter user 'root' identified by 'root';
Query OK, 0 rows affected (0.00 sec)
# MySQL8.0中:失败
mysql> alter user 'root' identified by 'root';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
7.4.2 MySQL8 之前的安全策略

在MySQL 8.0之前,MySQL使用的是validate_password插件检测、验证账号密码强度,保障账号的安全性。

7.4.2.1 安装/启用插件方式1

在参数文件my.cnf中添加参数。

[mysqld]
plugin-load-add=validate_password.so
#ON/OFF/FORCE/FORCE_PLUS_PERMANENT: 是否使用该插件(及强制/永久强制使用)
validate-password=FORCE_PLUS_PERMANENT

说明1: plugin library中的validate_password文件名的后缀名根据平台不同有所差异。 对于 Unix 和
Unix-like 系统而言,它的文件后缀名是.so,对于 Windows 系统而言,它的文件后缀名是.dll

说明2: 修改参数后必须重启 MySQL 服务才能生效。

说明3: 参数FORCE_PLUS_PERMANENT是为了防止插件在 MySQL 运行时的时候被卸载。当你卸载插
件时就会报错。如下所示。

mysql> SELECT PLUGIN_NAME, PLUGIN_LIBRARY, PLUGIN_STATUS, LOAD_OPTION FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';
+-------------------+----------------------+---------------+----------------------+
| PLUGIN_NAME    | PLUGIN_LIBRARY    | PLUGIN_STATUS | LOAD_OPTION     |
+-------------------+----------------------+---------------+----------------------+
| validate_password | validate_password.so | ACTIVE    | FORCE_PLUS_PERMANENT |
+-------------------+----------------------+---------------+----------------------+
1 row in set (0.00 sec)
mysql>  UNINSTALL PLUGIN validate_password;
ERROR 1702 (HY000): Plugin 'validate_password' is force_plus_permanent and can not be
unloaded
mysql>
7.4.2.2 安装/启用插件方式2

运行时命令安装(推荐)。

mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
Query OK, 0 rows affected, 1 warning (0.11 sec)

此方法也会注册到元数据,也就是 mysql.plugin 表中,所以不用担心 MySQL 重启后插件会失效。

7.4.3 MySQL8的安全策略
7.4.3.1 validate_password说明

MySQL 8.0,引入了服务器组件Components这个特性,validate_password插件已用服务器组件重新实现。

8.0.25版本的数据库中,默认自动安装validate_password组件。

未安装插件前,执行如下两个指令 ,执行效果:

mysql> show variables like 'validate_password%';
Empty set (0.04 sec)
mysql> SELECT * FROM mysql.component;
ERROR 1146 (42S02): Table 'mysql.component' doesn't exist

安装插件后,执行如下两个指令 ,执行效果:

mysql> SELECT * FROM mysql.component;
+--------------+--------------------+------------------------------------+
| component_id | component_group_id | component_urn                      |
+--------------+--------------------+------------------------------------+
|            1 |                  1 | file://component_validate_password |
+--------------+--------------------+------------------------------------+
1 row in set (0.00 sec)
mysql> show variables like 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password.check_user_name    | ON    |
| validate_password.dictionary_file    |       |
| validate_password.length             | 8     |
| validate_password.mixed_case_count   | 1     |
| validate_password.number_count       | 1     |
| validate_password.policy             | MEDIUM|
| validate_password.special_char_count | 1     |
+--------------------------------------+-------+
7 rows in set (0.00 sec)

关于 validate_password 组件对应的系统变量说明:

选项默认值参数描述
validate_password_check_user_nameON设置为ON的时候表示不能将密码设置成当前用户名。
validate_password_dictionary_file用于检查密码的字典文件的路径名,默认为空。
validate_password_length8密码的最小长度,也就是说密码长度必须大于或等于8
validate_password_mixed_case_count1如果密码策略是中等或更强的,validate_password要求密码具有的小写和大写字符的最小数量。
对于给定的这个值密码必须有那么多小写字符和那么多大写字符。
validate_password_number_count1密码必须包含的数字个数。
validate_password_policyMEDIUM密码强度检验等级,可以使用数值0、1、2或相应的符号值LOW、MEDIUM、STRONG来指定。
0/LOW :只检查长度。
1/MEDIUM :检查长度、数字、大小写、特殊字符。
2/STRONG :检查长度、数字、大小写、特殊字符、字典文件。
validate_password_special_char_count1密码必须包含的特殊字符个数。

组件和插件的默认值可能有所不同。例如,MySQL 5.7 validate_password_check_user_name的默认值为OFF

7.4.3.2 修改密码策略
SET GLOBAL validate_password_policy=LOW;
SET GLOBAL validate_password_policy=MEDIUM;
SET GLOBAL validate_password_policy=STRONG;
SET GLOBAL validate_password_policy=0;  # For LOW
SET GLOBAL validate_password_policy=1;  # For MEDIUM
SET GLOBAL validate_password_policy=2;  # For HIGH
# 注意,如果是插件的话,SQL为set global validate_password_policy=LOW
# 还可以修改密码中字符的长度
set global validate_password_length=1;
7.4.3.3 密码强度测试

如果创建密码是遇到Your password does not satisfy the current policy requirements,可以通过函数组件去检测密码是否满足条件: 0-100。当评估在100时就是说明使用上了最基本的规则:大写+小写+特殊
字符+数字组成的8位以上密码。

mysql> SELECT VALIDATE_PASSWORD_STRENGTH('medium');
+--------------------------------------+
| VALIDATE_PASSWORD_STRENGTH('medium') |
+--------------------------------------+
|                                   50 |
+--------------------------------------+
1 row in set (0.01 sec)

mysql> SELECT VALIDATE_PASSWORD_STRENGTH('K354*45jKd5');
+-------------------------------------------+
| VALIDATE_PASSWORD_STRENGTH('K354*45jKd5') |
+-------------------------------------------+
|                                       100 |
+-------------------------------------------+
1 row in set (0.00 sec)

如果没有安装validate_password组件或插件的话,那么这个函数永远都返回 0。

关于密码复杂度对应的密码复杂度策略。如下表格所示:

Password TestReturn Value
Length < 40
Length ≥ 4 and < validate_password.length25
Satisfies policy 1 (LOW)50
Satisfies policy 2 (MEDIUM)75
Satisfies policy 3 (STRONG)100
7.4.4 卸载插件、组件(了解)
# 卸载插件
mysql> UNINSTALL PLUGIN validate_password;
Query OK, 0 rows affected, 1 warning (0.01 sec)
# 卸载组件
mysql> UNINSTALL COMPONENT 'file://component_validate_password';
Query OK, 0 rows affected (0.02 sec)

8. Linux下MySQL登录

8.1 设置远程登录

8.1.1 确认网络
  • 1). 在远程机器上使用 ping ip 地址保证网络畅通
  • 2). 在远程机器上使用 telnet 命令保证端口号开放访问。
8.1.2 关闭防火墙或开放端口
8.1.2.1 方式一:关闭防火墙
# CentOS6 
service iptables stop

# CentOS7:
#开启防火墙
systemctl start firewalld.service
#查看防火墙状态
systemctl status firewalld.service
#关闭防火墙
systemctl stop firewalld.service
#设置开机启用防火墙 
systemctl enable firewalld.service 
#设置开机禁用防火墙 
systemctl disable firewalld.service
8.1.2.2 方式二:开放端口
# 查看开放的端口号
firewall-cmd --list-all
# 设置开放的端口号
firewall-cmd --add-service=http --permanent
firewall-cmd --add-port=3306/tcp --permanent
# 重启防火墙
firewall-cmd --reload

8.2 Linux 下修改配置

  • 修改允许远程登陆。
[root@MySQL80 ~]# mysql -uroot -proot
use mysql;
select Host, User, plugin from user;
update user set host = '%' where user ='root';
flush privileges;

%是个通配符,如果Host=192.168.1.%,那么就表示只要是IP地址前缀为 192.168.1.x 的客户端都可以连接。如果Host=%,表示所有IP都有连接权限。

注意:在生产环境下不能为了省事将 host 设置为%,这样做会存在安全问题,具体的设置可以根据生产环境的IP进行设置。

8.3 远程登录错误号码2058

配置新连接报错:错误号码 2058,分析是 mysql 密码加密方法变了。

  • 解决方法一:升级远程连接工具版本。
  • 解决方法二:使用mysql_native_password创建修改加密用户。
mysql>
USE mysql; 
select Host, User, plugin from user;
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

9. MySQL 演示使用

9.1 查看 MySQL 版本

mysql --version
#或
mysqladmin --version

9.2 MySQL 的使用演示

9.2.1 查看所有的数据库
# v5.7
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)
  • information_schema是 MySQL 系统自带的数据库,主要保存 MySQL 数据库服务器的系统信息,比如数据库的名称、数据表的名称、字段名称、存取权限、数据文件 所在的文件夹和系统使用的文件夹,等等。
  • performance_schema是 MySQL 系统自带的数据库,可以用来监控 MySQL 的各类性能指标。
  • sys数据库是 MySQL 系统自带的数据库,主要作用是以一种更容易被理解的方式展示 MySQL 数据库服务器的各类性能指标,帮助系统管理员和开发人员监控 MySQL 的技术性能。
  • mysql数据库保存了 MySQL 数据库服务器运行时需要的系统信息,比如数据文件夹、当前使用的字符集、约束检查信息等。

为什么Workbench里面我们只能看到“demo”和“sys”这 2 个数据库呢?(Workbench是MySQL官方数据库管理工具,参考后文)

  • 这是因为,Workbench 是图形化的管理工具,主要面向开发人 员,“demo”和“sys”这 2 个数据库已经够用了。如果有特殊需求,比如,需要监控 MySQL 数据库各项性能指标、直接操作 MySQL 数据库系统文件等,可以由 DBA 通过 SQL 语句,查看其它的系统数据库。
9.2.2 创建自己的数据库
create database 数据库名;
#创建 l080l 数据库,该名称不能与已经存在的数据库重名。
create database l080l;
9.2.3 使用自己的数据库
use 数据库名;
#使用 l080l 数据库
use l080l;

说明:如果没有使用use语句,后面针对数据库的操作也没有加“数据名”的限定,那么会报ERROR 1046 (3D000): No database selected(没有选择数据库)。使用完 use 语句之后,如果接下来的SQL都是针对一个数据库操作的,那就不用重复use了,如果要针对另一个数据库操作,那么要重新use。

9.2.4 查看某个库的所有表格
show tables;  #要求前面有use语句
show tables from 数据库名;
9.2.5 创建新的表格
create table 表名称(
	字段名  数据类型,
	字段名 数据类型
);

说明:如果是最后一个字段,后面就用加逗号,因为逗号的作用是分割每个字段。

#创建学生表
create table student(
	id int,
    name varchar(20)
);
9.2.6 查看一个表的数据
select * from 数据库表名称;
#查看学生表的数据
select * from student;
9.2.7 添加一条记录
insert into 表名称 values(值列表);
#添加两条记录到student表中
insert into student values(1,'张三');
insert into student values(2,'李四');
# 报错:字符集的问题。
mysql> insert into student values(1,'张三');
ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'name' at row 1
mysql> insert into student values(2,'李四');
ERROR 1366 (HY000): Incorrect string value: '\xC0\xEE\xCB\xC4' for column 'name' at row 1
mysql> show create table student;
9.2.8 查看表的创建信息
show create table 表名称\G
#查看student表的详细创建信息
show create table student\G
#结果如下
*************************** 1. row ***************************
       Table: student
Create Table: CREATE TABLE `student` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

上面的结果显示 student 的表格的默认字符集是latin1不支持中文。

9.2.9 查看数据库的创建信息
show create database 数据库名\G
#查看l080l数据库的详细创建信息
show create database l080l\G
#结果如下
*************************** 1. row ***************************
       Database: l080l
Create Database: CREATE DATABASE `l080l` /*!40100 DEFAULT CHARACTER SET latin1 */
1 row in set (0.00 sec)

上面的结果显示 l080l 数据库也不支持中文,字符集默认是 latin1。

9.2.10 删除表格
drop table 表名称;
# 删除学生表
drop table student;
9.2.11 删除数据库
drop database 数据库名;
# 删除l080l数据库
drop database l080l;

10. 字符集的相关操作

10.1 默认字符集

在MySQL 8.0版本之前,默认字符集为 latin1,utf8字符集指向的是 utf8mb3。网站开发人员在数据库
设计的时候往往会将编码修改为utf8 字符集。如果遗忘修改默认的编码,就会出现乱码的问题。从MySQL
8.0开始,数据库的默认编码将改为 utf8mb4,从而避免上述乱码的问题;MySQL 5.7中添加中文数据时,报错:

mysql> 
create database dbtest1;
use dbtest1;
create table t_emp(id int,name varchar(15));
mysql> INSERT INTO t_emp VALUES(1,'张三','男');
ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'sname' at row 1
# 查看默认字符集
mysql> show variables like 'character%';
# linux平台
# 5.7
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
# 8.0
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
# Windows平台 5.7
mysql> show variables like 'character_%';
+--------------------------+-------------------------------------------+
| Variable_name            | Value                                     |
+--------------------------+-------------------------------------------+
| character_set_client     | gbk                                       |
| character_set_connection | gbk                                       |
| character_set_database   | latin1                                    |
| character_set_filesystem | binary                                    |
| character_set_results    | gbk                                       |
| character_set_server     | latin1                                    |
| character_set_system     | utf8                                      |
| character_sets_dir       | D:\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+-------------------------------------------+
8 rows in set (0.01 sec)

mysql> show variables like 'collation_%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | gbk_chinese_ci    |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

10.2 MySQL5.7 修改字符集

但是原库、原表的设定不会发生变化,参数修改只对新建的数据库生效。

10.2.1 Linux 平台
# 编辑mysql配置文件
[root@MySQL57 ~]# vim /etc/my.cnf
# 在MySQL5.7或之前的版本中,在文件最后加上中文字符集配置:
character_set_server=utf8
# 重启服务
[root@MySQL57 ~]# systemctl restart mysqld
10.2.2 Windows 平台
10.2.2.1 步骤1:修改my.ini配置文件
[mysql]  #大概在63行左右,在其下添加
... 
default-character-set=utf8  #默认字符集

[mysqld]  # 大概在76行左右,在其下添加
...
character-set-server=utf8
collation-server=utf8_general_ci
  • 建议修改配置文件使用 notepad++ 等高级文本编辑器,使用记事本等软件打开修改后可能会导致文件编码修改为“含 BOM 头”的编码,从而服务重启失败。
  • 如果使用记事本编辑,需要另存为 ANSI 编码格式。
10.2.2.2 步骤2:重启服务
10.2.2.3 步骤3:查看编码命令
show variables like 'character_%';
show variables like 'collation_%';
  • 如果是以上配置就说明对了。接着我们就可以新创建数据库、新创建数据表,接着添加包含中文的数据了。

10.3 已有库&表字符集的变更

mysql> show create table t_emp;
+-------+--------------------------------
| Table | Create Table
+-------+--------------------------------
| t_emp | CREATE TABLE 't_emp' (
  'id' int(11) DEFAULT NULL,
  'name' varchar(15) DEFAULT NULL
) ENGINE=InnoDB DEAULT CHARSET=latin1 |
+-------+--------------------------------
1 row in set (0.00 sec)
# 修改已创建数据库的字符集
alter database dbtest1 character set 'utf8';
# 修改已创建数据表的字符集
alter table t_emp convert to character set 'utf8';

注意:原有的数据如果是用非’utf8’编码的话,数据本身编码不会发生改变。已有数据需要导
出或删除,然后重新插入。

10.4 各级别的字符集

MySQL 有 4 个级别的字符集和比较规则,分别是:

  • 服务器级别
  • 数据库级别
  • 表级别
  • 列级别
mysql> show variables like 'character%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
  • character_set_server:服务器级别的字符集
  • character_set_database:当前数据库的字符集
  • character_set_client:服务器解码请求时使用的字符集
  • character_set_connection:服务器处理请求时会把请求字符串从character_set_client转为character_set_connection
  • character_set_results:服务器向客户端返回数据时使用的字符集
10.4.1 服务器级别

character_set_server :服务器级别的字符集。

在启动服务器程序时通过启动选项或者在服务器程序运行过程中使用 SET 语句修改这两个变量
的值。比如可以在配置文件中这样写:

[server]
character_set_server=gbk  		# 默认字符集
collation_server=gbk_chinese_ci # 对应的默认的比较规则

当服务器启动的时候读取这个配置文件后这两个系统变量的值便修改了。

10.4.2 数据库级别

character_set_database :当前数据库的字符集。

在创建和修改数据库的时候可以指定该数据库的字符集和比较规则,具体语法如下:

CREATE DATABASE 数据库名
 [[DEFAULT] CHARACTER SET 字符集名称]
 [[DEFAULT] COLLATE 比较规则名称];
ALTER DATABASE 数据库名
 [[DEFAULT] CHARACTER SET 字符集名称]
 [[DEFAULT] COLLATE 比较规则名称];
10.4.3 表级别

也可以在创建和修改表的时候指定表的字符集和比较规则,语法如下:

CREATE TABLE 表名 (列的信息)
 [[DEFAULT] CHARACTER SET 字符集名称]
 [COLLATE 比较规则名称]]
ALTER TABLE 表名
 [[DEFAULT] CHARACTER SET 字符集名称]
 [COLLATE 比较规则名称]

如果创建和修改表的语句中没有指明字符集和比较规则,将使用该表所在数据库的字符集和比较规则作
为该表的字符集和比较规则。

10.4.4 列级别

对于存储字符串的列,同一个表中的不同的列也可以有不同的字符集和比较规则。我们在创建和修改列
定义的时候可以指定该列的字符集和比较规则,语法如下:

CREATE TABLE 表名(
 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称],
 其他列...
);
ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];

对于某个列来说,如果在创建和修改的语句中没有指明字符集和比较规则,将使用该列所在表的字符集
和比较规则作为该列的字符集和比较规则。

在转换列的字符集时需要注意,如果转换前列中存储的数据不能用转换后的字符集进行表示会发生
错误。比方说原先列使用的字符集是utf8,列中存储了一些汉字,现在把列的字符集转换为ascii的
话就会出错,因为ascii字符集并不能表示汉字字符。

10.4.5 小结

这4个级别字符集和比较规则的联系如下:

  • 如果创建或修改列时没有显式的指定字符集和比较规则,则该列默认用表的字符集和比较规则
  • 如果创建表时没有显式的指定字符集和比较规则,则该表默认用数据库的字符集和比较规则
  • 如果创建数据库时没有显式的指定字符集和比较规则,则该数据库默认用服务器的字符集和比较规则

知道了这些规则之后,对于给定的表,我们应该知道它的各个列的字符集和比较规则是什么,从而根据
这个列的类型来确定存储数据时每个列的实际数据占用的存储空间大小了。比方说我们向表 t 中插入一
条记录:

mysql> INSERT INTO t(col) VALUES('我们');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM t;
+--------+
| s   |
+--------+
| 我们  |
+--------+
1 row in set (0.00 sec)
# 首先列 col 使用的字符集是 gbk ,一个字符 '我' 在 gbk 中的编码为 0xCED2 ,占用两个字节,
# 两个字符的实际数据就占用4个字节。如果把该列的字符集修改为 utf8 的话,这两个字符就实际占用6个字节

10.5 字符集与比较规则(了解)

10.5.1 utf8与utf8mb4

utf8 字符集表示一个字符需要使用1~4个字节,但是我们常用的一些字符使用1~3个字节就可以表示
了。而字符集表示一个字符所用的最大字节长度,在某些方面会影响系统的存储和性能,所以设计
MySQL 的设计者偷偷的定义了两个概念:

utf8mb3 :阉割过的 utf8 字符集,只使用1~3个字节表示字符。
utf8mb4 :正宗的 utf8 字符集,使用1~4个字节表示字符。

10.5.2 比较规则

上表中,MySQL版本一共支持41种字符集,其中的 Default collation 列表示这种字符集中一种默认的比较规则,里面包含着该比较规则主要作用于哪种语言,比如 utf8_polish_ci 表示以波兰语的规则
比较, utf8_spanish_ci 是以西班牙语的规则比较, utf8_general_ci 是一种通用的比较规则。后缀表示该比较规则是否区分语言中的重音、大小写。具体如下:

后缀英文释义描述
_aiaccent insensitive不区分重音
_asaccent sensitive区分重音
_cicase insensitive不区分大小写
_cscase sensitive区分大小写
_binbinary以二进制方式比较
#查看GBK字符集的比较规则
SHOW COLLATION LIKE 'gbk%';
#查看UTF-8字符集的比较规则
SHOW COLLATION LIKE 'utf8%';

#查看服务器的字符集和比较规则
SHOW VARIABLES LIKE '%_server';
#查看数据库的字符集和比较规则
SHOW VARIABLES LIKE '%_database';
#查看具体数据库的字符集
SHOW CREATE DATABASE dbtest1;
#修改具体数据库的字符集
ALTER DATABASE dbtest1 DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

#查看表的字符集
show create table employees;
#查看表的比较规则
show table status from l080l like 'employees';
#修改表的字符集和比较规则
ALTER TABLE emp1 DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

10.6 请求到响应过程中字符集的变化

系统变量描述
character_set_client服务器解码请求时使用的字符集。
character_set_connection服务器处理请求时会把请求字符串从character_set_client 转为 character_set_connection。
character_set_results服务器向客户端返回数据时使用的字符集。

这几个系统变量在我的计算机上的默认值如下(不同操作系统的默认值可能不同):

mysql> show variables like 'character%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+

为了体现出字符集在请求处理过程中的变化,我们这里特意修改一个系统变量的值:

mysql> set character_set_connection = gbk;
Query OK, 0 rows affected (0.00 sec)

现在假设我们客户端发送的请求是下边这个字符串:

SELECT * FROM t WHERE s = '我';

为了方便大家理解这个过程,我们只分析字符 ‘我’ 在这个过程中字符集的转换。现在看一下在请求从发送到结果返回过程中字符集的变化:

10.6.1 客户端发送请求所使用的字符集

一般情况下客户端所使用的字符集和当前操作系统一致,不同操作系统使用的字符集可能不一
样,如下:

  • 类 Unix 系统使用的是 utf8
  • Windows 使用的是 gbk

当客户端使用的是 utf8 字符集,字符 ‘我’ 在发送给服务器的请求中的字节形式就是:
0xE68891。

如果你使用的是可视化工具,比如navicat之类的,这些工具可能会使用自定义的字符集来编
码发送到服务器的字符串,而不采用操作系统默认的字符集(所以在学习的时候还是尽量用
命令行窗口)。

10.6.2 服务器接收

服务器接收到客户端发送来的请求其实是一串二进制的字节,它会认为这串字节采用的字符集是
character_set_client ,然后把这串字节转换为 character_set_connection 字符集编码的
字符。
由于我的计算机上 character_set_client 的值是 utf8 ,首先会按照 utf8 字符集对字节串
0xE68891 进行解码,得到的字符串就是 ‘我’ ,然后按照 character_set_connection 代表的
字符集,也就是 gbk 进行编码,得到的结果就是字节串 0xCED2 。

10.6.3 转换

因为表 t 的列 col 采用的是 gbk 字符集,与 character_set_connection 一致,所以直接到列中找字节值为 0xCED2 的记录,最后找到了一条记录。

如果某个列使用的字符集和character_set_connection代表的字符集不一致的话,还需要进行
一次字符集转换。

10.6.4 解码

上一步骤找到的记录中的 col 列其实是一个字节串 0xCED2 , col 列是采用 gbk 进行编码的,所以首先会将这个字节串使用 gbk 进行解码,得到字符串 ‘我’ ,然后再把这个字符串使用
character_set_results 代表的字符集,也就是 utf8 进行编码,得到了新的字节串:0xE68891 ,然后发送给客户端。

10.6.5 返回结果

由于客户端是用的字符集是 utf8 ,所以可以顺利的将 0xE68891 解释成字符 我 ,从而显示到我
们的显示器上,所以我们人类也读懂了返回的结果。

使用操作系统的字符集编码请求字符串
使用操作系统的字符集解码响应的字符串
客户端
从character_set_client转换为character_set_connection
从character_set_connection转换为具体的列使用的字符集
将查询结果从具体的列上使用的字符集转换为character_set_results

11. SQL 大小写规范

11.1 Windows和Linux平台区别

在 SQL 中,关键字和函数名是不用区分字母大小写的,比如 SELECT、WHERE、ORDER、GROUP BY 等关
键字,以及 ABS、MOD、ROUND、MAX 等函数名。不过在 SQL 中,你还是要确定大小写的规范,因为在 Linux 和 Windows 环境下,可能会遇到不同的大小写问题。Windows 系统默认大小写不敏感 ,但是 Linux 系统是大小写敏感的 。

# 通过如下命令查看:
SHOW VARIABLES LIKE '%lower_case_table_names%';
# Linux 下
mysql> SHOW VARIABLES LIKE '%lower_case_table_names%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_table_names | 0     |
+------------------------+-------+
1 row in set (0.00 sec)
# Windows 下
mysql> SHOW VARIABLES LIKE '%lower_case_table_names%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_table_names | 1     |
+------------------------+-------+
1 row in set (0.00 sec)

lower_case_table_names参数值的设置:

默认为0,大小写敏感 。

设置1:大小写不敏感。创建的表,数据库都是以小写形式存放在磁盘上,对于sql语句都是转
换为小写对表和数据库进行查找。

设置2:创建的表和数据库依据语句上格式存放,凡是查找都是转换为小写进行。

两个平台上SQL大小写的区别具体来说:

MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:

  • 1). 数据库名、表名、表的别名、变量名是严格区分大小写的;
  • 2). 关键字、函数名称在 SQL 中不区分大小写;
  • 3). 列名(或字段名)与列的别名(或字段别名)在所有的情况下均是忽略大小写的;

MySQL在Windows的环境下全部不区分大小写。

11.2 Linux下大小写规则设置

MySQL 5.7

当想设置为大小写不敏感时,要在MySQL5.7 的 my.cnf 这个配置文件 [mysqld] 中加入lower_case_table_names=1,然后重启服务器。

[mysqld]
lower_case_table_names=1 

但是要在重启数据库实例之前就需要将原来的数据库和表转换为小写,否则将找不到数据库名。此参数适用于MySQL5.7。

MySQL 8.0

在 MySQL 8 下禁止在重新启动 MySQL 服务时将
lower_case_table_names 设置成不同于初始化 MySQL 服务时设置的
lower_case_table_names 值。如果非要将 MySQL 8 设置为大小写不敏感,具体步骤为:

1). 停止MySQL服务

2). 删除数据目录,即删除 /var/lib/mysql 目录

3). 在MySQL配置文件( /etc/my.cnf )中添加 lower_case_table_names=1

4). 启动MySQL服务

11.3 SQL编写建议

如果你的变量名命名规范没有统一,就可能产生错误。这里有一个有关命名规范的建议:

1). 关键字和函数名称全部大写;

2). 数据库名、表名、表别名、字段名、字段别名等全部小写;

3). SQL 语句必须以分号结尾。

数据库名、表名和字段名在 Linux MySQL 环境下是区分大小写的,因此建议你统一这些字段的命名规
则,比如全部采用小写的方式。虽然关键字和函数名称在 SQL 中不区分大小写,也就是如果小写的话同样可以执行。但是同时将关键词
和函数名称全部大写,以便于区分数据库名、表名、字段名。

12. SQL_mode 的合理设置

12.1 宽松模式 vs 严格模式

12.1.1 宽松模式

如果设置的是宽松模式,那么我们在插入数据的时候,即便是给了一个错误的数据,也可能会被接受,
并且不报错。

举例

我在创建一个表时,该表中有一个字段为name,给name设置的字段类型时 char(10) ,如果在插入数据的时候,其中 name 这个字段对应的有一条数据的长度超过了 10 ,例如 ‘1234567890abc’,超过了设定的字段长度 10,那么不会报错,并且取前 10 个字符存上,也就是说你这个数据被存为了 ‘1234567890’,而 ‘abc’ 就没有了。但是,我们给的这条数据是错误的,因为超过了字段长度,但是并没有报错,并且 mysql 自行处理并接受了,这就是宽松模式的效果。

应用场景

通过设置 sql mode 为宽松模式,来保证大多数 sql 符合标准的 sql 语法,这样应用在不同数据库之间进行迁移时,则不需要对业务 sql 进行较大的修改。

12.1.2 严格模式

出现上面宽松模式的错误,应该报错才对,所以 MySQL5.7 版本就将 sql_mode 默认值改为了严格模式。所以在生产等环境中,我们必须采用的是严格模式,进而开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。并且即便是用的MySQL5.6,也应该自行将其改为严格模式。

开发经验

MySQL 等数据库总想把关于数据的所有操作都自己包揽下来,包括数据的校验,其实开发中,我们应该在自己开发的项目程序级别将这些校验给做了,虽然写项目的时候麻烦了一些步骤,但是这
样做之后,我们在进行数据库迁移或者在项目的迁移时,就会方便很多。

12.2 模式查看和设置

12.2.1 查看当前的sql_mode
select @@session.sql_mode
select @@global.sql_mode
show variables like 'sql_mode';
12.2.2 临时设置方式
# 临时设置方式:设置当前窗口中设置sql_mode
SET GLOBAL sql_mode = 'modes...'; #全局
SET SESSION sql_mode = 'modes...'; #当前会话
# 举例
#改为严格模式。此方法只在当前会话中生效,关闭当前会话就不生效了。
set SESSION sql_mode='STRICT_TRANS_TABLES'; 
#改为严格模式。此方法在当前服务中生效,重启MySQL服务后失效。
set GLOBAL sql_mode='STRICT_TRANS_TABLES';
12.2.3 永久设置

在 my.cnf 文件(Windows系统是my.ini文件),新增:

[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

然后重启 MySQL,当然生产环境上是禁止重启 MySQL 服务的,所以采用临时设置方式 + 永久设置方式来解决线上的问题,那么即便是有一天真的重启了 MySQL 服务,也会永久生效了。

12.3 严格模式存在的问题

若设置模式中包含了NO_ZERO_DATE,那么 MySQL 数据库不允许插入零日期,插入零日期会抛出错误而不是警告。例如表中含字段 TIMESTAMP 列(如果未声明为NULL或显示DEFAULT子句)将自动分配 DEFAULT ‘0000-00-00 00:00:00’(零时间戳),也或者是本测试的表 day 列默认允许插入零日期 ‘0000-00-00’ COMMENT ‘日期’;这些显然是不满足 sql_mode 中的 NO_ZERO_DATE 而报错。

方式一:先执行select @@sql_mode,复制查询出来的值并将其中的 NO_ZERO_IN_DATE、NO_ZERO_DATE 删除,然后执行 set sql_mode = '修改后的值'或者set session sql_mode='修改后的值';,例如:set session sql_mode='STRICT_TRANS_TABLES';改为严格模式。此方法只在当前会话中生效,关闭当前会话就不生效了。
方式二:先执行 select @@global.sql_mode,复制查询出来的值并将其中的 NO_ZERO_IN_DATE、NO_ZERO_DATE 删除,然后执行set global sql_mode = '修改后的值'
此方法在当前服务中生效,重新 MySQL 服务后失效。
方法三:在 mysql 的安装目录下,或 my.cnf 文件(windows系统是my.ini文件),添加 my.cnf 如下:

[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

然后重启 mysql。
此方法永久生效,当然生产环境上是禁止重启 MySQL 服务的,所以采用方式二加方式三来解决线上的问题,即便是有一天真的重启了 MySQL 服务,也会永久生效了。

当前 8.0 和 5.7 版本默认都是严格模式。

13. MySQL 图形化管理工具

MySQL图形化管理工具极大地方便了数据库的操作与管理,常用的图形化管理工具有:MySQL Workbench、phpMyAdmin、Navicat Preminum、MySQLDumper、SQLyog、dbeaver、MySQL ODBC Connector。

13.1 工具1. MySQL Workbench

13.1.1 社区版

MySQL官方提供的图形化管理工具MySQL Workbench完全支持MySQL 5.0以上的版本。MySQL Workbench分为社区版和商业版,社区版完全免费,而商业版则是按年收费。MySQL Workbench 为数据库管理员、程序开发者和系统规划师提供可视化设计、模型建立、以及数据库管理功能。它包含了用于创建复杂的数据建模ER模型,正向和逆向数据库工程,也可以用于执行通常需要花费大量时间的、难以变更和管理的文档任务。下载地址:http://dev.mysql.com/downloads/workbench/

首先,点击 Windows 左下角的“开始”按钮,如果你是 Win10 系统,可以直接看到所有程序。接着,找到“MySQL”,点开,找到“MySQL Workbench 8.0 CE”。点击打开 Workbench,如下图所示:

左下角有个本地连接,点击,录入 Root 的密码,登录本地 MySQL 数据库服务器,如下图所示:

这是一个图形化的界面,我来给你介绍下这个界面。

  • 上方是菜单。左上方是导航栏,这里我们可以看到 MySQL 数据库服务器里面的数据 库,包括数据表、视图、存储过程和函数;左下方是信息栏,可以显示上方选中的数据 库、数据表等对象的信息。
  • 中间上方是工作区,你可以在这里写SQL 语句,点击上方菜单栏左边的第三个运行按 钮,就可以执行工作区的 SQL 语句了。
  • 中间下方是输出区,用来显示 SQL 语句的运行情况,包括什么时间开始运行的、运行的 内容、运行的输出,以及所花费的时长等信息。
13.1.2 商业版

https://edelivery.oracle.com/

13.2 工具2. Navicat

Navicat MySQL 是一个强大的 MySQL 数据库服务器管理和开发工具。它可以与任何 3.21 或以上版本的 MySQL 一起工作,支持触发器、存储过程、函数、事件、视图、管理用户等,对于新手来说易学易用。其精心设计的图形用户界面(GUI)可以让用户用一种安全简便的方式来快速方便地创建、组织、访问和共享信息。Navicat 支持中文,有免费版本提供。
下载地址:http://www.navicat.com/

13.3 工具3. SQLyog

SQLyog 是业界著名的 Webyog 公司出品的一款简洁高效、功能强大的图形化 MySQL 数据库管理工具。这款工具是使用C++语言开发的。该工具可以方便地创建数据库、表、视图和索引等,还可以方便地进行插入、更新和删除等操作,同时可以方便地进行数据库、数据表的备份和还原。该工具不仅可以通过 SQL 文件进行大量文件的导入和导出,还可以导入和导出 XML、HTML 和 CSV 等多种格式的数据。下载地址:http://www.webyog.com/,也可以搜索中文版的下载地址。

14.2 工具4. dbeaver

DBeaver 是一个通用的数据库管理工具和 SQL 客户端,支持所有流行的数据库:MySQL、PostgreSQL、SQLite、Oracle、DB2、SQL Server、 Sybase、MS Access、Teradata、 Firebird、Apache Hive、Phoenix、Presto等。DBeaver 比大多数的 SQL 管理工具要轻量,而且支持中文界面。DBeaver社区版作为一个免费开源的产品,和其他类似的软件相比,在功能和易用性上都毫不逊色。唯一需要注意是 DBeaver 是用Java编程语言开发的,所以需要拥有 JDK(Java Development ToolKit)环境。如果电脑上没有JDK,在选择安装DBeaver组件时,勾选“Include Java”即可。

DBeaver Community Windows Installer
下载地址:https://dbeaver.io/download/
下载MySQL驱动 https://dev.mysql.com/downloads/connector/j/

如果自动加载的驱动无法安装下载,手动下载MySQL官方的驱动加载即可。

13.5 可能出现连接问题

13.5.1 错误号码2058

有些图形界面工具,特别是旧版本的图形界面工具,在连接 MySQL8 时出现“Authentication plugin ‘caching_sha2_password’ cannot be loaded”错误。

出现这个原因是 MySQL8 之前的版本中加密规则是mysql_native_password,而在MySQL8之后,加密规则是caching_sha2_password。解决问题方法有两种,

  • 第一种是升级图形界面工具版本;
  • 第二种是把MySQL8用户登录密码加密规则还原成mysql_native_password

第二种解决方案如下,用命令行登录MySQL数据库之后,执行如下命令修改用户密码加密规则并更新用户密码,这里修改用户名为“root@localhost”的用户密码规则为“mysql_native_password”,密码值为“123456”,如图所示。

#使用mysql数据库
USE mysql; 
#修改'root'@'localhost'或者'root'@'%'
mysql> use mysql;
Database changed
mysql> select Host, User, plugin from user;
+-----------+------------------+-----------------------+
| Host      | User             | plugin                |
+-----------+------------------+-----------------------+
| %         | root             | caching_sha2_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session    | caching_sha2_password |
| localhost | mysql.sys        | caching_sha2_password |
+-----------+------------------+-----------------------+
# 根据查询到的host(%或localhost)执行以下命令
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
# 刷新权限或重启服务生效
FLUSH PRIVILEGES;

13.5.2 远程连接问题

Host is not allowed to connect to this MySQL server,在装有 MySQL 的机器上登录MySQL mysql -u root -p密码。

# 登录MySQL
C:\Users\Administrator>mysql -uroot -P33065 -proot
# 使用MySQL
mysql> use  mysql
Database changed
# 更新用户可登录的host
mysql> update user set host = '%' where user = 'root';
# 刷新
mysql> FLUSH PRIVILEGES;

14. Windows 下 MySQL目录结构与源码

14.1 主要目录结构

MySQL的目录结构说明
bin目录所有MySQL的可执行文件。如:mysql.exe
MySQL InstanceConfig.exe数据库的配置向导,在安装时出现的内容。
data目录系统数据库所在的目录。
my.ini文件MySQL的主要配置文件。
C:\ProgramData\MySQL\MySQL Server 8.0\data\用户创建的数据库所在的目录。

14.2 MySQL 源代码获取

首先,进入 MySQL下载界面。 这里不要选择用默认的“Microsoft Windows”,而是要通过下拉栏,找到“Source Code”,在下面的操作系统版本里面,选择 Windows(Architecture Independent),然后点击下载。接下来,把下载下来的压缩文件解压,我们就得到了 MySQL 的源代码。MySQL 是用 C++ 开发而成的,简单介绍一下源代码的组成。mysql-8.0.22 目录下的各个子目录,包含了 MySQL 各部分组件的源代码:

  • sql 子目录是 MySQL 核心代码;
  • libmysql 子目录是客户端程序 API;
  • mysql-test 子目录是测试工具;
  • mysys 子目录是操作系统相关函数和辅助函数;

源代码可以用记事本打开查看,如果你有 C++ 的开发环境,也可以在开发环境中打开查看。

如上图所示,源代码并不神秘,就是普通的 C++ 代码,跟你熟悉的一样,而且有很多注释,可以帮助理解。阅读源代码就像在跟 MySQL 的开发人员对话一样,十分有趣。

15. 学习MySQL几个示例数据库

当前演示的Mysql 8.0环境和8.0版本示例数据库。

MySQL官方网站提供了以下几个示例数据库:

这些数据库既可以用于日常学习和测试,也可以作为我们设计时数据库的一个参考。本文就来介绍一下这些数据库的模式结构以及如何下载和安装。

15.1 EMPLOYEE

15.1.1 介绍

Employee 示例数据库包含了 6 个表(dept_emp、dept_manager、titles、salaries、employees 以及 departments),大约 400 万条数据(需要约 160 MB 磁盘空间)。Employees 数据库的模式结构如下图所示:

15.1.2 安装

下载数据库 Employees DB on GitHub

# 1、上传到opt,解压
[root@node1 ~]# cd /opt/
[root@node1 opt]# unzip test_db-master.zip
# Employees数据库与几种不同的存储引擎兼容,默认情况下启用InnoDB引擎。
# 2、(略)编辑Employees.sql文件并调整注释以选择其他存储引擎:
   set storage_engine = InnoDB;
-- set storage_engine = MyISAM;
-- set storage_engine = Falcon;
-- set storage_engine = PBXT;
-- set storage_engine = Maria;
# 3、导入Employees到数据库
[root@node1 opt]# cd test_db-master/
[root@node1 test_db-master]# mysql -proot -t < employees.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
+-----------------------------+
| INFO                        |
+-----------------------------+
| CREATING DATABASE STRUCTURE |
+-----------------------------+
+------------------------+
| INFO                   |
+------------------------+
| storage engine: InnoDB |
+------------------------+
+---------------------+
| INFO                |
+---------------------+
| LOADING departments |
+---------------------+
+-------------------+
| INFO              |
+-------------------+
| LOADING employees |
+-------------------+
+------------------+
| INFO             |
+------------------+
| LOADING dept_emp |
+------------------+
+----------------------+
| INFO                 |
+----------------------+
| LOADING dept_manager |
+----------------------+
+----------------+
| INFO           |
+----------------+
| LOADING titles |
+----------------+
+------------------+
| INFO             |
+------------------+
| LOADING salaries |
+------------------+
+---------------------+
| data_load_time_diff |
+---------------------+
| 00:01:12            |
+---------------------+
# 4、如果想要使用分区表,可以执行 employees_partitioned.sql 文件
15.1.3 验证数据
# Employee数据库提供了md5和sha两种验证数据的方法:
# sha验证
[root@node1 test_db-master]# time mysql -proot -t < test_employees_sha.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------------+
| INFO                 |
+----------------------+
| TESTING INSTALLATION |
+----------------------+
+--------------+------------------+------------------------------------------+
| table_name   | expected_records | expected_crc                             |
+--------------+------------------+------------------------------------------+
| departments  |                9 | 4b315afa0e35ca6649df897b958345bcb3d2b764 |
| dept_emp     |           331603 | d95ab9fe07df0865f592574b3b33b9c741d9fd1b |
| dept_manager |               24 | 9687a7d6f93ca8847388a42a6d8d93982a841c6c |
| employees    |           300024 | 4d4aa689914d8fd41db7e45c2168e7dcb9697359 |
| salaries     |          2844047 | b5a1785c27d75e33a4173aaa22ccf41ebd7d4a9f |
| titles       |           443308 | d12d5f746b88f07e69b9e36675b6067abb01b60e |
+--------------+------------------+------------------------------------------+
+--------------+------------------+------------------------------------------+
| table_name   | found_records    | found_crc                                |
+--------------+------------------+------------------------------------------+
| departments  |                9 | 4b315afa0e35ca6649df897b958345bcb3d2b764 |
| dept_emp     |           331603 | d95ab9fe07df0865f592574b3b33b9c741d9fd1b |
| dept_manager |               24 | 9687a7d6f93ca8847388a42a6d8d93982a841c6c |
| employees    |           300024 | 4d4aa689914d8fd41db7e45c2168e7dcb9697359 |
| salaries     |          2844047 | b5a1785c27d75e33a4173aaa22ccf41ebd7d4a9f |
| titles       |           443308 | d12d5f746b88f07e69b9e36675b6067abb01b60e |
+--------------+------------------+------------------------------------------+
+--------------+---------------+-----------+
| table_name   | records_match | crc_match |
+--------------+---------------+-----------+
| departments  | OK            | ok        |
| dept_emp     | OK            | ok        |
| dept_manager | OK            | ok        |
| employees    | OK            | ok        |
| salaries     | OK            | ok        |
| titles       | OK            | ok        |
+--------------+---------------+-----------+
+------------------+
| computation_time |
+------------------+
| 00:01:13         |
+------------------+
+---------+--------+
| summary | result |
+---------+--------+
| CRC     | OK     |
| count   | OK     |
+---------+--------+

real    1m13.504s
user    0m0.004s
sys     0m0.015s
# md5验证
[root@node1 test_db-master]# time mysql -proot -t < test_employees_md5.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------------+
| INFO                 |
+----------------------+
| TESTING INSTALLATION |
+----------------------+
+--------------+------------------+----------------------------------+
| table_name   | expected_records | expected_crc                     |
+--------------+------------------+----------------------------------+
| departments  |                9 | d1af5e170d2d1591d776d5638d71fc5f |
| dept_emp     |           331603 | ccf6fe516f990bdaa49713fc478701b7 |
| dept_manager |               24 | 8720e2f0853ac9096b689c14664f847e |
| employees    |           300024 | 4ec56ab5ba37218d187cf6ab09ce1aa1 |
| salaries     |          2844047 | fd220654e95aea1b169624ffe3fca934 |
| titles       |           443308 | bfa016c472df68e70a03facafa1bc0a8 |
+--------------+------------------+----------------------------------+
+--------------+------------------+----------------------------------+
| table_name   | found_records    | found_crc                        |
+--------------+------------------+----------------------------------+
| departments  |                9 | d1af5e170d2d1591d776d5638d71fc5f |
| dept_emp     |           331603 | ccf6fe516f990bdaa49713fc478701b7 |
| dept_manager |               24 | 8720e2f0853ac9096b689c14664f847e |
| employees    |           300024 | 4ec56ab5ba37218d187cf6ab09ce1aa1 |
| salaries     |          2844047 | fd220654e95aea1b169624ffe3fca934 |
| titles       |           443308 | bfa016c472df68e70a03facafa1bc0a8 |
+--------------+------------------+----------------------------------+
+--------------+---------------+-----------+
| table_name   | records_match | crc_match |
+--------------+---------------+-----------+
| departments  | OK            | ok        |
| dept_emp     | OK            | ok        |
| dept_manager | OK            | ok        |
| employees    | OK            | ok        |
| salaries     | OK            | ok        |
| titles       | OK            | ok        |
+--------------+---------------+-----------+
+------------------+
| computation_time |
+------------------+
| 00:00:58         |
+------------------+
+---------+--------+
| summary | result |
+---------+--------+
| CRC     | OK     |
| count   | OK     |
+---------+--------+

real    0m58.515s
user    0m0.006s
sys     0m0.015s

15.2 World

15.2.1 介绍

Word数据库包含了 country、countrylanguage 以及 city 表。world 是一个小型的简单数据库,主要用于基础查询测试。

img

15.2.2 安装

下载 https://dev.mysql.com/doc/index-other.html。部署验证 https://dev.mysql.com/doc/world-setup/en/world-setup-installation.html

[root@node1 test_db-master]# cd /opt/
[root@node1 opt]# unzip world-db.zip 
Archive:  world-db.zip
   creating: world-db/
  inflating: world-db/world.sql 
[root@node1 opt]# cd world-db/
[root@node1 world-db]# mysql -proot -t < world.sql
15.2.3 验证
mysql> USE world;
Database changed
mysql> SHOW TABLES;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+
3 rows in set (0.00 sec)
mysql> SELECT COUNT(*) FROM city;
+----------+
| COUNT(*) |
+----------+
| 4079     |
+----------+
1 row in set (0.02 sec)
mysql> SELECT COUNT(*) FROM country;
+----------+
| COUNT(*) |
+----------+
| 239      |
+----------+
1 row in set (0.00 sec)

15.3 WORLD_X

15.3.1 介绍

是一个基于 world 修改后的数据库,主要用于测试 MySQL 5.7 之后提供的文档存储功能和 X DevAPI。

img

15.3.2 安装

下载https://dev.mysql.com/doc/index-other.html

# 解压
[root@node1 world-db]# cd /opt/
[root@node1 opt]# unzip world_x-db.zip 
Archive:  world_x-db.zip
   creating: world_x-db/
  inflating: world_x-db/README.txt   
  inflating: world_x-db/world_x.sql  
[root@node1 opt]# cd world_x-db/
[root@node1 world_x-db]#
# 使用mysql命令导入
[root@node1 world_x-db]# mysql -proot
SOURCE /opt/world_x-db/world_x.sql
15.3.3 验证
mysql> USE world_x;
Database changed

mysql> SHOW TABLES;
+-------------------+
| Tables_in_world_x |
+-------------------+
| city              |
| country           |
| countryinfo       |
| countrylanguage   |
+-------------------+
4 rows in set (0.00 sec)

mysql> SELECT COUNT(*) FROM city;
+----------+
| COUNT(*) |
+----------+
|     4079 |
+----------+
1 row in set (0.02 sec)

mysql> SELECT COUNT(*) FROM country;
+----------+
| COUNT(*) |
+----------+
|      239 |
+----------+
1 row in set (0.00 sec)

15.4 SAKILA

15.4.1 介绍

Sakila 是一个在线 DVD 出租商店数据库,为各种 MySQL 文档、书籍、教程、文章、示例等提供了一个标准数据库模式;同时,它还可以用于演示 MySQL 的其他功能特性,例如视图、存储过程和触发器。Sakila 数据库的模式结构如下图所示:

img

  • Sakila 数据库提供了以下数据表:
    • actor,演员信息表。通过 film_actor 表和 film 表进行关联。
    • film,电影信息表。film 引用了 language 表,同时被 film_category、film_actor 以及 inventory 表引用。
    • film_actor,电影演员表。film 表和 actor 表之间的多对多关系。
    • film_category,电影分类表。film 表和 category 表之间的多对多关系。
    • category,分类表。通过 film_category 表和 film 表进行关联。
    • inventory,电影库存表。每部电影在不同商店里的库存,被 rental 表引用。
    • film_text,电影描述表。包含了 film 表中的 film_id、title 以及 description 三个字段,通过 film 表上的触发器进行数据同步。
    • language,语言信息表。language 表被 film 表引用。
    • address,地址信息表。其中主键字段 address_id 是 customer、staff 以及 store 表上的外键引用字段,同时引用了 city 表。
    • city,城市信息表。引用了 country 表,同时被 address 表引用。
    • country,国家信息表。country 表被 city 表引用。
    • customer,客户信息表。引用了 address 和 store 表,同时被 payment 和 rental 表引用。
    • payment,付款信息表。引用了 customer、staff 以及 rental 表。
    • rental,租赁信息表,每个 DVD 每次被租赁的信息。引用了 inventory、customer 以及 staff 表,同时被 payment 表引用。
    • staff,员工信息表。引用了 store 和 address 表,同时被 rental、payment 以及 store 表引用。
    • store,商店信息表,引用了 staff 和 address 表,同时被 staff、customer 以及 inventory 表引用。
  • Sakila 数据库提供了以下视图:
    • actor_info,包含了所有的演员,以及他们演出过的电影。
    • customer_list,客户和地址信息列表。
    • film_list,电影信息和参与的演员。
    • nicer_but_slower_film_list,电影信息和参与的演员,演员的姓名调整为首字母大写。
    • sales_by_film_category,按照不同电影分类统计的销售金额,同一个电影可能被分为多个类别。
    • sales_by_store,按照商店统计的销售金额。
    • staff_list,员工列表,包括地址和所属的商店。
  • Sakila 数据库提供了以下存储过程和函数:
    • film_in_stock,存储过程,获取指定电影在指定商店内未出租的 DVD。
    • film_not_in_stock,存储过程,获取指定电影在指定商店内已出租未归还的 DVD。
    • rewards_report,存储过程,获取上个月的最佳客户列表。
    • get_customer_balance,存储函数,返回指定客户在某个日期之前的欠款。
    • inventory_held_by_customer,存储函数,返回正在租赁某个 DVD 的客户。
    • inventory_in_stock,存储函数,返回某个 DVD 是否可出租。TRUE 表示可以出租,FALSE 表示已出租未归还。
  • Sakila 数据库包含了以下触发器:
    • customer_create_date,插入数据时将 customer 表的 create_date 字段设置为当前日期和时间。
    • payment_date,插入数据时将 payment 表的 payment_date 字段设置为当前日期和时间。
    • rental_date,插入数据时将 rental 表的 rental_date 字段设置为当前日期和时间。
    • ins_film,将 film 表上插入的相关数据复制一份到 film_text 表。
    • upd_film,将 film 表上更新的相关数据同步到 film_text 表。
    • del_film,删除 film 表数据时同步删除 film_text 表上的相关数据。
15.4.2 安装

下载https://dev.mysql.com/doc/index-other.html

[root@node1 mysql]# cd /opt/
[root@node1 opt]# unzip sakila-db.zip 
Archive:  sakila-db.zip
   creating: sakila-db/
  inflating: sakila-db/sakila-data.sql  
  inflating: sakila-db/sakila-schema.sql  
  inflating: sakila-db/sakila.mwb 
[root@node1 opt]# cd sakila-db/
[root@node1 sakila-db]# mysql -proot -t <  sakila-schema.sql;
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@node1 sakila-db]# mysql -proot -t <  sakila-data.sql;
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@node1 sakila-db]# 
15.4.3 验证
mysql> USE sakila;
Database changed

mysql> SHOW FULL TABLES;
+----------------------------+------------+
| Tables_in_sakila           | Table_type |
+----------------------------+------------+
| actor                      | BASE TABLE |
| actor_info                 | VIEW       |
| address                    | BASE TABLE |
| category                   | BASE TABLE |
| city                       | BASE TABLE |
| country                    | BASE TABLE |
| customer                   | BASE TABLE |
| customer_list              | VIEW       |
| film                       | BASE TABLE |
| film_actor                 | BASE TABLE |
| film_category              | BASE TABLE |
| film_list                  | VIEW       |
| film_text                  | BASE TABLE |
| inventory                  | BASE TABLE |
| language                   | BASE TABLE |
| nicer_but_slower_film_list | VIEW       |
| payment                    | BASE TABLE |
| rental                     | BASE TABLE |
| sales_by_film_category     | VIEW       |
| sales_by_store             | VIEW       |
| staff                      | BASE TABLE |
| staff_list                 | VIEW       |
| store                      | BASE TABLE |
+----------------------------+------------+
23 rows in set (0.01 sec)

mysql> SELECT COUNT(*) FROM film;
+----------+
| COUNT(*) |
+----------+
|     1000 |
+----------+
1 row in set (0.00 sec)

mysql> SELECT COUNT(*) FROM film_text;
+----------+
| COUNT(*) |
+----------+
|     1000 |
+----------+
1 row in set (0.00 sec)

15.5 menagerie

15.5.1 介绍

menagerie 数据库是一个小型的动物数据库,包含 pet 和 event 表。

img

15.5.2 安装

下载 https://dev.mysql.com/doc/index-other.html

[root@node1 opt]# unzip menagerie-db.zip 
Archive:  menagerie-db.zip
   creating: menagerie-db/
  inflating: menagerie-db/README.txt  
  inflating: menagerie-db/cr_event_tbl.sql  
  inflating: menagerie-db/cr_pet_tbl.sql  
  inflating: menagerie-db/event.txt  
  inflating: menagerie-db/ins_puff_rec.sql  
  inflating: menagerie-db/load_pet_tbl.sql  
  inflating: menagerie-db/pet.txt    
[root@node1 opt]# cd menagerie-db/
# 使用方法参考README.txt
[root@node1 menagerie-db]# cat README.txt 
[root@node1 menagerie-db]# mysql -proot
# 创建数据库
mysql>
CREATE DATABASE menagerie;
USE menagerie;
# 创建 pet 表并加载数据:
mysql>
SOURCE cr_pet_tbl.sql;
LOAD DATA LOCAL INFILE 'pet.txt' INTO TABLE pet;
SOURCE ins_puff_rec.sql;
# 创建 event 表并加载数据:
mysql>
SOURCE cr_event_tbl.sql;
LOAD DATA LOCAL INFILE 'event.txt' INTO TABLE event;
# load data 问题
#1、 ERROR 3948
mysql> LOAD DATA LOCAL INFILE 'pet.txt' INTO TABLE pet;
SOURCE ins_puff_rec.sql;ERROR 3948 (42000): Loading local data is disabled; this must be enabled on both the client and server sides
	-- 解决
	mysql> show variables like 'local_infile';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | local_infile  | OFF   |
    +---------------+-------+
    1 row in set (0.00 sec)
	mysql> set global local_infile=on;
	Query OK, 0 rows affected (0.00 sec)
#2、重新LOAD DATA报错
mysql> LOAD DATA LOCAL INFILE 'pet.txt' INTO TABLE pet;
ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.
	-- 解决
	# 解决方法是需要以mysql -u 用户名 -p --local-infile的命令登陆,如:
[root@node1 menagerie-db]# mysql -proot --local-infile
mysql> USE menagerie;

mysql> LOAD DATA LOCAL INFILE 'pet.txt' INTO TABLE pet;
Query OK, 8 rows affected (0.01 sec)
Records: 8  Deleted: 0  Skipped: 0  Warnings: 0

mysql> LOAD DATA LOCAL INFILE 'event.txt' INTO TABLE event;
Query OK, 10 rows affected, 2 warnings (0.00 sec)
Records: 10  Deleted: 0  Skipped: 0  Warnings: 2

15.6 小结

  • Sakila 是一个相对复杂和完整的示例数据库,可以用于测试 MySQL 中的各种功能;
  • Employees 是一个经典的员工管理数据库;
  • world 是一个小型的数据库,world_x 是一个文档数据库;
  • menagerie 是一个简单的数据库。

这些示例数据库可以满足我们不同的学习和测试需求,也为数据库设计提供了一定的参考价值。

16. 常见问题的解决

16.1 问题1:root用户密码忘记,重置的操作

1). 通过任务管理器或者服务管理,关掉 mysqld (服务进程)。

2). 通过命令行+特殊参数开启 mysqld
mysqld --defaults-file=“D:\ProgramFiles\mysql\MySQLServer5.7Data\my.ini” --skip-grant-tables.

3). 此时,mysqld服务进程已经打开。并且不需要权限检查。

4). mysql -uroot 无密码登陆服务器。另启动一个客户端进行。。

5). 修改权限表。

use mysql;
update user set authentication_string=password('新密码') where user='root' and Host='localhost'; 
flush privileges;

6). 通过任务管理器,关掉mysqld服务进程。

7). 再次通过服务管理,打开mysql服务。

8). 即可用修改后的新密码登陆。

16.2 问题2:mysql命令报“不是内部或外部命令”

如果输入mysql 命令报“不是内部或外部命令”,把mysql安装目录的bin目录配置到环境变量path中。如下:

16.3 问题3:ERROR :No database selected

ERROR 1046 (3D000): No database selected
解决方案一:就是使用“USE 数据库名;”语句,这样接下来的语句就默认针对这个数据库进行操作。
解决方案二:就是所有的表对象前面都加上“数据库.”。

16.4 问题4:命令行客户端的字符集问题

mysql> INSERT INTO t_stu VALUES(1,'张三','男');
ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'sname' at row 1

原因:服务器端认为你的客户端的字符集是utf-8,而实际上你的客户端的字符集是GBK。

查看所有字符集:SHOW VARIABLES LIKE ‘character_set_%’;

解决方案,设置当前连接的客户端字符集 “SET NAMES GBK;”

16.5 问题5:修改数据库和表的字符编码

修改编码:

  • (1). 先停止服务
  • (2). 修改my.ini文件
  • (3). 重新启动服务

说明:如果是在修改 my.ini 之前建的库和表,那么库和表的编码还是原来的 Latin1,要么删了重建,要么使用 alter 语句修改编码。

mysql> create database 0728db charset Latin1;
Query OK, 1 row affected (0.00 sec)
mysql> use 0728db;
Database changed
mysql> create table student (id int , name varchar(20)) charset Latin1;
Query OK, 0 rows affected (0.02 sec)

mysql> show create table student\G
*************************** 1. row ***************************
       Table: student
Create Table: CREATE TABLE `student` (
  `id` int(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
#修改表字符编码为UTF8
mysql> alter table student charset utf8;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table student\G
*************************** 1. row ***************************
       Table: student
Create Table: CREATE TABLE `student` (
  `id` int(11) NOT NULL,
  `name` varchar(20) CHARACTER SET latin1 DEFAULT NULL,  #字段仍然是latin1编码
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> alter table student modify name varchar(20) charset utf8; #修改字段字符编码为UTF8
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table student\G
*************************** 1. row ***************************
       Table: student
Create Table: CREATE TABLE `student` (
  `id` int(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> show create database 0728db;;
+--------+-----------------------------------------------------------------+
|Database| Create Database                                                 |
+------+-------------------------------------------------------------------+
|0728db| CREATE DATABASE `0728db` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+------+-------------------------------------------------------------------+
1 row in set (0.00 sec)
#修改数据库的字符编码为utf8
mysql> alter database 0728db charset utf8; 
Query OK, 1 row affected (0.00 sec)

mysql> show create database 0728db;
+--------+-----------------------------------------------------------------+
|Database| Create Database                                                 |
+--------+-----------------------------------------------------------------+
| 0728db | CREATE DATABASE `0728db` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+--------+-----------------------------------------------------------------+
1 row in set (0.00 sec)

欢迎关注公众号:一介IT
本站博文抢先发布在公众号。
Alt

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一介IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值