MySQL5.78.0权限-角色管理

news/2024/7/5 2:05:16/文章来源:https://www.cnblogs.com/rcsy/p/18280563

数据控制语言(Data Control Language, DCL)用于用户权限的管理,包括了GRANT与REVOKE命令。

授权(GRANT)

MySQL有很精细的权限控制:

服务器级  ----> DB级 -----------> 表 -----------------> 列  ------------------>对象,存储过程,视图等
mysql.user    mysql.db    mysql.tables_priv   mysql.columns_priv     mysql.procs_priv


一、授权:

#复制账户
create user 'repl'@'172.17.73.%' identified by 'L"04)-Xd*~2/%T';
grant replication slave,replication client on *.* to 'repl'@'172.17.73.%';

#应用账户
create user 'xxx'@'172.17.73.%' identified by 'R75,CI8#u[>w9j';
grant select,insert,update,delete,create,create temporary tables,execute,show view,index,create,alter on test.* to 'xxx'@'172.17.73.%';
grant select on mysql.proc to 'xxx'@'172.17.73.%';

#监控账户
create user 'monitor'@'localhost' identified by 'mVWp~09K!h#s';
grant select,super,process,show databases,replication slave,replication client on *.* to 'monitor'@'localhost';

#备份账户
create user 'backup'@'localhost' identified by 'd*CRK$AZVr2t+{';
grant select,reload,super,replication slave,replication client,show view,alter routine,event,trigger on *.* to 'backup'@'localhost';

#xtrbackup
create user 'xtrbackup'@'localhost' identified by '[{ehE!)w:0xpL8';
grant select,reload,lock tables,PROCESS,replication slave,replication client on *.* to 'xtrbackup'@'localhost';

#中间件账号maxscale权限

CREATE USER 'maxscale'@'172.17.73.%' identified by 'Oracle_123';
GRANT SELECT on mysql.user to 'maxscale'@'172.17.73.%';
GRANT SELECT ON mysql.db TO 'maxscale'@'172.17.73.%';
GRANT SELECT ON mysql.tables_priv TO 'maxscale'@'172.17.73.%';
GRANT SHOW DATABASES ON *.* TO 'maxscale'@'172.17.73.%';
GRANT REPLICATION SLAVE, REPLICATION CLIENT,SELECT ON *.* TO maxscale@'172.17.73.%';
flush PRIVILEGES;

#开发账户
create user 'dev'@'%' identified by 'X0WMbwPrYD';
grant select on test.* to 'dev'@'%';

兼容工具或JDBC特性:
grant select on mysql.help_topic to 'xxx'@'172.17.73.%';
grant select on mysql.proc to 'xxx'@'172.17.73.%';

修改用户名:
rename user OLD_NAME to NEW_NAME;

----------------------

修改密码:
alter user 'root'@'%' identified by '12345678';
也可以:
#新版本5.7MYSQL修改密码:
    update mysql.user set authentication_string=password('zabbix') where user='zabbix';

mariadb及5.6以下:
    update mysql.user set password=password('zabbix') where user='zabbix';

 

修改认证插件:
ALTER USER 'root'@'%' IDENTIFIED WITH sha256_password BY 'pwd';    指定认证插件

 update user set plugin='mysql_native_password' where user = 'root' and host = '%';

MySQL 8.0 中,caching_sha2_password 是默认的身份验证插件,默认的密码加密方式是 SHA2。

需要修改my.cnf 中配置项并重启服务后生效。此选项暂不支持 MySQL 8.0 动态修改特性。
[mysqld]
default_authentication_plugin = mysql_native_password

MySQL 8.0 中已有的 SHA2 密码修改为 SHA1 的模式。
mysql> ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'password';
mysql> FLUSH PRIVILEGES;

 

认证中大小写敏感。
    字段user,password,authencation_string,db,table_name大小写敏感
    字段host,column_name,routine_name大小写不敏感


删除用户
mysql> drop user 'test'@'localhost';
Query OK, 0 rows affected (0.00 sec)


二、查看权限

(1)查看所有用户

mysql> select host,user,plugin,authentication_string,password_expired,password_lifetime,account_locked from mysql.user;
+-----------+-------------------+----------------------------------+-------------------------------------------+----------------------------+-------------------+----------------+
| host      | user            | plugin                    | authentication_string                     | password_expired | password_lifetime | account_locked |
+-----------+-------------------+---------------------------------+--------------------------------------------+----------------------------+-------------------+----------------+
| localhost | root            | mysql_native_password |                                              | N                    |              NULL | N              |
| localhost | mysql.session | mysql_native_password | *THISISNOTAVALIDPASS....  | N                    |              NULL | Y              |
| localhost | mysql.sys        | mysql_native_password | *THISISNOTAVALIDPASSW   | N                    |              NULL | Y              |
+-----------+--------------------+---------------------------------+---------------------------------------------+------------------+-------------------+----------------+
                                     认证插件           密码加密字符串                     密码是否过期           密码过期时间        账号登录是否锁定

(2)查看用户的权限

mysql> show grants for 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.02 sec)


user表中host列的值的意义

%             匹配所有主机
localhost    localhost不会被解析成IP地址,直接通过UNIXsocket连接
127.0.0.1    会通过TCP/IP协议连接,并且只能在本机访问;
::1           ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1


(3)忘记root密码,处理办法

[root@vm00 ~]# /etc/init.d/mysqld --skip-grant-tables
忽略权限表启动。(不检验权限)

Mysql –uroot mysql

更新root密码:
UPDATE user SET Password=PASSWORD('mysql') where USER='root';
或者:
set password for 'root'@'%' = Password('mysql')

新版本5.7MYSQL修改密码:
update mysql.user set authentication_string=password('mysql') where user='mysql';

FLUSH PRIVILEGES;

=====================================MySQL 角色管理

MySQL 8.0 角色是指定的权限集合,和用户帐户一样可以对角色进行权限的授予和撤消。如果用户被授予角色权限,则该用户拥有该角色的权限。

(1)MySQL 8.0 提供的角色管理功能如下:

    CREATE ROLE       角色创建
    DROP ROLE        角色删除
    GRANT          为用户和角色分配权限
    REVOKE          为用户和角色撤销权限
    SHOW GRANTS      显示用户和角色的权限
    SET DEFAULT ROLE      指定哪些帐户角色默认处于活动状态
    SET ROLE          更改当前会话中的活动角色
    CURRENT_ROLE()      显示当前会话中的活动角色

为了清楚区分角色的权限,建议将角色名称命名得比较直观。

mysql> CREATE ROLE 'app', 'dba', 'dev_read';
注:角色名称格式类似于由用户和主机部分组成的用户帐户,如:role_name@host_name。如果省略主机部分,则默认为 “%”,表示任何主机。

给角色授予对应的权限。
mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON wordpress.* TO 'app';
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO 'dba';
mysql> GRANT SELECT ON wordpress.* TO 'dev_read';

给用户分配角色
mysql> GRANT app TO 'app01'@'%';
mysql> GRANT ops TO 'ops01'@'%';
mysql> GRANT dev_read TO 'dev01'@'%';

如果要将多个用户同时加入多个角色,可以使用类似语句。
mysql> GRANT dev_read, dev_write TO 'dev02'@'%', 'dev03'@'%';

ALL [PRIVILEGES]表示除了GRANT OPTION和PROXY权限外,授予权限级别的所有可用权限。


(2)查看用户权限:

mysql> SHOW GRANTS FOR 'dev01'@'%';
+-------------------------------------+
| Grants for dev01@%                  |
+-------------------------------------+
| GRANT USAGE ON *.* TO `dev01`@`%`   |
| GRANT `dev_read`@`%` TO `dev01`@`%` |
+-------------------------------------+
2 rows in set (0.00 sec)

如果要显示角色所代表的权限,需要加上 USING 子句和授权角色的名称。

mysql> SHOW GRANTS FOR 'dev01'@'%' USING dev_read;
+----------------------------------------------+
| Grants for dev01@%                           |
+----------------------------------------------+
| GRANT USAGE ON *.* TO `dev01`@`%`            |
| GRANT SELECT ON `wordpress`.* TO `dev01`@`%` |
| GRANT `dev_read`@`%` TO `dev01`@`%`          |
+----------------------------------------------+
3 rows in set (0.00 sec)

(3)设置默认角色

向用户帐户授予角色后,当用户帐户连接到数据库服务器时,它并不会自动使角色变为活动状态。

#查看当前角色。
mysql> SELECT current_role();
+----------------+
| current_role() |
+----------------+
| NONE           |
+----------------+
1 row in set (0.00 sec)

