MySQL-01-安装

目标

  • 安装MySQL服务器和客户端程序
  • 认识安装过程中的文件和文件夹
  • 执行 MySQLserver 的初始化操作
  • 启动和停止MySQL
  • 升级到MySQL 8.0

安装MySQL

安装步骤

  1. 确定你的平台是否受支持。
    • 查看:https://www.mysql.com/support/supportedplatforms/database.html
  2. 选择一种发布版本。
    • 预打包的二进制文件
      • 原生格式,例如,适用于 Linux 的 RPM 包、适用于 OS X 的 PKG 包、适用于 Windows 的 MySQL 安装程序
      • 通用格式,例如,ZIP 归档文件或压缩的 tar 文件
    • 源代码
  3. 下载该发布版本。
  4. 安装该发布版本。
  5. 执行任何所需的安装后配置。

一般来说,应选择二进制发布版本。只有你想查看非常新的功能并测试新代码时,才选择源代码发布版本。

从下载的软件包安装 MySQL(Installing MySQL from Downloaded Packages)

  • 下载 MySQL Linux 软件包后,使用以下命令进行安装:

    • 在 RPM 系统上:

      1
      
      rpm -ivh packagename.rpm
      
    • 在 APT 系统上:

      1
      
      dpkg -i packagename.deb
      
  • 安装软件包时,必须识别并解决依赖关系。

    • 安装 MySQL 软件包前,先安装所有依赖项。
      • 例如,MySQL 依赖于 libaio 库。若未安装该库,数据目录初始化及后续服务器启动步骤会失败。
    • 按正确顺序安装 MySQL 软件包。
      • 例如,安装 clientserver 软件包前,先安装 libs 软件包。
安装依赖项(Installing Dependencies)

在可通过网络访问软件仓库或连接了文件系统的 RPM 机器上,你可以使用包管理器解决依赖问题。

如果你在无法访问软件仓库的机器上安装,必须手动解决安装 MySQL 软件包时发现的所有未满足的依赖项。为此,你需要搜索与你所安装的 Linux 系统适配的软件仓库,找到包含相关软件包的 RPM 或 DEB 文件。

注意:如需了解关于使用包管理器的信息,请参阅本课程后续的 “使用包管理器安装 MySQL(Installing MySQL by Using a Package Manager)” 部分。

Linux 的 MySQL RPM 安装文件

可用的 RPM 包(Available RPMs)

Oracle 提供两种类型的 MySQL RPM 包:

  • 独立于发行版(Distribution-independent):应能在所有支持 RPM 包且使用 glibc 2.12 的 Linux 版本上运行。
  • 特定于发行版(Distribution-specific):针对特定的 Linux 平台,例如 Oracle Linux 7。

MySQL 的 RPM 安装通常会拆分为不同的软件包。你可以单独下载这些软件包,也可以将它们打包成一个归档文件下载。

  • Server:数据库服务器及相关工具
  • Common:服务器和客户端库的通用文件
  • Client:MySQL 客户端应用程序和工具
  • Devel:用于 MySQL 数据库客户端应用程序的开发头文件和库
  • Embedded-compat:作为嵌入式库的 MySQL 服务器,与使用版本 18 库的应用程序兼容
  • Libs:MySQL 数据库客户端应用程序的共享库
  • Libs-compat:用于早期 MySQL 安装的共享兼容库
  • Test:MySQL 服务器的测试套件
  • Router:在 InnoDB 集群中提供透明路由的轻量级中间件
  • Backup:MySQL 企业级备份(仅商业版本)

对于标准安装,必须至少安装 commonserverclient 软件包

MySQL RPM 安装流程(MySQL RPM Installation Process)

  • RPM 安装会执行以下任务:

    • 将 RPM 文件提取到其默认位置。
    • 注册 SysV 初始化脚本或 systemd 启动脚本。
    • 在操作系统中创建mysql用户和用户组。
      • MySQL 服务器进程以 mysql 用户身份运行。
  • 首次使用

    1
    
    service start mysqld
    

    1
    
    systemctl start mysqld
    

    启动服务时,MySQL 会:

    • 创建数据目录和默认的my.cnf文件。
      • 这些文件归 mysql 用户和用户组所有。
    • 创建默认的 root@localhost 账户。
    • root账户设置随机临时密码,并将该密码写入错误日志文件(/var/log/mysqld.log)。
      • 使用 MySQL 前,必须修改该密码。
MySQL 文件位置(MySQL File Locations)

RPM 安装程序会将 basedir(基础目录 )设置为 /usr,且未提供将 MySQL 安装到文件系统其他位置的选项。如果你想在同一系统上安装多个版本的 MySQL,这可能会引发问题。

若要安装到其他位置,请使用通用二进制包。注意,RPM 安装程序还会设置 mysql 用户和用户组、Linux 服务及其他配置,而这些在通过通用二进制包安装时必须手动完成。

Oracle RPM 与非 Oracle RPM(Oracle RPMs and Non-Oracle RPMs)

一些 Linux 发行版会提供它们自己构建的 MySQL RPM 包。本幻灯片中的步骤反映的是 Oracle RPM 包的安装流程。由于这种行为是内置于 RPM 包的,其他发行版的安装流程可能会有所不同。

启动 MySQL 服务(Starting the MySQL Service)

MySQL 服务不会自动启动。在使用 MySQL 前,你必须自行启动服务:

  • service mysqld start
  • 在运行 systemd 的 Linux 发行版上,使用 systemctl start mysqld

在运行 systemd 的 Linux 版本中,service 命令会映射到等效的 systemctl 命令

MySQL DEB 安装(MySQL DEB Installation)

  • DEB 软件包适用于 APT Linux 系统,可单独下载或打包下载。

  • 若要进行标准安装,请按指定顺序安装以下软件包。

    1. 数据库通用文件包

    2. 客户端包

    3. 客户端元包

    4. 服务器包

    5. 服务器元包

      1
      
      sudo dpkg -i mysql-({common,community-client,client,community-server,server})_*.deb
      
  • 安装服务器包时,dpkg会提供一个配置界面:

    • root 账户选择密码。
    • 指明是否要安装测试数据库。
