mysql的启动

服务器启动
mysqld启动mysql进程
mysqld_safe调用mysqld并监控运行状态,帮助重启服务器,并将错误信息输出到错误日志
mysql.server调用mysqld_safe,mysql.server start启动服务器
mysqld_mult启动或停止多个mysql
mysqld –console查看启动日志
mysqld -P 3307指定启动端口

mysql通信协议

mysql使用tcp协议进行客户端和服务器通信
如果是windows系统使用命名管道或共享内存通信,共享内存需要客户端和服务器在同一台机器上
如果是mac系统使用unix域套接字通信,mysql默认监听/tmp/mysql.socket文件,若要修改可通过mysqld –socket=/tmp/mysql2.socket,客户端也可mysql -h localhost -u root -p –socket=/tmp/mysql2.socket

mysql处理客户端请求

每当有客户端连接服务器会创建一个线程处理,客户端退出线程不会立即销毁,而是等待其他客户端的连接再分配
mysql查询缓存:两个查询请求有任何字符不同都不会导致命中,某些系统函数如now不可能命中,查询缓存是表级别的,若表被修改过则清空整张表的查询缓存,mysql8中直接删除了查询缓存
mysql处理请求过程分为server层和存储引擎层,server写把查询到的数据发送到缓冲区,等缓冲区满了再发送给客户端,缓冲区大小由net_buffer_length控制

存储引擎的一些操作

show engines查询服务器支持的存储引擎,xa表示是否支持分布式事务,savepoints表示是否支持分布式部分回滚
创建表时可以指定存储引擎

1
create table user () engine = InnoDB;

mysql的启动项和配置文件

禁止使用tcp网络通信

1
mysqld --skip-networking

启动服务器时指定存储引擎

1
mysqld --default-storage-engine=MyISAM

mysql配置文件:/ect/my.cnf, /ect/mysql/my.cnf, ~/.my.cnf
~/.my.cnf的优先级大于/ect/my.cnf
配置文件添加默认配置

1
2
[server]
default-storage-engine=MyISAM

启动项的优先级高于配置文件

系统变量

查看系统变量

1
show variables like 'default_storage_engine'; // 必须使用_

系统变量的作用范围:global和session
启动服务器使用的是global,每当有客户端链接作用范围为session
单独设置global和session的系统变量

1
2
set global default_storage_engine=MyISAM;
set session default_storage_engine=MyISAM;

单独查看global和session的系统变量

1
2
show global variables like 'default_storage_engine';
show session variables like 'default_storage_engine';

max_connections只有global范围
insert_id(AUTO_INCREMENT时的初始值)只有session范围

状态变量

Threads_connected表示有多少个链接的客户端
查看状态变量

1
show status like 'thread%';

字符集

Latin1: iso 8859-1共收录256个字符
utf-8使用1-4个字节编码
utf8mb3: 只有1-3个字节的utf-8
utf8mb4: 1-4个字节,4字节可保存emoji表情,mysql8中的默认字符集
查看字符集

1
show charset;

default collation表示字符集的默认比较规则
查看比较规则

1
show collation like 'utf8%';

utf8_general_ci(默认)表示通用规则不区分大小写,utf8_general_cs区分大小写

1
select 'a' = 'A'; // 返回true

查看服务器级别的字符集和比较规则

1
2
show variables like 'character_set_server';
show variables like 'collation_server';

可以在配置文件修改字符集和比较规则

1
2
3
[server]
character_set_server=gb2312
collation_server=gb2312_chinese_ci

也可以在创建数据库时声明

1
2
3
4
create database test character set gb2312 collate gb2312_chinese_ci;
use test;
show variables like 'character_set_database';
show variables like 'collation_database';

表级别的字符集

1
create table user () character set utf8 collate utf8_general_ci;

行级别的字符集

1
alter tbaler user modify name varchar(20) character set gbk collate gbk_chinese_ci;

只修改字符集,比较规则也会跟着变为相应的默认,
只修改比较规则,字符集也会相应改变
操作系统的字符集可通过环境变量查看,优先级$LC_ALL > $LC_CTYPE > $LANG
windows系统可通过chcp命令查看,936表示GBK,65001表示utf-8
客户端的字符集,客户端使用utf8请求

1
mysql --default_character_set=utf8

三种系统变量:character_set_client, character_set_connection, character_set_results
三者为session级别
default_character_set: 客户端发送数据使用的编码
1.character_set_client: 服务器认为客户端使用该编码
2.character_set_connection: 请求处理时使用的编码
3.character_set_results: 返回给客户端数据时使用的编码
character_set_server: 数据存储的编码

客户端的默认字符集为操作系统默认字符集,若操作系统字符集为ascii,则mysql客户端默认字符集为latin1,mysql5.7使用latin1为默认字符集,mysql8使用utf8mb4为默认字符集,若设置了default-character-set则忽略操作系统默认字符集,服务器收到上述三种字符集后初始化为客户端默认字符集