要在每次用户帐户连接到数据库服务器时指定哪些角色应该处于活动状态,需用使用 SET DEFAULT ROLE 语句来指定。
# 以下语句将把 dev01 帐户分配的所有角色都设置为默认值。
mysql> SET DEFAULT ROLE ALL TO 'dev01'@'%';

用户帐户可以通过指定哪个授权角色处于活动状态来修改当前用户在当前会话中的有效权限。

将活动角色设置为 NONE,表示没有活动角色。
mysql> SET ROLE NONE;

将活动角色设置为所有授予的角色。
mysql> SET ROLE ALL;

将活动角色设置为由 SET DEFAULT ROLE 语句设置的默认角色。
mysql> SET ROLE DEFAULT;

同时设置多个活动的角色。
mysql> SET ROLE granted_role_1, granted_role_2, ...


(4)撤消角色或角色权限
正如可以授权某个用户的角色一样,也可以从用户帐户中撤销这些角色。
mysql> REVOKE role FROM user;

从 dev_write 角色中撤消掉修改权限。
REVOKE INSERT, UPDATE, DELETE ON wordpress.* FROM 'dev_write';
角色中撤销权限会影响到该角色中任何用户的权限。

删除角色:
DROP ROLE 'role_name', 'role_name', ...;
删除角色会从授权它的每个帐户中撤消该角色。

(5)克隆权限

MySQL 8.0 将每一个用户帐户视为角色,因此可以将用户帐户授予另一个用户帐户。例如:将一开发人员帐号权限复制到另一开发人员帐号。

将 dev02 用户帐户的权限复制到 dev04 用户帐户
mysql> GRANT 'dev02'@'%' TO 'dev04'@'%';


三、回收权限,密码过期时间管理,锁定账号

revoke跟grant的语法差不多,只需要把关键字 “to” 换成 “from” 即可;
mysql> revoke delete on *.* from 'test'@'localhost';

(2)密码过期时间管理

default_password_lifetime 其默认值为 0,表示禁用自动密码过期。
default_password_lifetime 的值如是是正整数 N ,则表示允许的设置密码生存周期 为 N,单位为天 。

如果你要建立一个全局策略,让所有用户的密码的使用期限为六个月。
[mysqld]
default_password_lifetime=180

也可以设置默认密码过期策略为 180 天后过期
mysql> SET PERSIST default_password_lifetime = 180;

# 设置默认密码过期策略为永不过期
mysql> SET PERSIST default_password_lifetime = 0;

# MySQL 8.0 永久动态修改参数会保存在配置文件 mysqld-auto.cnf 中,保存的格式为JSON串。
$ cat  /var/lib/mysql/mysqld-auto.cnf
{ "Version" : 1 , "mysql_server" : { "default_password_lifetime" : { "Value" : "180" , "Metadata" : { "Timestamp" : 1525663928688419 , "User" : "root" , "Host" : "" } } } }


创建或修改一个用户的密码过期时间为 90 天。
mysql> CREATE USER 'mike'@'%' IDENTIFIED BY '000000' PASSWORD EXPIRE INTERVAL 90 DAY;
mysql> ALTER USER `mike`@`%` PASSWORD EXPIRE INTERVAL 90 DAY;

创建或修改一个用户的密码过期时间为永不过期。
mysql> CREATE USER 'mike'@'%' PASSWORD EXPIRE NEVER;
mysql> ALTER USER 'mike'@'%' PASSWORD EXPIRE NEVER;

创建或修改一个遵循全局到期策略的用户。
mysql> CREATE USER 'mike'@'%' PASSWORD EXPIRE DEFAULT;
mysql> ALTER USER 'mike'@'%' PASSWORD EXPIRE DEFAULT;


(3)锁定管理

创建一个带帐户锁的用户
mysql> CREATE USER 'mike-temp1'@'%' IDENTIFIED BY '000000' ACCOUNT LOCK;

锁定用户:
ALTER USER 'mike'@'%' ACCOUNT LOCK;

解锁此用户
mysql> ALTER USER 'mike-temp1'@'%' ACCOUNT UNLOCK;


(4)密码重用
从 MySQL 8.0 开始允许限制重复使用以前的密码。可以根据密码更改次数、已用时间或两者来建立密码重用限制。

如果根据密码更改次数限制帐户,则无法从指定数量的最新密码中选择新密码。例如:如果密码更改的最小数量设置为 3,则新密码不能与任何最近的3个密码相同。
如果根据密码修改时间来限制帐户,则无法将指定时间历史记录中的密码中选择为新密码。例如:如果密码重用间隔设置为 60,则新密码不得在最近 60 天内选择的密码相同。
注:空密码不记录在密码历史记录中,并随时可以重复使用。