DEB 安装前步骤(DEB Pre-installation Step)

MySQL 8.0 不允许在服务器初始化后修改 lower_case_table_names 变量。DEB 安装会在安装过程中自动初始化 MySQL 服务器。如果你想启用 lower_case_table_names 设置,需要在开始安装前使用 debconf-set-selection 工具配置该选项。

1
shell> sudo debconf-set-selections <<< "mysql-server mysql-server/lowercase-table-names select Enabled"
DEB 与 RPM 软件包:差异(DEB and RPM Package: Differences)

DEB 软件包的组件组织方式与 RPM 软件包类似。差异包括以下几点:

  • 没有 DEB 源码包。你可以直接通过 .tar.gz 文件获取源代码。
  • 没有等效的 libs-compat 包。该包的用途特定于基于 RPM 的发行版。
  • dpkg 安装过程默认是交互式的。安装软件包时,它会显示一个基于 Curses 的界面,用于设置幻灯片中所示的选项。使用 dpkg-preconfigure 命令在安装前设置这些配置选项时,也会看到该界面,此时安装界面不会显示。如果你将 DEBIAN_FRONTEND 环境变量设置为 noninteractive,则不会显示 Curses 界面,且 root 密码会保持为空。

特定于 Linux 发行版的软件仓库(Linux Distribution–Specific Repositories)

许多 Linux 发行版会维护它们自己的软件包仓库。

  • 托管在网络上或本地文件系统中。
  • 可通过包管理器进行访问:
    • 仓库网址在每台主机的包管理器配置中指定。
    • 你也可以手动下载单个软件包。
  • 包含软件包及其依赖项。
  • 可通过额外的软件仓库补充,这些额外仓库包含标准软件包仓库中没有的软件:
    • 你可以将这些额外的软件仓库添加到每台主机的包管理器配置中。
  • 示例:http://public-yum.oracle.com/ 包含 Oracle Linux 软件包。
本地软件仓库(Local Repositories)

当你从 CD 或 DVD 安装 Linux 时,安装介质可能包含一个精选软件包的仓库,安装程序会在安装过程中使用该仓库。你可以从这样的仓库安装软件包,而无需连接到互联网。

使用包管理器安装 MySQL(Installing MySQL by Using a Package Manager)

  • 在基于 RPM 的系统(包括 Oracle Linux、Red Hat、Fedora 和 CentOS )上,使用 yum install

    • 示例:

      1
      2
      
      yum install mysql-community-server
      yum install mysql-workbench
      
  • 在基于 APT 的系统(包括 Ubuntu 和 Debian )上,使用 apt-get install

    • 示例:

      1
      2
      
      apt-get install mysql-community-server
      apt-get install mysql-workbench
      
  • 安装 mysql-community-server 软件包时,也会安装服务器所需组件的软件包。

依赖项(Dependencies)

如果包管理器能够通过网络或从文件系统访问其软件仓库,它们会自动检测并安装依赖项。例如,mysql-community-server 软件包依赖于多个其他软件包,包括:

  • mysql-community-client:客户端软件
  • mysql-community-common:供客户端和服务器使用的通用错误消息和字符集
  • mysql-community-libs:共享客户端库

当你安装 mysql-community-server 时,如果系统上不存在这些依赖项,包管理器会找到并安装这些软件包及其可能有的依赖项。

软件仓库维护者(Repository Maintainers)

在某些发行版中,mysql-server 是一个虚拟软件包,其本身不包含任何软件,而是将特定版本的 mysql-community-server 或其他软件作为依赖项。当你安装这样的虚拟软件包时,包管理器会安装其所有依赖项,包括定义版本的 MySQL 软件包。

由于此软件包通常由发行版维护者而非 Oracle 维护,它无法反映 MySQL 软件的最新变化。

添加 Yum 软件仓库(Adding a Yum Repository)
  • http://dev.mysql.com/downloads/repo/yum/ 下载 Yum 软件仓库的 RPM 文件。

    • 为你的发行版选择正确的 RPM 文件。
    • 示例:适用于 Red Hat Enterprise Linux 7 / Oracle Linux 7(架构独立)的 RPM 包名为 mysql80-community-release-el7-3.noarch.rpm
  • 使用 yum localinstall 命令安装该文件,例如:

    1
    
    yum localinstall mysql80-community-release-el7-3.noarch.rpm
    
    • 上述命令会将 MySQL Yum 软件仓库添加到主机的 Yum 配置中。
  • 启用或禁用特定版本。

    • MySQL 8.0 默认启用。其他版本默认禁用。
  • 运行 yum install packagename 从新仓库安装软件包。

软件仓库配置(Repository Configuration)

安装仓库 RPM 文件时,它会在 /etc/yum.repos.d/ 中创建两个文件:

  • mysql-community.repo:包含 MySQL 社区版的仓库元数据。
  • mysql-community-source.repo:包含 MySQL 源代码的仓库元数据。

默认配置启用 MySQL 最新的通用可用(GA)版本以及 MySQL 工具。之前的 GA 版本会被禁用,尚未通用可用的开发版本也会被禁用。

配置 Yum 仓库版本

通过编辑 /etc/yum.repos.d/mysql-community-repo 文件,启用或禁用特定版本:

  • 默认情况下,最新的正式发布(GA)版本是启用的。
  • 以下摘录显示 MySQL 5.7 仓库处于禁用状态:
1
2
3
4
5
6
7
# 启用以使用 MySQL 5.7
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/\$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

enabled 的值改为 enabled=1,以启用 mysql57-community 仓库。

  • 要启用 MySQL 5.7 仓库,修改 enabled 设置的值,使其为 enabled=1
  • 使用相同的方法启用开发版本。
从仓库安装 MySQL

当你安装仓库 RPM 文件时,yum install 命令会自动从最合适的仓库获取软件包。官方 MySQL 仓库通常比发行版自带仓库有更新的版本,因此 yum 会优先安装官方软件包,因为它们的仓库中有最新版本。

