【MySQL】Linux下MySQL的目录结构、用户、权限与角色

一、Linux下MySQL的目录结构

1、MySQL相关目录

  • 数据库文件存放路径:/var/lib/mysql
  • 数据库命令存放路径:/user/bin/user/sbin
  • 配置文件目录:/usr/share/mysql-8.0//usr/share/mysql//etc/my.cnf

2、假设我们创建了一个数据库dbtest1,在这个数据库下创建了表test1

  • 如果表使用InnoDB存储结构,在/var/lib/mysql/dbtest1下会生成如下文件
    • 存储表结构(5.7版本存在):test1.frm
    • 存放此数据库的字符集、比较规则等配置(5.7版本存在):db.opt
    • 数据信息和索引信息存放:
      • 如果使用系统表空间存储模式:表数据会存放到/var/lib/mysql/ibdata1
      • 如果使用独立表空间存储模式:/var/lib/mysql/dbtest1下会生成test1.idb(8.0版本没有.frm和.opt文件,独立表空间存储模式下,表结构、数据以及db.opt存放的配置信息都会存放到.idb文件中)
  • 如果表使用MyISAM存储结构,在/var/lib/mysql/dbtest1下会生成如下文件
    • 存储数据信息(如果采用独立表空间的存储模式):test1.MYD(MyData)
    • 存放索引信息文件:test1.MYI(MyIndex)
    • 存储表结构:test1.frm(5.7版本)或test_xxx.sdi(8.0版本)
  • 创建视图:MySQLl5.7会创建一个xxx_view.frm存放视图结构(8.0版本还没找到在哪,暂时留一个疑问)

决定使用系统表空间还是独立表空间,由参数innodb_file_per_table决定,可以在my.cnf下配置

  • innodb_file_per_table=0:使用系统表空间
  • innodb_file_per_table=1:使用独立表空间
mysql> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)mysql>

这里的ON,表示使用独立表空间

3、可以使用命令ibd2sdi --dump-file=test1.txt test1.ibd查看存放表数据的文件test1.ibd

二、用户管理

1、查看当前系统中存在的用户
使用mysql这个database,执行select host,user from user;语句

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 -ADatabase changed
mysql>
mysql>
mysql> select host,user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | root             |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
+-----------+------------------+
4 rows in set (0.00 sec)mysql>

2、创建用户CREATE USER

mysql> create user 'test001' identified by 'test001Pwd';
Query OK, 0 rows affected (0.01 sec)mysql> select host,user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | root             |
| %         | test001          |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
+-----------+------------------+
5 rows in set (0.00 sec)mysql>
mysql> create user 'test001'@'localhost' identified by 'test001Pwd';
Query OK, 0 rows affected (0.00 sec)mysql>
mysql> select host,user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | root             |
| %         | test001          |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | test001          |
+-----------+------------------+
6 rows in set (0.00 sec)mysql>

我们发现,同一个用户test001,可以被创建多次
因为user表中,host+user字段是联合主键

联合主键:指的是把两个列看成是一个整体,这个整体是不为空,唯一,不重复

3、修改用户名(注意flush privileges)

mysql> create user 'test002'@'localhost' identified by 'test002Pwd';
Query OK, 0 rows affected (0.00 sec)mysql>
mysql> select host,user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | root             |
| %         | test001          |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | test001          |
| localhost | test002          |
+-----------+------------------+
7 rows in set (0.00 sec)mysql>
mysql> update user set user = 'test003' where user = 'test002' and host = 'localhost';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql>
mysql> select host,user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | root             |
| %         | test001          |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | test001          |
| localhost | test003          |
+-----------+------------------+
7 rows in set (0.00 sec)mysql>
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)mysql>

我们新建了一个用户test002,修改用户名为test003后,
如果未执行flush privileges;,那么当我们尝试用test003登录,会发现失败
在这里插入图片描述

4、删除用户