要建立全局密码重用策略,可修改 password_history 和 password_reuse_interval 系统变量。

禁止重复使用最近 6 个密码或最近 180 天内使用过的任何密码为例。
[mysqld]
password_history=6
password_reuse_interval=180

该参数是支持永久动态设置,也可以直接用下面语句进行设置。
mysql> SET PERSIST password_history = 6;
mysql> SET PERSIST password_reuse_interval = 180;


四、密码3种检验策略

mysql对于密码有3种检验策略,默认validate_password_policy为MEDIUM。

LOW :仅仅验证密码长度,至少8个字符。
MEDIUM 在low基础上,密码必须至少包含1个数字字符、1个小写和大写字符以及1个特殊(非字母数字)字符。
STRONG :长度为4或更长的密码子字符串不能与单词匹配。

如果需要密码校验,需要安装插件:
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';

检验密码复杂度
mysql> select VALIDATE_PASSWORD_STRENGTH('abc1235jeme');
+-------------------------------------------+
| VALIDATE_PASSWORD_STRENGTH('abc1235jeme') |
+-------------------------------------------+
|                                        50 |
+-------------------------------------------+

修改密码策略:

 SHOW VARIABLES LIKE 'validate_password%';


validate_password_number_count             参数是密码中至少含有的数字个数,当密码策略是MEDIUM或以上时生效。
validate_password_special_char_count       参数是密码中非英文数字等特殊字符的个数,当密码策略是MEDIUM或以上时生效。
validate_password_mixed_case_count         参数是密码中英文字符大小写的个数,当密码策略是MEDIUM或以上时生效。
validate_password_length                   参数是密码的长度,这个参数由下面的公式生成
                                           validate_password_number_count+ validate_password_special_char_count+ (2 * validate_password_mixed_case_count)
validate_password_dictionary_file          参数是指定密码验证的字典文件路径。
validate_password_policy                   这个参数可以设为0、1、2,分别代表从低到高的密码强度,此参数的默认值为1,如果想将密码强度改弱,则更改此参数为0。


更改密码策略为LOW
mysql> set global validate_password_policy=0;

更改密码长度
mysql> set global validate_password_length=0;


/etc/my.cnf配置文件中也可开启或关闭相关密码策略

[mysqld]
validate_password=off


五、MySQL支持的权限

ALL或ALL PRIVILEGES                  代表指定权限等级的所有权限。
ALTER                   允许使用ALTER TABLE来改变表的结构,ALTER TABLE同时也需要CREATE和INSERT权限。
                        重命名一个表需要对旧表具有ALTER和DROP权限,对新表具有CREATE和INSERT权限。
ALTER ROUTINE           允许改变和删除存储过程和函数
CREATE                  允许创建新的数据库和表
CREATE ROUTINE          允许创建存储过程和包
CREATE TABLESPACE       允许创建、更改和删除表空间和日志文件组
CREATE TEMPORARY TABLES 允许创建临时表
CREATE USER             允许更改、创建、删除、重命名用户和收回所有权限
CREATE VIEW             允许创建视图
DELETE                  允许从数据库的表中删除行
DROP                    允许删除数据库、表和视图
EVENT                   允许在事件调度里面创建、更改、删除和查看事件
EXECUETE                允许执行存储过程和包
FILE                    允许在服务器的主机上通过LOAD DATA INFILE、SELECT ... INTO OUTFILE和LOAD_FILE()函数读写文件
GRANT OPTION            允许向其他用户授予或移除权限
INDEX                   允许创建和删除索引
INSERT                  允许向数据库的表中插入行
LOCK TABLE              允许执行LOCK TABLES语句来锁定表
PROCESS                 允许显示在服务器上执行的线程信息,即被会话所执行的语句信息。
                        这个权限允许你执行SHOW PROCESSLIST和mysqladmin processlist命令来查看线程,同时这个权限也允许你执行SHOW ENGINE命令。
