也用了一段时间MySQL8.0,对几个有用的新特性来说一说
1.变量持久化
8.0以前MySQL需要修改变量,临时的办法:
set global max_connections = 1000;系统重启后失效,需要放在my.cnf里面才能永久生效。
我们来看下新语法:
添加变量:
SET PERSIST max_connections = 1000;
SET @@PERSIST.max_connections = 1000;
删除变量:
要从中删除特定的持久变量 mysqld-auto.cnf,但如果文件中不存在该变量,则发出警告而不是错误IF EXISTS ,请在前面的语法中添加一个子句:
RESET PERSIST IF EXISTS system_var_name;
在数据库启动时,会首先读取其它配置文件(手工指定的),最后才读取mysqld-auto.cnf文件
2.sql_require_primary_key参数
show variables like '%sql_require_primary_key%'
用于控制创建表必须包含主键,如果没有主键,则直接报错。
MGR环境也是要求每个表都需要主键,建议是表都开启此参数
3.innodb_dedicated_server参数
当innodb_dedicated_server启用时,InnoDB会自动配置以下变量:
innodb_buffer_pool_size
innodb_log_file_size
innodb_log_files_in_group (自MySQL 8.0.14起)
innodb_flush_method
仅innodb_dedicated_server当MySQL实例在数据库专用服务器上时,才考虑启用 。单节点是比较推荐的。
innodb_dedicated_server如果MySQL实例与其他应用程序共享系统资源,则不建议启用 。
官方解释
innodb_buffer_pool_size
Detected Server Memory | Buffer Pool Size |
Less than 1GB | 128MiB (the default value) |
1GB to 4GB | detected server memory * 0.5 |
Greater than 4GB | detected server memory * 0.75 |
innodb_log_file_size
Buffer Pool Size | Log File Size |
Less than 8GB | 512MiB |
8GB to 128GB | 1024MiB |
Greater than 128GB | 2048MiB |
innodb_log_file_size
Buffer Pool Size | Log File Size |
Less than 8GB | 512MiB |
8GB to 128GB | 1024MiB |
Greater than 128GB | 2048MiB |
innodb_log_files_in_group
Buffer Pool Size | Number of Log Files |
Less than 8GB | ROUND(buffer pool size) |
8GB to 128GB | ROUND(buffer pool size * 0.75) |
Greater than 128GB | 64 |
innodb_flush_method
flush method设置为 O_DIRECT_NO_FSYNC当 innodb_dedicated_server被启用。如果该O_DIRECT_NO_FSYNC设置不可用,innodb_flush_method则使用默认设置。
InnoDB O_DIRECT 在刷新I O期间使用,但fsync() 在每次写操作后跳过系统调用。
3.加密方式及密码策略
1.默认的加密方式发生变化
在MySQL 8.0中,caching_sha2_password是默认的身份验证插件而不是之前版本的mysql_native_password,默认的密码加密方式是sha2。
如果需要保持之前的验证方式,
并保持之前版本的密码加密方式需要在配置文件中修改,暂不支持动态修改,需要重启生效:default_authentication_plugin = mysql_native_password。
2.default_password_lifetime默认0
此变量定义全局自动密码过期策略
。默认 default_password_lifetime 值为0,这将禁用自动密码过期。
如果的值为 default_password_lifetime正整数N(最大值65535),密码必须每N天更改一次。
参数可以动态设置:
SET PERSIST default_password_lifetime = 180;
SET PERSIST default_password_lifetime = 0;
#修改加密规则为永不过期
ALTER USER 'root'@'127.0.0.1' IDENTIFIED BY 'passowrd' PASSWORD EXPIRE NEVER;
#更新一下用户的密码加密方式为之前版本的方式
ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'password';
#刷新权限
FLUSH PRIVILEGES;
MySQL8.0的用户授权和之前有所区别,老版本的常用授权语句在8.0中会报错:
MySQL8.0之前版本:
GRANT ALL ON *.* TO `wangwei`@`127.0.0.1` IDENTIFIED BY
'passowrd' WITH GRANT OPTION;
MySQL8.0版本:
CREATE USER `wangwei`@`127.0.0.1` IDENTIFIED BY 'passowrd';
GRANT ALL ON *.* TO `wangwei`@`127.0.0.1` WITH GRANT OPTION;
MySQL8.0中带过期时间用户的创建:
CREATE USER `wangwei`@`127.0.0.1` IDENTIFIED BY 'wangwei' PASSWORD EXPIRE INTERVAL 90 DAY;
GRANT ALL ON *.* TO `wangwei`@`127.0.0.1` WITH GRANT OPTION;
4.角色管理
MySQL角色是指定的权限集合。
像ORACLE一样,角色可以拥有授予和撤消的权限。
CREATE ROLE并 DROP ROLE角色创建和删除;
GRANT并 REVOKE为用户和角色分配和撤销权限;
SHOW GRANTS 显示用户和角色的权限和角色分配;
SET DEFAULT ROLE 指定哪些帐户角色默认处于活动状态;
SET ROLE 更改当前会话中的活动角色。
CURRENT_ROLE()功能显示当前会话中的活动角色。
使用场景:
应用程序使用名为demo的数据库 。
与应用程序相关联,可以为创建和维护应用程序的开发人员以及管理员账户。
开发人员需要完全访问数据库。
(有的用户只需要读取权限,有的用户需要读取/写入权限。)
-- 创建角色
CREATE ROLE 'app_developer', 'app_read', 'app_write';
-- 角色授权
GRANT ALL ON demo.* TO 'app_developer';
GRANT SELECT ON demo.* TO 'app_read';
GRANT INSERT, UPDATE, DELETE ON demo.* TO 'app_write';
-- 创建用户
CREATE USER 'dev1'@'%' IDENTIFIED BY 'Dr@.1214';
CREATE USER 'read_user'@'%' IDENTIFIED BY 'Dr@.1214';
CREATE USER 'write_user'@'%' IDENTIFIED BY 'Dr@.1214';
-- 授权
GRANT 'app_developer' TO 'dev1'@'%';
GRANT 'app_read' TO 'read_user'@'%';
GRANT 'app_write', 'app_read' TO 'write_user'@'%';
撤销权限
REVOKE role FROM user;
剩余的一些8.0增强或者新增的功能,可以查看官方,包括表空间加密、redo加密,
InnoDB增强功能等可以参考官方网站
https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html