# 方式一:使用DROP
# 默认删除host为%的用户
DROP USER user1,user2...;
# 删除指定host的用户
DROP USER 'test001'@'localhost';# 方式二:使用delete(不推荐)
DELETE from mysql.user where user = 'test001' and host = 'localhost';
flush privileges;

5、设置用户密码

  • 修改当前用户的密码,我们之前把test002改为test003,我们尝试改一下test003的密码
    • 方式一:使用alter user user() identified by '新密码';
    • 方式二:使用SET password = '新密码';

使用alter user user() identified by '新密码';把密码从test002Pwd改为test003

[root@myLinux2 ~]# mysql -utest003 -ptest002Pwd
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
...
mysql>
mysql> alter user user() identified by 'test003';
Query OK, 0 rows affected (0.01 sec)mysql> exit;
Bye
[root@myLinux2 ~]# mysql -utest003 -ptest002Pwd
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'test003'@'localhost' (using password: YES)
[root@myLinux2 ~]#
[root@myLinux2 ~]# mysql -utest003 -ptest003
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 8.0.36 MySQL Community Server - GPL
...

使用SET password = '新密码';把密码从test003改为test003Pwd

mysql> SET password = 'test003Pwd';
Query OK, 0 rows affected (0.00 sec)mysql> exit
Bye
[root@myLinux2 ~]# mysql -utest003 -ptest003
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'test003'@'localhost' (using password: YES)
[root@myLinux2 ~]#
[root@myLinux2 ~]# mysql -utest003 -ptest003Pwd
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 8.0.36 MySQL Community Server - GPL
...
mysql>
  • 修改其他用户的密码:需要是root用户或者被root用户赋予修改密码的权限
    • 方式一:使用alter user 'user'@'host' identified by '新密码';
    • 方式二:使用SET PASSWORD FOR 'user'@'host' = '新密码';

使用alter user 'user'@'host' identified by '新密码';修改test003的密码为test003

mysql> ALTER USER 'test003'@'localhost' identified by 'test003';
Query OK, 0 rows affected (0.01 sec)

在这里插入图片描述
使用SET PASSWORD FOR 'user'@'host' = '新密码';修改test003的密码为test003Pwd

mysql> SET PASSWORD FOR 'test003'@'localhost' = 'test003Pwd';
Query OK, 0 rows affected (0.00 sec)

在这里插入图片描述

三、权限管理

1、授权的原则

  • 最小权限原则:只给予用户他职权范围内的最小权限,比如用户只能查询,就只给他select权限
  • 创建用户的时候,限制用户的登陆主机,限制他的网段或IP
  • 每个用户的密码都要满足密码复杂度
  • 定期清理用户账号和权限

2、查看用户权限
使用show grants;或者show grants for 'test001'@'localhost';
在这里插入图片描述

3、授权方式(需要是root用户)

  • 方式一:直接给用户授权:grant 权限1,权限2 on database名称.表名 to '用户名'@'host';

首先我们使用show grants;查看一下当前用户的权限
在这里插入图片描述
如果想给用户授权某个数据下的所有表的权限,那么database名称.表名需要换成database名称.*

mysql> grant select,update on dbtest1.* to 'test003'@'localhost';
Query OK, 0 rows affected (0.00 sec)mysql>

我们测试一下test003的权限,发现确实是只有select和update权限

mysql> show grants;
+--------------------------------------------------------------+
| Grants for test003@localhost                                 |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO `test003`@`localhost`                  |
| GRANT SELECT, UPDATE ON `dbtest1`.* TO `test003`@`localhost` |
+--------------------------------------------------------------+
2 rows in set (0.00 sec)mysql>
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| dbtest1            |
| information_schema |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)mysql>
mysql> use dbtest1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql>
mysql> show tables;
+-------------------+
| Tables_in_dbtest1 |
+-------------------+
| test1             |
| test1_view        |
+-------------------+
2 rows in set (0.00 sec)mysql>
mysql> select * from test1;
+------+--------+
| id   | name   |
+------+--------+
|    1 | decade |
|    2 | 十年   |
+------+--------+
2 rows in set (0.00 sec)mysql>
mysql> update test1 set name = 'decadeNew' where id = '1';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from test1;
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | decadeNew |
|    2 | 十年      |
+------+-----------+
2 rows in set (0.00 sec)mysql>
mysql> delete from test1 where id = '1';
ERROR 1142 (42000): DELETE command denied to user 'test003'@'localhost' for table 'test1'
mysql>

然后我们再把delete权限也给他加上

mysql> grant delete on dbtest1.* to 'test003'@'localhost';
Query OK, 0 rows affected (0.00 sec)

重新登录之后,删除权限生效

mysql> delete from test1 where id = '1';
Query OK, 1 row affected (0.00 sec)mysql> select * from test1;
+------+--------+
| id   | name   |
+------+--------+
|    2 | 十年   |
+------+--------+
1 row in set (0.00 sec)mysql>
mysql>
mysql> show grants;
+----------------------------------------------------------------------+
| Grants for test003@localhost                                         |
+----------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `test003`@`localhost`                          |
| GRANT SELECT, UPDATE, DELETE ON `dbtest1`.* TO `test003`@`localhost` |
+----------------------------------------------------------------------+
2 rows in set (0.00 sec)mysql>

如果想把所有表下的所有的权限都授予某个用户,那么可以使用
GRANT all privileges ON *.* TO '用户名'@'host';

  • 方式二:把权限赋予给角色,然后把用户和角色进行绑定

4、权限的横向分组和纵向分组

  • 横向分组:可以接触到的数据范围,例如数据库、表
  • 纵向分组:对接触到的数据能访问到什么程度,如查看、更新、删除、插入等

5、收回权限(注意是FROM不是TO)
使用REVOKE 权限1,权限2 ON database名称.表名 FROM '用户名'@'host';

mysql> revoke select on dbtest1.test1 from 'test001'@'localhost';
Query OK, 0 rows affected (0.00 sec)

重新登陆后,发现权限已失效

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
+--------------------+
2 rows in set (0.00 sec)mysql>
mysql> show grants;
+---------------------------------------------+
| Grants for test001@localhost                |
+---------------------------------------------+
| GRANT USAGE ON *.* TO `test001`@`localhost` |
+---------------------------------------------+
1 row in set (0.00 sec)mysql>
mysql> SELECT CURRENT_USER;
+-------------------+
| CURRENT_USER      |
+-------------------+
| test001@localhost |
+-------------------+
1 row in set (0.00 sec)mysql>

如果回收某个用户所有表下的所有的权限,那么可以使用
REVOKE all privileges ON *.* FROM '用户名'@'host';

6、业务开发
实际业务开发时,访问数据库不应该使用root用户,可以单独创建一个业务账号,进行相应授权
防止root密码泄露之后,数据库处于一个危险状态

7、权限表(根据联合主键确定数据的唯一性)

  • user表:关键字段user、host、authentication_string(密码),决定用户能否正常登录
    在这里插入图片描述
  • db表:记录用户对某个database拥有的权限信息
    在这里插入图片描述
  • tables_priv:记录用户对某个表拥有的权限信息
    在这里插入图片描述
  • columns_priv:记录用户对某个字段拥有的权限信息
    在这里插入图片描述
  • procs_priv:记录用户对某个存储过程和函数拥有的权限信息
    在这里插入图片描述

在MySQL启动时,服务器将这些表中的权限信息内容读入内存

8、MySQL访问控制

  • 连接核实阶段:将当前用户信息和user表中的user、host、authentication_string(密码)进行匹配,决定用户能否正常登录
  • 请求核实阶段:从user表到db表,然后一层一层向下检查当前用户的权限,确定是否满足当前请求所需权限,如果找到匹配结果,操作被允许,否则就就返回错误信息

四、角色管理

1、在MySQL中,角色是权限的集合,引入角色之后,方便管理权限相同的用户

2、创建角色

mysql> create user 'test002' identified by 'test002Pwd';
Query OK, 0 rows affected (0.00 sec)mysql>
mysql> create role 'manager'@'%';
Query OK, 0 rows affected (0.00 sec)mysql> GRANT select,update on dbtest1.* to 'manager'@'%';
Query OK, 0 rows affected (0.01 sec)mysql>
mysql> show grants for 'manager'@'%';
+------------------------------------------------------+
| Grants for manager@%                                 |
+------------------------------------------------------+
| GRANT USAGE ON *.* TO `manager`@`%`                  |
| GRANT SELECT, UPDATE ON `dbtest1`.* TO `manager`@`%` |
+------------------------------------------------------+
2 rows in set (0.00 sec)mysql> revoke update on dbtest1.* from 'manager'@'%';
Query OK, 0 rows affected (0.00 sec)mysql>
mysql> show grants for 'manager'@'%';
+----------------------------------------------+
| Grants for manager@%                         |
+----------------------------------------------+
| GRANT USAGE ON *.* TO `manager`@`%`          |
| GRANT SELECT ON `dbtest1`.* TO `manager`@`%` |
+----------------------------------------------+
2 rows in set (0.00 sec)mysql>

上面我们测试了一下创建角色、赋予权限、查询角色权限和回收权限

同理,我们也可以使用下面的语句,将角色与所有权限进行绑定和解绑
GRANT all privileges on *.* to 'manager'@'%';
REVOKE all privileges on *.* FROM 'manager'@'%';

删除角色使用DROP ROLE '用户名'@'host';

mysql> create role 'employee'@'%';
Query OK, 0 rows affected (0.00 sec)mysql> show grants for 'employee'@'%';
+--------------------------------------+
| Grants for employee@%                |
+--------------------------------------+
| GRANT USAGE ON *.* TO `employee`@`%` |
+--------------------------------------+
1 row in set (0.00 sec)mysql> drop role 'employee'@'%';
Query OK, 0 rows affected (0.01 sec)mysql>
mysql> show grants for 'employee'@'%';
ERROR 1141 (42000): There is no such grant defined for user 'employee' on host '%'
mysql>

3、给用户和角色进行绑定

mysql> create user 'test002' identified by 'test002Pwd';
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> show grants for 'test002'@'%';
+-------------------------------------+
| Grants for test002@%                |
+-------------------------------------+
| GRANT USAGE ON *.* TO `test002`@`%` |
+-------------------------------------+
1 row in set (0.00 sec)mysql>
mysql>
mysql> grant 'manager'@'%' to 'test002'@'%';
Query OK, 0 rows affected (0.00 sec)mysql>
mysql> show grants for 'test002'@'%';
+--------------------------------------+
| Grants for test002@%                 |
+--------------------------------------+
| GRANT USAGE ON *.* TO `test002`@`%`  |
| GRANT `manager`@`%` TO `test002`@`%` |
+--------------------------------------+
2 rows in set (0.00 sec)mysql>

4、激活角色
注意:用户绑定之后还需要激活角色,权限才能生效

  • 方式一:使用set default role激活

执行前使用select CURRENT_ROLE();查询当前用户的角色信息

mysql> select CURRENT_ROLE();
+----------------+
| CURRENT_ROLE() |
+----------------+
| NONE           |
+----------------+
1 row in set (0.00 sec)mysql>
mysql> set default role 'manager'@'%' to 'test002'@'%';
Query OK, 0 rows affected (0.00 sec)mysql>

执行完成之后,用户重新登录,发现已拥有manager角色的权限

mysql> select CURRENT_ROLE();
+----------------+
| CURRENT_ROLE() |
+----------------+
| `manager`@`%`  |
+----------------+
1 row in set (0.00 sec)mysql> select * from dbtest1.test1;
+------+--------+
| id   | name   |
+------+--------+
|    2 | 十年   |
+------+--------+
1 row in set (0.00 sec)mysql>
  • 方式二:修改系统变量(设置到配置文件里也可以)
    这样一来,后续再进行角色绑定,就不用手动激活了,只需要重新登录即可
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)mysql>
mysql> SET global activate_all_roles_on_login=ON;
Query OK, 0 rows affected (0.00 sec)mysql>
mysql> show variables like 'activate_all_roles_on_login';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| activate_all_roles_on_login | ON    |
+-----------------------------+-------+
1 row in set (0.01 sec)mysql>