PROXY                   允许用户冒充成为另外一个用户
REFERENCES              允许创建外键
RELOAD                  允许使用FLUSH语句
REPLICATION CLIENT      允许执行SHOW MASTER STATUS,SHOW SLAVE STATUS和SHOW BINARY LOGS命令
REPLICATION SLAVE       允许SLAVE服务器连接到当前服务器来作为他们的主服务器。
SELECT                  允许从数据库中查询表
SHOW DATABASES          允许账户执行SHOW DATABASE语句来查看数据库。没有这个权限的账户只能看到他们具有权限的数据库。
SHOW VIEW               允许执行SHOW CREATE VIEW语句
SHUTDOWN                允许执行SHUTDOWN语句和mysqladmin shutdown已经mysql_shutdown() C API函数
SUPER                   允许用户执行CHANGE MASTER TO,KILL或mysqladmin kill命令来杀掉其他用户的线程,允许执行PURGE BINARY LOGS命令,
                        通过SET GLOBAL来设置系统参数,执行mysqladmin debug命令,开启和关闭日志,即使read_only参数开启也可以执行update语句,
                        打开和关闭从服务器上面的复制,允许在连接数达到max_connections的情况下连接到服务器。super权限可以对全局变量更改。
TRIGGER                 允许操作触发器
UPDATE                  允许更新数据库中的表
USAGE                   代表没有任何权限,只能登陆

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/736515.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cJSON:构建JSON

使用cJSON库构建比较简单的JSON类型: create_json.c #include <stdio.h> #include <string.h> #include <stdlib.h>#include "cJSON.h"static int create_json_type_1(void) {char *json_str = NULL;cJSON *root = NULL;root = cJSON_CreateObjec…

【esp32 学习笔记】将lvgl融入esp-idf项目中

