MYSQL03高级_新增用户、授予权限、授权底层表结构、角色理解

news2024/9/28 15:24:16

文章目录

  • ①. 登录服务器操作
  • ②. 用户的增删改
  • ③. 修改用户密码
  • ④. MySQL8密码管理
  • ⑤. 权限列表及原则
  • ⑥. 授予查看回收权限
  • ⑦. 底层权限表操作
  • ⑧. 角色的理解

①. 登录服务器操作

  • ①. 启动MySQL服务后,可以通过mysql命令来登录MySQL服务器,命令如下:
mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL语句"
  • ②. 下面详细介绍命令中的参数:
  1. -h参数:后面接主机名或者主机IP,hostname为主机,hostIP为主机IP
  2. -P参数:后面接MySQL服务的端口,通过该参数连接到指定的端口。MySQL服务的默认端口是3306,不使用该参数时自动连接到3306端口,port为连接的端口号
  3. -u参数:后面接用户名,username为用户名
  4. -p参数:会提示输入密码
  5. DatabaseName参数:指明登录到哪一个数据库中。如果没有该参数,就会直接登录到MySQL数据库中,然后可以使用USE命令来选择数据库
  6. -e参数:后面可以直接加SQL语句。登录MySQL服务器以后即可执行这个SQL语句,然后退出MySQL服务器
  • ③. 举例子
mysql -uroot -p -hlocalhost -P3306 mysql -e "select host,user from user"

②. 用户的增删改

  • ①. 创建用户,CREATE USER语句的基本语法形式如下:
  1. 用户名参数表示新建用户的账户,由 用户(User) 和 主机名(Host) 构成
  2. “[ ]”表示可选,也就是说,可以指定用户登录时需要密码验证,也可以不指定密码验证,这样用户可以直接登录。不过,不指定密码的方式不安全,不推荐使用。如果指定密码值,这里需要使用IDENTIFIED BY指定明文密码值
  3. CREATE USER语句可以同时创建多个用户
CREATE USER 用户名 [IDENTIFIED BY '密码'][,用户名 [IDENTIFIED BY '密码']];
CREATE USER tang IDENTIFIED BY '111111'; # 默认host是 %
CREATE USER 'tang'@'localhost' IDENTIFIED BY '111111';
  • ②. 修改用户:相当于是修改表记录
UPDATE mysql.user SET USER='tang' WHERE USER='tang1';
FLUSH PRIVILEGES;
  • ③. 使用DROP方式删除(推荐)
    使用DROP USER语句来删除用户时,必须用于DROP USER权限。DROP USER语句的基本语法形式如下:
DROP USER user[,user];
DROP USER tang; # 默认删除host为%的用户
DROP USER 'tang'@'localhost';
  • ④. 使用DELETE方式删除(不推荐)
    不推荐通过 DELETE FROM USER u WHERE USER=‘tang’ 进行删除,系统会有残留信息保留。而drop user命令会删除用户以及对应的权限,执行命令后你会发现mysql.user表和mysql.db表的相应记录都消失了
DELETE FROM mysql.user WHERE Host='hostname' AND User='tang';
# 执行完DELETE命令后要使用FLUSH命令来使用户生效,命令如下:
FLUSH PRIVILEGES;

③. 修改用户密码

  • ①. 使用ALTER USER命令来修改当前用户密码用户可以使用ALTER命令来修改自身密码,如下语句代表修改当前登录用户的密码。基本语法如下:
# 修改当前用户密码
ALTER USER USER() IDENTIFIED BY 'new_password';
mysql> set password =password('123456');
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> exit
Bye
[root@mysql57 ~]# mysql -u root -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.28 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> alter user user() identified by '9602111022yxTZ@';
Query OK, 0 rows affected (0.01 sec)

在这里插入图片描述

  • ②. 使用SET语句来修改当前用户密码 使用root用户登录MySQL后,可以使用SET语句来修改密码,具体SQL语句如下
# 该语句会自动将密码加密后再赋给当前用户
SET PASSWORD='new_password';
  • ③. 使用ALTER语句来修改普通用户的密码 可以使用ALTER USER语句来修改普通用户的密码。基本语法形式如下:
ALTER USER user(比如tang) [IDENTIFIED BY '新密码']
[,user[IDENTIFIED BY '新密码']];
  • ④. 使用SET命令来修改普通用户的密码 使用root用户登录到MySQL服务器后,可以使用SET语句来修改普通用户的密码。SET语句的代码如下
SET PASSWORD FOR 'username'@'hostname'='new_password';
  • ⑤. 使用UPDATE语句修改普通用户的密码(不推荐)
UPDATE MySQL.user SET authentication_string=PASSWORD("123456")
WHERE User = "username" AND Host = "hostname";

④. MySQL8密码管理

  • ①. 密码过期策略
  1. 在MySQL中,数据库管理员可以手动设置账号密码过期,也可以建立一个自动密码过期策略
  2. 过期策略可以是全局的,也可以为每个账号设置单独的过期策略
  3. 方式1:使用SQL语句更改该变量的值并持久化
    SET PERSIST default_password_lifetime = 180; # 建立全局策略,设置密码每隔180天过期
  4. 方式2:配置文件my.cnf中进行维护
    [mysqld]
    default_password_lifetime=180 #建立全局策略,设置密码每隔180天过期
ALTER USER user PASSWORD EXPIRE;
ALTER USER 'tang'@'localhost' PASSWORD EXPIRE;
#设置TANG账号密码每90天过期:
CREATE USER 'TANG'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
ALTER USER 'TANG'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;

#设置密码永不过期:
CREATE USER 'TANG'@'localhost' PASSWORD EXPIRE NEVER;
ALTER USER 'TANG'@'localhost' PASSWORD EXPIRE NEVER;

#延用全局密码过期策略:
CREATE USER 'TANG'@'localhost' PASSWORD EXPIRE DEFAULT;
ALTER USER 'TANG'@'localhost' PASSWORD EXPIRE DEFAULT;
  • ②. 密码重用策略
  1. MYSQL限制使用已用过的密码。重用限制策略基于密码更改的梳理和使用的时间。重用策略可以是全局的,也可以为每个账号设置单独的策略
  2. 账号的历史密码包含过去该账号所使用的密码。MYSQL基于一下规则来限制密码重用
    如果账号的密码限制 基于密码更新的数量,那么新密码不能从最近限制的密码数量中选择。例如,如果密码更改的最小值为3,那么新密码不能与最新3个密码中任何一个相同
    如果账号密码限制 基于时间,那么新密码不能从规定时间内选择。例如,如果密码重用周期为60天,那么新密码不能从最近60天内使用的密码中选择
  3. MYSQL使用password_history和password_reuse_interval系统变量设置密码重用策略
    password_history:规定密码重用的数量
    password_reuse_interval:规定密码重用的周期
# 方式1:使用SQL
SET PERSIST password_history = 6; #设置不能选择最近使用过的6个密码
SET PERSIST password_reuse_interval = 365; #设置不能选择最近一年内的密码

# 方式2:my.cnf配置文件
[mysqld]
password_history=6
password_reuse_interval=365

# 手动设置密码重用方式2:单独设置
#不能使用最近5个密码:
CREATE USER 'tang'@'localhost' PASSWORD HISTORY 5;
ALTER USER 'tang'@'localhost' PASSWORD HISTORY 5;
#不能使用最近365天内的密码:
CREATE USER 'tang'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
ALTER USER 'tang'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
#既不能使用最近5个密码,也不能使用365天内的密码
CREATE USER 'tang'@'localhost'
PASSWORD HISTORY 5
PASSWORD REUSE INTERVAL 365 DAY;
ALTER USER 'tang'@'localhost'
PASSWORD HISTORY 5
PASSWORD REUSE INTERVAL 365 DAY;

⑤. 权限列表及原则

  • ①. MySQL到底都有哪些权限呢?show privileges;
  1. CREATE和DROP权限:可以创建新的数据库和表,或删除(移掉)已有的数据库和表。如果将MySQL数据库中的DROP权限授予某用户,用户就可以删除MySQL访问权限保存的数据库
  2. SELECT、INSERT、UPDATE和DELETE权限 允许在一个数据库现有的表上实施操作
  3. SELECT权限只有在它们真正从一个表中检索行时才被用到
  4. INDEX权限 允许创建或删除索引,INDEX适用于已有的表。如果具有某个表的CREATE权限,就可以在CREATE TABLE语句中包括索引定义
  5. ALTER权限:可以使用ALTER TABLE来更改表的结构和重新命名表
  6. CREATE ROUTINE权限 用来创建保存的程序(函数和程序),ALTER ROUTINE权限用来更改和删除保存的程序, EXECUTE权限 用来执行保存的程
  7. GRANT权限 允许授权给其他用户,可用于数据库、表和保存的程序
  8. FILE权限:使用户可以使用LOAD DATA INFILE和SELECT … INTO OUTFILE语句读或写服务器上的文件,任何被授予FILE权限的用户都能读或写MySQL服务器上的任何文件(说明用户可以读任何数据库目录下的文件,因为服务器可以访问这些文件)
  • ②. 权限控制主要是出于安全因素,因此需要遵循以下几个经验原则:
  1. 只授予能满足需要的最小权限 ,防止用户干坏事。比如用户只是需要查询,那就只给select权限就可以了,不要给用户赋予update、insert或者delete权限
  2. 创建用户的时候限制用户的登录主机,一般是限制成指定IP或者内网IP段
  3. 为每个用户设置满足密码复杂度的密码
  4. 定期清理不需要的用户 ,回收权限或者删除用户

⑥. 授予查看回收权限

  • ①. 给用户授权的方式有2种,分别是通过把角色赋予用户给用户授权和直接给用户授权。用户是数据库的使用者,我们可以通过给用户授予访问数据库中资源的权限,来控制使用者对数据库的访问,消除安全隐患

  • ②. 授权命令:

  1. ALL PRIVILEGES是所有权限,你可以使用SELECT、UPDATE等权限
  2. ON用来指定权限针对那些库和表
  3. .中前面的*号用来指定数据库名,后面的*号用来指定表明,这里的*表示所有的
  4. TO表示将权限赋予某个用户
  5. li4@'localhost’表示li4用户,@后面限制的主机,可以是ip、ip段、域名以及%,%表示任何地方
  6. IDENTIFIED BY 指定用户的登录密码
  7. 如果需要赋予包括GRANT权限,添加参数"WITH GRANT OPTION"这个选项,表示该用户可以将自己拥有的权限授予给别人。经常有人在创建用户的时候不指定WITH GRANT OPTION选项导致后来该用户不能使用GRANT命令创建用户或者给其他用户授权
  8. 可以使用GRANT重复给用户添加权限,权限叠加,比如你先给用户添加一个SELECT权限,然后又给用户添加一个INSERT权限,那么该用户就同时拥有了SELECT和INSERT权限
GRANT 权限1,权限2,…权限n ON 数据库名称.表名称 TO 用户名@用户地址 [IDENTIFIED BY ‘密码口令’];
# 给li4用户用本地命令行方式,授予db1这个库下的所有表的插删改查的权限。
GRANT SELECT,INSERT,DELETE,UPDATE ON db1.* TO li4@localhost ;
# 授予通过网络方式登录的joe用户 ,对所有库所有表的全部权限,密码设为123。注意这里唯独不包grant的权限
GRANT ALL PRIVILEGES ON *.* TO joe@'%' IDENTIFIED BY '123';
  • ③. 查看当前用户权限
SHOW GRANTS;
# 或
SHOW GRANTS FOR CURRENT_USER;
# 或
SHOW GRANTS FOR CURRENT_USER();
#查看某用户的全局权限
SHOW GRANTS FOR 'user'@'主机地址';
  • ④. 收回权限就是取消已经赋予用户的某些权限。收回用户不必要的权限可以在一定程度上保证系统的安全性。MySQL中使用 REVOKE语句取消用户的某些权限。使用REVOKE收回权限之后,用户账户的记录将从db、host、tables_priv和columns_priv表中删除,但是用户账户记录仍然在user表中保存(删除user表中的账户记录使用DROP USER语句)
    注意: 须用户重新登录后才能生效
# 权限回收
REVOKE 权限1,权限2,…权限n ON 数据库名称.表名称 FROM 用户名@用户地址;
#收回全库全表的所有权限
REVOKE ALL PRIVILEGES ON *.* FROM joe@'%';
#收回mysql库下的所有表的插删改查权限
REVOKE SELECT,INSERT,UPDATE,DELETE ON mysql.* FROM joe@localhost;