类似地,如果你在安装新仓库后执行 yum upgrade 命令来升级机器上的所有软件包,软件包管理器会自动升级之前从其自带仓库安装的任何旧版本的 MySQL,并将其替换为新的官方版本。

添加 APT 仓库

  1. 从http://dev.mysql.com/downloads/repo/apt/ 下载 APT 仓库的 DEB 文件。
    • 支持的发行版:
      • Debian 版本 9
      • Ubuntu LTS 版本 16.04、18.04 和 18.10
  2. 使用 dpkg 命令安装该文件:
1
dpkg -i mysql-apt-config_0.8.12-1_all.deb

上述命令会将 MySQL APT 仓库添加到主机的 APT 配置中。

  1. 配置仓库版本。
  2. 运行 apt-get update 来刷新仓库元数据。
  3. 运行 apt-get install packagename 从新仓库安装软件包。
仓库配置

当你安装 mysql-apt-config 软件包时,dpkg 会打开一个交互式窗口,你可以从中选择仓库版本。将在后续展示展示。

要使用此界面重新配置仓库,你可以重新安装 mysql-apt-config 软件包,或者使用以下命令重新配置:

1
dpkg-reconfigure mysql-apt-config
image-20250721170936342
dpkg 配置界面

该界面的第一页显示了仓库配置中可用的产品:

  • MySQL 服务器和集群
  • MySQL 工具和连接器
  • MySQL 预览包

它还提供了一个 “确定(OK)” 选项,用于保存更改并退出该界面。

手动配置 APT 仓库

通过编辑 /etc/apt/sources.list.d/mysql.list 文件,启用或禁用特定仓库:

  • 执行上一张幻灯片中的步骤后,会得到以下配置:
1
2
3
4
5
6
7
### 此文件由以下条目自动配置 ###
# 你可以修改下面的条目,但其他修改可能会丢失。
# 以 root 身份使用命令 'dpkg-reconfigure mysql-apt-config' 进行修改。
deb http://repo.mysql.com/apt/ubuntu/ bionic mysql-apt-config
deb http://repo.mysql.com/apt/ubuntu/ bionic mysql-8.0
#deb http://repo.mysql.com/apt/ubuntu/ bionic mysql-tools-preview
deb-src http://repo.mysql.com/apt/ubuntu/ bionic mysql-8.0

# 符号开头注释的行,表示对应的仓库已禁用 。

  • 要启用或禁用特定产品仓库,分别取消注释或添加注释其对应的行即可。

如注释所示,如果重新安装或重新配置 mysql-apt-config 软件包,对 mysql.list 文件的手动修改不会保留;软件包配置界面会提示你进行想要的配置更改,然后重新写入该文件 。

Windows中安装MySQL

在 Windows 上安装 MySQL

  • MySQL 安装程序
    • .msi 可执行文件形式发布
    • 引导你通过配置向导创建运行 MySQL 所需的文件夹和配置
  • 免安装归档包
    • .zip 文件形式发布
    • 必须解包并移动到所需的安装位置
    • 必须手动配置以创建运行 MySQL 所需的文件夹和配置
包含的产品

Windows 发行版包含 MySQL 数据库服务器,以及以下产品:

  • MySQL Workbench(数据库设计建模工具 )
  • MySQL Notifier(状态通知工具 )
  • MySQL for Excel(Excel 集成插件 )
  • MySQL Enterprise Backup(仅商业版,企业级备份工具 )
  • MySQL for Visual Studio(Visual Studio 集成插件 )
  • MySQL Shell(交互式操作终端 )
  • MySQL Router(路由代理工具 )
  • MySQL Connectors(.Net/ Python / ODBC / Java / C++ 等语言连接器 )
  • 示例、用例和文档
image-20250721172150734 image-20250721172228987 image-20250721172247924

在 Windows 系统中安装 MySQL 服务

  • 使用 MySQL 安装程序:

    • 使用提供的服务名称,或选择其他名称。
  • 安装后通过命令行操作:

    • 手动安装服务:

      1
      
      mysqld.exe --install servicename --defaults-file="C:\my.ini"
      
    • 移除已安装的服务:

      1
      
      mysqld.exe --remove servicename
      
  • 通过 “服务” 控制面板应用查看已安装的服务:

    • 从命令行启动(服务面板):

      1
      
      services.msc
      
  • 设置服务为自动或手动启动,并指定用于启动服务的 Windows 账户

Windows 服务相关说明

每个 Windows 服务用于控制一个程序,实现程序的启动和停止。创建服务时,必须确保服务管理器能访问程序路径。你可能需要提供 mysqld.exe 可执行文件的完整路径。

示例

1
C:\mysql80\bin\mysqld.exe --install servicename ...

除了使用 --install 选项,你也可以用 Windows 的 sc 命令行程序将 MySQL 安装为 Windows 服务。

示例

1
sc create servicename start=auto DisplayName=MySQL binPath=C:\mysql80\bin\mysqld.exe

如果因 MySQL 安装路径包含空格(比如使用默认安装程序路径,包含 “MySQL Server 8.0” 这类文本 ),导致服务启动出现问题,可使用短路径名称,或在 binPath 参数两侧添加双引号来安装服务。

从源代码安装 MySQL

在以下情况时,从源代码构建 MySQL:

  • 配置内置选项
    • 示例:
      • 在生产服务器上,针对清晰明确的使用场景,禁用未使用的功能以优化性能
      • 启用额外的调试功能
  • 在没有预编译二进制文件的平台上运行 MySQL
  • 向 MySQL 添加你自己的修改(或社区补丁 )
编译 MySQL

如果预编译发行版中缺少你需要的功能(比如完整的调试支持 ),可从源代码编译 MySQL。要打造运行时占用更少内存的服务器,你可能需要禁用不必要的特性。例如,你可能需要禁用可选的存储引擎,或者仅编译应用所需的字符集。

编译 MySQL 的要求与编译一般 C++ 程序类似:

  • CMake
  • make
  • GCC 5.3(Linux 系统 )或其他符合 ANSI 标准的 C++ 编译器

在 Oracle Linux 7 上,需启用软件集合(Software Collections )来安装编译 MySQL 软件所需的工具。

