Appearance
MySQL 的安装和配置
安装MySQL后,如何判断是否已安装成功
MySQL 安装完成后,用户可以通过 DOS 窗口或者 MySQL 5.7 Command Line Client 验证 MySQL 是否安装成功。
DOS窗口验证
步骤 1):打开 DOS 窗口,如果你配置了 MySQL 环境变量,直接登录;没有配置环境变量就需要进入到 mysql/bin 目录下登录。如图所示。
步骤 2):输入 status 命令查看 MySQL 版本信息,如图所示。
出现以上代码就说明安装成功了。
MySQL客户端验证
步骤 1):打开 MySQL 5.7 Command Line Client 程序,输入密码后按回车键,弹出当前 MySQL 的服务器状态,如图所示。
当前 MySQL 服务器的版本为 5.7.20-log MySQL Community Server(GPL),表明 MySQL 已经安装成功。
步骤 2):在 MySQL 5.7 Command Line Client 程序中输入简单命令,如 SHOW DATABASES;
,显示当前的数据库列表,如图所示。
如果显示数据库列表,则说明 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 的时候修改了安装保存的文件夹,那么软件的安装位置就会出现错误。如果是使用的默认的安装目录,一般是不会出现这样的故障。