《MySQL是怎样运行的》笔记(一)

377 阅读6分钟

对小册《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中的utf8utf8mb4

    • utf8utf8mb3):阉割过的utf8字符集,只使用1~3个字节表示字符,可以覆盖常用的字符

    • utf8mb4:正宗的utf8字符集,使用1~4个字节表示字符

  • 常用的字符集表示字符最多需要的字节数:

    字符集Maxlen
    ascii1
    gbk2
    utf83
    utf8mb44
  • MySQL有4个级别的字符集与比较规则:

    • 服务器级别的字符集通过系统变量character_set_server来表示,默认为utf8;比较规则通过collation_server来表示,默认为utf8_general_ci

    • 数据库级别的字符集与比较规则分别通过系统变量character_set_databasecollation_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编码后发送给客户端