MySQL 8.0系列——轻松改配置,云上友好

背景

MySQL 5.7及之前版本下修改配置,如果能动态修改的,可以用set global语法,不能动态修改的,只能修改/etc/my.cnf配置文件,之后重启生效。如果需要持久化动态修改的参数,也只能同时修改/etc/my.cnf配置文件。

这个对云上环境不友好,毕竟云数据库上,大家无法直接远程底层虚拟机修改配置文件。针对如何持久化参数配置,在MySQL 8.0,有一个新特性,可以实现轻松修改配置文件,那就是set persistset persist_only语法。前者用于修改并持久化动态参数,后者用于持久化静态参数。

修改并持久化动态参数一例

mysql> show variables like '%innodb_buffer_pool_size%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.01 sec)

mysql> set persist innodb_buffer_pool_size=134217728*2;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%innodb_buffer_pool_size%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 268435456 |
+-------------------------+-----------+
1 row in set (0.00 sec)

在数据目录里,会生成一个持久化参数的json格式文件,内容如下:

[[email protected] data]# cat mysqld-auto.cnf |jq
{
  "Version": 1,
  "mysql_server": {
    "innodb_buffer_pool_size": {
      "Value": "268435456",
      "Metadata": {
        "Timestamp": 1570678719890919,
        "User": "root",
        "Host": "localhost"
      }
    }
}

点评: 居然有时间戳,还有谁修改了参数!

持久化静态参数一例

# 我们先模拟没有权限
mysql> revoke SYSTEM_VARIABLES_ADMIN, PERSIST_RO_VARIABLES_ADMIN on *.* from 'root'@'localhost';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show variables like 'innodb_log_file_size';
+----------------------+----------+
| Variable_name        | Value    |
+----------------------+----------+
| innodb_log_file_size | 50331648 |
+----------------------+----------+
1 row in set (0.01 sec)

mysql> set persist innodb_log_file_size=50331648*2;
ERROR 1238 (HY000): Variable 'innodb_log_file_size' is a read only variable

# 因缺少SYSTEM_VARIABLES_ADMIN 和 PERSIST_RO_VARIABLES_ADMIN 权限而报错
mysql> set persist_only innodb_log_file_size=50331648*2;
ERROR 3630 (42000): Access denied; you need SYSTEM_VARIABLES_ADMIN and PERSIST_RO_VARIABLES_ADMIN privileges for this operation

# 增加授权
mysql> grant SYSTEM_VARIABLES_ADMIN, PERSIST_RO_VARIABLES_ADMIN on *.* to 'root'@'localhost';
Query OK, 0 rows affected, 1 warning (0.01 sec)

# 修改成功
mysql> set persist_only innodb_log_file_size=50331648*2;
Query OK, 0 rows affected (0.00 sec)

# 重启,MySQL8.0支持在数据库里重启操作,云友好!
mysql> restart;
Query OK, 0 rows affected (0.00 sec)

mysql> restart;
ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).
注意: 要求mysqld运行在mysqld_safe下。

清空 persist 持久化参数

mysql> RESET PERSIST;
Query OK, 0 rows affected (0.00 sec)

人手删除此文件 或 人手清空此文件内容,也可以达到相同效果。
当然了,云数据库上只能用 RESET PERSIST 了。

相关 performance_schema 表

1. 查看数据库启动后载入的 PERSIST 相关参数

在重启数据库后,我们可以通过表 performance_schema.variables_info 查看我们从哪些 mysqld-auto.cnf 载入了哪些参数。

mysql> select * from performance_schema.variables_info where variable_source like 'PERSISTED'\G
*************************** 1. row ***************************
  VARIABLE_NAME: innodb_buffer_pool_size
VARIABLE_SOURCE: PERSISTED
  VARIABLE_PATH: /data/mysql/mysql3308/data/mysqld-auto.cnf
      MIN_VALUE: 5242880
      MAX_VALUE: 9223372036854775807
       SET_TIME: 2019-10-10 11:38:39.890919
       SET_USER: root
       SET_HOST: localhost
*************************** 2. row ***************************
  VARIABLE_NAME: innodb_log_file_size
VARIABLE_SOURCE: PERSISTED
  VARIABLE_PATH: /data/mysql/mysql3308/data/mysqld-auto.cnf
      MIN_VALUE: 4194304
      MAX_VALUE: 18446744073709551615
       SET_TIME: 2019-10-10 11:21:12.623177
       SET_USER: root
       SET_HOST: localhost
2 rows in set (0.02 sec)

2. 查看变量都来自于哪里