根据编译类型以及获取源代码的方式,还存在其他要求。

注意:如需详细了解从源代码安装 MySQL 的内容,请参阅 https://dev.mysql.com/doc/mysql/en/source-installation.html

从二进制归档文件安装 MySQL

若不通过包管理器安装,必须手动执行一些配置步骤。

  1. 创建 mysql 用户和用户组。
1
2
# groupadd mysql
# useradd -r -g mysql -s /bin/false mysql
  1. mysql 用户身份登录时,将归档文件解压到合适的目录。或者,在解压后,更改已解压归档文件的所属权为 mysql
1
2
3
4
# mkdir /usr/local/mysql-8.0.x/
# chown mysql:mysql /usr/local/mysql-8.0.x/
# cd /usr/local/mysql-8.0.x/
# tar xf ~/mysql-8.0.x-linux-glibc2.12-x86_64.tar.gz
mysql 用户

你可以使用不同于 mysql 的操作系统用户名和用户组名。为简单起见,这些说明遵循与安装包中相同的约定,安装包在安装过程中会创建 mysql 用户和用户组。

如果你使用不同的用户名和用户组名,要确保 MySQL 服务器进程以该用户名运行,且该用户对 MySQL 数据文件、日志文件和 PID 文件拥有所属权。

尽管可以以 root 用户身份运行 mysqld 进程,但不建议这样做。与其他操作系统服务一样,MySQL 可执行用户授权的操作。如果此类服务(或与之通信的应用程序 )遭到破坏,攻击者会受到该用户所受限制的约束。

安装目录

可以将归档文件解压到任何你具有写入权限的目录。MySQL 服务器使用 basedir 选项来确定安装目录的位置。

  1. 创建初始配置文件
  • my-default.cnf 复制到 /etc/my.cnf
  • 编辑 datadir 配置项,使其指向数据目录。
  • 编辑 basedir 配置项,使其指向安装目录。
  • 编辑其他所需配置:
    • 日志文件设置
    • TCP 端口
  1. 初始化数据目录并记录生成的临时密码
1
# bin/mysqld --initialize --user=mysql  
  1. 启动 MySQL 服务器
1
# bin/mysqld_safe --user=mysql &  
  1. 使用临时密码连接到 MySQL 服务器
1
2
3
4
# mysql -u root -p  
Enter password: (输入随机生成的密码 )  
...  
mysql>  
  1. 修改 root 用户密码
1
mysql> ALTER USER USER() IDENTIFIED BY 'new password';  
  1. (可选 )填充时区表
  • 示例:
1
# mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p  
时区表说明

当你创建新的数据库目录时,MySQL 会创建时区表,但不会填充数据。你可通过以下任一方式填充:

  • 执行 mysql_tzinfo_to_sql 工具,基于系统时区数据库文件生成 INSERT 语句。若系统有 zoneinfo 文件(让 MySQL 与时区相关系统工具保持一致 ),选此方式。
  • http://dev.mysql.com/downloads/timezones.html 下载包含 INSERT 语句的脚本。若系统本身没有时区信息,选此方式。

MySQL 利用时区信息处理时区敏感函数和数据类型(如 NOW()TIMESTAMP ),以及计算特殊时间(如夏令时转换时出现的非法日期和时间 )。

使用 Docker 部署 MySQL 服务器

你需要先在主机上安装 Docker 引擎和客户端。

  1. 下载 MySQL 服务器 Docker 镜像

    • 使用 MySQL 社区版镜像:登录到 Docker Hub,使用 docker 命令拉取镜像:
    1
    
    # docker pull mysql/mysql-server
    
    • 使用 MySQL 企业版镜像:登录到 My Oracle Support,下载 MySQL 商业服务器 Docker 镜像;使用 docker 命令加载镜像:
    1
    
    # docker load -i mysql-enterprise-server-version.tar
    
  2. 列出所有已下载的镜像

1
# docker images
  1. 创建 MySQL 服务器 Docker 容器
1
# docker run --name=mysql1 -d mysql/mysql-server  
  1. 查看 MySQL 服务器日志
1
# docker logs mysql1  
  • 提取生成的临时密码
1
# docker logs mysql1 2>&1 | grep GENERATED  
  1. 从容器内部连接到 MySQL 服务器
1
# docker exec -it mysql1 mysql -uroot -p  
  • 输入临时密码
  • 修改 root 用户密码:
1
mysql> ALTER USER USER() IDENTIFIED BY 'new password';  

运行命令

1
docker run --name=container_name -d image_name:tag

安装文件及路径

linux MySQL Server 安装目录

image-20250723165628953

数据目录(Data Directory)

  • /var/lib/mysql 是服务器存储数据库的位置。当你(或安装过程)运行 mysqld --initialize 时,会配置该目录。InnoDB 日志文件、回滚表空间和系统表空间都位于此目录中。它还包含每个数据库对应的子目录,其中包括 mysql 目录(该目录包含系统表,包括授权表 )。MySQL 8.0 使用 InnoDB 存储引擎,将数据字典存储在 mysql.ibd 表空间中。

基础目录(Base Directory)

  • /usr/sbin 包含主要的服务器可执行文件 mysqld
  • /usr/bin 包含客户端程序和脚本,如 mysqlmy_print_defaultsmysqladminmysqlcheckmysqlimport

其他目录(Other Directories)

  • /var/lib/mysql-filessecure_file_priv 变量中配置,用于存储导入和导出的数据文件。
  • /var/lib/mysql-keyring 分配用于存储密钥环文件。
  • /etc/var/log 是 Linux 系统存放配置文件和日志文件的标准目录。MySQL 服务器进程(mysqld )会读取 /etc/my.cnf 文件。
  • systemd 启动脚本存储在 systemd 的默认目录中。

Windows MySQL Server 安装路径

image-20250723165943329

默认情况下,MySQL 安装在 C:\Program Files\MySQL\MySQL Server [版本号] 目录中。例如,安装程序会将 MySQL 8.0 放置在 C:\Program Files\MySQL\MySQL Server 8.0 目录。

“Program Files” 目录

bin\ 目录包含 MySQL 服务器和客户端程序。Windows 版 MySQL 发行包包含多个程序,可在 bin 目录中找到:

  • mysqld.exe:服务器可执行文件
  • 客户端程序,如 mysql.exemysqladmin.exe(列于标题为 “命令行客户端程序” 的幻灯片中 )

其他目录用于存放头文件、库文件和支持文件。

“ProgramData” 目录

Data\ 是服务器存储数据库和日志文件的位置。该目录已预先配置好,可直接使用。例如,此目录包含一个 mysql 子目录(包含授权表 )。

Uploads\secure_file_priv 变量中配置,用于存储导入和导出的数据文件。

配置文件

my.ini 配置选项文件指定了安装目录的位置,以及其他可选设置。

MySQL Programs

  • 服务器程序(Server programs)
    • mysqld 服务器进程
    • 服务工具、启动程序
  • 安装程序(Installation programs)
    • 执行初始安装配置过程部分步骤的程序
  • 实用程序(Utility programs)
    • 无需连接到服务器即可执行某些功能的 MySQL 程序
  • 客户端程序(Client programs)
    • 连接到服务器的程序

mysqld:MySQL 服务器进程(mysqld: MySQL Server Process)

  • 由某一个服务器辅助程序自动启动

    • 包括操作系统的启动脚本
  • 可手动启动以调试 MySQL 服务器配置

    • 默认情况下,错误消息会输出到终端,而非错误日志。

    • 示例:

      1
      
      $ mysqld --user=mysql --datadir=/var/lib/mysql --socket=/tmp/mysql.sock
      

安装程序(Installation Programs)

  • mysql_secure_installation
    • 用于启用初始安全配置的安全程序。
  • mysql_tzinfo_to_sql
    • 用于创建包含主机时区信息的 SQL 脚本的实用程序。
  • mysql_upgrade
    • 用于验证数据库内容并确保其与当前 MySQL 版本兼容的程序。
    • 自 MySQL Server 8.0.16 起已弃用,因为这些任务现在会在服务器启动时自动执行。

mysql_secure_installation 可通过以下方式提升 MySQL 安装的安全性:

  • 你可以为 root 账户设置密码。
  • 你可以移除可从本地主机外部访问的 root 账户。
  • 你可以移除匿名用户账户。
  • 你可以移除 test 数据库(默认情况下,所有用户,甚至匿名用户都可访问该数据库 ),以及移除允许任何人访问名称以 test_ 开头的数据库的权限。

MySQL 8.0 安装默认已处理大部分此类问题。因此,可能无需运行 mysql_secure_installation

实用程序(Utility Programs)

  • mysql_config_editor
    • 管理登录路径,简化命令行客户端与 MySQL 服务器的连接方式。
  • mysqlbinlog
    • 读取并回放二进制日志的内容。
  • mysqldumpslow
    • 读取并汇总慢查询日志的内容。
  • mysql_ssl_rsa_setup
    • 创建 TLS 密钥和证书。
  • ibd2sdi
    • 从 InnoDB 表空间文件中提取序列化字典信息(SDI)。
mysql_config_editor

使用 mysql_config_editor 创建加密的选项文件。

  • 将用户、密码和主机选项存储在专用的选项文件中:

    • 当前用户主目录下的 .mylogin.cnf 文件
    • 要指定其他文件名,设置 MYSQL_TEST_LOGIN_FILE 环境变量。
  • .mylogin.cnf 文件包含登录路径。

    • 它们类似于选项组。

    • 每个登录路径包含单个身份的认证信息。

    • 客户端使用--login-path(或-l)命令行选项引用登录路径:

      1
      
      # mysql --login-path=admin
      
    • 保护该文件不被其他用户读取。任何能够读取该文件的人都可以使用这些凭据,并能够获取明文密码。

隐藏已保存的密码(Obscuring Saved Passwords)

不建议以 mysql -uroot -ppassword 的形式在命令行指定密码。为方便起见,你可以将密码放在 [client] 选项组中,但密码是以明文形式存储的,任何对选项文件有读取权限的人都可以轻松看到。

mysql_config_editor 实用程序使你能够将认证凭据存储在名为 .mylogin.cnf 的加密登录文件中。在 Linux 和 UNIX 上,该文件位置是当前用户的主目录;在 Windows 上,是 %APPDATA%\MySQL 目录。之后,MySQL 客户端程序可以读取该文件以获取连接 MySQL 服务器的方法。加密方法是可逆的,因此你不能假定凭据对任何拥有该文件读取权限的人都是安全的。相反,此功能让你更易于避免在命令行或 MySQL 配置文件中使用明文凭据。

