对小册《MySQL是怎样运行的》知识点的一些摘录。
MySQL服务启动
启动服务器程序
-
运行
mysqld
可以直接启动一个服务器进程 -
mysqld_safe
是一个启动脚本,除了调用mysqld
外还启动了一个帮助服务进程挂掉重启的监控进程,并且会将服务器程序的出错信息和其他诊断信息重定向到某个日志文件中 -
mysql.server
也是一个启动脚本,它会间接的调用mysqld_safe
,在后边指定start
参数就可以启动服务器程序,换成stop
就可以关闭正在运行的服务器程序mysql.server start/stop
与客户端建立连接(进程之间通信)
-
MySQL
支持通过TCP/IP
、命名管道和共享内存
、Unix域套接字文件
三种方式与客户端连接 -
MySQL
服务器启动的时候会默认监听3306
端口号,或者在启动命令中添加-P
参数指定端口号 -
命名管道和共享内存
是Windows
操作系统中的两种进程间通信方式,需要分别在服务器与客户端的启动命令中添加参数来指定通信方式,共享内存
仅限于服务器与客户端程序运行在同一台主机上 -
类Unix系统上可以使用
Unix域套接字文件
来进行进程间通信,仅限于服务器与客户端程序运行在同一台主机上
系统变量与状态变量
系统变量VARIABLES
-
MySQL
服务器维护了许多表示其配置的系统变量,所有变量均有默认值 -
系统变量按作用范围分为
GLOBAL(全局变量)
与SESSION(会话变量)
两种,GLOBAL
影响服务器全局操作,SESSION
影响具体客户端连接相关操作 -
在服务器启动时,会将每个
GLOBAL
初始化为其默认值,然后服务器还为每个连接的客户端维护一组SESSION
,客户端的SESSION
在连接时使用相应全局变量的当前值初始化 -
可以通过启动选项设置系统变量的初始值
mysqld --启动选项1[=值1] --启动选项2[=值2] ... --启动选项n[=值n]
-
可以通过配置文件设置系统变量的初始值
-
在类
UNIX
操作系统中,MySQL
会按照下列路径来寻找配置文件:路径名 备注 /etc/my.cnf
/etc/mysql/my.cnf
SYSCONFDIR/my.cnf
$MYSQL_HOME/my.cnf
特定于服务器的选项(仅限服务器) defaults-extra-file
命令行指定的额外配置文件路径 ~/.my.cnf
用户特定选项 ~/.mylogin.cnf
用户特定的登录路径选项(仅限客户端) -
配置文件中的启动选项被划分为若干个组,每个组有一个组名:
[组名] option1 #这是option1,该选项不需要选项值 option2 = value2 #这是option2,该选项需要选项值 ...
-
配置文件中不同的选项组是给不同的启动命令使用的:
启动命令 类别 能读取的组 mysqld
启动服务器 [mysqld]
、[server]
mysqld_safe
启动服务器 [mysqld]
、[server]
、[mysqld_safe]
mysql.server
启动服务器 [mysqld]
、[server]
、[mysql.server]
mysql
启动客户端 [mysql]
、[client]
mysqladmin
启动客户端 [mysqladmin]
、[client]
mysqldump
启动客户端 [mysqldump]
、[client]
-
设置系统变量的优先级为 启动选项 > 配置文件,多个配置文件中的同一个启动项以最后一个加载的文件为准,同一个配置文件中的同一个启动项以最后一个加载的组为准
-
如果我们不想让
MySQL
到默认的路径下搜索配置文件,可以在命令行指定defaults-file
选项:mysqld --defaults-file=/tmp/myconfig.txt
-
-
可以通过
MySQL
客户端查看系统变量SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式]; SELECT @@[GLOBAL|SESSION].系统变量名;
-
大部分系统变量的值支持热修改(在服务器程序运行过程中进行动态修改而无需停止并重启服务器),服务重启后热修改的系统变量会失效
-
可以通过
MySQL
客户端修改系统变量(SUPER
权限)SET [GLOBAL|SESSION] 系统变量名 = 值; SET @@[GLOBAL|SESSION].系统变量名 = 值;
-
如果某个客户端改变了某个系统变量在
GLOBAL
作用范围的值,并不会影响该系统变量在当前已经连接的客户端作用范围为SESSION
的值,只会影响后续连入的客户端在作用范围为SESSION
的值
状态变量STATUS
-
状态变量记录了程序运行状态,也分为
GLOBAL(全局变量)
与SESSION(会话变量)
两种 -
可以通过
MySQL
客户端查看系统变量SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式];
MySQL数据存储
字符集与比较规则
-
字符集
指的是某个字符范围的编码规则,比较规则
是针对某个字符集中的字符比较大小的一种规则 -
可以通过
MySQL
客户端查看支持的字符集与比较规则:SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式]; SHOW COLLATION [LIKE 匹配的模式];
-
MySQL
中的utf8
和utf8mb4
:-
utf8
(utf8mb3
):阉割过的utf8
字符集,只使用1~3个字节表示字符,可以覆盖常用的字符 -
utf8mb4
:正宗的utf8
字符集,使用1~4个字节表示字符
-
-
常用的字符集表示字符最多需要的字节数:
字符集 Maxlen ascii
1
gbk
2
utf8
3
utf8mb4
4
-
MySQL
有4个级别的字符集与比较规则:-
服务器级别的字符集通过系统变量
character_set_server
来表示,默认为utf8
;比较规则通过collation_server
来表示,默认为utf8_general_ci
-
数据库级别的字符集与比较规则分别通过系统变量
character_set_database
与collation_database
来表示,在创建或修改数据库的时候可以指定,否则默认使用服务器级别的设置CREATE DATABASE 数据库名 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称] ALTER DATABASE 数据库名 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称]
-
表级别的字符集与比较规则在创建或修改表的时候可以指定,否则默认使用数据库级别的设置
CREATE TABLE 表名 (列的信息) [CHARACTER SET 字符集名称] [COLLATE 比较规则名称] ALTER TABLE 表名 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称]
-
对于存储字符串的列,同一个表中的不同的列可以有不同的字符集与比较规则,在创建和修改列定义的时候可以指定,否则默认使用表级别的设置
CREATE TABLE 表名( 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称], 其他列... ); ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];
-
-
服务器与客户端的字符集转换:
-
服务器使用
character_set_client
解码客户端的请求 -
服务器将结果集使用
character_set_results
编码后发送给客户端
-