Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Nonpersistible and Persist-Restricted System Variables

7.1.9.4 非持久化和持久性受限的系统变量

SET PERSISTSET PERSIST_ONLY 允许将全局系统变量持久化到数据目录中的 mysqld-auto.cnf 选项文件中(参见第15.7.6.1节,“SET Syntax for Variable Assignment”)。然而,不是所有的系统变量都可以被持久化,或者只能在某些限制条件下被持久化。以下是一些原因,为什么一个系统变量可能不是非持久化的,或者只在特定限制条件下可持久化:

  • 会话系统变量不能被持久化。会话变量不能在服务器启动时设置,因此没有必要将它们持久化。

  • 一个全局系统变量可能涉及敏感数据,因此只能由直接访问服务器主机的用户设置。

  • 一个全局系统变量可能是只读的(即由服务器设置)。在这种情况下,它不能由用户在任何时候设置,无论是在服务器启动时还是运行时。

  • 一个全局系统变量可能仅供内部使用。

非持久化的系统变量不能在任何情况下被持久化。受限于持久性的系统变量可以使用 SET PERSIST_ONLY 持久化,但只能由满足以下条件的用户进行设置:

例如,protocol_version 是只读的,只由服务器设置,因此它在任何情况下都不能被持久化。另一方面,bind_address 受限于持久性,所以可以由满足前提条件的用户设置。

以下是非持久化系统变量的列表。这一列表可能随着不断发展而变化。

audit_log_current_session
audit_log_filter_id
caching_sha2_password_digest_rounds
character_set_system
core_file
have_statement_timeout
have_symlink
hostname
innodb_version
keyring_hashicorp_auth_path
keyring_hashicorp_ca_path
keyring_hashicorp_caching
keyring_hashicorp_commit_auth_path
keyring_hashicorp_commit_ca_path
keyring_hashicorp_commit_caching
keyring_hashicorp_commit_role_id
keyring_hashicorp_commit_server_url
keyring_hashicorp_commit_store_path
keyring_hashicorp_role_id
keyring_hashicorp_secret_id
keyring_hashicorp_server_url
keyring_hashicorp_store_path
large_files_support
large_page_size
license
locked_in_memory
log_bin
log_bin_basename
log_bin_index
lower_case_file_system
ndb_version
ndb_version_string
persist_only_admin_x509_subject
persisted_globals_load
protocol_version
relay_log_basename
relay_log_index
server_uuid
skip_external_locking
system_time_zone
version_comment
version_compile_machine
version_compile_os
version_compile_zlib

受限于持久性的系统变量是那些只能在命令行或选项文件中设置,除了 persist_only_admin_x509_subjectpersisted_globals_load 之外的其他系统变量。这一列表可能随着不断发展而变化。

audit_log_file
audit_log_format
auto_generate_certs
basedir
bind_address
caching_sha2_password_auto_generate_rsa_keys
caching_sha2_password_private_key_path
caching_sha2_password_public_key_path
character_sets_dir
datadir
default_authentication_plugin
ft_stopword_file
init_file
innodb_buffer_pool_load_at_startup
innodb_data_file_path
innodb_data_home_dir
innodb_dedicated_server
innodb_directories
innodb_force_load_corrupted
innodb_log_group_home_dir
innodb_page_size
innodb_read_only
innodb_temp_data_file_path
innodb_temp_tablespaces_dir
innodb_undo_directory
innodb_undo_tablespaces
lc_messages_dir
log_error
mecab_rc_file
named_pipe
pid_file
plugin_dir
port
relay_log
replica_load_tmpdir
secure_file_priv
sha256_password_auto_generate_rsa_keys
sha256_password_private_key_path
sha256_password_public_key_path
shared_memory
shared_memory_base_name
skip_networking
slave_load_tmpdir
socket
ssl_ca
ssl_capath
ssl_cert
ssl_crl
ssl_crlpath
ssl_key
tmpdir
version_tokens_session_number

要为服务器启用持久化受限系统变量,请按照以下步骤进行配置:

  1. 确保MySQL已被配置以支持加密连接。参见第8.3.1节,“使用加密连接的MySQL配置”

  2. 为持久化受限系统变量指定一个SSL证书X.509主题值,并生成具有该主题的证书。参见第8.3.3节,“创建SSL和RSA证书和密钥”

  3. 使用带有指定主题值的 persist_only_admin_x509_subject 启动服务器。例如,在您的服务器 my.cnf 文件中放置以下行:

    [mysqld]
    persist_only_admin_x509_subject="subject-value"

    主题值的格式与用于CREATE USER ... REQUIRE SUBJECT 的相同。参见第15.7.1.3节,“创建用户语句”

    您必须在MySQL服务器主机上直接执行此步骤,因为 persist_only_admin_x509_subject 本身不能在运行时被持久化。

  4. 重启服务器。

  5. 将带有指定主题值的SSL证书分发给那些被允许持久化受限系统变量的用户。

假设 myclient-cert.pem 是用于客户端可以持久化受限系统变量的SSL证书。使用 openssl 命令显示证书内容:

$> openssl x509 -text -in myclient-cert.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 2 (0x2)
    Signature Algorithm: md5WithRSAEncryption
        Issuer: C=US, ST=IL, L=Chicago, O=MyOrg, OU=CA, CN=MyCN
        Validity
            Not Before: Oct 18 17:03:03 2018 GMT
            Not After : Oct 15 17:03:03 2028 GMT
        Subject: C=US, ST=IL, L=Chicago, O=MyOrg, OU=client, CN=MyCN
...

openssl命令行工具的输出显示了证书的主题值是:

C=US, ST=IL, L=Chicago, O=MyOrg, OU=client, CN=MyCN

要为MySQL指定主题值,请使用以下格式:

/C=US/ST=IL/L=Chicago/O=MyOrg/OU=client/CN=MyCN

在服务器配置文件my.cnf中设置主题值:

[mysqld]
persist_only_admin_x509_subject="/C=US/ST=IL/L=Chicago/O=MyOrg/OU=client/CN=MyCN"

重启服务器以使新配置生效。

将SSL证书(以及任何相关的SSL文件)分发给适当的用户。这样一个用户就可以使用证书和其他必要的SSL选项来建立加密连接。

为了使用X.509,客户端必须指定--ssl-key--ssl-cert选项来连接。指定--ssl-ca也被推荐,但不是必需的,以便服务器提供的公钥证书可以被验证。例如:

$> mysql --ssl-key=myclient-key.pem --ssl-cert=myclient-cert.pem --ssl-ca=mycacert.pem

假设用户有足够的权限来使用SET PERSIST_ONLY,可以像这样将受限系统变量持久化:

mysql> SET PERSIST_ONLY socket = '/tmp/mysql.sock';
Query OK, 0 rows affected (0.00 sec)

如果服务器没有配置为启用持久化受限系统变量,或者用户不满足该能力的要求,那么会发生错误:

mysql> SET PERSIST_ONLY socket = '/tmp/mysql.sock';
ERROR 1238 (HY000): Variable 'socket' is a non persistent read only variable