【MySQL精通之路】系统变量-不持久和持久受限系统变量

SET PERSISTSET PERSIST_ONLY使全局系统变量能够持久化到数据目录中的mysqld-auto.cnf选项文件中

(请参阅"变量分配的SET语法")。

但是,并不是所有的系统变量都可以持久化,或者只能在某些限制条件下持久化。

1.受限原因

以下是系统变量可能不持久或持续受限的一些原因:

会话系统变量无法持久化。无法在服务器启动时设置会话变量,因此没有理由保留它们。

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

全局系统变量 可能是只读的(即,仅由服务器设置)。在这种情况下,用户根本无法设置它,无论是在服务器启动时还是在运行时。

全局系统变量可能仅用于内部使用。

不可持久化的系统变量在任何情况下都不能持久化。

从MySQL 8.0.14开始,持久化受限系统变量可以使用SET PERSIST_ONLY持久化,但只能由满足以下条件的用户持久化:

persist_only_admin_x509_subject系统变量设置为SSL证书X.509 subject值。

用户使用加密连接连接 到服务器,并提供具有指定Subject值的SSL证书

用户有足够的权限使用SET PERSIST_ONLY(请参阅"系统变量权限")。

【MySQL精通之路】系统变量-系统变量权限-CSDN博客

例如,protocol_version 是只读的,并且仅由服务器设置 ,因此在任何情况下都不能持久化

另一方面,bind_address 是持久限制的,因此它可以由满足上述条件的用户进行设置

2.持久化受限的变量

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

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
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
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

3.配置

要将服务器配置为启用持久化受限制的系统变量,请使用以下过程:

确保MySQL配置为支持加密连接。

请参阅"配置MySQL以使用加密连接"。
指定SSL证书X.509 Subject值,该值表示持久保留受限制的系统变量的能力,并生成具有该Subject的证书。请参阅"创建SSL和RSA证书和密钥"。

在将persist_only_admin_x509_subject设置为指定的subject值的情况下启动服务器。例如,将以下行放在服务器my.cnf文件中:

sql 复制代码
[mysqld]
persist_only_admin_x509_subject="subject-value"

Subject值的格式与CREATE USER ... REQUIRE SUBJECT使用的格式相同

请参阅第"CREATE USER语句"。

您必须直接在MySQL服务器主机上执行此步骤,因为persist_only_admin_x509_subject本身在运行时无法持久化
重新启动服务器。
将具有指定Subject值的SSL证书分发给用户。

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

sql 复制代码
$> 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输出显示证书Subject值为:

sql 复制代码
C=US, ST=IL, L=Chicago, O=MyOrg, OU=client, CN=MyCN

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

sql 复制代码
/C=US/ST=IL/L=芝加哥/O=MyOrg/OU=客户/CN=MyCN

使用Subject值配置服务器my.cnf文件:

sql 复制代码
[mysqld]
persist_only_admin_x509_subject="/C=US/ST=IL/L=Chicago/O=MyOrg/OU=client/CN=MyCN"

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

将SSL证书(以及任何其他关联的SSL文件)分发给相应的用户。

然后,这样的用户使用证书和建立加密连接所需的任何其他SSL选项连接到服务器。

要使用X.509,客户端必须指定要连接的**--ssl密钥** 和**--ssl证书**选项。

建议(但不强制)同时指定--ssl ca,以便验证服务器提供的公共证书。

例如:

sql 复制代码
$> mysql --ssl-key=myclient-key.pem --ssl-cert=myclient-cert.pem --ssl-ca=mycacert.pem

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

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

如果服务器未配置为启用持久化受限制的系统变量,或者用户不满足该功能所需的条件,则会发生错误:

sql 复制代码
mysql> SET PERSIST_ONLY socket = '/tmp/mysql.sock';
ERROR 1238 (HY000): Variable 'socket' is a non persistent read only variable
相关推荐
woshilys24 分钟前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi25 分钟前
SQL注入的那些面试题总结
数据库·sql
建投数据1 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi2 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀2 小时前
Redis梳理
数据库·redis·缓存
独行soc2 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天3 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺3 小时前
分布式系统架构:服务容错
数据库·架构
独行soc4 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain4 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu