首页 » MySQL » mysql 8.0 新特性

mysql 8.0 新特性

 
文章目录

参考:https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html

角色参考:https://dev.mysql.com/doc/refman/8.0/en/roles.html

新增加的功能

data dictionary

MySQL现在整合了一个存储有关数据库对象信息的事务数据字典。在以前的MySQL版本中,字典数据存储在元数据文件和非事务表中。

有了data dictionary之后,创建表之后,表的元数据信息就存储在data dictionary里,以前.frm和.ibd都是在数据库文件的目录下,现在没有.frm文件了。

atomic data definition statements (原子性DDL)

注意:这个特性只支持InnoDB引擎。

DDL包括:create,alter,drop,truncate 原子性就是要么执行成功,要么都失败。如果是之前的版本,成功的就成功了,失败了就失败了。看下面的案例:

8.0如下:

mysql> CREATE TABLE t1 (c1 INT);
mysql> DROP TABLE t1, t2;
ERROR 1051 (42S02): Unknown table 'test.t2'
mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| t1             |
+----------------+

5.*版本:

mysql> CREATE TABLE t1 (c1 INT);
mysql> DROP TABLE t1, t2;
ERROR 1051 (42S02): Unknown table 'test.t2'
mysql> SHOW TABLES;
Empty set (0.00 sec)

安全和账号管理

  • 新的cachingsha2password认证插件可用。和sha256_password插件一样,cachingsha2password实现SHA-256密码哈希,但是使用缓存来解决连接时的延迟问题。它还支持更多的连接协议,并且不需要与基于RSA密钥对的密码交换功能的OpenSSL进行链接
  • MySQL现在支持角色,这些角色被命名为特权集合。角色可以创建和删除。角色可以拥有授予和撤消的权限。角色可以授予用户帐户并从其中撤销。可以从授予该帐户的角色中选择适用于该帐户的活动适用角色,并且可以在该帐户的会话期间对其进行更改

角色的创建使用如下:

#创建三个角色 
CREATE ROLE 'app_developer', 'app_read', 'app_write';

#为角色分配权限,与之前给账号授权一样,
grant all on app_db.* to 'app_developer';
grant select on app_db.* to 'app_read';
grant insert,update,delete on app_db.* to 'app_write';

#创建账号
create user 'dev1'@'localhost' identified by 'dev1pass';
create user 'read_user1'@'localhost' identified by 'read_user1pass';
create user 'read_user2'@'localhost' identified by 'read_user2pass';
create user 'rw_user1'@'localhost' identified by 'rw_user1pass';

#把角色授给账号,角色本身含有对哪些数据库的操作权限,所以角色授给了账号之后,账号也有相应的权限 。
grant 'app_developer' to 'dev1'@'localhost';
grant 'app_read' to 'read_user1'@'localhost','read_user2'@'localhost';
grant 'app_read','app_write' to 'rw_user1'@'localhost';


#强制性定义角色 ,可以把角色名写在配置文件中
[mysqld]
mandatory_roles='role1,role2@localhost,r3@%.example.com'

#在运行时永久设置强制性角色:
SET PERSIST mandatory_roles = 'role1,role2@localhost,r3@%.example.com';

#查看角色权限 
mysql> SHOW GRANTS FOR 'dev1'@'localhost';
+-------------------------------------------------+
| Grants for dev1@localhost                       |
+-------------------------------------------------+
| GRANT USAGE ON *.* TO `dev1`@`localhost`        |
| GRANT `app_developer`@`%` TO `dev1`@`localhost` |
+-------------------------------------------------+
#上面保显示角色,没有角色具体权限,如果要查可以用以下:
mysql> SHOW GRANTS FOR 'dev1'@'localhost' USING 'app_developer';
+----------------------------------------------------------+
| Grants for dev1@localhost                                |
+----------------------------------------------------------+
| GRANT USAGE ON *.* TO `dev1`@`localhost`                 |
| GRANT ALL PRIVILEGES ON `app_db`.* TO `dev1`@`localhost` |
| GRANT `app_developer`@`%` TO `dev1`@`localhost`          |
+----------------------------------------------------------+

mysql> SHOW GRANTS FOR 'read_user1'@'localhost' USING 'app_read';
+--------------------------------------------------------+
| Grants for read_user1@localhost                        |
+--------------------------------------------------------+
| GRANT USAGE ON *.* TO `read_user1`@`localhost`         |
| GRANT SELECT ON `app_db`.* TO `read_user1`@`localhost` |
| GRANT `app_read`@`%` TO `read_user1`@`localhost`       |
+--------------------------------------------------------+
mysql> SHOW GRANTS FOR 'rw_user1'@'localhost' USING 'app_read', 'app_write';
+------------------------------------------------------------------------------+
| Grants for rw_user1@localhost                                                |
+------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `rw_user1`@`localhost`                                 |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `app_db`.* TO `rw_user1`@`localhost` |
| GRANT `app_read`@`%`,`app_write`@`%` TO `rw_user1`@`localhost`               |
+------------------------------------------------------------------------------+

#查看当前默认角色
select current_role();

#回收用户角色权限
语法:revoke role from user;
mysql> revoke app_developer from dev1@localhost;
Query OK, 0 rows affected (0.15 sec)

mysql> show grants for 'dev1'@'localhost';
+------------------------------------------+
| Grants for dev1@localhost                |
+------------------------------------------+
| GRANT USAGE ON *.* TO `dev1`@`localhost` |
+------------------------------------------+
1 row in set (0.00 sec)

#回收角色权限 
REVOKE INSERT, UPDATE, DELETE ON app_db.* FROM 'app_write';

#删除角色:
drop role 'drop_name';

#锁定账号,防止使用或登录 
alter user 'old_app_dev'@'localhost' account lock;

#可以把账号权限授给一个新账号
CREATE USER 'new_app_dev1'@'localhost' IDENTIFIED BY 'new_password';
GRANT 'old_app_dev'@'localhost' TO 'new_app_dev1'@'localhost';

MySQL密码管理

MySQL现在维护有关密码历史记录的信息,从而限制重复使用以前的密码。数据库管理员可能要求不要从以前的密码中选择新的密码进行一些密码更改或一段时间。可以在全局和每个帐户的基础上建立密码重用策略。结合现有的密码到期功能以要求定期更改密码,新的密码历史记录功能可让DBA更全面地控制密码管理。

mysql支持以下密码管理策略:

  • 密码过期,需要定期更改密码
  • 密码重用限制,以防止再次选择旧密码
  • 密码强度评估,要求强密码

1、密码180天后过期设置

[mysqld]
default_password_lifetime=180

2、密码永不过期设置

[mysqld]
default_password_lifetime=0

3、在运行时永久保存设置

SET PERSIST default_password_lifetime = 180;
SET PERSIST default_password_lifetime = 0;

上面设置保存之后,是生成了一个mysqld-auto.cnf文件在数据目录下面,是json格式的。

4、创建用户时设置过期

CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;

5、创建或修改禁用密码过期功能

CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;

6、遵循全局到期政策,也就是在配置文件中有配置。
这个不知道多长时间,但是设置之后,mysql.user中的password_lifetime为null

CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;

7、要禁止重新使用最近6个密码或密码超过365天的任何密码

[mysqld]
password_history=6
password_reuse_interval=365

或者在运行时这样设置

SET PERSIST password_history = 6;
SET PERSIST password_reuse_interval = 365;

MySQL现在支持创建和管理资源组

MySQL现在支持创建和管理资源组,并允许将服务器内运行的线程分配给特定的组,以便线程根据组可用的资源执行。组属性启用对其资源的控制,以启用或限制组中线程的资源消耗。 DBA可以根据不同的工作负载适当地修改这些属性。目前,CPU时间是可管理的资源,由“虚拟CPU”的概念表示为包括CPU核心,超线程,硬件线程等的术语。服务器在启动时确定有多少虚拟CPU可用,并且具有适当权限的数据库管理员可以将这些CPU与资源组相关联,并将线程分配给组

增加了InnoDB引擎

auto-increment

  • 服务器重新启动不再取消AUTO_INCREMENT = N表选项的效果。如果将自动递增计数器初始化为特定值,或者如果将自动递增计数器值更改为较大值,则新值在服务器重新启动时会持续存在。
  • 在ROLLBACK操作之后立即重新启动服务器不再导致重新分配给回滚事务的自动增量值。
  • 如果将AUTO_INCREMENT列值修改为大于当前最大自动增量值的值(例如,在UPDATE操作中),则新值将被保留,随后的INSERT操作会分配自增值,从新值开始值。

1、现在,所有InnoDB临时表都将在共享临时表空间ibtmp1中创建。

