MySQL中不持久和持久受限系统变量的简要介绍

SET PERSISTSET PERSIST_ONLY是MySQL中用于将全局系统变量的值持久化到数据目录下的mysqld-auto.cnf选项文件的命令。但是,并非所有的系统变量都可以被持久化,或者只能在某些限制性条件下被持久化。以下是系统变量可能无法持久化或持久化受限的一些原因:

  • 会话系统变量:会话变量是针对每个客户端会话特定的,它们不能在服务器启动时设置,因此没有理由将它们持久化。

  • 敏感数据:某些全局系统变量可能包含敏感数据,例如密码、密钥等。这样的变量应该只由能够直接访问服务器主机的用户设置,而不是通过持久化文件。

  • 只读变量:有些全局系统变量是只读的,这意味着它们只能由服务器本身设置,而不能由用户通过SET命令来修改。这样的变量自然也不能被持久化。

  • 内部使用:某些全局系统变量是专为MySQL服务器内部使用而设计的,它们通常不需要也不应该被用户修改或持久化。

在MySQL 8.0.14及更高版本中,当系统变量是持久化受限的(persist-restricted)时,可以使用SET PERSIST_ONLY命令来尝试持久化这些变量的值,但这仅适用于满足以下条件的用户:

  • persist_only_admin_x509_subject系统变量被设置为了一个SSL证书X.509 Subject值。这个值通常用于指定哪些具有特定SSL证书的用户有权使用SET PERSIST_ONLY命令。

  • 用户必须使用加密连接(如SSL/TLS)连接到服务器,并且在连接时提供具有指定Subject值的SSL证书。

  • 用户必须具有足够的权限来使用SET PERSIST_ONLY命令。通常,这需要SUPER权限或类似的特权。

这个特性为管理员提供了一种安全的方式来持久化某些系统变量的值,同时限制只有那些持有特定SSL证书的用户才能执行此操作。这有助于减少未授权用户修改系统配置的风险。

需要注意的是,不是所有持久化受限的系统变量都可以通过SET PERSIST_ONLY来持久化。每个系统变量都有其特定的持久化限制和条件。

例如,protocol_version 就是一个只读的系统变量,它由MySQL服务器自身设置,因此用户无法更改其值,也无法将其持久化。

而 bind_address 是一个持久化受限的系统变量。它指定MySQL服务器应该监听的IP地址。在满足特定条件(如前面提到的SSL证书和权限要求)的情况下,用户可以使用 SET PERSIST 或 SET PERSIST_ONLY 来持久化 bind_address 的值。

以下是一些通常被认为是不可持久化的系统变量(请注意,这个列表可能会随着MySQL版本的发展而有所变化):

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-restricted)系统变量是只读的,并且可以在命令行或选项文件中设置的变量(除了 persist_only_admin_x509_subject 和 persisted_globals_load 这两个特殊变量之外)。

这些持久化受限的变量通常涉及到服务器配置的关键部分,需要管理员级别的权限来修改,并且可能需要通过安全的方式(如使用SSL证书)来验证管理员的身份。

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

为了配置MySQL服务器以启用持久化持久化受限的系统变量,可以使用以下步骤:

  • 确保MySQL配置支持加密连接

    可能需要配置SSL/TLS参数,如ssl-cassl-certssl-key等,以便服务器和客户端之间可以进行加密通信。

  • 指定一个SSL证书X.509 Subject值

    选择一个SSL证书X.509 Subject值,该值将标识具有持久化持久化受限系统变量能力的用户。然后,生成一个具有该Subject的证书。这通常涉及到使用OpenSSL或其他SSL工具来生成证书和密钥。

  • 在启动服务器时设置persist_only_admin_x509_subject

    在MySQL服务器的配置文件(如my.cnfmy.ini)中,设置persist_only_admin_x509_subject参数为您指定的Subject值。这样,服务器就知道哪些具有特定SSL证书的用户可以使用SET PERSISTSET PERSIST_ONLY命令来持久化持久化受限的系统变量。

    例如,在[mysqld]部分添加以下行:

[mysqld]
persist_only_admin_x509_subject="subject-value"
 

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

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

  • 重启MySQL服务器
  • 分发SSL证书
    将具有指定Subject值的SSL证书分发给那些需要持久化持久化受限系统变量的用户。这些用户将需要使用这个证书来建立与MySQL服务器的加密连接,并在连接时验证他们的身份。

    分发证书时,请确保:

    证书的分发可以通过电子邮件、安全的文件共享服务、内部网站或其他安全的方式来完成。请确保只有被授权的用户才能获得证书。

    • 证书的安全性得到维护,避免未经授权的访问。
    • 用户知道如何配置他们的客户端以使用此证书进行连接。
    • 用户知道他们的权限和责任,不要滥用他们的权限。

假设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工具生成或查看SSL证书时,输出将包含证书的各种信息,其中之一是Subject值。Subject是一个描述证书所有者的字段,通常包含一些标识信息,如国家/地区名、组织名、组织单位名、常用名等。

在OpenSSL的输出中显示证书Subject值的示例如下:

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

使用Subject值配置服务器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

  • 30
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值