⑦. 底层权限表操作

  • ①. user表是MySQL中最重要的一个权限表,记录用户账号和权限信息,有49个字段
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> desc user;
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field                    | Type                              | Null | Key | Default               | Extra |
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host                     | char(255)                         | NO   | PRI |                       |       |
| User                     | char(32)                          | NO   | PRI |                       |       |
| Select_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Insert_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Update_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Delete_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Create_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Drop_priv                | enum('N','Y')                     | NO   |     | N                     |       |
| Reload_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Shutdown_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Process_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| File_priv                | enum('N','Y')                     | NO   |     | N                     |       |
| Grant_priv               | enum('N','Y')                     | NO   |     | N                     |       |
| References_priv          | enum('N','Y')                     | NO   |     | N                     |       |
| Index_priv               | enum('N','Y')                     | NO   |     | N                     |       |
| Alter_priv               | enum('N','Y')                     | NO   |     | N                     |       |
| Show_db_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Super_priv               | enum('N','Y')                     | NO   |     | N                     |       |
| Create_tmp_table_priv    | enum('N','Y')                     | NO   |     | N                     |       |
| Lock_tables_priv         | enum('N','Y')                     | NO   |     | N                     |       |
| Execute_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Repl_slave_priv          | enum('N','Y')                     | NO   |     | N                     |       |
| Repl_client_priv         | enum('N','Y')                     | NO   |     | N                     |       |
| Create_view_priv         | enum('N','Y')                     | NO   |     | N                     |       |
| Show_view_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Create_routine_priv      | enum('N','Y')                     | NO   |     | N                     |       |
| Alter_routine_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Create_user_priv         | enum('N','Y')                     | NO   |     | N                     |       |
| Event_priv               | enum('N','Y')                     | NO   |     | N                     |       |
| Trigger_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Create_tablespace_priv   | enum('N','Y')                     | NO   |     | N                     |       |
| ssl_type                 | enum('','ANY','X509','SPECIFIED') | NO   |     |                       |       |
| ssl_cipher               | blob                              | NO   |     | NULL                  |       |
| x509_issuer              | blob                              | NO   |     | NULL                  |       |
| x509_subject             | blob                              | NO   |     | NULL                  |       |
| max_questions            | int unsigned                      | NO   |     | 0                     |       |
| max_updates              | int unsigned                      | NO   |     | 0                     |       |
| max_connections          | int unsigned                      | NO   |     | 0                     |       |
| max_user_connections     | int unsigned                      | NO   |     | 0                     |       |
| plugin                   | char(64)                          | NO   |     | caching_sha2_password |       |
| authentication_string    | text                              | YES  |     | NULL                  |       |
| password_expired         | enum('N','Y')                     | NO   |     | N                     |       |
| password_last_changed    | timestamp                         | YES  |     | NULL                  |       |
| password_lifetime        | smallint unsigned                 | YES  |     | NULL                  |       |
| account_locked           | enum('N','Y')                     | NO   |     | N                     |       |
| Create_role_priv         | enum('N','Y')                     | NO   |     | N                     |       |
| Drop_role_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Password_reuse_history   | smallint unsigned                 | YES  |     | NULL                  |       |
| Password_reuse_time      | smallint unsigned                 | YES  |     | NULL                  |       |
| Password_require_current | enum('N','Y')                     | YES  |     | NULL                  |       |
| User_attributes          | json                              | YES  |     | NULL                  |       |
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
  • ②. 使用desc查看db表的基本结构:
    在这里插入图片描述
  • ③. tables_priv表权限
    在这里插入图片描述
  • ④. columns_priv表权限
    在这里插入图片描述
  • ⑤. 连接核实阶段:校验用户密码是否正确
  1. 当用户试图连接MySQL服务器时,服务器基于用户的身份以及用户是否能提供正确的密码验证身份来确定接受或者拒绝连接。即客户端用户会在连接请求中提供用户名、主机地址、用户密码,MySQL服务器接收到用户请求后,会使用user表中的host、user和authentication_string这3个字段匹配客户端提供信息
  2. 服务器只有在user表记录的Host和User字段匹配客户端主机名和用户名,并且提供正确的密码时才接受连接。如果连接核实没有通过,服务器就完全拒绝访问;否则,服务器接受连接,然后进入阶段2等待用户请求
  • ⑥. 请求核实阶段
  1. 一旦建立了连接,服务器就进入了访问控制的阶段2,也就是请求核实阶段。对此连接上进来的每个请求,服务器检查该请求要执行什么操作、是否有足够的权限来执行它,这正是需要授权表中的权限列发挥作用的地方。这些权限可以来自user、db、table_priv和column_priv表
  2. 确认权限时,MySQL首先 检查user表 ,如果指定的权限没有在user表中被授予,那么MySQL就会继续检查db表,db表是下一安全层级,其中的权限限定于数据库层级,在该层级的SELECT权限允许用户查看指定数据库的所有表中的数据;如果在该层级没有找到限定的权限,则MySQL继续检查tables_priv表以及 columns_priv表 ,如果所有权限表都检查完毕,但还是没有找到允许的权限操作,MySQL将 返回错误信息 ,用户请求的操作不能执行,操作失败

⑧. 角色的理解

  • ①. 引入角色的目的是方便管理拥有相同权限的用户。恰当的权限设定,可以确保数据的安全性,这是至关重要的
    在这里插入图片描述
  • ②. 创建角色:使用CREATE ROLE 语句,语法如下:
CREATE ROLE 'role_name'[@'host_name'] [,'role_name'[@'host_name']]...
# 角色名称的命名规则和用户名类似。如果 host_name省略,默认为% , role_name不可省略 ,不可为# 练习:我们现在需要创建一个经理的角色,就可以用下面的代码:
CREATE ROLE 'manager'@'localhost';
  • ③. 创建角色之后,默认这个角色是没有任何权限的,我们需要给角色授权。给角色授权的语法结构是:
GRANT privileges ON table_name TO 'role_name'[@'host_name'];
# 上述语句中privileges代表权限的名称,多个权限以逗号隔开。可使用SHOW语句查询权限名称,图11-43
列出了部分权限列表
SHOW PRIVILEGES\G;
GRANT SELECT ON demo.settlement TO 'manager';
GRANT SELECT ON demo.goodsmaster TO 'manager';
GRANT SELECT ON demo.invcount TO 'manager';
  • ④. 赋予角色权限之后,我们可以通过 SHOW GRANTS 语句,来查看权限是否创建成功了:
  1. 只要你创建了一个角色,系统就会自动给你一个“ USAGE ”权限,意思是 连接登录数据库的权限 。代码的最后三行代表了我们给角色“manager”赋予的权限,也就是对商品信息表、盘点表和应付账款表的只读权限
  2. 结果显示,库管角色拥有商品信息表的只读权限和盘点表的增删改查权限
mysql> SHOW GRANTS FOR 'manager';
+-------------------------------------------------------+
| Grants for manager@% |
+-------------------------------------------------------+
| GRANT USAGE ON *.* TO `manager`@`%` |
| GRANT SELECT ON `demo`.`goodsmaster` TO `manager`@`%` |
| GRANT SELECT ON `demo`.`invcount` TO `manager`@`%` |
| GRANT SELECT ON `demo`.`settlement` TO `manager`@`%` |
+-------------------------------------------------------+
  • ⑤. 回收角色的权限
  1. 角色授权后,可以对角色的权限进行维护,对权限进行添加或撤销。添加权限使用GRANT语句,与角色授权相同。撤销角色或角色权限使用REVOKE语句
  2. 修改了角色的权限,会影响拥有该角色的账户的权限
  3. 撤销角色权限的SQL语法如下
REVOKE privileges ON tablename FROM 'rolename';
# 练习1:撤销school_write角色的权限
REVOKE INSERT, UPDATE, DELETE ON school.* FROM 'school_write';
# 撤销后使用SHOW语句查看school_write对应的权限,语句如下。
SHOW GRANTS FOR 'school_write';
  • ⑥. 删除角色:当我们需要对业务重新整合的时候,可能就需要对之前创建的角色进行清理,删除一些不会再使用的角色。删除角色的操作很简单,你只要掌握语法结构就行了
    注意, 如果你删除了角色,那么用户也就失去了通过这个角色所获得的所有权限
DROP ROLE role [,role2]...
# 练习:执行如下SQL删除角色school_read。
DROP ROLE 'school_read';
  • ⑦. 给用户赋予角色:角色创建并授权后,要赋给用户并处于 激活状态 才能发挥作用。给用户添加角色可使用GRANT语句,语法形式如下:
GRANT role [,role2,...] TO user [,user2,...];
# 使用GRANT语句给kangshifu添加school_read权限,SQL语句如下
GRANT 'school_read' TO 'kangshifu'@'localhost';
# 添加完成后使用SHOW语句查看是否添加成功,SQL语句如下
SHOW GRANTS FOR 'kangshifu'@'localhost';
# 使用kangshifu用户登录,然后查询当前角色,如果角色未激活,结果将显示NONE。SQL语句如下
SELECT CURRENT_ROLE();
mysql> SELECT CURRENT_ROLE();
+----------------+
| CURRENT_ROLE() |
+----------------+
| NONE           |
+----------------+
1 row in set (0.01 sec)
  • ⑧. 激活角色 - 方式1:使用set default role 命令激活角色
SET DEFAULT ROLE ALL TO 'kangshifu'@'localhost';
# 使用 SET DEFAULT ROLE 为下面4个用户默认激活所有已拥有的角色如下:
SET DEFAULT ROLE ALL TO
'dev1'@'localhost',
read_user1'@'localhost',
'read_user2'@'localhost',
'rw_user1'@'localhost';
  • ⑨. 方式2:将activate_all_roles_on_login设置为ON
# 默认情况:
mysql> show variables like 'activate_all_roles_on_login';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| activate_all_roles_on_login | OFF |
+-----------------------------+-------+
1 row in set (0.00 sec)
# 设置:这条 SQL 语句的意思是,对 所有角色永久激活 。运行这条语句之后,用户才真正拥有了赋予角色的所有权限。
SET GLOBAL activate_all_roles_on_login=ON;
  • ⑩. 撤销用户的角色
REVOKE role FROM user;
# 撤销kangshifu用户的school_read角色。 (1)撤销的SQL语句如下
REVOKE 'school_read' FROM 'kangshifu'@'localhost';
# 撤销后,执行如下查询语句,查看kangshifu用户的角色信息
SHOW GRANTS FOR 'kangshifu'@'localhost';

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:搜索Python答案的软件

搜索Python答案的软件 介绍:什么是搜索Python答案的软件? 搜索Python答案的软件是一种工具,可以帮助编程人员快速地找到他们在编写Python代码时遇到的问题的答案。这种软件可以搜索各种不同的网站,以帮助用户找到最适合他们问题…

实例006 菜级联菜单

实例说明 如果管理程序功能菜单非常多,一些功能中又包括许多子功能,这时可以使用级联菜单来组织系统的各个功能。实例运行结果如图1.6所示。 图1.6 级联菜单 技术要点 制作级联菜单需要使用MenuStrip控件。 注意:在使用级联菜单时最好不要…

Redis三种模式——主从复制、哨兵、集群

目录 一、概述 二、 Redis 主从复制 1.主从复制的作用 2. 主从复制流程 3. 搭建Redis 主从复制 3.1准备环境 3.2安装redis 3.3创建redis工作目录 3.4环境变量 3.5定义systemd服务管理脚本 3.6修改 Redis 配置文件(Master节点操作) 3.7修改 …

我在「亚马逊云科技中国峰会」做讲师 - 「程序员的社区成长史」

文章目录 ⭐️ Part - 〇:开场的自我介绍⭐️ Part - ①:程序员的学习从技术社区开始🌟 编程初学者共同面对的迷茫🌟 加入一个适合自己的技术社区🌟 反哺社区做有价值的贡献者 ⭐️ Part - ②:与技术社区的…

STM32F4 WiFi上传温度【ds18b20传感器、网络通信】