2、MySQL系统表和数据字典表现在创建在MySQL数据目录中名为mysql.ibd的单个InnoDB表空间文件中。以前,这些表是在mysql数据库目录中的各个InnoDB表空间文件中创建的

3、修改了影响缓冲池预冲洗和冲洗行为的配置选项的默认值:

  • innodbmaxdirty_pagespctlwm默认值现在为10.先前的默认值0禁用缓冲池预冲洗。当缓冲池中脏页的百分比超过10%时,值为10将启用预先浮动。启用预冲可提高性能一致性。
  • innodbmaxdirtypagespct默认值从75增加到90. InnoDB尝试从缓冲池中清除数据,以使脏页面的百分比不超过此值。增加的默认值允许缓冲池中更大比例的脏页面。

4、重命名常规表空间由ALTER TABLESPACE … RENAME TO语法支持。

5、Innodbdedicatedserver配置选项默认情况下处于禁用状态,可用于根据服务器上检测到的内存量自动配置以下选项:

  • innodbbufferpool_size
  • innodblogfile_size
  • innodbflushmethod

6、与MySQL捆绑在一起的zlib库版本从版本1.2.3升级到版本1.2.11。 MySQL在zlib库的帮助下实现压缩。

7、序列化字典信息(SDI)存在于除临时表空间和撤消表空间文件之外的所有InnoDB表空间文件中。 SDI是表和表空间对象的序列化元数据。 SDI数据的存在提供元数据冗余。例如,如果数据字典变得不可用,字典对象元数据可能从表空间文件中提取。使用ibd2sdi工具执行SDI提取。 SDI数据以JSON格式存储

8、InnoDB存储引擎现在支持DDL原子,它可以确保DDL操作完全提交或回退,即使服务器在操作期间暂停

9、可以使用innodb_directories选项在服务器脱机时将表空间文件移动或恢复到新位置

10、默认字符集已从latin1更改为utf8mb4。

其他的功能

1、支持正则表达式

2、内部临时表,TempTable存储引擎将MEMORY存储引擎替换为内存中内部临时表的默认引擎。

移除的功能

1 、grant 创建用户已经删除,需要用create user创建用户。

2、txisolation和txreadonly系统变量已被删除。改为使用transactionisolation和transactionreadonly。

3、sync_frm系统变量已被删除,因为.frm文件已过时。

4、multirangecount系统变量已被删除。

5、logwarnings系统变量和–log-warnings服务器选项已被删除。改用logerror_verbosity系统变量。

6、sqllogbin系统变量的全局范围已被删除。 sqllogbin仅具有会话范围,并且应该调整依赖访问@@ global.sqllogbin的应用程序。

7、这些已弃用的兼容性SQL模式已被删除:DB2,MAXDB,MSSQL,MYSQL323,MYSQL40,ORACLE,POSTGRESQL,NOFIELDOPTIONS,NOKEYOPTIONS,NOTABLEOPTIONS。它们不能再分配给sql_mode系统变量,或者作为mysqldump –compatible选项的允许值使用。

8、未使用的dateformat,datetimeformat,time_format和maxtmptables系统变量已被删除。

9、mysqlinstalldb程序已从MySQL发行版中删除。数据目录初始化应该通过使用–initialize或–initialize-insecure选项调用mysqld来执行。另外,mysqlinstalldb使用的mysqld的–bootstrap选项已被删除,并且控制mysqlinstalldb安装位置的INSTALL_SCRIPTDIR CMake选项已被删除。

隐藏索引

  • 隐藏索引的特性对于性能调试非常有用。在 8.0 中,索引可以被“隐藏”和“显示”。当一个索引隐藏时,它不会被查询优化器所使用。
  • 也就是说,我们可以隐藏一个索引,然后观察对数据库的影响。如果数据库性能有所下降,就说明这个索引是有用的,于是将其“恢复显示”即可;如果数据库性能看不出变化,说明这个索引是多余的,可以删掉了。
  • 隐藏一个索引的语法是:
alter table t alter index i invisible;
  • 恢复显示索引的语法是:
alter table t alter index i visible;

2、设置持久化
SET PERSIST 命令就可以

如:set persist max_connections = 500

MySQL 会将该命令的配置保存到数据目录下的 mysqld-auto.cnf 文件中,下次启动时会读取该文件,用其中的配置来覆盖缺省的配置文件。

 

原文链接:mysql 8.0 新特性,转载请注明来源!

1