mysql> SELECT t1.VARIABLE_NAME, VARIABLE_VALUE, VARIABLE_SOURCE
    -> FROM performance_schema.variables_info t1
    -> JOIN performance_schema.global_variables t2
    -> ON t2.VARIABLE_NAME=t1.VARIABLE_NAME
    -> WHERE t1.VARIABLE_SOURCE != 'COMPILED';
+--------------------------------------+-------------------------------------+-----------------+
| VARIABLE_NAME                        | VARIABLE_VALUE                      | VARIABLE_SOURCE |
+--------------------------------------+-------------------------------------+-----------------+
| auto_increment_increment             | 1                                   | EXPLICIT        |
| auto_increment_offset                | 1                                   | EXPLICIT        |
...
| binlog_format                        | ROW                                 | DYNAMIC         |
| binlog_rows_query_log_events         | ON                                  | EXPLICIT        |
| foreign_key_checks                   | ON                                  | DYNAMIC         |
| gtid_executed_compression_period     | 1000                                | EXPLICIT        |
| innodb_buffer_pool_size              | 268435456                           | PERSISTED       |
| innodb_change_buffer_max_size        | 25                                  | EXPLICIT        |
| innodb_log_file_size                 | 100663296                           | PERSISTED       |
| innodb_log_files_in_group            | 2                                   | EXPLICIT        |
| pid_file                             | /data/mysql/mysql3308/data/pxc1.pid | COMMAND_LINE    |
| port                                 | 3308                                | EXPLICIT        |
+--------------------------------------+-------------------------------------+-----------------+
73 rows in set (0.01 sec)

EXPLICIT 来自于参数配置文件my.cnf
COMMAND_LINE 来自于启动mysqld时额外的command_line
PERSISTED 来自于数据目录下mysqld-auto.cnf
DYNAMIC 来自于SESSION变量(包括GLOBAL变量的继承)

3. 查看动态修改的session变量(包括GLOBAL变量的继承)

mysql> set session binlog_format='Mixed';
Query OK, 0 rows affected (0.00 sec)

mysql> set global read_only=1;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT t1.VARIABLE_NAME, VARIABLE_VALUE, VARIABLE_SOURCE FROM performance_schema.variables_info t1 JOIN performance_schema.session_variables t2 ON t2.VARIABLE_NAME=t1.VARIABLE_NAME WHERE t1.VARIABLE_SOURCE = 'DYNAMIC';
+--------------------+----------------+-----------------+
| VARIABLE_NAME      | VARIABLE_VALUE | VARIABLE_SOURCE |
+--------------------+----------------+-----------------+
| binlog_format      | MIXED          | DYNAMIC         |
| foreign_key_checks | ON             | DYNAMIC         |
| read_only          | ON             | DYNAMIC         |
+--------------------+----------------+-----------------+
2 rows in set (0.01 sec)

吐槽

MySQL8.0 对于 all 这个权限没之前直观了。

mysql> create user [email protected]'%' identified by 'password';
Query OK, 0 rows affected (0.03 sec)

mysql> grant all on *.* to [email protected]'%';
Query OK, 0 rows affected (0.02 sec)

mysql> show grants for [email protected]'%';
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `fander`@`%`                                                                                       |
| GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `fander`@`%` |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.01 sec)

潜台词: 我还得数一数权限是否足够。。

作为对比,以下是5.7的显示方式:

mysql> create user [email protected]'%' identified by 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> grant all on *.* to [email protected]'%';
Query OK, 0 rows affected (0.01 sec)

mysql> show grants for [email protected]'%';
+---------------------------------------------+
| Grants for [email protected]%                         |
+---------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'fander'@'%' |
+---------------------------------------------+
1 row in set (0.00 sec)

参考:
https://lefred.be/content/mysql-8-0-changing-configuration-easily-and-cloud-friendly/
https://lefred.be/content/what-configuration-settings-did-i-change-on-my-mysql-server/

原文地址:https://www.cnblogs.com/fander/p/11648160.html

时间: 2024-10-06 11:17:11

MySQL 8.0系列——轻松改配置,云上友好的相关文章

原创:mysql5 还原至mysql 8.0.11数据库链接配置提示错误改动备注

原创:mysql5 还原至mysql 8.0.11数据库链接配置提示错误改有三: a) mysql 连接jar包版修改 b)类路径修改 c)配置连接池地址修改 因版本升级,首先要修改 1:mysql-connector-java 架包版本修改 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> !--原版本 5.1.6-->

MySQL 8.0.18 在 Windows Server 2019 上的安装(ZIP)公开