.mylogin.cnf 格式(.mylogin.cnf Format)
  • 解密后的 .mylogin.cnf 文件由选项组构成。

    • 与其他选项文件类似
  • .mylogin.cnf 中的每个选项组都是一个登录路径。

    • 一组值,指示服务器主机以及用于向该服务器进行认证的凭据
    • 仅允许有限的一组选项(userpasswordhost
  • 示例:

    1
    2
    3
    4
    
    [admin]
    user = root
    password = oracle
    host = 127.0.0.1
    

如果你尝试在文本编辑器中读取 .mylogin.cnf 文件,它会以加密形式显示。你可以使用 print 命令查看登录路径,具体将在下一张幻灯片中展示。

注意:使用带 -s 选项的 my_print_defaults 实用程序可以明文显示密码。

登录路径(Login Paths)
  • 创建登录路径

    1
    2
    3
    4
    
    mysql_config_editor set 
      --login-path=login-path 
      --user=username 
      --password --host=hostname
    
  • 明文查看单个登录路径

    1
    2
    
    mysql_config_editor print 
      --login-path=login-path
    
  • 明文查看所有登录路径

    1
    
    mysql_config_editor print --all
    
  • 移除登录路径

    1
    2
    
    mysql_config_editor remove 
      --login-path=login-path
    
  • 默认登录路径名称是 [client]。所有标准客户端都会读取它。

如果调用 mysql_config_editor 时未使用 --login-path 选项,它会使用 [client] 登录路径。所有标准客户端默认使用此登录路径。

例如,以下命令创建一个供所有标准客户端使用的 [client] 登录路径:

1
2
# mysql_config_editor set --user=root --password
Enter password: oracle

在未指定更多命令行参数或选项文件的情况下调用标准客户端,会导致其读取 .mylogin.cnf 文件中的 [client] 登录路径,以及任何选项文件中的 [client] 选项组。例如,执行上述命令后,调用 mysql 客户端的输出如下:

1
2
3
# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
...

命令行客户端程序(Command-Line Client Programs)

  • mysql:MySQL 命令行客户端
  • mysqladmin:用于监控、管理和关闭 MySQL 的实用程序
  • mysqldump/mysqlpump:备份实用程序,可创建用于恢复数据库结构和内容的 SQL 脚本
  • mysqlimport:用于导入分隔数据文件内容的实用程序
  • mysqlslap:负载模拟客户端
  • mysqlshow:用于显示数据库对象元数据的实用程序
  • mysqlcheck:用于检查和优化表的实用程序
  • mysqlsh:MySQL Shell 是适用于 MySQL 服务器的高级命令行客户端和代码编辑器

MySQL Shell 必须单独安装。

MySQL Workbench 是一个图形化客户端程序,需单独安装。

启动命令行客户端程序(Launching Command-Line Client Programs)
  • 客户端支持许多通用选项:
    • 认证和连接选项
      • 示例:--user--password--host--socket
  • 部分选项是特定客户端独有的:
    • mysqladmin的示例选项:
      • --relative
      • --sleep
    • mysqlcheck的示例选项:
      • --analyze
      • --check
      • --check-upgrade

初始化配置

配置强制访问控制(Configuring Mandatory Access Control)

一些平台会实施强制访问控制(MAC)系统,其具备以下特点:

  • 阻止服务访问未授权的资源(如文件或端口 )
    • 默认配置包含对常见服务(包括 MySQL )的默认文件和端口访问权限。
  • 可配置为启用特定的非默认访问权限
  • 可完全禁用
  • 包含以下系统:
    • Linux MAC 系统:
      • SELinux:适用于 Oracle Linux、Red Hat Enterprise Linux、Fedora、CentOS
      • AppArmor:适用于 SUSE、Ubuntu
    • Oracle Solaris 扩展策略

默认 MAC 配置(Default MAC Configuration)

由于 MySQL 在许多平台上是常用服务,常见的 MAC 系统默认会允许 mysqld 服务器进程访问默认的 MySQL TCP 端口、默认数据目录和日志位置。一般来说,除非你想启用非默认配置(例如,如果你更改了数据目录或 TCP 端口号 ),否则无需修改 MAC 配置。

SELinux 示例(SELinux Example)
  • 添加新的端口映射

    • 将一系列 TCP 端口(33060(X 协议)、33061(组复制)和 33062(管理端口) )设置为mysqld_port_t类型,以便 MySQL 可以使用它们:

      1
      
      # semanage port -a -t mysqld_port_t -p tcp 33060-33062
      
  • 添加新的文件上下文类型映射

    • /datadir目录及其内容设置为mysqld_db_t类型,以便 MySQL 可以访问它们:

      1
      2
      3
      4
      5
      
      # semanage fcontext -a -t mysqld_db_t "/datadir(/.*)?"
      # restorecon -Rv /datadir
      restorecon reset /datadir context
      unconfined_u:object_r:default_t:s0-
      >unconfined_u:object_r:mysqld_db_t:s0
      
禁用 SELinux(Disabling SELinux)

你可以通过将 SELinux 设置为宽容模式(permissive mode),临时禁用其阻止效果。要执行此操作,运行以下命令:

1
setenforce 0

在宽容模式下,SELinux 会将未授权访问记录到其日志文件中(默认在 /var/log/audit/audit.log ),但不会阻止此类访问。使用宽容模式排查你怀疑可能由 SELinux 配置导致的访问问题。当你重启系统或执行 setenforce 1 命令时,SELinux 会恢复执行其策略。

要完全禁用 SELinux,需在 /etc/selinux/config 文件中将 SELinux 设置从 enforcing 改为 disabled,如下例所示:

1
SELINUX=disabled
AppArmor:示例(AppArmor: Example)
  • 编辑 /etc/apparmor.d/local/usr.sbin.mysqld 文件,修改本机的 MySQL 策略。

    • /datadir目录及其内容设置为可访问。

      1
      
      # /datadir/** rwk,
      
  • 重新加载 AppArmor 配置文件。

    1
    2
    
    # service apparmor reload
    * Reloading AppArmor profiles
    
  • 将 MySQL 策略设置为投诉模式(complain mode)。

    1
    2
    
    # aa-complain /usr/sbin/mysqld
    Setting /usr/sbin/mysqld to complain mode.
    
  • 将 MySQL 策略设置为强制模式(enforce mode)。

    1
    2
    
    # aa-enforce /usr/sbin/mysqld
    Setting /usr/sbin/mysqld to enforce mode.
    
投诉模式与强制模式(Complain and Enforce Modes)

AppArmor 与其他 MAC 系统类似,默认阻止未授权访问,这称为强制模式(enforce mode)。当你希望策略记录未授权访问但不阻止时,执行 aa-complain 命令,将特定可执行文件的策略改为投诉模式(complain mode)。

禁用 AppArmor(Disabling AppArmor)

AppArmor 作为服务运行。要禁用它,使用操作系统的服务管理功能禁用 apparmor 服务或启动脚本。例如,在使用 systemd 的系统上,执行以下命令:

1
systemctl disable apparmor.service

更改 root 密码

修改 root 密码(Changing the root Password)

  • 安装后修改 root 密码:

    • RPM 安装会创建一个 root 账户,其初始密码是随机生成且已过期的,你必须在使用前修改它。
      • 初始密码会写入服务器日志(通常在 /var/log/mysql/mysqld.log 中 )
    • 交互式 DEB 安装会提示设置初始 root 密码,后续无需再修改。
    • 其他维护者提供的安装包可能会通过其他方式创建初始 root 密码。
    • 当使用 mysqld --initialize 初始化 MySQL 时,会生成一个初始的随机过期密码。源码安装和归档包安装通常使用这种方式。
  • 使用初始密码登录到 MySQL,然后使用 ALTER USER 语句修改密码:

    1
    2
    3
    
    # mysql --user=root --password
    Enter password: drVXqk9)nn?t
    mysql> ALTER USER USER() IDENTIFIED BY 'neW%P4ss';
    
    使用 mysqladmin 修改 root 密码(Using mysqladmin to Change the root Password)

    使用 mysqladmin 客户端实用程序配合 password 命令来修改密码。

    • 如果你未向 password 命令提供参数,mysqladmin 会提示你输入新密码:

      1
      2
      3
      4
      
      # mysqladmin --user=root --password password
      Enter password: drVXqk9)nn?t
      New password: neW%P4ss
      Confirm new password: neW%P4ss
      
    • 如果你在命令行中提供旧密码或新密码,mysqladmin 会显示警告:

      1
      2
      3
      
      # mysqladmin --user=root --password password 'neW%P4ss'
      Enter password: drVXqk9)nn?t
      mysqladmin: [Warning] Using a password on the command line interface can be insecure.
      
    使用登录路径(Using Login Paths)

    你可以在包括 mysqladmin 在内的许多 MySQL 客户端中使用登录路径。以下示例展示如何使用默认的 [client] 登录路径设置新密码:

    前提:已用 mysql_config_editor 设置 [client] 登录路径(含旧密码 )

    1
    2
    3
    
    # mysqladmin password
    New password: neW%P4ss
    Confirm new password: neW%P4ss
    

    请注意,使用此命令修改用户密码后,客户端登录路径不再包含正确的用户密码,因此你必须执行 mysql_config_editor 来设置新的用户密码。

