MySQL 命令的选项

MySQL 命令的选项

本节介绍了如何设置 MySQL 变量,以及常用的连接选项。

设置程序变量

MySQL 对选项是顺序处理的

  • 环境变量 -> 配置文件 -> 命令行 -> mysqld-auto.cnf (数据目录下的持久化配置文件)

  • 当出现重复选项时,后面的会覆盖前面的。

    所以环境变量的优先级最低,命令行优先级最高 (数据目录下 mysqld-auto.cnf 例外)。

长选项和短选项

  • 长选项和值之间必须有 =

    --host=172.16.0.30
    
  • 短选项和值之间可以是空格或直接相连
    -h 172.16.0.30
    -h172.16.0.30
    

组成

  • 选项名称
    • 破折号 - 和下划线 _ 可互换

      如 –skip-grant-tables 和 –skip_grant_tables 是等同的。

    • 可以使用 --disable--skip 前缀,或者 =0后缀

      # disable
      --disable-column-names
      --skip-column-names
      --column-names=0
      
      # enable
      --column-names
      --enable-column-names
      --column-names=1
      
    • 识别配置的选项是否有效
      • --loose 前缀

        无法识别的选项会发出警告并忽略。如 mysql –loose-no-such-option。

      • --maximum 前缀

        限制最大变量的最大值,仅适用于 mysqld ,且仅能用于设置会话级的选项值,设置全局级选项值会报错,如 –maximum-max_heap_table_size=32M 。

  • 选项值

    • 对于采用数字值的选项,可以给该值加上后缀K,M、G、T、P 或 E (不区分大小写),表示1024、1024^2、1024^3 …
      # ping 1024次
      mysqladmin --count=1K --sleep=10 ping
      
    • 布尔型选项的值可以为 {ON|OFF|TRUE|FALSE},不区分大小写

设置方法

  • 启动时指定

    shell> mysql --max_allowed_packet=16777216  # 单位是bytes
    shell> mysql --max_allowed_packet=16M # 单位不区分大小写
    
    • 程序调用时设置变量,可以指定倍数后缀 (K/M/G),但不可以使用表达式
      shell> mysql --max_allowed_packet=16M
      shell> mysql --max_allowed_packet=16*1024*1024  # 不合法
      
    • 对于有选项值的选项,如果在启动时指定,选项和选项值之间要用 = 连接
      shell> mysqld_safe --log-error=my-errors &
      
  • 在配置文件中指定
    [mysql]
    max_allowed_packet=16777216
    or
    [mysql]
    max_allowed_packet=16M
    
    # 下划线或破折号等效
    [mysqld]
    key_buffer_size=512M
    or
    [mysqld]
    key-buffer-size=512M
    
  • 使用 SET 语句动态设置
    • SET 设置变量时,不可以指定倍数后缀 (K/M/G),但可以使用表达式
      mysql> SET GLOBAL max_allowed_packet=16M;  -- 不合法
      mysql> SET GLOBAL max_allowed_packet=16*1024*1024;
      

用于连接的选项

这些选项对于 MySQL 程序基本是通用的。

建立连接的选项

  • –default-auth
    • 认证插件
  • –host,-h
    • 主机,默认 localhost
  • –password,-p
    • 密码。输入时建议采用交互式,或写到配置文件中

      使用时,密码必须紧跟选项,否则会被识别为数据库名,如 mysql -p test

      某些系统会将密码限制为8位,这个限制是系统库的限制,不是 MySQL 的属性。MySQL 对密码长度没有任何限制。

  • –skip-password

    • 无密码且不提示输入密码
    • 如果忘记管理员密码,可以使用这个选项跳过密码登录,然后重置密码
  • –plugin-dir
    • 插件目录

      当指定了 –default-auth 但是找不到插件时,需要指定插件目录。

  • –port,-P

    • 端口,默认 3306
  • –protocol={TCP|SOCKET}
    mysql --host=127.0.0.1
    mysql --host=::1  # IPv6连接本地服务端
    mysql --protocol=TCP
    
    • 连接协议,localhost 连接默认使用 socket 方式

    • 在执行时,仅使用与传输协议相关的连接选项,无关的选项会被忽略

      如 localhost 连接,即使指定了 TCP/IP 的端口号 (-P),也会被忽略,因为 localhost 使用 socket 方式。

  • –secure-auth

    已弃用。

  • –socket,-S

    • socket 文件,默认是 /tmp/mysql.sock
  • –user,-u
    • 用户。默认为系统的登录用户