5、撤销用户角色
使用revoke '角色'@'host' from '用户'@'host';

mysql> revoke 'manager'@'%' from 'test002'@'%';
Query OK, 0 rows affected (0.01 sec)mysql>

这样一来,test002的角色就被撤销了
在这里插入图片描述

如有错误,欢迎指正!!!

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

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

相关文章

探索视觉世界:深入了解目标检测算法的奥秘

目标检测算法 一、介绍目标检测算法的背景和意义1.1 目标检测的定义和应用场景1.2 目标检测算法的发展历程 二、目标检测算法分类2.1 传统目标检测算法2.1.1 基于分类器的目标检测算法2.1.2 基于模板匹配的目标检测算法 2.2 深度学习目标检测算法2.2.1 两阶段目标检测算法2.2.2…

firewalld防火墙转发流量到其他端口forward port rules

假设云主机eth0: 47.93.27.106 tun0: inet 10.8.0.1 netmask 255.255.255.0 Show rules for a specific zone (public) sudo firewall-cmd --zonepublic --list-all Add the tun0 interface to the public zone: sudo firewall-cmd --zonepublic --add-interfacetun0 --…

Linux基础篇——学习Linux基本工具安装教程视频链接

本篇文章就是记录一下学习Linux需要用到的基本工具的视频教程链接,方便以后查看 VMware15.5安装 安装视频教程:VMware15.5安装教程 centos7.6安装(这个视频教程真的很nice) 视频教程:centos7.6 虚拟机克隆、快照、…

【区块链+基础设施】区块链服务网络 BSN | FISCO BCOS应用案例

BSN(Blockchain-based Service Network,区块链服务网络)是一个跨云服务、跨门户、跨底层框架,用于部 署和运行各类区块链应用的全球性基础设施网络,旨在为开发者提供低成本和技术互通的区块链一站式服务。 2019 年 12…

Pharmacy Management System v1.0 文件上传漏洞(CVE-2022-30887)

前言 CVE-2022-30887 是一个存在于 Pharmacy Management System v1.0 中的远程代码执行(RCE)漏洞。这个漏洞存在于 /php_action/editProductImage.php 组件中。攻击者可以通过上传一个精心制作的图像文件来执行任意代码。 漏洞详细信息 漏洞描述: Pha…

零基础STM32单片机编程入门(五)FreeRTOS实时操作系统详解及实战含源码视频

文章目录 一.概要二.什么是实时操作系统三.FreeRTOS的特性四.FreeRTOS的任务详解1.任务函数定义2.任务的创建3.任务的调度原理 五.CubeMX配置一个FreeRTOS例程1.硬件准备2.创建工程3.调试FreeRTOS任务调度 六.CubeMX工程源代码下载七.讲解视频链接地址八.小结 一.概要 FreeRTO…

新版一键AI视频图片换脸神器来了!目前最强的AI视频换脸工具Swapface!

之前发过一款AI换脸工具,可惜部署门槛太高, 有没有换头换脸的AI工具? 今天就给你们安排到家! Swapface AI工具一键开箱包‍(一键整合包添加下方领取~) 它使用先进的人工智能和计算机视觉技术,可以在几秒…

秋招突击——6/24——复习{完全背包问题——买书,状态转换机——股票买卖V}——新作{两数相除,LRU缓存实现}

文章目录 引言复习完全背包问题——买书个人实现 状态转换机——股票买卖V个人实现参考实现 新作两数相除个人实现 新作LRU缓存实现个人实现unordered_map相关priority_queue相关 参考实现自己复现 总结 引言 今天知道拼多多挂掉了,难受,那实习就是颗粒无…

体验升级:扫描全能王智能高清滤镜2.0全面测评

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

【接口自动化测试】第四节.实现项目核心业务的单接口自动化测试