AskScuti MySQL : Windows Server 2019 安装 MySQL 8.0 温馨提示:为了展现我最“魅力”的一面,请用谷歌浏览器撩我. 一切就绪,点我开撩 原文地址:https://www.cnblogs.com/askscuti/p/11805064.html

Entity Framework 5.0系列之约定配置

Code First之所以能够让开发人员以一种更加高效.灵活的方式进行数据操作有一个重要的原因在于它的约定配置.现在软件开发越来复杂,大家也都试图将软件设计的越来越灵活,很多内容我们都希望是可配置的,但是过多的配置也会带来很大的工作量,解决这个问题的方法就是约定.对于一些简单的,不太可能经常变化的内容我们以一种约定的方式进行设计.使用过其他ORM框架的朋友可能知道一般ORM都有对应的映射配置文件(一般是一个Xml文件),但是EF并没有.在EF中是以一种约定的方式进行表.列同实体类进行映射的,与此

【转】Entity Framework 5.0系列之约定配置

Code First之所以能够让开发人员以一种更加高效.灵活的方式进行数据操作有一个重要的原因在于它的约定配置.现在软件开发越来复杂,大家也都试图将软件设计的越来越灵活,很多内容我们都希望是可配置的,但是过多的配置也会带来很大的工作量,解决这个问题的方法就是约定.对于一些简单的,不太可能经常变化的内容我们以一种约定的方式进行设计.使用过其他ORM框架的朋友可能知道一般ORM都有对应的映射配置文件(一般是一个Xml文件),但是EF并没有.在EF中是以一种约定的方式进行表.列同实体类进行映射的,与此

Mysql-5.7.27与mysql-ODBC-8.0.17压缩版配置与使用

Mysql-5.7.27与mysql-ODBC-8.0.17压缩版配置与使用2019年8月2日 15:04:14 天府之秋于成都东门大桥 前提: 1, 修复OS自带的DLL因为有经常有太多的windows系统在安装的是否,总有些dll文件缺失,这些确实的文件平时又用不到:但是,一旦碰到需要它们而又没有的时候,就会报各种莫名其妙的错误.所谓,经过多次摸索,需要事先都修复好,这样会省事省时得多. 真实修复了不少的地方呢.前提2: 解压缩mysql到一个指定的地方,本实例为D:\MYSQL: 开始配置

安装配置BITS上传服务

IIS 6.0和IIS 7.0 支持安装BITS上传组件. 下面以IIS7.0为例安装配置bits上传服务. 1.安装 首先确定服务器已经按装IIS服务.依次打开服务管理器->功能->添加功能, 选择BITS服务扩展,添加必要的服务后点击确定.等待BITS安装完成. 打开IIS管理器后选择一个网站,可以在功能视图中找到BITS上载配置 2.配置 2.1设置虚拟路径权限 由于安全原因,BITS不允许上传的虚拟路径拥有脚本执行权限,如果试图上传文件到一个拥有执行权限的虚拟目录,Job会执行失败BG

阿里云专有宿主机,构建公共云上的专有资源池

近日,阿里云发布专有宿主机,用户通过独占物理服务器资源,来满足安全合规.性能隔离等诉求,帮助企业级用户轻松构建公共云上的专有资源池.对于企业级用户迁移上云,将会拥有更加丰富的选择.在专有宿主机上创建ECS云服务器,用户不仅在物理级别上和其他租户进行隔离,保证单租户环境性能的稳定性,同时也能拥有阿里云虚拟化管控的所有功能和优势. 近年来,云计算已经俨然成为了一种趋势,不仅仅是个人用户.创业公司选择在云上搭建自己的基础设施,越来越多的企业级用户开始选择云平台搭建自己的系统.从测试系统的迁移到生产系统

记录阿里云ECS(Centos7.4)安装mysql 8.0.X服务

#*.rpm介绍 大多数二进制rpm包都包含在名称中倒数第二个字段中编译rpm的体系结构..rpm软件包有那么几种 *.src.rpm 源程序包,要先通过编译才能安装 *.noarch.rpm 该包适用于任何架构 *.i*86.rpm 该包适用于intel cpu的电脑上运行 *.amd64.rpm 该包适用于amd64 cpu的电脑上运行 mysql各种源 传送门 https://repo.mysql.com/ 在这里,我选择mysql80-community-release-el7-1.no

mysql 8.0 安装与配置

mysql 安装 到官网下载解压版解压到本地: 在安装路径下创建:my.ini 文件,编辑 my.ini 配置以下基本信息: [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] # 设置3306端口 port = 3306 # 设置mysql的安装目录 basedir=C:\\Program Files\\Mysql\\mysql-8.0.16-winx64 # 设置 mysql数据库的数据的存放目录,MySQL 8+ 不需