加密连接的选项

  • –get-server-public-key
    • 从服务器请求 RSA 公钥

      此选项适用于使用 caching_sha2_password 身份验证插件进行身份验证的客户端。

  • –server-public-key-path

    • 服务器公钥路径

      此选项适用于使用 sha256_password 或 caching_sha2_password 身份验证插件进行身份验证的客户端。

  • –ssl, –skip-ssl

    已弃用。

    • 控制是否使用加密连接

    • 创建加密连接用户

      # 创建加密连接用户
      mysql> create user repl@'172.16.0.%' identified by 'root' require ssl;
      mysql> alter user repl@'172.16.0.%' identified by 'root' require ssl;
      
      # 验证
      shell> mysql -urepl -proot -h 172.16.0.30 -P 3306 --ssl-mode=disabled  # 连接被拒绝
      shell> mysql -urepl -proot -h 172.16.0.30 -P 3306 --ssl-mode=require  # 正常连接
      
  • –ssl-ca
    • 包含 ssl 证书颁发机构列表的文件
  • –ssl-capath
    • ca 文件目录
  • –ssl-cert
    • 包含 X.509 证书的公钥文件
  • –ssl-cipher
    • 加密密码列表,如果表中不支持密码,则加密连接不起作用
      --ssl-cipher=AES128-SHA
      --ssl-cipher=DHE-RSA-AES128-GCM-SHA256:AES128-SHA
      
  • –ssl-crl
    • 包含证书吊销列表的文件
  • –ssl-crlpath
    • crl 文件所在目录
  • –ssl-fips-mode={OFF|ON|STRICT}
    • 客户端是否允许 FIPS 模式
  • –ssl-key
    • 包含 X.509 密钥的私钥文件

      如果密钥文件受密码保护,会提示输入密码。

  • –ssl-mode

    服务器端已删除,客户端仍然保留。

    • 与服务器连接所需的安全状态
    • 选项值
      • REQUIRED
        • 如果服务器支持加密连接,就建立加密连接,如果不支持,则报错
      • DISABLED
        • 禁用加密连接
      • PREFERRED
        • (默认) 如果服务器支持加密连接,就建立加密连接,如果不支持,就使用非加密连接
        • 本地 socket 连接,是未加密连接,但是默认情况下,它是安全的,如果使用加密连接,反而会增加 CPU 负载
      • VERIFY_CA
        • 类似 REQUIRED,但是需要验证证书,找不到有效证书就报错
      • VERIFY_IDENTITY
        • 类似 VERIFY_CA,另外还要验证证书中的主机名,此选项有助于防止中间人攻击
        • 这种主机名验证,不适用于自动创建或使用 mysql_ssl _rsa_setup 手动创建的自签名证书。这类证书不包含主机名作为通用名称
  • –ssl-verify-server-cert

    已弃用,被 –ssl-mode=VERIFY_IDENTITY 取代。

    • 根据服务器证书的通用名身份验证主机名
  • –tls-ciphersuites=ciphersuite_list
    • 允许 TLSv1.3 密码用于加密连接
      shell> mysql --tls-ciphersuites="suite1:suite2:suite3"
      
  • –tls-version
    • 客户端加密连接允许的 TLS 协议
      shell> mysql --tls-version="TLSv1.1,TLSv1.2"
      
    • 为避免漏洞,TLS 版本必须连续,否则会造成漏洞
      --tls-version="TLSv1,TLSv1.1,TLSv1.2"
      --tls-version="TLSv1.1,TLSv1.2"
      --tls-version="TLSv1.2"
      

压缩连接的选项

  • –compress, -C

    已弃用。

    • 尽可能压缩客户端和服务器之间发送的所有信息
  • –compression-algorithms=value
    • 允许的压缩算法,默认未压缩
  • –zstd-compression-level=level
    • zstd 算法的压缩级别,允许值为1-22,默认级别是3

控制连接压缩

客户端和服务器端之间的流量可以进行压缩,以减少通过连接发送的字节数。 默认情况下,连接是未压缩的,但是如果服务器端和客户端同意相互允许的压缩算法,则可以压缩连接。

压缩发生在加密之前。并且,压缩会影响客户端和服务器端的 CPU 负载,所以只适用于低带宽的环境,可以减少传输的字节数。

适用范围

  • 普通客户端连接
  • 主从复制的连接
  • 组复制 (GR) 的连接
  • 不适用于 FEDERATED 表的连接
  • X 协议连接也支持压缩,但是独立于经典 MySQL 协议连接的压缩

