SET PERSIST并 SET PERSIST_ONLY启用全局系统变量被持久化到mysqld-auto.cnf数据目录选项文件(见第13.7.6.1,“SET语法变量分配”)。但是,并非所有系统变量都可以持久化,或者仅在某些限制性条件下才能持久化。以下是系统变量不可持久或受持久限制的一些原因:
会话系统变量无法持久保存。会话变量不能在服务器启动时设置,因此没有理由将其持久化。
全局系统变量可能涉及敏感数据,因此只能由直接访问服务器主机的用户才能设置。
全局系统变量可能是只读的(即,仅由服务器设置)。在这种情况下,无论是在服务器启动时还是在运行时,用户都无法设置它。
全局系统变量可能仅供内部使用。
不可持久的系统变量在任何情况下都不能持久化。从MySQL 8.0.14开始,可以使用持久存储限制的系统变量SET PERSIST_ONLY,但是只有满足以下条件的用户才能保存 :
该 persist_only_admin_x509_subject 系统变量设置为SSL证书X.509主题值。
用户使用加密连接连接到服务器,并提供具有指定主题值的SSL证书。
用户具有足够的特权来使用 SET PERSIST_ONLY(请参见 第5.1.9.1节“系统变量特权”)。
例如,它protocol_version 是只读的,并且仅由服务器设置,因此在任何情况下都不能持久保存。另一方面,它 bind_address是持久性限制的,因此可以由满足上述条件的用户设置。
以下系统变量是不可持久的。该列表可能会随着正在进行的开发而改变。
audit_log_current_session
audit_log_filter_id
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_subject 和除外) 进行设置persisted_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
daemon_memcached_engine_lib_name
daemon_memcached_engine_lib_path
daemon_memcached_option
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
keyring_encrypted_file_data
keyring_encrypted_file_password
lc_messages_dir
log_error
mecab_rc_file
named_pipe
pid_file
plugin_dir
port
relay_log
relay_log_info_file
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
要将服务器配置为启用持久性限制的持久性系统变量,请使用以下过程:
确保将MySQL配置为支持加密连接。请参见 第6.3.1节“配置MySQL以使用加密连接”。
指定SSL证书X.509主题值,该值表示持久存储受限制的系统变量并生成具有该主题的证书的能力。请参见第6.3.3节“创建SSL和RSA证书和密钥”。
将服务器persist_only_admin_x509_subject 设置为指定的Subject值,以启动服务器 。例如,将这些行放在服务器my.cnf文件中:
[mysqld]
persist_only_admin_x509_subject=“subject-value”
Subject值的格式与用于的格式相同 CREATE USER … REQUIRE SUBJECT。请参见 第13.7.1.3节“ CREATE USER语句”。
您必须直接在MySQL服务器主机上执行此步骤,因为 persist_only_admin_x509_subject 它本身不能在运行时持久化。
重新启动服务器。
将具有指定主题值的SSL证书分发给允许持久存储受限制的系统变量的用户。
假设这myclient-cert.pem是可以持久保存受限制的系统变量的客户端使用的SSL证书。使用openssl命令显示证书内容:
shell> 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也进行指定,以便可以验证服务器提供的公共证书。例如:
shell> 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




