1.安装目录
在mac中mysql 安装目录为/usr/local/mysql
,以mysql8.0.25版本为例 ,该目录下文件如下:
├── bin //可执行文件
├── data //数据库文件、日志文件、表空间等
├── docs
├── include
├── keyring
├── lib
├── man
├── share
└── support-files
其中data文件夹是核心,后续笔记会涉及这块
2.mysql 架构
mysql 分为客户端和服务器端,用户通过客户端程序发送请求给服务端,服务端收到请求后处理,并把处理结果返回给客户端,架构详情可参考:MySQL基础架构
3.启动服务器
(1)mysqld
mysqld
:mysqld可执行文件 即我们所理解的mysql服务端,运行这个可执行文件即可启动mysql服务器进程,但一般不直接使用该方式启动
(2)mysqld_safe
mysqld_safe
:mysql启动脚本。会调用mysqld并监控服务器运行状态
(3)mysql.server
mysql.server
:mysql启动脚本。会调用mysqld_safe
(4)mysqld_multi
mysqld_multi
:多服务器端启动
4.启动mysql客户端
mysql -h主机名 -u用户名 -p密码
5.客户端服务器连接方式
(1)TCP/IP
mysql采用TCP/IP协议作为服务端和客户端的网络通信协议。 mysql服务器默认使用3306端口号,也可以通过启动服务端改变端口号(ex:mysqld -P3307
)
(2)命名管道和共享内存
windows进程间通信方式。只适合 Windows 系统下用来连接本机的 MySQL
启用方式:启动服务器加命令/配置加上--enable-named-pipe
,启动客户端命令加--pipe
(3)UNIX套接字
MySQL服务器程序默认监听/tmp/mysql.sock
套接字,客户端程序也默认连接到该套接字,也可以在启动服务端时更改(mysqld --socket=/tmp/a.txt
)。 该方式只适合服务器程序和客户端程序都在本机上的类UNIX操作系统。
启用方式:mysql -h主机名 -u用户名 --socket -p密码
/ mysql -uroot -S /tmp/mysql.sock -p
可通过命令
mysql -u root -p密码 -h 127.0.0.1 -e "select @@socket"
查询socket文件位置)
6.MySQL启动配置
我们都知道一个服务启动,会需要读一些配置,除了在命令行中制定启动选项,还可以通过配置文件进行配置。对于MySQL来说,配置位置可以通过以下方式获取:
$ mysql --help | grep my.cnf
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
MySQL会按照位置顺序读取,因此位置越靠后优先级越高
MySQL中可以没有配置文件,没有的情况下MySQL会按照编译时的默认参数设置。
6.1 MySQL配置文件内容
配置文件中的启动选项被划分为若干个组,每个组下面可以定义多个启动选项,不同的选项组是给不同的程序使用的。如果选项组名称与程序名相同,则组中的选项将专门应用于该程序。
注意:mysqld_safe,mysql.server启动时都会读取[mysqld]内容
[server] //作用于所有的服务器程序
...
[mysqld]//应用于mysqld服务器程序
port=3306
socket=/tmp/mysql.sock
key_buffer_size=16M
max_allowed_packet=128M
[mysqld_safe]
...
[client] //作用于所有客户端程序
port=3306
socket=/tmp/mysql.sock
[mysql]//应用于mysql客户端程序
...
[mysqladmin]
force
[mysqldump]
quick
[mysqld-8.0] ///特定MySQL版本选项组
sql_mode=TRADITIONAL
7.MySQL运行时系统变量
系统变量作用范围:
- GLOBAL:影响服务器整体操作
- SESSION:影响某个客户端连接操作
## 查询系统变量
## 不加GLOBAL|SESSION修饰符查询=SESSION范围查询
SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配模式];
##设置系统变量
SET [GLOBAL|SESSION] 系统变量名 = 值;
启动选项和系统变量区别:
- 启动选项是在程序启动时由用户传递的参数,系统变量影响服务器程序运行的变量
- 大部分系统变量可以当作启动选项传入。但有些系统变量是在程序运行过程中自动生成,不能当作启动选项传入,如character_set_client
- 有些启动选项不是系统变量,如defaults-file
8.字符集和比较规则
8.1 字符集
字符集主要需要注意MySQL中utf8并不是真的utf8,是utf8mb3(使用1~3个字节表示一个字符),utf8mb4才是utf8
## MySQL查看字符集
show charset;
8.2 比较规则
## MySQL查看比较规则
show collation [like 匹配模式];
utf8字符集下的比较规则如下所示:
mysql> show collation like 'utf8\_%';
+--------------------------+---------+-----+---------+----------+---------+---------------+
| Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute |
+--------------------------+---------+-----+---------+----------+---------+---------------+
| utf8_bin | utf8 | 83 | | Yes | 1 | PAD SPACE |
| utf8_croatian_ci | utf8 | 213 | | Yes | 8 | PAD SPACE |
| utf8_czech_ci | utf8 | 202 | | Yes | 8 | PAD SPACE |
| utf8_danish_ci | utf8 | 203 | | Yes | 8 | PAD SPACE |
| utf8_esperanto_ci | utf8 | 209 | | Yes | 8 | PAD SPACE |
| utf8_estonian_ci | utf8 | 198 | | Yes | 8 | PAD SPACE |
| utf8_general_ci | utf8 | 33 | Yes | Yes | 1 | PAD SPACE |
| utf8_general_mysql500_ci | utf8 | 223 | | Yes | 1 | PAD SPACE |
| utf8_german2_ci | utf8 | 212 | | Yes | 8 | PAD SPACE |
| utf8_hungarian_ci | utf8 | 210 | | Yes | 8 | PAD SPACE |
| utf8_icelandic_ci | utf8 | 193 | | Yes | 8 | PAD SPACE |
| utf8_latvian_ci | utf8 | 194 | | Yes | 8 | PAD SPACE |
| utf8_lithuanian_ci | utf8 | 204 | | Yes | 8 | PAD SPACE |
| utf8_persian_ci | utf8 | 208 | | Yes | 8 | PAD SPACE |
| utf8_polish_ci | utf8 | 197 | | Yes | 8 | PAD SPACE |
| utf8_romanian_ci | utf8 | 195 | | Yes | 8 | PAD SPACE |
| utf8_roman_ci | utf8 | 207 | | Yes | 8 | PAD SPACE |
| utf8_sinhala_ci | utf8 | 211 | | Yes | 8 | PAD SPACE |
| utf8_slovak_ci | utf8 | 205 | | Yes | 8 | PAD SPACE |
| utf8_slovenian_ci | utf8 | 196 | | Yes | 8 | PAD SPACE |
| utf8_spanish2_ci | utf8 | 206 | | Yes | 8 | PAD SPACE |
| utf8_spanish_ci | utf8 | 199 | | Yes | 8 | PAD SPACE |
| utf8_swedish_ci | utf8 | 200 | | Yes | 8 | PAD SPACE |
| utf8_tolower_ci | utf8 | 76 | | Yes | 1 | PAD SPACE |
| utf8_turkish_ci | utf8 | 201 | | Yes | 8 | PAD SPACE |
| utf8_unicode_520_ci | utf8 | 214 | | Yes | 8 | PAD SPACE |
| utf8_unicode_ci | utf8 | 192 | | Yes | 8 | PAD SPACE |
| utf8_vietnamese_ci | utf8 | 215 | | Yes | 8 | PAD SPACE |
+--------------------------+---------+-----+---------+----------+---------+---------------+
比较规则名称后缀英文释义及描述
后缀 | 英文释义 | 描述 |
---|---|---|
_ai | Accent-insensitive | 不区分重音 |
_as | Accent-sensitive | 区分重音 |
_ci | Case-insensitive | 不区分大小写 |
_cs | Case-sensitive | 区分大小写 |
_bin | Binary | 以二进制方式比较 |
8.3 字符集和比较规则应用
(1)作用范围
MySQL有4个级别的字符集和比较规则:服务器级别、数据库级别、表级别、列级别
系统变量 | 描述 |
---|---|
character_set_server | 服务器级别字符集 |
collation_server | 服务器级别比较规则 |
character_set_database | 数据库级别字符集 |
collation_database | 数据库级别比较规则 |
如果创建数据库不指定字符集/比较规则,将使用服务器级别字符集/比较规则;创建表不指定字符集/比较规则,则使用数据库级别字符集/比较规则;创建列不指定字符集/比较规则,则使用表级别字符集/比较规则。
字符集和比较规则间相互关联,如果只修改字符集,比较规则会变为字符集默认的比较规则,反之亦是
(2)客户端服务器通信过程字符集
a.客户端发送请求
一般情况下客户端编码请求字符串时使用的字符集与操作系统当前字符集一致
//查看操作系统字符集
$ echo $LC_ALL
$ echo $LC_CTYPE
$ echo $LANG
zh_CN.UTF-8
b.服务器接收请求
服务器将收到的请求当作系统变量character_set_client
代表的字符集进行编码的字节序列
每个客户端和服务器建立连接后,服务器会为该客户端维护一个单独的
character_set_client
变量,变量为SESSION级别
c.服务器处理请求
服务器处理请求时,会将请求的字节序列转换为character_set_connection
对应的字符集进行编码的字节序列
d.服务器生成响应
将结果集转换为character_set_results
对应字符集编码发送给客户端
e.客户端接收响应
对于类UNIX操作系统,会把接收到的字节序列写入MySQL命令行界面,并默认使用当前操作系统字符集解释该字符
对于Windows系统,会使用客户端默认字符集进行解释字符
小结
系统变量 | 描述 |
---|---|
character_set_client | 服务器认为请求是按照该系统变量指定的字符集来编码的 |
character_set_connection | 服务器在处理请求时,会把请求字节序列从character_set_client转换为character_set_connection |
character_set_results | 服务器采用该系统变量指定的字符集对返回给客户端的字符串进行编码 |
参考:
[1]https://dev.mysql.com/doc/refman/8.0/en/data-directory.html
[2]https://dev.mysql.com/doc/refman/8.0/en/programs-server.html
[3]MySQL是怎样运行的-小孩子4919
[4]MySQL技术内幕 Innodb存储引擎-姜承尧
[5]https://dev.mysql.com/doc/refman/8.0/en/option-files.html
[6]https://dev.mysql.com/doc/refman/8.0/en/charset-collation-names.html