启动和关闭MySQL

  • 启动 MySQL 的方法
    • 直接运行 mysqld 二进制文件。
    • 运行 mysqld_safe
    • 使用 Linux 服务管理器:
      • 在 SysVinit 系统上,运行 service mysqld start
      • 在 systemd 系统上,运行 systemctl start mysqld
  • 停止 MySQL 的方法
    • 使用 SIGTERM 信号(-15 )终止 mysqld 二进制文件。如果 mysqld_safe 在运行,先终止它。
    • 使用 Linux 服务管理器:
      • 在 SysVinit 系统上,运行 service mysqld stop
      • 在 systemd 系统上,运行 systemctl stop mysqld
    • mysqladmin shutdown
    • SQL 的 SHUTDOWN 语句

使用 kill 命令(Using kill)

service mysqld stop 命令(或在 systemd 发行版上的 systemctl stop mysqld )会向 mysqld 进程发送 UNIX SIGTERM 信号(kill -15 ),进程将其解读为关闭服务器的指令。当你使用 mysqladmin shutdown 时,它会使用服务器协议命令向服务器发送 “关闭” 消息。在这两种情况下,服务器进程都会接收消息并执行相同的有序关闭流程。

如果你发送 SIGKILL 信号(kill -9 ),mysqld 会立即停止,不会执行有序关闭,就像拔掉机器电源线一样。这可能会导致数据损坏。如果 mysqld_safe 辅助程序在运行,它会将这种突然关闭检测为崩溃,并重新启动 mysqld

SQL RESTART 语句(SQL RESTART statement)

MySQL 8.0 引入了 RESTART SQL 语句,用于停止并重启 MySQL 服务器。RESTART 需要一个监控进程(如 systemd、mysqld_safe 或 Windows 服务 )在服务器以退出代码 16 关闭后启动 MySQL 服务器。

使用 mysqladmin 停止 MySQL(Stopping MySQL with mysqladmin)

  • 使用 [client] 登录路径

    1
    
    mysqladmin shutdown
    
  • 使用 [admin] 登录路径

    1
    
    mysqladmin --login-path=admin shutdown
    
  • 在命令行提供凭据和服务器连接信息

    1
    2
    
    mysqladmin -u root -p -h dbhost -P 3306 shutdown
    Enter password: password
    
SHUTDOWN 权限(SHUTDOWN Privilege)

一些 mysqladmin 命令仅对拥有所需权限的 MySQL 账户可用。例如,要关闭服务器,你必须使用具有 SHUTDOWN 权限的管理账户(如 root )进行连接。

MySQL 服务文件(MySQL Service Files)

  • 在 SysVinit 系统上,将 mysql.server 脚本复制到 /etc/init.d/mysqld

    • 部分软件包安装程序会自动创建此文件。

    • 使用 startstoprestart 选项调用它。

    • 示例:

      1
      2
      3
      
      service mysqld start
      /etc/init.d/mysqld restart
      support-files/mysql.server stop
      
  • 如果你从为 systemd 发行版构建的 RPM 软件包安装 MySQL,或者手动配置了 systemd,使用 systemctl 命令:

    1
    2
    
    systemctl start mysqld
    systemctl stop mysqld
    
    • 这会使用 mysqld.service 文件,它是一个 systemd 服务单元配置文件。
SysVinit、Upstart 和 systemd 发行版(SysVInit, Upstart, and systemd Distributions)

SysVinit 是初始化 UNIX 服务的标准方法。许多 Linux 系统曾使用这种方法。近年来,Upstart 进程在许多发行版中取代了 SysVinit,模拟其功能。mysql.server 脚本在 SysVinit 和 Upstart 系统上的运行方式相同。

一些 Linux 发行版的最新版本(包括 MySQL 支持的发行版 )使用 systemd 作为替代的初始化进程。如果你从 RPM 或 APT 二进制包安装 MySQL,服务会自动配置。如果你使用通用 Linux 二进制包安装 MySQL,则必须自行配置 systemd 服务。

注意:你需在标题为 “配置 MySQL 服务(Configuring the MySQL Service)” 的实践内容中,配置 systemd 中的 mysqld 服务。

