Skip to content

MySQL 的安装和配置

安装MySQL后,如何判断是否已安装成功

MySQL 安装完成后,用户可以通过 DOS 窗口或者 MySQL 5.7 Command Line Client 验证 MySQL 是否安装成功。

DOS窗口验证

步骤 1):打开 DOS 窗口,如果你配置了 MySQL 环境变量,直接登录;没有配置环境变量就需要进入到 mysql/bin 目录下登录。如图所示。

DOS窗口登录MySQL

步骤 2):输入 status 命令查看 MySQL 版本信息,如图所示。

查看MySQL版本信息

出现以上代码就说明安装成功了。

MySQL客户端验证

步骤 1):打开 MySQL 5.7 Command Line Client 程序,输入密码后按回车键,弹出当前 MySQL 的服务器状态,如图所示。

登录MySQL并获取服务器状态

当前 MySQL 服务器的版本为 5.7.20-log MySQL Community Server(GPL),表明 MySQL 已经安装成功。

步骤 2):在 MySQL 5.7 Command Line Client 程序中输入简单命令,如 SHOW DATABASES;,显示当前的数据库列表,如图所示。

执行简单的SQL命令

如果显示数据库列表,则说明 MySQL 数据库安装成功。

MySQL数据库文件存放目录结构详解

在 MySQL 中,物理文件存放在数据目录中。数据目录与安装目录不同,安装目录用来存储控制服务器和客户端程序的命令,数据目录用来存储 MySQL 服务器在运行过程中产生的数据。本节主要介绍 MySQL 数据目录的物理结构和作用。

MySQL 中任何一项逻辑性或者物理性文件都具有可配置性,另外由于开源的原因,每个版本都有一些改进,所以我们在学习本节内容时要灵活掌握,不能生搬硬套。

如果你不知道 MySQL 的数据目录路径,可以通过SHOW VARIABLES LIKE 'datadir';命令查看。

下面分别讲解 MySQL 数据目录里存放的目录和文件。

1. 数据目录

下图是 MySQL(5.7.29)在 Windows 系统下安装的数据文件目录,可以看到有如下几类文件。

Data 目录用来存放数据库相关的数据信息,包括数据库信息,表信息等。

MySQL 5.7 及之后的版本开始支持集群模式,installer_config.xml 配置文件主要用于配置单节点或集群模式。

my.ini 文件是 MySQL 服务端和客户端主要的配置文件,包括编码集、默认引擎、最大连接数等设置。MySQL 服务器启动时会默认加载此文件。

2. Data目录

Data 目录中存放的文件如下图所示:

由图中可以看出,系统数据库和用户自定义数据库的存放路径相同。数据库目录中主要存放相应的数据库对象(图中箭头指向的为 test 数据库目录中存放的文件 )。

对 Data 目录中的文件说明如下:

  • mysql、performance_schema、sakila、sys 和 world 是系统数据库,information_schema 数据库比较特殊,这里没有相应的数据库目录。
  • test 是用户自定义的数据库,也就是用户自己创建的数据库。
  • auto.cnf:MySQL 服务器的选项文件,用于存储 server-uuid 的值。server-uuid 与 server-id 一样,用于标识 MySQL 实例在集群中的唯一性。
  • ib_logfile0、ib_logfile1 是支持事务性引擎的 redo 日志文件
  • ibdata1 为共享表空间(系统表空间)。如果采用 InnoDB 引擎,默认大小为 10M 。
  • ibtmp1 为存储临时对象的空间,比如临时表对象等。

数据目录里可能还有:

  • MySQL 服务器的进程 ID(PID)文件。
  • MySQL 服务器所生成的状态和日志文件。
  • DES 密钥文件或服务器的 SSL 证书。

3. 数据库目录

数据库实际是一个目录,每个目录都保存着相应数据库中的表以及表数据。下面我们以 test 数据库为例讲解目录中存放的文件。

test 数据库中有如下几张数据表:

+-------------------+
| Tables_in_test    |
+-------------------+
| tb_student        |
| tb_student_course |
| tb_students_info  |
| tb_usertest       |
+-------------------+

对 test 数据库目录中的文件说明如下:

1)db.opt

用来保存数据库的配置信息,比如该库的默认字符集编码和字符集排序规则。如果你创建数据库时指定了字符集和排序规则,后续创建的表没有指定字符集和排序规则,那么该表将采用 db.opt 文件中指定的属性。

对于 InnoDB 表,如果是独立的表空间,数据库中的表结构以及数据都存储在数据库的路径下(而不是在共享表空间 ibdata1 文件中)。但是数据中的其他对象,包括数据被修改之后,事务提交之间的版本信息,仍然存储在共享表空间的 ibdata1 文件中。

2).frm

在 MySQL 中建立任何一张数据表,其对应的数据库目录下都会有该表的 .frm 文件。.frm文件用来保存每个数据表的元数据(meta)和表结构等信息。数据库崩溃时,可以用 .frm 文件恢复表结构。

.frm 文件跟存储引擎无关,任何存储引擎的数据表都有 .frm 文件,命名方式为表名.frm,如 users.frm。

MySQL 8.0 版本开始,frm 文件被取消,MySQL 把文件中的数据都写到了系统表空间。通过利用 InnoDB 存储引擎来实现表 DDL 语句操作的原子性(在之前版本中是无法实现表 DDL 语句操作的原子性的,如 TRUNCATE 无法回滚)。

3).MYD和.MYI

  • .MYD 理解为 My Data,用于存放 MyISAM 表的数据。
  • .MYI  理解为 My Index,主要存放 MyISAM 表的索引及相关信息。

4).ibd

对于 InnoDB 存储引擎的数据表,一个表对应两个文件,一个是 *.frm,存储表结构信息;一个是*.ibd,存储表中数据。

5).ibd和.ibdata

.ibd 和 .ibdata 都是专属于 InnoDB 存储引擎的数据库文件。当采用共享表空间时,所有 InnoDB 表的数据均存放在 .ibdata 中。所以当表越来越多时,这个文件会变得很大。相对应的 .ibd 就是采用独享表空间时 InnoDB 表的数据文件。

当然,就算开启了独享表空间,ibdata 文件也会越来越大,因为这个文件里还存储了:

  • 变更缓冲区
  • 双写缓冲区
  • 撤销日志

与其它数据库不同,MySQL可以在不同的SQL模式下运行

与其它数据库不同,MySQL 服务器可以在不同的 SQL 模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于 sql_mode 系统变量的值。
 
SQL 模式定义了 MySQL 数据库所支持的 SQL 语法和数据校验(数据验证检查),这样可以更容易的在不同环境下使用 MySQL。
 
在 MySQL 中,SQL 模式常用来解决下面几类问题:

  • 通过设置 SQL Mode,可以完成不同严格程度的数据校验,有效地保障了数据的准确性。
  • 通过设置 SQL Mode 为 ANSI 模式,可以保证大多数 SQL 符合标准的 SQL 语法,使不同数据库之间进行迁移时,不需要进行较大的修改。
  • 在不同数据库之间进行数据迁移之前,设置 SQL Mode 可以使 MySQL 中的数据更方便地迁移到目标数据库中。

sql_mode 系统变量的常用值

下面列出了几种 SQL 模式常用的值。

1) TRICT_ ALL_TABLES 和 STRICT_ TRANS_TABLES

如果将 sql_mode 的值设置为 TRICT_ALL_TABLES 和 STRICT_TRANS_TABLES,那么 MySQL将启用“严格”模式。在严格模式下,MySQL 服务器会更加严格地对待接收到的不合格数据,它不会把这些不合格的数据转换为最为接近的有效值,而是会拒绝接收它们。

简单来说 MySQL 的严格模式就是 MySQL 自身对数据进行的严格校验,例如格式、长度和类型等。

2) TRADITIONAL

类似于严格模式,但是对于插入的不合格值会给出错误而不是警告。可以应用在事务表和非事务表,用于事务表时,只要出现错误就会立即回滚。