lvgl科普 lvgl 主要特点:Github库整体了解版本号编排原则屏幕兼容性LVGL 问题处理: lvgl 与 FreeRTOS 由于esp-idf本身带了 FreeRTOS系统,因此需要关注一下操作系统相关的内容:void lvgl_thread(void) {while(1) {uint32_t time_till_next;time_till_next = lv_timer_hand…

QT6 CMake项目配置 (Visual Studio)

QT6 CMake项目配置 (Visual Studio) 上一节已经编译好了动态和静态的QT库,接下来在CMake中引入。 这边主要介绍使用Visual Studio的配置方法 测试环境 首先使用VS创建一个项目来测试CMake能否正常使用。 如果是首次打开VS会有个配置主题的界面,自己选一下就好了 首先我们来创…

ssrf+结合redis 写入crontab或者公钥(两种环境)

REDIS redis作为一种数据库 其实是会真的将数据写入到内存中的 我们利用ssrf请求 请求redis 实现服务器对自己的公钥或任务计划写入 实现无密码登录 或反弹bashredis监听所有地址时 才能被外部访问 否则只能127.0.0.1 本地访问 而且开启保护模式后会导致目标端口只能本地访问 这…

ffmpeg常用命令汇总

最近在学习ffmpeg,将基础命令做一次汇总,便于自己以后查阅: 1. ffmpeg 常用命令 ffmpeg 帮助信息查看 // 查看 ffmpeg 的基础信息。 ffmpeg --help// 查看高级参数部分。 ffmpeg --help long// 查看全部的帮助信息。 ffmpeg --help full转封装 // -hide_banner: 隐去 ffmpeg …

麻烦问一下xpath标签定位的这个索引是做什么用的?

大家好,我是Python进阶者。 一、前言 前几天在Python最强王者交流群【杨又串🍻】问了一个Python网络爬虫的问题,问题如下:老师,麻烦问一下xpath标签定位的这个索引是做什么用的,我听网课把这个知识点跳过了? 二、实现过程 后来【隔壁😼山楂】给了一个指导:这个过去出…

李沐动手学深度学习V2-chap_preliminaries

李沐动手学深度学习V2 文章内容说明 本文主要是自己学习过程中的随手笔记,需要自取 课程参考B站:https://space.bilibili.com/1567748478?spm_id_from=333.788.0.0 课件等信息原视频简介中有CSV文件修改读取成张量tensor 数据预处理 首先(创建一个人工数据集,并存储在CSV(…

C语言打印倒三角形,底边长n作为参数输入,从键盘输入

打印倒三角形,底边长n作为参数输入,从键盘输入。#include <stdio.h> int main(int argc, char const *argv[]) {int i, j, k, l, n;printf("请输入底边长: \n");scanf("%d", &n);while (getchar() != \n);printf("输出图形如下:\n"…

WebAPI项目框架JWT权限验证

JWT是什么?校验逻辑?授权过程?这里就不过多的阐述了,直接上代码 在appsettings.json中配置jwt参数的值 SecretKey必须大于16个字符1 {2 "Logging": {3 "LogLevel": {4 "Default": "Information",5 "Micros…

2.SpringBoot快速上手

2.SpringBoot快速上手 SpringBoot介绍javaEE的开发经常会涉及到3个框架Spring ,SpringMVC,MyBatis.但是这三个框架配置极其繁琐,有大量的xml文件,spring Boot对之前的配置进行极大的简化Spring Boot 是由Pivotal团队提供的基于Spring的全新框架,简化Spring应用的初始搭建和…

RTMP协议

RTMP(Real-Time Messaging Protocol)是一个综合性的协议,不仅可以传输音视频数据,还可以传输信令控制指令。RTMP 使用 TCP 作为传输协议,可以直接在 TCP 连接上传输音视频数据,也可以传输控制指令,实现了音视频流的实时传输和控制。 与RTSP 不同,RTSP(Real-Time S…

yarn install 时显示 node_modules\esbuild: Command failed

可以找一找你的nodejs安装路径是不是中文的,如果是中文的换成英文应该就可以了(记得系统变量里也要改掉)

阿里云个人账号 创建docker仓库

1、创建阿里云账号 2、搜索“容器镜像服务”,进入,点击“管理控制台” 3、选择个人实例,这一步可能会让你创建registry密码(如果没有创建过的话),后面登录需要 4、创建命名空间5、创建镜像仓库 输入信息,点击下一步,选择本地仓库 6、进入管理页面 执行相关命令

Django3在网页上生成二维码

1.安装依赖包pip install django-qr-code2.在django,你项目的settings中,安装app 打开你项目的setting,找到INSTALLED_APPS ,在这里新加一条qr_code INSTALLED_APPS = [...,rest_framework,qr_code,... ] 3.在你打算渲染的html文档中,导入模板 {% load qr_code %}ps:如果…

Hackthebox bagel.dll 代码审计

利用ilspy将bagel.dll打开关于此目录有可以说的内容 目录解析 最上方的bagel是组装名字(assemble name) bagel_server 是命令空间(namespace) 下一级分支是类如File,Base,Handler,Orders等(class) 反序列化导致的命令执行漏洞代码审计思路 首先看主程序Bagel 1.通过明显的英…

2024/7/2 T1

题意:分析: 记 \(S_{i}\) 表示目前第 \(i\) 个集合里的元素个数。 集合之间互不区分,强制钦定必须满足 \(S_{i} \le S_{i+1}(i<k)\)。 经搜索发现,这样的状态数量最多约为 \(1.8 \times 10^5\)。 极差可以这样处理:将 \(a\) 排序,\(S_{i}\) 第一次加入某个元素 \(x\),…

Eplan插件 - 矩形修订云线

前言 在 CAD 中,矩形云线一直是设计师们用于标注修订区域或突出重要部分的得力工具。然而,在 Eplan 中,没有直接绘制矩形云线的功能。为了填补这一空白,开发了专门用于Eplan的矩形修订云线插件。 这款插件保留了Eplan绘制的习惯,可以简洁快速的框选出需要修订或者重点关注…

Nginx配置以及热升级

目录Nginx详解1. Nginx关键特性2. Nginx配置2.1 event2.2 http2.2.1 log_format2.2.2 sendfile2.2.3 tcp_nopush2.2.4 tcp_nodelay2.2.5 keepalive_timeout2.2.6 include2.2.7 default_type2.2.8 server3. 配置Nginx虚拟主机3.1 基于端口3.2 基于IP3.3 基于域名4. Location4.1 …

Python3学习之路~3.4 作业之对员工信息表实现增删改查操作

有以下员工信息表当然此表你在文件存储时可以这样表示1,Alex Li,22,13651054608,IT,2013-04-01 现需要对这个员工信息文件,实现增删改查操作可进行模糊查询,语法至少支持下面3种: select name,age from staff_table where age > 22 select * from staff_table where dep…

Python3学习之路~2.11 补充:Python输出字符串加颜色or背景色

格式:\033[二位数;1m字符串\033[0m 二位数为31-37,40-47(其他数字无效),其中:十位数3表示字颜色,4表示背景色个位数0-7分别表示 黑 红 绿 黄 蓝 紫 浅蓝 灰 示例代码:# 加颜色:31-37 print("\033[31;1mHello Python-31-红色字\033[0m") print("\033[32;…