通过WIFI或GPRS上传温度到云端 本篇博客将介绍如何使用WIFI或GPRS模块将温度数据上传到云端。我们将涵盖连接网络的过程、上传数据的过程以及相关代码。 准备工作 在开始之前,我们需要准备以下材料: STM32F4开发板温度传感器(例如18B20&a…

ch0_汇编介绍

1. 汇编作用 1.1 1.2 1.3 2.  机器语言到汇编语言 2.1 2.2 2.3 3.  计算机的组成 3.1 指令和数据是存放在存储器中的, 而计算机包含多种存储器; 但是,在计算机工作的过程中, 指令和数据则必须存放到内存中。 而对于…

代码随想录二刷day41 | 动态规划之 343. 整数拆分 96.不同的二叉搜索树

day41 343. 整数拆分确定dp数组(dp table)以及下标的含义确定递推公式dp的初始化确定遍历顺序举例推导dp数组 96.不同的二叉搜索树确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 34…

【每日一题Day254】LC445两数相加Ⅱ | 链表反转 栈

两数相加Ⅱ【LC445】 给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 可以假设除了数字 0 之外,这两个数字都不会以零开头。 原来是专题模拟 反转链表 2022/11/4 思…

MySQL 记一个调优记录:最大化获取 uid 和 mobile

目录 前言调优过程总结 前言 环境:MySQL 5.6、windows 11 前阵子,有一个 BI 看板跑不起来,每次执行跑了很久,还不一定有结果,急需维护迭代。 经过调试,发现看板的SQL 逻辑中有一个开销非常大的逻辑影响了整…

2 Prometheus 简介

目录 1. 起源 2. Prometheus 架构 2.1 指标收集 2.2 服务发现 2.3 聚合和警报 2.4 查询数据 2.5 服务自治 2.6 冗余和高可用性 2.7 可视化 3. Prometheus数据模型 3.1 指标名称 3.2 标签 3.3 采样数据 3.4 符号表示 3.5 保留时间 4. 安全模型 5. Prometheus生态…

AI会取代程序员吗?这几个事实告诉你真相

人工智能(AI)的迅猛发展引起了许多关于其对各行各业的影响的讨论,其中包括程序员的未来。有人认为,AI的出现可能会使程序员岗位面临消失的风险,因为它们可以自动化编码和解决问题的过程。然而,在我们下结论…

MySQL:UNION的使用

UNION的使用 前言一、合并查询结果二、语法格式:三、UNION操作符四、UNION ALL操作符五、使用 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主! 也许一个人独行,可以走的很快…

全志V3S嵌入式驱动开发(full image制作和资料汇总)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 所谓的full image制作,就是制作一个image,上面包含了所有的嵌入式软件、库和配置文件。之前虽然我们也构建了spi-nor、spi-…

AC/DC(二): 整流

一、全波整流电路 全波整流电路可以看作是由两个半波整流电路组合而成,如图1所示, 图1 变压器次级线圈中间引出一个中心抽头,把次级线圈分成两个对称的绕组,从而引出大小相等但极性相反的两个电压VD1、VD2,构成VD1、…

14 MFC多进程

文章目录 创建进程win32子进程内容创建进程传递参数关闭进程通过配置文件读取全部代码 打开进程便利进程 创建进程 分别创建MFC应用程序和Win32应用程序 MFC应用程序界面设置 win32子进程内容 #include <Windows.h> int WINAPI wWinMain(HINSTANCE hInstance, HINSTAN…

分享在Linux下使用OSGi.NET插件框架快速实现一个分布式服务集群的方法

在这篇文章我分享了如何使用分层与模块化的方法来设计一个分布式服务集群。这个分布式服务集群是基于DynamicProxy、WCF和OSGi.NET插件框架实现的。我将从设计思路、目标和实现三方面来描述。 1 设计思路 首先&#xff0c;我来说明一下设计思路。我们先来看看目前OSGi.NET插件…

C++中生成二维码-libqrencode

文章目录 前言libqrencode在qt中调用libqrencode其他 前言 二维码的种类很多。本文仅介绍&#xff0c;如何用C生成QR码(QRcode)。通常而言&#xff0c;我们不需要知道QR码的详细结构&#xff0c;如QrCode的结构原理与实战 | 张展鹏的博客。我们只需要&#xff0c;可以将文本转…

Python——— 字符串

&#xff08;一&#xff09;字符串 字符串是 Python 中最常用的数据类型。我们可以使用引号 ( 或 " ) 来创建字符串。顾名思义&#xff0c;羊肉串是由羊肉做成的串&#xff0c;而字符串就是由字符组成的。 字符串的本质是&#xff1a;字符序列。 2 Python 不支持单字符…

Kafka 小结

Kafka 是由 Linkedin 开发并开源的分布式消息系统&#xff0c;因其分布式及高吞吐率而被广泛使用&#xff0c;现已与 Cloudera Hadoop、Apache Storm、Apache Spark、Flink 集成。 Kafka 使用场景 页面访问量 PV、页面曝光 Expose、页面点击 Click 等行为事件&#xff1b;实时计…