如果你使用的是非事务存储引擎,建议不要把 SQL Mode 值设置为 TRADITIONAL,因为出现错误前进行的操作不会回滚,这样会导致操作只进行了一部分。

3) ANSI_QUOTES

MySQL 服务器会把双引号识别为一个标识符引用字符,而不是字符串的引号字符。所以在启用 ANSI_QUOTES 时,不能用双引号来引用字符串。

4) PIPES_ AS_ CONCAT

会让 MySQL 服务器把||当成一个标准的 SQL 字符串连接运算符,而不会把它当成是 OR 运算符的同义词。

在 Oracle 等数据库中,||被视为字符串的连接操作符,所以在其它数据库中含有||操作符的 SQL 在 MySQL 中将无法执行,为了解决这个问题,MySQL 提供了这个值。

5) ANSI

会同时启用 ANSI_QUOTES、PIPES_ AS_CONCAT 和其它的几个模式值,使 MySQL 服务器的行为比它的默认运行状态更接近于标准 SQL。

如何设置 sql_mode

在设置 SQL 模式时,需要指定一个由单个模式值或多个模式值(多个模式值用逗号分隔)构成的值,或者指定一个空字符串,用以清除该值。模式值不区分大小写。
 
如果想在启动服务器时设置 SQL 模式,那么可以在 mysqld 命令行,或者在某个选项文件里设置系统变量 sql_mode。可以使用下面语句:

sql_mode= "TRADITIONAL "
sql_mode= "ANSI_ QUOTES, PIPES_ AS_ CONCAT"

如果只是想在运行时更改 SQL 模式,那么可以使用 SET 语句来设置 sql_mode 系统变量。

SET sql_mode = ' TRADITIONAL' ;

如果想设置全局性的 SQL 模式,则需要加上 GLOBAL 关键字:

SET GLOBAL sql_mode = ' TRADITIONAL';

设置全局变量需要具备 SUPER 管理权限。新设置的全局变量值将成为此后连入客户端的默认 SQL 模式。
 
如果想获取当前会话或全局的 SQL 模式值,则可以使用如下语句:

SELECT @@SESSION.sql_mode;
SELECT @@GLOBAL. sql_mode;

其返回值由当前启用的所有模式构成,两个模式之间以逗号隔开。如果当前没有启用任何模式,则返回一个空值。

# MySql Command Line Client闪退原因及解决方案

第一次使用 MySQL Command Line Client 有可能输入密码后一按下回车键,程序窗口就自动关闭,出现闪退现象。本节主要分析产生闪退现象的原因以及如何处理这种情况。

原因分析一

首先可以查看程序默认执行文件是否存在,具体操作步骤如下:

步骤 1):找到 MySQL 5.7 Command Line Client 程序右击,在弹出的菜单中选择属性。

步骤 2):在打开的属性对话框中注意看“目标”文本框中的内容,如图所示。

目标文本框中的内容如下:

"C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql.exe" "--defaults-file=C:\ProgramData\MySQL\MySQL Server 5.7\my.ini" "-uroot" "-p"

可以看出程序默认执行的是 my.ini 文件,但是进入 MySQL 目录后会发现并没有 my.ini 文件。因为执行文件不存在,所以弹出的窗口会闪一下就消失了。

这时大家可以将电脑中的 my-default.ini 文件复制粘贴,然后重命名为 my.ini 就可以了。

原因分析二

如果 MySQL 服务没有启动,MySQL Command Line Client 也会出现闪退现象。大多数用户没有启动 MySQL 服务就开始运行 MySQL Command Line Client,这样的情况下也是无法登录的。大家可以通过任务管理器来查看是否开启了这个程序,如图所示。

原因分析三

还有一种比较少的情况,那就是修改了安装路径。如果在安装 MySQL 的时候修改了安装保存的文件夹,那么软件的安装位置就会出现错误。如果是使用的默认的安装目录,一般是不会出现这样的故障。