配置连接压缩

  • 控制压缩
    • 系统变量
      • protocol_compression_algorithms
    • 命令行选项
      • –compression-algorithms
      • –zstd-compression-level
    • C API 函数 mysql_options() 的参数
      • MYSQL_OPT_COMPRESSION_ALGORITHMS
      • MYSQL_OPT_ZSTD_COMPRESSION_LEVEL
    • CHANGE MASTER TO

      从 8.0.23 版本开始,CHANGE MASTER TO 已经替换成 CHANGE REPLICATION SOURCE TO。

      • MASTER_COMPRESSION_ALGORITHMS
      • MASTER_ZSTD_COMPRESSION_LEVEL
    • CHANGE REPLICATION SOURCE TO
      • SOURCE_COMPRESSION_ALGORITHMS
      • SOURCE_ZSTD_COMPRESSION_LEVEL
    • 组复制的系统变量
      • group_replication_recovery_compression_algorithm
      • group_replication_recovery_zstd_compression_level
  • 压缩算法
    • zlib
    • zstd
      • 允许的压缩级别是 1-22,默认级别是3
    • uncompressed
      • 允许不压缩 (可能压缩,也可能不压缩)
  • 算法协商过程

    为了成功建立连接,连接双方必须在相互允许的压缩算法上达成共识。算法协商过程先尝试使用 zlib,然后使用 zstd,然后未压缩。如果双方找不到通用算法,则连接尝试将失败。

  • 配置方法

    根据算法的协商过程,在服务器端配置连接压缩后,在客户端也要配置相同的算法,否则是不会使用压缩连接的。

    配置的选项值是一个压缩算法列表,多个压缩算法之间用逗号分隔,不区分大小写,无特定顺序。

    • 服务器端
      • 修改配置文件
        [mysqld]
        protocol_compression_algorithms=zlib,zstd,uncompressed
        
      • 动态设置
        mysql> SET PERSIST protocol_compression_algorithms='zlib,zstd,uncompressed';
        

        Note: SET PERSIST 动态设置变量,并保存该值,下次重启仍然生效。如果不保存该值,可以使用 GLOBAL 关键字。

      • 主从复制时指定

        CHANGE REPLICATION SOURCE TO
          SOURCE_COMPRESSION_ALGORITHMS = 'zlib,zstd',
          SOURCE_ZSTD_COMPRESSION_LEVEL = 7;
        

        Note: 前提是,假设系统变量 slave_compressed_protocol 未开启。slave_compressed_protocol 的优先级更高。

    • 客户端

      • 修改配置文件
        [mysql]
        # 建立连接
        user=root
        #host=172.16.0.40
        password=root
        #protocol=TCP
        #port=3306
        socket=/tmp/mysql.sock
        
        # 加密连接
        ssl_mode=PREFERRED
        
        # 连接压缩
        compression_algorithms=zstd,uncompressed
        zstd_compression_level=3
        

        Note: 这是客户端的配置文件,用于连接到服务器端,与服务器端的配置文件可以不是同一个文件。

      • 在命令行中指定选项

        shell> mysql -uroot -p -S /tmp/mysql.sock --compression-algorithms=zstd,uncompressed --zstd-compression-level=4
        

配置旧版连接压缩

这些配置选项适用于 8.0.18 版本之前的连接压缩。

  • 控制压缩
    • 命令行选项
      • –compress
    • C API 函数 mysql_options() 的参数
      • MYSQL_OPT_COMPRESS
    • 主从复制的系统变量
      • slave_compressed_protocol
  • 压缩算法
    • zlib (旧版只支持 zlib 算法)
  • 配置方法

    略。方法是一样的,只是使用的选项名称不同、压缩算法不同。

监控连接压缩

  • 状态变量

    • Compression={ON|OFF}
    • Compression_algorithm
    • Compression_level
  • 系统变量
    • protocol_compression_algorithms
  • 客户端命令
    • \status, \s
  • 对于主从复制的连接
    • 系统表
      • performance_schema.replication_connection_configuration

        COMPRESSION_ALGORITHMS 和 ZSTD_COMPRESSION_LEVEL 这两列分别显示压缩算法和 zstd 压缩级别。

      • mysql.slave_master_info

        Master_compression_algorithms 和 Master_zstd_compression_level 这两列,分别显示压缩算法和压缩级别。

    • master.info文件

      8.0 版本已经删除这个文件,改为使用上面介绍的 mysql.slave_master_info 系统表记录相关信息。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注