文章目录 前言一、登录单接口自动化测试 1.1 登录单接口文档信息 1.2 登录成功 1.3 登录失败(用户名为空)二、数据驱动的实现 2.1 json文件实现数据驱动总结 前言 一、登录单接口自动化测试 1.1 登录单接口文档信息 需求&#xff1…

LeetCode 子集

原题链接78. 子集 - 力扣(LeetCode) 这是一道暴力搜索问题参考大佬们的题解,对这类题目做出一下总结 1.确定递归参数变量 2.递归结束条件 3.做出选择,递归调用进入下一层 4.回溯,返回到递归前的状态 要完成前面这…

【Matlab函数分析】imread从图形文件读取图像

🔗 运行环境:Matlab 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 #### 防伪水印——左手の明天 #### 💗 大家好🤗&#x1f91…

Qt6.6编译Qt二维图形编辑器QVGE源码

QVGE是一个开源的多平台QtC编写的图形编辑器,可以用来画网络节点图,或者其他作用。 QVGE可以轻松创建和参数设定的小型到中型图形(1000节点/边缘),共同的视觉特性的节点和边缘:形状、尺寸、颜色、标签等。定义(用户定义)属性的图表…

前端技术(二)——javasctipt 介绍

一、javascript基础 1. javascript简介 ⑴ javascript的起源 ⑵ javascript 简史 ⑶ javascript发展的时间线 ⑷ javascript的实现 ⑸ js第一个代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>…

探究Qt5【元对象编译器,moc】的 设计原理和技术细节

Qt5是一个跨平台C框架&#xff0c;它有个突出的特点就是其元对象系统&#xff0c;该系统通过扩展C的能力&#xff0c;为事件处理提供了信号与槽机制、为对象内省提供了属性系统。为了支持这些特性&#xff0c;Qt引入了元对象编译器&#xff08;Meta-Object Compiler, MOC&#…

C++视觉开发 一.OpenCV环境配置

一.OpenCV安装环境配置 1.OpenCV安装 &#xff08;1&#xff09;下载 官方下载链接&#xff1a;http://opencv.org/releases 这边选择需要的版本&#xff0c;我是在windows下的4.9.0。&#xff08;科学上网下载很快&#xff0c;否则可能会有点慢&#xff09; (2)安装 双击下…

使用systemd管理Linux下的frps服务:安装、配置及自动化操作指南

在 Linux 系统下&#xff0c;使用 systemd 可以方便地控制 frps 服务端的启动、停止、配置后台运行以及开机自启动。以下是具体的操作步骤&#xff1a; 1. 安装 systemd 如果您的 Linux 服务器上尚未安装 systemd&#xff0c;可以使用包管理器如 yum&#xff08;适用于 Cent…

基于RabbitMQ的异步消息传递:发送与消费

引言 RabbitMQ是一个流行的开源消息代理&#xff0c;用于在分布式系统中实现异步消息传递。它基于Erlang语言编写&#xff0c;具有高可用性和可伸缩性。在本文中&#xff0c;我们将探讨如何在Python中使用RabbitMQ进行消息发送和消费。 安装RabbitMQ 在 Ubuntu 上安装 Rabbi…

GaussDB关键技术原理:高性能(三)

GaussDB关键技术原理&#xff1a;高性能&#xff08;二&#xff09;从查询处理综述对GaussDB的高性能技术进行了解读&#xff0c;本篇将从查询重写RBO、物理优化CBO、分布式优化器、布式执行框架、轻量全局事务管理GTM-lite等五方面对高性能关键技术进行分享。 目录 3 高性能…

PyTorch之nn.Module、nn.Sequential、nn.ModuleList使用详解

文章目录 1. nn.Module1.1 基本使用1.2 常用函数1.2.1 核心函数1.2.2 查看函数1.2.3 设置函数1.2.4 注册函数1.2.5 转换函数1.2.6 加载函数 2. nn.Sequential()2.1 基本定义2.2 Sequential类不同的实现2.3 nn.Sequential()的本质作用 3. nn.ModuleList参考资料 本篇文章主要介绍…