在 Windows 上启动和停止 MySQL:MySQL Notifier

  • 由 MySQL 安装程序安装
  • 自动注册本地计算机上的 MySQL 服务
  • 支持注册远程 MySQL 服务
  • 显示已注册服务器的运行状态
    • 在系统托盘显示
    • 可选:当已注册服务器状态变化,或 MySQL Notifier 检测到新的本地 MySQL 服务时发出通知
  • 支持启动、重启和停止已注册的服务器
  • 启动已安装的 MySQL 应用程序:
    • MySQL Workbench
    • MySQL Utilities
    • MySQL Installer

升级MySQL

  • 最简易的升级是在同一版本系列内的小版本之间进行。
    • 示例:从 8.0.xx 升级到 8.0.yy
  • 你可以从 MySQL 5.7 升级到 8.0
    • 仅支持在通用可用(GA)版本之间进行,且 MySQL 5.7.9 或更高版本
    • Oracle 建议在升级到 MySQL 8.0 之前,先升级到最新的 5.7 GA 版本
  • 留意版本之间的差异,这样你就能选择正确的升级方法(原地升级或逻辑升级 ),并避免兼容性问题。
  • 即便你要执行原地升级,也应事先备份数据。
    • 这样一来,若遇到问题,你就能回滚升级操作。

降级(Downgrading)

从 MySQL 8.0 降级到 MySQL 5.7,或者从某一 MySQL 8.0 版本降级到之前的 MySQL 8.0 版本,是不被支持的。唯一受支持的替代方案是恢复升级前创建的备份。因此,在开始升级流程前备份数据至关重要。

阅读发行说明(Reading Release Notes)

在升级之前,查看当前版本与目标版本之间的变更内容:

搜索特定变更(Searching for Specific Changes)

如果你知道某个选项或其他功能发生了变更,但不知道变更发生在哪个版本,你可以使用文档页面上的搜索功能。

或者,你可以在常用搜索引擎上搜索特定的发行说明,方法是包含 site: 修饰符,将搜索范围限定在 MySQL 发行说明网页。例如,要搜索 authentication_string 列的发行说明,在 Google 或 Bing 等常用搜索引擎中输入以下搜索条件:

1
site:dev.mysql.com/doc/relnotes authentication_string

MySQL Shell 升级检查工具(MySQL Shell Upgrade Checker Utility)

  • util.checkForServerUpgrade() 函数

    • 在 MySQL Shell 中可用
    • 让你能够验证 MySQL 服务器实例是否已准备好进行升级
    • 检查升级到 MySQL 8.0 时的兼容性错误和问题
    • 仅支持 MySQL Server 5.7 和 8.0 的通用可用(GA)版本
    • 如果你提供文件路径,会检查配置文件(my.cnfmy.ini
  • MySQL Shell 的版本必须与你要升级到的 MySQL Server 版本相同或更高。

  • 以下示例检查一个 MySQL 服务器,以升级到 8.0.18 版本:

    1
    2
    
    mysqlsh --util checkForServerUpgrade user@localhost:3306 
      --target-version=8.0.18 --config-path=/etc/mysql/my.cnf
    

使用原地升级方法(Using In-Place Upgrade Method)

当你在同一版本系列内升级或从一个主要版本升级到下一个主要版本时,使用原地(物理)升级方法。

  • 停止 MySQL 服务器进程。
  • 使用文件复制备份当前数据库。(可选,但建议执行 )
  • 用新版本替换 mysqld 二进制文件。
  • 使用新的二进制文件启动 MySQL 服务器进程。
  • 在 MySQL 8.0.16 之前,你必须运行 mysql_upgrade。在 MySQL 8.0.16 及更高版本中,服务器重启会自动执行所有升级任务。

这是从 MySQL 5.7 升级到 8.0 的推荐方法。

使用逻辑升级方法(Using Logical Upgrade Method)

当你要升级到一个或多个更高的主要版本时,使用逻辑(备份 / 恢复)升级方法。

  • 使用 mysqldump 备份当前数据库。
  • 安装并初始化一个新的 MySQL 服务器。
  • 启动新的 MySQL 服务器。
  • 从转储文件恢复备份的数据库。
    • 由于新特性、变更特性、弃用特性或移除特性和功能带来的不兼容性,可能会导致错误。
  • 在 MySQL 8.0.16 之前,你必须运行 mysql_upgrade。在 MySQL 8.0.16 及更高版本中,你必须关闭服务器并使用 --upgrade=FORCE 选项重启它,以执行剩余的升级任务。
使用 mysqldump 执行逻辑备份(Using mysqldump to Perform a Logical Backup)

以下命令是升级过程中执行逻辑备份的推荐方式:

1
2
mysqldump --all-databases --routines --events --add-drop-table \
  --lock-all-tables --flush-privileges=0 > data-for-upgrade.sql

注意:使用 mysqldump 备份数据的流程在标题为 “执行备份(Performing Backups)” 的课程中有介绍。

其他方法(Other Methods)

如果你使用复制,可能需要执行滚动升级,即依次升级主机,而不同时关闭复制拓扑。

你也可以通过在升级期间使用临时主机运行应用程序来减少停机时间,该临时主机在升级期间投入使用。

mysql_upgrade

  • 检查数据库中的所有表,查看其与当前 MySQL 服务器版本是否存在不兼容性
  • 修复在存在潜在不兼容性的表中发现的任何问题
  • 升级系统表,以添加新版本中可用的任何新权限或功能
  • 用当前 MySQL 版本号标记所有已检查和修复的表
  • MySQL 服务器 8.0.16 及更高版本不需要此工具。服务器会在启动期间执行所有升级流程。8.0.16 中引入了一个新选项 --upgrade 来控制升级过程。
版本(Versions)

在升级过程中,同一主机上可能同时存在多个版本的 mysql_upgrade。确保你执行正确版本的 mysql_upgrade,以便它能适配正确的 MySQL 目标版本。

--upgrade 选项有以下取值:

  • AUTO(默认):服务器会对发现的所有过时内容执行自动升级。
  • NONE:服务器在启动期间不执行任何自动升级步骤。
  • MINIMAL:如有必要,服务器会升级数据字典,但不会升级其他任何内容。
  • FORCE:如有必要,服务器会升级数据字典,并强制升级其他所有内容。
0 次浏览