-
1. 示例查询 1.在PG_TABLES系统表中查看public schema中包含的所有表。 SELECT distinct(tablename) FROM pg_tables WHERE SCHEMANAME = 'public'; 2.通过PG_USER可以查看数据库中所有用户的列表,还可以查看用户ID(USESYSID)和用户权限。 SELECT * FROM pg_user; 3.通过视图PG_STAT_ACTIVITY可以查看正在运行的查询语句。 a.当此参数为on时,数据库系统才会收集当前活动查询的运行信息。 SET track_activities = on; b.查看正在运行的查询语句。以查看正在运行的查询语句所连接的数据库名、执行查询的用户、查询状态及查询对应的PID。 SELECT datname, usename, state,pid FROM pg_stat_activity; 如果state字段显示为idle,则表明此连接处于空闲,等待用户输入命令。 c.若需要取消运行时间过长的查询,通过PG_TERMINATE_BACKEND函数,根据线程ID结束会话。 SELECT PG_TERMINATE_BACKEND(139834759993104); 1 显示类似如下信息,表示结束会话成功。 PG_TERMINATE_BACKEND ---------------------- t (1 row) 显示类似如下信息,表示用户执行了结束当前会话的操作。 FATAL: terminating connection due to administrator command FATAL: terminating connection due to administrator command The connection to the server was lost. Attempting reset: Succeeded. gsql客户端使用PG_TERMINATE_BACKEND函数结束当前会话后台线程时,客户端不会退出而是自动重连。即还会返回“The connection to the server was lost. Attempting reset: Succeeded.” 2. 系统表和系统视图概述 一般非管理员无权查看系统表和视图,用户应该禁止对系统表进行增删改等操作,人为对系统表的修改或破坏可能会导致系统各种异常情况甚至集群不可用。 3. 常见系统表 1. PG_ATTRDEF PG_ATTRDEF系统表存储列的默认值 2. PG_ATTRIBUTE PG_ATTRIBUTE系统表存储关于表字段的信息。 3. PG_AUTH_MEMBERS PG_AUTH_MEMBERS系统表存储显示角色之间的成员关系。 4. PG_CLASS PG_CLASS系统表存储数据库对象信息及其之间的关系。 5. PG_CONSTRAINT PG_CONSTRAINT系统表存储表上的检查约束、主键、唯一约束和外键约束。 6. PG_DATABASE PG_DATABASE系统表存储关于可用数据库的信息。 7. PG_DEFAULT_ACL PG_DEFAULT_ACL系统表存储为新建对象设置的初始权限。 8. PG_EXTENSION PG_EXTENSION系统表存储关于所安装扩展的信息。 9. PG_EXTENSION_DATA_SOURCE PG_EXTENSION_DATA_SOURCE系统表存储外部数据源对象的信息。 10. PG_FOREIGN_TABLE PG_FOREIGN_TABLE系统表存储外部表的辅助信息。 11. PG_INDEX PG_INDEX系统表存储索引的一部分信息,其他的信息大多数在PG_CLASS中。 12. PG_INHERITS PG_INHERITS系统表记录关于表继承层次的信息。数据库里每个直接的子系表都有一条记录。间接的继承可以通过追溯记录链来判断。 13. PG_JOB PG_JOB系统表存储用户创建的定时任务的任务详细信息,定时任务线程定时轮询pg_job系统表中的时间,当任务到期会触发任务的执行,并更新pg_job表中的任务状态。该系统表属于Shared Relation,所有创建的job记录对所有数据库可见。 14. PG_JOB_PROC PG_JOB_PROC系统表对应PG_JOB表中每个任务的作业内容(包括:PL/SQL代码块、匿名块)。将存储过程信息独立出来,是因为Oracle中这个字段是varchar(4000)的,如果放到PG_JOB中,被加载到共享内存的时候,会占用不必要的空间,所以在使用的时候再进行查询获取。 15. PG_NAMESPACE PG_NAMESPACE系统表存储名字空间,即存储schema相关的信息。 16. PG_PARTITION PG_PARTITION系统表存储数据库内所有分区表(partitioned table)、分区(table partition)、分区上toast表和分区索引(index partition)四类对象的信息。分区表索引(partitioned index)的信息不在PG_PARTITION系统表中保存。 17. PG_PROC PG_PROC系统表存储函数或过程的信息。 18. PG_RESOURCE_POOL PG_RESOURCE_POOL系统表提供了数据库资源池的信息。 19. PG_STATISTIC PG_STATISTIC系统表存储有关该数据库中表和索引列的统计数据。需要有系统管理员权限才可以访问此系统表。 20. PG_TABLESPACE PG_TABLESPACE系统表存储表空间信息。 21. PG_TRIGGER PG_TRIGGER系统表存储触发器信息。 22. PG_TYPE PG_TYPE系统表存储数据类型的相关信息。 23. PG_USER_STATUS PG_USER_STATUS系统表提供了访问数据库用户的状态。需要有系统管理员权限才可以访问此系统表。 24. PGXC_CLASS PGXC_CLASS系统表存储每张表的复制或分布信息。 25. PGXC_GROUP PGXC_GROUP系统表存储节点组信息。 26. PGXC_NODE PGXC_NODE系统表存储集群节点信息。
-
什么是数据库 数据库是按照数据结构来组织、存储和管理数据的仓库,用户可以通过数据库管理系统对存储的数据进行增删改查操作。 数据库实际上是一个文件集合,本质就是一个文件系统,以文件的方式,将数据保存在电脑上。 什么是数据库管理系统 数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,是用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。 数据库、数据库管理系统、数据库管理工具之间的关系 数据库是存储和管理数据的仓库;而这个“数据库”是理论上的 要在计算机上实现存储和管理数据的操作靠的是数据库管理系统,MySQL就是其中一款 SQL是我们用来和数据库管理系统对话的语言 Workbench是MySQL的官方数据库管理工具,能让对数据库管理系统的操作更简单。 为什么使用数据库 从数据存储方式比较 优点: 相比内存,数据库中的数据可以永久保存 相比文件(Excel),海量数据存储时,提供不错的查询效率 缺点 :占用资源(重型武器) ,有些数据库需要付费 使用数据库可以高效且条理分明地存储数据,它使人们能够更加迅速和方便地管理数据,主要体现在以下几个方面。 1、数据库可以结构化存储大量的数据信息,方便用户进行有效的检索和访问。 数据库可以对数据进行分类保存,并且能够提供快速的查询。例如,我们平时使用百度搜索内容时,百度也是基于数据库和数据分类技术来达到快速搜索的目的。 2、数据库可以有效地保持数据信息的一致性、完整性、降低数据冗余。 可以很好地保证数据有效、不被破坏,而且数据库自身有避免重复数据的功能,以此来降低数据的冗余。 3、数据库可以满足应用的共享和安全方面的要求,把数据放在数据库中在很多情况下也是出于安全的考虑。 例如,如果把所有员工信息和工资数据都放在磁盘文件上,则工资的保密性就无从谈起。如果把员工信息和工资数据放在数据库中,就可以只允许查询和修改员工信息,而工资信息只允许指定人(如财务人员)查看,从而保证数据的安全性。 4、数据库技术能够方便智能化地分析,产生新的有用信息。 例如,超市中把物品销售信息保存在数据库中,每个月销售情况的排名决定了下半月的进货数量。数据库查询的结果实际上产生了新的数据信息。
-
在GaussDB中,database是对业务的物理隔离,不同database的之间的对象不能相互访问。比如在databaseA中无法访问databse B中的对象。因此登录集群的时候必须显示指定要连接的databse。 在GaussDB中创建database时,需要重点关注字符集编码(ENCODING)和兼容性(DBCOMPATIBILITY)两个配置项。ENCODING指明了数据库存储的数据的编码格式,为了适应全球化,创建DATABASE的时候建议使用UTF-8编码。DBCOMPATIBILITY 指明了DATABASE的兼容性选项,GaussDB支持Oracle、Teradata和MySQL三种兼容模式,分别兼容Oracle、Teradata和MySQL语法;若不指定DBCOMPATIBILITY,则默认为ORA。需要注意的是, 数据库一旦创建,这两个属性就不能修改,甚至语法层就没有提供修改这两个属性的接口 SCHEMA 在GaussDB(DWS)中,schema是DATABASE下一个特殊的对象,实现对数据库对象的逻辑隔离,从功能上类似于一些编程语言中namespace的概念。同一个schema下,不能存在同名的数据库对象;但是不同scheam下的对象名可以重复。 SEARCHPATH search_path又称之为模式搜索路径,本身是一个guc参数。对于未定义schema的对象,会根据search_path的配置赋予默认的schema或者默认的schema搜索范围 1)创建对象时,会在search_path指定的schema列表中的第一个schema下创建对象 USER 查询对象时,如果对象没有显式指明schema,GaussDB(DWS)会按照search_path中指明的schema列表,顺序查找指定名称的对象。如果遍历完所有的schema都没有查找到同名对象,数据库会直接报错。 系统表 pg_users pg_database pg_tables pg_tablespace pg_statistic 在PG_TABLES系统表中查看public Schema中包含的前缀为search_table的表 gaussdb=# SELECT distinct(tablename) FROM pg_tables WHERE SCHEMANAME = 'public' AND TABLENAME LIKE 'search_table%'; 查看和停止正在运行的查询语句 通过视图PG_STAT_ACTIVITY可以查看正在运行的查询语句。方法如下: 设置参数track_activities为on。 SET track_activities = on; 当此参数为on时,数据库系统才会收集当前活动查询的运行信息。 查看正在运行的查询语句。以查看正在运行的查询语句所连接的数据库名、执行查询的用户、查询状态及查询对应的PID为例: SELECT datname, usename, state,pid FROM pg_stat_activity; 如果state字段显示为idle,则表明此连接处于空闲,等待用户输入命令。 如果仅需要查看非空闲的查询语句,则使用如下命令查看: SELECT datname, usename, state, pid FROM pg_stat_activity WHERE state != 'idle'; 若需要取消运行时间过长的查询,通过PG_TERMINATE_BACKEND函数,根据线程ID(即2中查询结果的pid字段)结束会话。 SELECT PG_TERMINATE_BACKEND(12800); 查看最耗时SQL SELECT current_timestamp - query_start AS runtime, datname, usename, query FROM pg_stat_activity where state != 'idle' ORDER BY 1 desc; 使用gsql的\d+命令查询表的属性 gaussdb=# \d+ customer_t1; 执行如下命令将搜索路径设置为myschema、public,首先搜索myschema。 gaussdb=# SET SEARCH_PATH TO myschema, public; 撤销PUBLIC在public模式下创建对象的权限,下面语句中第一个“public”是模式,第二个“PUBLIC”指的是所有角色。 gaussdb=# REVOKE CREATE ON SCHEMA public FROM PUBLIC; 执行如下命令查询系统和用户定义的所有索引。 gaussdb=# SELECT RELNAME FROM PG_CLASS WHERE RELKIND='i'; 更新统计信息 ANALYZE tablename; --更新单个表的统计信息 ANALYZE; --更新全库的统计信息 表的选择 1.行存储 默认创建表的类型。数据按行进行存储,即一行数据是连续存储。适用于对数据需要经常更新的场景 gaussdb=# CREATE TABLE customer_t1 ( state_ID CHAR(2), state_NAME VARCHAR2(40), area_ID NUMBER ); --删除表 gaussdb=# DROP TABLE customer_t1; 2列存储 数据按列进行存储,即一列所有数据是连续存储的。单列查询IO小,比行存表占用更少的存储空间。适合数据批量插入、更新较少和以查询为主统计分析类的场景。列存表不适合点查询。 gaussdb=# CREATE TABLE customer_t2 ( state_ID CHAR(2), state_NAME VARCHAR2(40), area_ID NUMBER ) WITH (ORIENTATION = COLUMN); --删除表 gaussdb=# DROP TABLE customer_t2; 3行存表和列存表的选择 更新频繁程度 数据如果频繁更新,选择行存表。 插入频繁程度 频繁的少量插入,选择行存表。一次插入大批量数据,选择列存表。 表的列数 表的列数很多,选择列存表。 查询的列数 如果每次查询时,只涉及了表的少数(<50%总列数)几个列,选择列存表。 压缩率 列存表比行存表压缩率高。但高压缩率会消耗更多的CPU资源。
-
大家现在都在用哪些数据库?一起来分享一下当前最热门的数据库以及使用他们的原因?
-
[运维管理] select '20241204'||lpad(row_number()over(partition by '1' order by '1'),10,0) as a from test1;生成值类似日期加序列,是否有更高效率的替代方式?select '20241204'||lpad(row_number()over(partition by '1' order by '1'),10,0) as a from test1;'20241204'||lpad(row_number()over(partition by '1' order by '1'),10,0)生成值类似日期加序列,是否有更高效率的替代方式?
-
高斯数据库安装直接就是分布式的库吗?有没有单机版本的。
-
趋势预测功能模块主要实现基于历史时序数据预测未来时序变化趋势。该模块框架解耦,可以实现不同预测算法的灵活替换,并且该模块功能可以实现不同特征时序的算法自动选择,支持线性特征时序预测LR回归算法和非线性特征预测ARIMA算法。目前该模块可以覆盖线性时序、非线性时序和周期时序的准确预测。 时序预测模块和异常检测模块作为自监控的两个核心组件,通过采集程序获取数据后,在检测器阶段进行时序预测及异常检测,数据流转的流程如下: 数据获取和数据分析是一个相对于数据库环境独立的工具组件,包括Agent、检测器等子模块。其中Agent是部署在数据库主机环境上的,用于采集数据库中的性能指标,并通过网络,将其传送给远端检测器模块,远端检测器模块负责对采集到的性能指标数据进行收集、存储与检测。 Agent模块分为三个子模块,分别是Source、Channel以及Sink,各个组件之间可插拔、可扩展。其中数据收集端Source,用于直接监控数据库系统,并从数据库系统中采集信息;数据缓存器Channel,可以理解为缓存区,用来保存Source处捕获的数据,是一个FIFO的队列。Source捕获的数据会Push到Channel中,而后Sink组件消费由Source产生的数据。Channel缓存在内存中,为了防止OOM,具有容量上限,当超过容量上限时,过多的元素会被禁止放入队列。数据处理及外发Sink,负责从Channel消费数据,然后将数据从Channel中清除,以指定数据格式进行外发,将数据存储到外部存储系统。在数据从Channel端到Sink端的过程中,加入了JSON wrapper 和flow controller两个中间件,分别对应了JSON格式封装、流量控制功能。其中,由于Agent架构对限流功能天然友好,Channel充当缓存功能,实现漏桶算法进行限流。Sink上支持类似这种pipeline模式,以便后续对上传过程进行控制,提供可扩展能力。 从Agent发送到检测器的网络通信协议默认为https,默认证书在部署时由部署脚本生成。 检测器主要包括三个部分,分别是存储模块、时序预测模块、异常检测模块。本章节重点描述时序预测模块,异常检测模块在后续单独描述。 时序预测模块的执行流程如下: 时序预测模块提供了两种基本的预测模型,分别是线性模型和深度学习模型。另外系统给用户指定了三种预测模式,分别是decompose、ensemble、hybrid。Decompose代表分解预测模式,ensemble代表整体预测模式,hybrid代表混合预测模式,算法步骤为: 1. 首先获取训练数据,算法会判断数据的线性相关系数是否大于指定的阈值(系统默认0.9),如果大于阈值,则会选择线性预测模型(linear regressor),否则会选择循环神经网络预测模型(RNN)。 2. 如果用户选择decompose预测模式,系统会调用是时序分解算法将序列分解成周期项、趋势项、残差项,然后调用模型对趋势项进行训练,得到趋势的预测结果。对于周期不需要预测,可以根据周期性递推得到未来周期项。对于残差,系统基于统计学原理,取25%和75%分位作为残差项的上下限。最终预测结果为趋势项、周期项和残差项的和。 3. 如果用户选择ensemble预测模式,系统会直接对数据进行训练,然后进行预测,得到预测结果和模型评分。 4. 如果用户选择的hybrid模式,系统会串行的执行decompose和ensemble两种预测模式流程,同时根据它们最终模型评分的高低选择最优的预测结果。如果用户真实采集到的信息与时序预测的结果出现较大偏差(大于预设阈值),则认为当前情况出现异常,执行报警逻辑。
-
GaussDB提供500+指标的智能监测,通过对数据库指标、操作系统指标和运行日志的采集,拉取采集数据至时序数据库存储,便于后续进行异常侦测和问题定位。为了快速支撑各粒度的多维度指标采集,部署多个采集程序,例如数据库指标采集程序openGauss-exporter、操作系统指标采集程序node-exporter、本地执行采集程序cmd_exporter以及数据二次处理程序reprocessing-exporter等。 GaussDB智能监测程序采取服务化方式部署,通过RPC通道(默认Https协议,且校验数据库用户名密码,不存在空密码访问情况)实现,可以获取数据库的即时信息,也可以向数据库下发执行动作(需要用户提供的用户具备执行权限,具体数据库用户由用户指定)。时序数据处理支持多种时序库存,例如普罗米修斯、Influxdb等,尽管对接接口协议不同,但实现方式类似。后面以普罗米修斯时序库和采集程序进行举例,说明智能监控的方法和实现方案。下图为智能监测方案的执行时序图。 数据采集的实现过程: (1)Exporter 的数据采集原理如上图所示,采集过程是pull的形式,即由Prometheus 主动发起数据刮取(scrape)请求,而后exporter再想被监控服务(可以是数据库服务、Linux等)发起查询请求,由其通过http(s) 协议展示给Prometheus; (2)通过Prometheus 框架,按照Prometheus协议即可实现对应的exporter,该实现过程类似一个插件,通过Prometheus 提供的SDK(如prometheus-client库)即可完成开发过程; (3)所采集的指标项通过用户给定的配置文件解析获得,不需要在exporter中固化; (4)实现的exporter主要有两个,一个是openGauss-exporter,用于监控数据库实例,从其上面抓取数据;另一个是reprocessing-exporter, 用于对Prometheus已经采集到的数据进行二次加工。两个exporter是各自独立的进程。 (5)openGauss-exporter 是需要输入待监控数据库的登录密码的,该密码通过shell命令的配置参数输入。其中,在命令行中通过内存覆盖的技术擦除了命令行中的密码,避免了通过 ps –ux 等泄漏密码的可能。 (6)为进一步保障采集数据的安全性,exporter采集的数据源由用户手动配置,默认配置文件不涉及敏感数据,仅采集数据库性能相关指标;在网络协议方面,默认支持采用https协议,用户显性给定证书文件路径,并在Prometheus-server侧进行配置exporter采集工具和用户不涉及交互,所有SQL执行都有程序本身实现,不涉及SQL注入问题。 数据采集存储在时序数据库后,将进入趋势预测和异常检测模块,便于客户提前发现潜在问题或者实时发现系统中的异常问题。
-
在数据库自治运维技术领域,主要分为两条技术路线。其一是以Oracle为主的老牌数据库厂商,构建运维及生命周期管理统一逃课,实现大规模的数据库智能化管理能力;对用户通过运维工具指导业务快速升级和排障,对业务通过内置的优化诊断套件和多维度报表,快速定位性能瓶颈问题和实现SQL的快速优化。这种方案在单一集群或小规模集群是高效的,通过DBA能力复制,可快速完成运维技术的应用。另一种是以新兴云厂商为主,构建基于云化设施和环境的自治运维技术。尽管各家的技术不近统一,主体思路是一致的,即尽可能通过一套运维管理系统,纳管云化多套环境,通过机器学习技术和海量数据,训练高效诊断和优化模型,形成标准化运维套路。 GaussDB基于机器学习技术和云上海量数据信息,构建领先的自治运维管理系统,通过成熟算法实现负载感知、环境感知和数据感知,为数据库提供自监控、自诊断、自调优、自安全的能力,为客户和DBA提供极佳的运维管理体验。 上图为GaussDB的自治运维系统整体框图。数据采集层实现多维指标的数据采集,采集频率根据内容不同可分为秒级采集和分钟级采集。其中秒级采集包括操作系统资源信息采集和数据库实例信息采集,例如操作系统层面CPU、内存、IO读写、网络资源信息采集,数据库实例状态、数据库内关键指标(内存、连接数、TPS、QPS、读写频率等);分钟级采集包括审计日志采集、数据库日志采集和全量SQL流水采集等。 自治运维平台提供采集程序(Agent进程),可部署在数据库服务侧或者远端,连接数据库实例或所在服务器,采集上述指标;若客户系统配置普罗米修斯进行信息采集,可实现相应的exporter,在其中内置数据库多维度指标采集方法以及数据清理方案,实现与普罗米修斯平台对接。 数据库采集端程序需要部署在同数据库进程所在物理节点时,若数据库为多节点集群环境,每个物理节点可部署一个Agent进程采集端(或者普罗米修斯采集端)。数据库采集端程序通常占用资源很少,通过配置文件可以制定不同指标采集频率,以免占用资源影响数据库业务正常运行。 数据计算层提供数据存储、数据分析及元数据管理能力。其中数据存储用于接收来自数据采集层发生来的数据,存储数据源可以是多种维度或者类型,包括普罗米修斯、时序数据库(OpenTSDB等)、MongoDB、SQLite等,自治运维服务内置对接接口,每个自治服务模块与存储数据源的交互,获取数据并进行分析处理。在企业实际应用时,可根据需要选择不同的存储组件和大数据处理组件,例如普罗米修斯+时序数据库,或者kafka+时序数据库等方案。 在数据计算层除了时序存储数据库外,还可以设计其他存储单元,例如算法模型库和故障规则库。其中算法模型库存储自治管理服务生成的AI模型,例如参数推荐训练模型;在算法模型库中,可以存储传统机器学习(例如监督学习)模型、强化学习模型。故障规则库是记录数据库常见故障案例,将这些案例通过拆解和分析,生成规则引擎。 自治服务层在用户维度,可以分为SQL诊断和调优、自治安全、数据库运维。其中SQL诊断和调优提供多种SQL治理和调优能力,包括慢SQL诊断、SQL表现评估、智能索引推荐、智能查询重写等服务。自治安全通过AI技术实现敏感信息发觉、SQL注入检测和异常行为分析。数据库运维能力实现在数据库系统、OS系统和数据库集群层面的运维和调优,其中数据库系统服务包括数据库参数智能推荐、智能巡检、数据库分布键推荐和智能业务调度;在操作系统层面,实现慢盘检测和恢复、网络丢包检测;在数据库集群层面,基于故障或者负载需求,提供自动扩缩容、异常节点修复服务。 自治运维服务最终需要通过管控网页界面形式对外呈现,方便用户直观感受运维管理带来的效果。在展示界面方面,多指标结合AI趋势预测,可给出后续时段的数据走向。同时为方便用户系统观察集群状态,提供健康指数报告和详细综合报告。健康指数报告给出当前系统的健康评分等级,默认80分以上属于运行健康状况,小于60分则存在严重隐患,急需修复。综合报告详细描述系统各维度信息,包括集群状态、负载运行情况、常见数据库指标项信息。
-
数据库智能化发展史 云原生为迎接智能化提供了基础条件,智能化是GaussDB的新的牵引方向,两者相辅相成,互相促进。在智能化出现之前,数据库的运维管理主要依赖分层解耦、化繁为简方式来治理,通过人工服务对单点的业务进行管理。但在云化环境中,一个Region纳管上万实例,仅靠人工很难满足业务诉求,这就促成智能与数据库在云原生的架构和应用中释放的新的研发方向。 GaussDB基于智能化(AI)技术,打造AI4DB和DB4AI两大技术高地,重构数据库内核核心组件,提升数据库管理和优化技术,满足数据库科学家对普惠AI的诉求。AI4DB技术利用机器学习,基于海量运行期数据及负载数据,形成智能解决方案,自动化处理各项任务,加速运维和诊断优化效率提升。DB4AI通过数据库使能AI,满足数据科学家在数据治理方面的诉求,仅通过简易SQL调用,即刻完成机器学习算法的训练和推荐,实现人人会AI,人人用AI的普惠应用。 如上图所示,GaussDB AI4DB领域包含两个方面的核心子系统:自治运维系统及智能优化器(ABO)。其中自治运维系统提供用户和DBA进行数据库系统的智能化运维管理能力,包括自监控、自诊断、自调优等方面端到端的运维管理能力,主要目标是提升系统的运维诊断效率,让数据库系统更高效和可靠。智能优化器是将AI技术嵌入到数据库内核优化器引擎,实现智能基数估计、智能计划管理和智能代价模型等功能,提升查询语句生成计划的准确性和提供查询语句的执行效率。 GaussDB DB4AI领域指在数据库内实现机器学习引擎,即库内AI引擎。通过在数据库内置常用机器学习算法,把AI算法作为执行器中的执行算子在语句执行中实现,对外提供训练和推理的简易SQL语法方便用户调用。同时,在数据库内置模型管理能力,用户训练好的模型可以存储在系统表中,方便快速推理调用。在训练数据准备阶段,通过数据集管理能力,分为多个版本来保证数据训练的一致性,便于训练算法的调优。
-
openGauss你计算的表大小,有包含toast表么? 最近有一个同事问我说“openGauss中pg_relation_size函数在计算表的大小时是否包含了大字段的大小?”,经过思考后,自己觉得表的大小是不包含大字段的大小的,然后通过查看官网的文档说明,该函数含义为指定OID代表的表或者索引所使用的磁盘空间。如果只单独看这条定义,那么还是不清楚是否包含toast表,但是如果你看了数据库对象的其他函数,结合其他函数的解释应该可以得出结论在这里是不包含toast表的大小。即使知道结果了,还是想通过实际操作验证一下openGauss的pg_relation_size函数在计算表大小时未包含toast表大小。关于toast机制在这里就不做详细介绍,有兴趣的同学,可以自行查看相关资料。 准备测试用例 创建测试用例表 create table tbl_blog (id serial primary key,author varchar(50),title varchar(200),content text); 查看表结构 testdb=> \d+ tbl_blog Table "test.tbl_blog" Column | Type | Modifiers | Storage | Stats target | Description ---------+------------------------+-------------------------------------------------------+----------+--------------+------------- id | integer | not null default nextval('tbl_blog_id_seq'::regclass) | plain | | author | character varying(50) | | extended | | title | character varying(200) | | extended | | content | text | | extended | | Indexes: "tbl_blog_pkey" PRIMARY KEY, btree (id) TABLESPACE pg_default Has OIDs: no Options: orientation=row, compression=no 在这里我们可以看到author、title、content的storage列的值为extended,这是大多数toast数据类型的默认设置,表示允许行外存储和压缩,一般会先压缩,如果还是太大,就会行外存储。这里行外存储其实就是指,当行的记录的长度大于了TOAST_TUPLE_THRESHOLD(值为2KB)时,会触发TOAST,把大字段的列数据存储到TOAST表中。 查看tbl_blog关联的toast表的oid testdb=> select oid,relname,reltoastrelid from pg_class where relname='tbl_blog'; oid | relname | reltoastrelid -------+----------+--------------- 24608 | tbl_blog | 24612 (1 row) 查询关联的toast表的表名及表数据 --查看toast表名 testdb=# select relname from pg_class where oid = 24612; relname ---------------- pg_toast_24608 (1 row) 在这里可以看到TOAST表名,其实就是pg_toast+表的oid。 查看toast表的信息 testdb=# select tableoid ,* from pg_toast.pg_toast_24608; chunk_id | chunk_seq | chunk_data ----------+-----------+------------ (0 rows) --查看TOAST表结构 testdb=> \d+ pg_toast.pg_toast_24608 TOAST table "pg_toast.pg_toast_24608" Column | Type | Storage ------------+---------+--------- chunk_id | oid | plain chunk_seq | integer | plain chunk_data | bytea | 这里简单的对toast表的字段说明一下 chunk_id:普通表通过TOAST pointer关联到一个被TOAST的列 chunk_seq:同一个chunk_id如果大于TOAST_MAX_CHUNK_SIZE,将被切片存储。这里存储切片后的序号 chunk_data:真实的数据,但是在这里展示的都是二进制值 模拟数据验证 content字段插入少许值 执行命令插入数据 insert into tbl_blog(author,title,content) values('墨竹','推荐Postgresql中一些好用的psql命令','psql客户端工具应该是dba非常频繁使用的的工具。'); 查看表大小和toast表的大小 testdb=# select pg_relation_size(oid) as tb_size,pg_relation_size(reltoastrelid) as toast_size from pg_class where relname='tbl_blog'; tb_size | toast_size ---------+------------ 8192 | 0 (1 row) --同样在toast表的数据仍然为空 testdb=# select * from pg_toast.pg_toast_24608; chunk_id | chunk_seq | chunk_data ----------+-----------+------------ (0 rows) 在上面查询结果可以看到当插入的值比较小时,在toast表未查询到数据。然后我们再查看content列的长度,为46字节。 testdb=> select pg_column_size(id),pg_column_size(author),pg_column_size(title),pg_column_size(content) from tbl_blog; pg_column_size | pg_column_size | pg_column_size | pg_column_size ----------------+----------------+----------------+---------------- 4 | 5 | 35 | 46 (1 row) content字段插入大量值 执行命令插入数据,在这里省略了大量的数据,自行测试的时候,找一些数据就行。 insert into tbl_blog(author,title,content) values('墨竹','推荐Postgresql中一些好用的psql命令','E.1.1. Overview PostgreSQL 17 contains many new features and enhancements, including: ....省略大量文字 Add worker type column to pg_stat_subscription (Peter Smith) §'); 查看表大小和toast表的大小 testdb=# select pg_relation_size(oid) as tb_size,pg_relation_size(reltoastrelid) as toast_size from pg_class where relname='tbl_blog'; tb_size | toast_size ---------+------------ 8192 | 8192 (1 row) --在这里由于chunk_data太大不方便展示,就截取了一部分 testdb=> select chunk_id,chunk_seq,substring(chunk_data,0,20) from pg_toast.pg_toast_24608; chunk_id | chunk_seq | substring ----------+-----------+------------------------------------------ 24618 | 0 | \x3a35000000452e312e312e204f007665727669 24618 | 1 | \x219b6c75652066021387926b946a114457696e 24618 | 2 | \x015620ce63113712450475697383ae4380606f 24618 | 3 | \x2204a824e26d616e69e47075443a6f66710973 (4 rows) 当再次插入数据时,表的大小未变化,但是toast表的变为了8KB,说明这个时候已经出发toast机制,将content列的数据存储到toast表。当查看toast表中的数据时,发现已经有数据并且由于插入的太大,对插入的数据进行了切分。最后再来查看一下列的长度,为7286字节,确实是需要切分的。 testdb=# select pg_column_size(id),pg_column_size(author),pg_column_size(title),pg_column_size(content) from tbl_blog; pg_column_size | pg_column_size | pg_column_size | pg_column_size ----------------+----------------+----------------+---------------- 4 | 7 | 45 | 65 4 | 7 | 45 | 7286 (2 rows) 再次插入数据 再次把第2次的数据重新插入一次 insert into tbl_blog(author,title,content) select author,title,content from tbl_blog where id = 2; 查看表大小和toast表的大小 testdb=> select pg_relation_size(oid) as tb_size,pg_relation_size(reltoastrelid) as toast_size from pg_class where relname='tbl_blog'; tb_size | toast_size ---------+------------ 8192 | 24576 (1 row) --在这里由于chunk_data太大不方便展示,就截取了一部分 testdb=> select chunk_id,chunk_seq,substring(chunk_data,0,20) from pg_toast.pg_toast_24608; chunk_id | chunk_seq | substring ----------+-----------+------------------------------------------ 24618 | 0 | \x3a35000000452e312e312e204f007665727669 24618 | 1 | \x219b6c75652066021387926b946a114457696e 24618 | 2 | \x015620ce63113712450475697383ae4380606f 24618 | 3 | \x2204a824e26d616e69e47075443a6f66710973 24620 | 0 | \x3a35000000452e312e312e204f007665727669 24620 | 1 | \x219b6c75652066021387926b946a114457696e 24620 | 2 | \x015620ce63113712450475697383ae4380606f 24620 | 3 | \x2204a824e26d616e69e47075443a6f66710973 (8 rows) 当我们再次对content字段插入大量值时,发现表的大小未变化,但是toast表大小翻了3倍。 查看列的长度 testdb=> select pg_column_size(id),pg_column_size(author),pg_column_size(title),pg_column_size(content) from tbl_blog; pg_column_size | pg_column_size | pg_column_size | pg_column_size ----------------+----------------+----------------+---------------- 4 | 5 | 35 | 46 4 | 5 | 35 | 7286 4 | 5 | 35 | 7286 (3 rows) 其实通过这三次的插入数据,观察pg_relation_size函数计算表的大小和toast表的大小,其中表的大小一直未变,toast表的大小从0->8192->24576,就可以判断出pg_relation_size函数计算表的大小时是不包含toast表的大小,如果你忽略这点的话,可能导致最终统计的数据不准确。 下面是计算数据库表/索引大小相关的函数。 pg_relation_size(oid) 描述:指定OID代表的表或者索引所使用的磁盘空间。 pg_indexes_size(regclass) 描述:附加到指定表的索引使用的总磁盘空间。 pg_table_size(regclass) 描述:指定的表使用的磁盘空间,不计索引(但是包含TOAST,自由空间映射和可见性映射) pg_total_relation_size(regclass) 描述:指定的表使用的总磁盘空间,包括所有的索引和TOAST数据 总结 从这个测试实验中,我们就可以很清晰的知道,pg_relation_size函数只统计表对象的大小,未包含toast表大小,因此如果我们需要统计表大小,建议使用pg_total_relation_size函数更精确一点,该函数的统计包括了索引和toast表;另外如果你使用了pg_table_size来统计表大小,需要注意该统计不包含索引,可能需要使用pg_indexes_size来单独计算索引的大小。 参考 https://github.com/digoal/blog/blob/master/201103/20110329_01.md
-
Springboot项目集成OpenGauss使用教程安装 openGauss 数据库:首先,确保你已经在本地或服务器上安装并配置了 openGauss 数据库。你可以参考 openGauss 官方文档来完成安装和配置:官网:openGauss 官网安装文档:openGauss 安装手册配置 openGauss JDBC 驱动:对于 Maven 用户: <!-- openGauss JDBC 驱动 --> org.postgresql postgresql 42.5.0 <!-- 请使用最新版本 --> 对于 Gradle 用户:dependencies { implementation 'org.postgresql:postgresql:42.5.0' // 请使用最新版本}Spring Boot 通过 JDBC 驱动与数据库进行交互,因此,你需要在 pom.xml 或 build.gradle 文件中添加 openGauss JDBC 驱动依赖。目前,openGauss 是兼容 PostgreSQL 的,所以可以使用 PostgreSQL 的 JDBC 驱动来连接 openGauss。配置 application.properties 或 application.yml: 在 application.properties 或 application.yml 文件中配置数据库连接信息。openGauss 和 PostgreSQL 使用相似的连接 URL 格式。使用 application.properties 配置:spring.datasource.url=jdbc:postgresql://:/spring.datasource.username=spring.datasource.password=spring.datasource.driver-class-name=org.postgresql.Driverspring.datasource.jpa.database-platform=org.hibernate.dialect.PostgreSQL95Dialectspring.jpa.hibernate.ddl-auto=updatespring.jpa.show-sql=truespring.jpa.properties.hibernate.format_sql=true解释:使用 application.yml 配置:spring: datasource: url: jdbc:postgresql://<host>:<port>/<database> username: <your-username> password: <your-password> driver-class-name: org.postgresql.Driver jpa: database-platform: org.hibernate.dialect.PostgreSQL95Dialect hibernate: ddl-auto: update show-sql: true properties: hibernate: format_sql: true:openGauss 数据库的主机地址。:openGauss 数据库的端口,默认是 5432。:要连接的数据库名。:连接数据库的用户名。:连接数据库的密码。测试连接: 确保你的 Spring Boot 应用能够成功连接到 openGauss 数据库。你可以创建一个简单的 Spring Data JPA 实体类,并在 @SpringBootApplication 中进行数据库操作,确保连接是否成功。创建 Entity 类与 Repository: 创建 JPA 实体类(Entity)和仓库(Repository)来操作 openGauss 数据库。@Entitypublic class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; // getters and setters}public interface UserRepository extends JpaRepository<User, Long> { List<User> findByName(String name);}在业务逻辑中使用 Repository: 可以通过 @Autowired 注解将 UserRepository 注入到你的服务类中,并进行数据库操作。@Servicepublic class UserService { @Autowired private UserRepository userRepository; public List<User> getUsersByName(String name) { return userRepository.findByName(name); }}启动项目并测试: 启动你的 Spring Boot 应用,检查数据库连接是否正常,执行数据库操作并查看结果。常见问题和解决方法:连接失败:确认 openGauss 数据库已经启动,且你的数据库地址、端口、用户名和密码正确。如果连接时出现 SSL 错误,可以尝试禁用 SSL:在 application.properties 中加入:spring.datasource.url=jdbc:postgresql://:/?sslmode=disable JPA 查询不生效:确保配置了正确的 JPA 方言。openGauss 基于 PostgreSQL,因此使用 org.hibernate.dialect.PostgreSQL95Dialect。性能问题:根据实际情况优化连接池配置,调整连接池的大小等参数,以应对高并发请求。
-
登录管理控制台。 单击管理控制台左上角的,选择区域和项目。 在页面左上角单击,选择“数据库 > 云数据库 GaussDB”,进入云数据库 GaussDB信息页面。 在“实例管理”页面,选择需要登录的目标数据库,单击操作列表中的“登录”,进入数据管理服务实例登录界面。 可以在“实例管理”页面,单击目标实例名称,进入实例的“基本信息”页面,在页面右上角,单击“登录”,进入数据管理服务实例登录界面。 在“自定义登录”页签,选择需要登录的节点,正确输入数据库用户名和密码,单击“测试连接”。测试连接通过后,单击“登录”,即可登录到数据库。 登录用户名:root 数据库名称:postgres 密码:root用户密码。购买实例时设置的管理员密码 SQL执行记录:开启
-
书接上文GaussDB高智能--数据库智能化发展史&自治运维技术,从智能检测、趋势预测、异常检测等三方面对GaussDB的自治运维技术进行了解读,本篇将从日志分析、慢SQL发现、慢SQL诊断、集群故障根因诊断等方面继续介绍GaussDB的自治运维技术。2.4 日志分析 日志是产品最重要的基础运维数据之一,它是一种文本数据,一般由时间戳和文本消息(等级、常量、其余变量)组成,实时记录了业务的运行状态。因此凡是能够打印日志的设备,理论上均可以通过分析日志,进行故障预测、亚健康检测、故障定界定位等维护活动。对故障诊断任务而言,日志相较指标有着诊断代码段级别故障,支持对程序执行逻辑的跟踪,捕捉故障细节的优势,并且很多时候是唯一可用的故障诊断数据源。GaussDB的日志分析功能主要是将非结构化的日志流,转换为时序数据,而后天然地与异常检测等机制进行对接,便于整合完整的异常诊断能力。日志分析功能包括两个关键部分,一个是日志采集模块,另一个是日志分析模块,这两个部分都在日志采集端实现,其整体模块结构图如下: 日志采集和分析的步骤如下:(1)启动本功能的exporter, 利用Linux的inotify系统调用,监听日志写入事件;(2)GaussDB数据库实例向被监听的日志文件目录写入日志;(3)exporter 通过inotify系统调用,获知日志写入事件,exporter的LogCollector子模块从日志文件目录中读取被写入的日志文件内容;(4)exporter的LogAnalyst模块获取写入的日志文件内容,并对其进行量化整理;(5)时序数据库访问exporter,LogAnalyst将已经量化好的日志指标项返回时序数据库。 日志分析功能在具体实现上,主要包括离线学习模块和在线检测模块两部分,其设计流程图如下图所示:其中离线学习模块具体有以下步骤:(1)日志解析阶段数据预处理:根据预设正则表达式去除噪声变量和拆分日志记录文本字符串得到单词列表,如日志记录“2020 04 23 17:01:11 INFO getGraceTime, customerID: lisi4, bpID: d1, graceTime:0”通过正则表达式替换customerID信息为通配符‘*’,并拆分字符和驼峰词命名词得到三部分,分别是时间:“2020 04 23 17:01:11”,等级:“INFO”,“单词列表”:['get', 'grace', 'time', ',', 'customer', 'id', ':', '*', ',', ‘bp’, 'id', ':', 'd1hg123', 'grace', 'time', ':', '0'];日志初始模板提取:这里关键词指日志常量部分,一般来讲常用英文,通过关键词词典,这里使用了维基百科语料出现频率前10000且含有字母数目超过2的纯英文单词加上业务专有术语作为关键词词典,将上述单词列表里非关键词替换为通配符,得到日志初始模板['get', 'grace', 'time', ',', 'customer', 'id', ':', '*', ',', ‘bp’, 'id', ':', '*', 'grace', 'time', ':', '*'];日志记录聚类:相同日志初始模板的日志记录会被聚类为一个日志集合,比如日志记录“getGraceTime, customerID: lisi4, bpID: d1, graceTime:0”与另一个日志记录“getGraceTime, customerID: zhangsan123, bpID: ss2, graceTime:0”的日志初始模板都是['get', 'grace', 'time', ',', 'customer', 'id', ':', '*', ',', ‘bp’, 'id', ':', '*', 'grace', 'time', ':', '*'],因此这两条日志记录会被聚类在同一个日志集合里;日志聚类的不变量提取:对于同一日志集合里多条日志记录的单词列表相同位置的不变量提取日志模板,如对上述日志集合对应的单词列表['get', 'grace', 'time', ',', 'customer', 'id', ':', '*', ',', ‘bp’, 'id', ':', '*', 'grace', 'time', ':', '*']和['get', 'grace', 'time', ',', 'customer', 'id', ':', '*', ',', ‘bp’, 'id', ':', '*', 'grace', 'time', ':', '*'],通过相同位置的两两比较,保留其中不变量,变化的单词位置则替换为通配符‘*’,最后得到该日志集合里日志记录的日志模板“getGraceTime, customerID: *, bpID: *, graceTime:0”;可变深度模板前缀树构建:以日志模板诸的每个单词(包括常量和通配符)为节点构建可变深度模板前缀树,逐个插入上述过程中得到的日志模板,建立单词列表到日志模板的映射,可以在线对日志单词列表推理其日志模板。其中可变深度指单个通配符节点允许匹配更多或更少的单词,从而能实现在线提取变长变量的日志记录的模板。(2)日志分析模型的训练上述离线学习模块是与数据库日志结构和内容相关的,功能在发布时,会自带一个小的预训练模型。此模型的训练和使用过程对用户是透明的,用户无需任何额外操作。(3)在线检测模块日志解析阶段的数据预处理:与离线学习模块一致,根据预设正则表达式去除噪声变量和拆分日志记录文本字符串得到单词列表;日志解析阶段的可变深度模板前缀树推理:通过模板前缀树匹配单词列表,将每个日志记录的单词列表映射到日志模板。如果出现变量数量有变化的日志,如“2020 04 23 17:01:11 INFO getGraceTime, customerID: lisi4,zhangsan3, bpID: d1, graceTime:0”,可变深度模板前缀树会允许单个通配符节点“*”匹配更多的单词(这个例子里则是“lisi4”和“zhangsan3”)提取出日志模板['get', 'grace', 'time', ',', 'customer', 'id', ':', '*', ',', ‘bp’, 'id', ':', '*', 'grace', 'time', ':', '0']。另外如果前缀树无法搜索到相应日志模板,则代表该日志模板为离线学习数据里没有出现过,会被标记为新增异常日志。 日志分析时,对已经在内存中模板化后的日志进行分析处理,提取我们希望使用的日志模板,进行指标量化。2.5 慢SQL发现 慢SQL发现基于数据库的历史SQL语句,通过对历史SQL语句的执行表现进行总结归纳,将之再用于推断新的未知业务上。由于短时间内数据库SQL语句执行时长不会有太大的差距,SQLdiag可以从历史数据中检测出与已执行SQL语句相似的语句结果集,并基于SQL向量化技术和模板化方法预测SQL语句执行时长。慢SQL发现不需要SQL语句的执行计划,对数据库性能不会有任何的影响。慢SQL发现的时序执行图如下: 在整个慢sql发现过程中,存在两个主要步骤:训练阶段:通过用户输入的日志地址导入历史sql数据,训练自编码模型,聚类模型及执行时间序列模型。预测阶段:用户输入待预测负载,系统根据训练阶段生成的自编码模型对待预测负载进行编码,之后根据训练阶段生成的聚类模型进行分类,进而根据每类的历史信息预测执行时间。慢SQL发现中的训练阶段和预测阶段的详细设计如下:(1)训练阶段前提条件:用户已导入数据,准备好自己的典型业务SQL历史记录,且输入格式为:(SQL执行时长,SQL语句,SQL锁等待时长),其中锁等待时长和SQL执行时长二者必须保证至少有一个不为0. 每一行通过跳格(TAB)分隔。 用户在Console页面输入历史日志文件的路径与希望模型文件保存的路径。前处理模块首先对日志进行前处理,抽取初级特征并对语句进行模板化,然后将模板化后的语句进行向量化处理,保存向量化过程所使用的字典。将数据集向量传入自编码模块。自编码模块对数据集数据进行自编码训练,保存自编码模型并将编码后的数据集传给聚类模块。聚类模块对编码后的数据集进行聚类,保存聚类模型。数据集在分类后,每类分别抽取所有类语句的历史执行时间记录,建立时间序列预测模型。(2)预测流程前提条件:训练阶段已完成,并且用户输入的待预测负载格式正确。用户在页面输入待预测负载文件路径与结果文件保存路径。与训练阶段同样,前处理模块会对待预测负载模板化,随后读取保存的字典将模板化后的语句向量化。在此步骤中,如果前处理模块捕捉到新元素的数量大于用户设定的重训练阈值,会提示用户该情况并询问用户是否重新训练。如果选是,则会重新开始训练阶段,否则继续执行预测阶段;如果前处理模块捕捉到新元素的数量不大于用户设定的重训练阈值,执行预测阶段。读取训练阶段生成的自编码模型及聚类模型,对待预测负载进行编码后分类。使用各类的时间序列预测模型,预测待预测负载的执行时间,保存至用户指定路径。自编码器在设计时,可以采用2种不同的模型,分别为:Doc2vec:着重于前后文特征关系的文本向量化编码器。LSTM:着重于训练样本本身特征关系的向量化自编码器。模型对比如下表所示: 聚类的设计流程图如下:对任意一个新SQL模板,计算它的访问频次历史与现有聚类中心的距离,判断是否超过阈值。检测已聚类的模板与聚类中心点的距离,如果相似度低于阈值,则移除当前聚类。计算聚类中心之间的距离,如果超过阈值,则合并两个聚类。通过以上三个步骤可以确保该online聚类算法能够对数据做到自适应,并且确保聚类中的模板与聚类中心始终是相似的。预测模型采用3种不同出发点的模型,分别为:线性:线性意味着假定输入与输出之间存在一定线性关系。记忆:模型是否能够综合输入与它从历史数据中保存下的信息来预测未来。核函数:模型支持核函数就可以对非线性关系进行分析。通常,线性模型能够有效的避免过拟合,并且对计算资源和训练数据要求较低,在预测较近的未来时间时表现较好。具有记忆性的模型可以挖掘数据的动态行为信息,但是增加了训练的复杂性与模型对数据的依赖。较好的一个方案是采用ENSEMBE方法,将多个模型进行合并做平均预测。 2.6 慢SQL诊断 慢SQL诊断提供诊断慢SQL所需要的必要信息,帮助开发者回溯执行时间超过阈值的SQL,诊断SQL性能瓶颈,用户无需通过复现就能离线诊断特定慢SQL的性能问题。慢SQL提供表和函数两种维度的查询接口,用户从接口中能查询到作业的执行计划,开始、结束执行时间,执行查询的语句,行活动,内核时间,CPU时间,执行时间,解析时间,编译时间,查询重写时间,计划生成时间,网络时间,IO时间,网络开销,锁开销等。所有信息都是脱敏的。慢SQL诊断的执行流程如下:在慢SQL根因诊断过程中,主要包括以下步骤:(1)获取慢SQL相关信息慢SQL相关信息包括SQL文本信息、SQL执行计划、SQL执行开始时间、SQL执行结束时间、SQL执行计划;(2)获取数据库关键指标信息 数据库关键指标信息包括数据库部分GUC参数、状态参数、资源指标、负载指标、节点上其余进程信息,典型指标信息如下表所示:(3)结合数据库关键指标信息和执行计划,分析慢SQL根因;在慢SQL文本、执行计划和其他信息的基础上,基于特定规则对慢SQL的根因进行分析,涉及到的规则如下:情况一:执行计划中出现SeqScan算子,且该算子执行代价较大或扫描行数较大,该场景下扫描算子IO占用高,引起性能慢;模糊查询like,建议避免模糊查询或全模糊查询;查询中包含is not null,建议不要使用is not null,否则会导致索引失效;查询条件中使用了不等于操作符(!=),SQL中的不等操作符限制索引,引起全表扫描,建议把不等操作符改成or; or语句连接条件中包含列没有全部创建索引,建议相关列全部创建索引;update语句update了全部字段,建议如果只更改了1、2个字段,不要update全部字段、否则频繁调用会引起明显的性能消耗;select count(*) from table,建议如果不是必要的话请杜绝此操作;where子句中对字段进行表达式操作,这将导致SQL引擎放弃使用索引而使用全表扫描,建议修改where子句,对字段不要进行表达式操作;where子句中使用函数操作,导致SQL引擎放弃使用索引而进行全表扫描,建议避免在where子句中使用函数操作;not in 导致全表扫描,建议对于连续性的数值,可以使用between代替;范围查询语句中的range条件范围过大;情况二:查询语句执行计划sort算子代价较大,同时在该SQL执行期间,数据目录下的base/pgsql_tmp路径下产生了临时文件;该场景下盘触发读写IO,引起的性能慢;此时可能原因是查询语句排序成本过高,导致出现慢SQL,建议调整work_mem的大小;情况三:两表join操作,选择了NestLoop方式,且执行代价较大,该场景计算慢,引起的性能慢;此时可能原因是大表join操作,NestLoop算子执行较慢,导致慢SQL,建议通过设置GUC参数enable_nestloop=off关掉NestLoop,让优化器选择其他join方式;情况四:Agg操作使用Sort Aggregate算子,且执行代价较大;此时可能原因是对于较大结果集的Aggregate操作,Sort Aggregate算子的性能较差,建议通过设置GUC参数enable_sort=off,让优化器选择HashAgg算子; 情况五:执行计划正常,不存在代价较大算子;相关列中存在大量重复索引,导致插入性能速度变慢,建议先删除重复索引后再进行插入操作;数据库负载请求集中,引起IO、CPU、MEMORY等资源指标上升,导致数据库资源紧张从而产生慢SQL;外部进程占用大量系统资源,导致数据库资源紧张,进而出现慢SQL,建议停止没有必要的大进程;慢SQL根因分析有两种使用方式,第一种方式是定期从sqlite数据库中拉取慢SQL信息,并基于上述规则去分析慢SQL根因,最后将结果输出到日志;第二种方式是通过用户输入慢SQL信息,然后基于特定规则去分析慢SQL根因,最后将结果输出到命令行;使用时将Anomaly-detection中的main.py作为统一程序入口,与慢SQL诊断相关参数如下表所示,命令如下:python main.py [-m MODE] [-q QUERY] [-s START_TIME] [-e END_TIME]Collect模式用于在数据库节点本地收集信息方式;Server模式用于数据存储、异常检测和慢SQL诊断,后续还会扩展其他功能。 基于自动采集后,Server自主发现问题,示例结果如下所示:{START-TIME: 2021-03-22 16:58:19, END-TIME: 2021-03-25 16:58:19,SQL: select i_id from bmsql_item where i_id not in(1,100),RCA: The plan contains SeqScan operator, possibly caused by ‘NOT IN’,Suggestion: For the continuous values, ‘BETWEEN’ is recommended}用户自行调用慢SQL根因分析功能:python main.py diagnosis -q ‘select i_id from bmsql_item where i_id not in(1,100)’ -s ‘2021-03-22 16:58:19’ -e ‘2021-03-25 16:58:19’输出结果如下:RCA:The plan contains SeqScan operator,and is possibly caused by NOT IN, Suggestion: For 上述示例中,用户输入了SQL执行的起止时间,工具会在数据库WDR报告中在该时间范围内进行搜寻,以发现SQL的精确执行时间和结束时间,之后基于上述规则进行分析;如果用户在命令行中只输入了一种时间,则工具会以该时间为基准,在正负2小时之内进行搜寻,以匹配该SQL的精确时间信息;如果用户没有提供任何的时间信息,则工具会以现在时间为基准,往前推24小时进行搜寻,以确定该SQL的精确执行时间信息;如果在搜寻时间范围内都没有发现该条SQL,则会在命令行输出如下信息:Error: Sorry, can not find the information of this slow SQL.同时该功能只支持单条SQL的分析,如果同时输入多条SQL,则只会对第一条进行分析。 2.7 集群故障根因诊断 在现网业务中需要对发生的故障原因进行快速定位定界,集群故障根因诊断功能可以通过收集数据库集群中各个组件(如CMS、DN)等的信息和即时状态(如网络连通性),来判断集群环境是否存在故障,以及故障根因。可用于实现集群级别的故障根因诊断。 自治运维服务支持CN、DN、CMS等节点日志采集,以及支持基于节点间网络连通(如ping)状态采集。经过故障场景分析和梳理,并对数据集进行枚举扩充,最终实现DN、CN故障快速定位。集群故障根因诊断的设计和交互图如下:自治运维服务通过采集各个组件(如DN、CN、CMS等)的关键日志信息,以及即时状态信息(如网络连通状态),构建集群状态特征,然后,根据DBMind预置的根因模型库,对问题根因进行判断。对于日志信息的采集对日志格式有一定要求,当日志格式发生变化时,需要代码同步更新以实现采集。下表中的“包含关键词”列即为采集日志所使用的正则匹配格式。其中,DN组件故障场景特征与根因分别下表所示:DN根因和特征的关系流程图如下: DN故障诊断部分特征和根因对应关系如下表,对于日志类特征,0代表对应日志不包含关键字,1代表对应日志包含关键字,对于其他非日志类特征,0代表否,1代表是,最后不同标签数值代表不同的根因。如下表为DN组件特征与根因对应关系示例:通过上述根因和特性之间关联,利用决策树模型,根据故障日志信息,快速获取故障根因,方便运维人员及时进行故障排除。以上内容从日志分析、慢SQL发现、慢SQL诊断、集群故障根因诊断等方面介绍了GaussDB的自治运维技术,下篇我们将从索引推荐、分布键推荐、参数调优等三方面继续解读GaussDB的自治运维技术。
-
在数据处理能力上,MySQL和GaussDB for MySQL存在显著的区别。以下是对两者数据处理能力的详细对比:一、数据处理架构与效率MySQL:MySQL采用了传统的关系型数据库架构,数据存储在独立的磁盘上,计算节点通过读取磁盘上的数据来进行处理。在处理复杂查询或大量数据时,MySQL可能需要多次读取磁盘,导致处理效率受限。GaussDB for MySQL:GaussDB for MySQL采用了存算分离的架构,计算节点和存储节点分离,实现了计算资源的共享和存储资源的独立扩展。这种架构使得GaussDB for MySQL能够更高效地处理数据,因为计算节点可以共享同一份数据,而无需每次都从磁盘读取。GaussDB for MySQL还支持算子下推,即将过滤条件、列投影、聚合运算等操作从计算节点下推到存储节点处理,进一步提高了数据处理效率。二、并行处理能力MySQL:MySQL的并行处理能力相对较弱,尤其是在处理复杂查询时,可能需要较长的处理时间。GaussDB for MySQL:GaussDB for MySQL支持并行处理,包括并行扫描、聚合计算、order by排序、join计算等操作。这种并行处理能力使得GaussDB for MySQL能够同时处理多个任务,提高了数据库的整体处理效率。三、数据查询性能MySQL:MySQL在处理简单查询时表现出色,但随着查询复杂度的增加,性能可能会逐渐下降。GaussDB for MySQL:GaussDB for MySQL针对复杂查询进行了优化,支持并行查询和智能优化技术。即使在处理复杂的SQL查询时,GaussDB for MySQL也能保持较高的性能水平。四、数据压缩与存储MySQL:MySQL提供了基本的数据压缩功能,但压缩效果可能因数据类型和存储引擎而异。GaussDB for MySQL:GaussDB for MySQL支持数据压缩能力,可以进一步减少存储空间的使用。同时,GaussDB for MySQL的存储节点采用了高效的分布式存储技术,提高了数据的读写速度和可靠性。五、可扩展性与灵活性MySQL:MySQL的可扩展性相对有限,尤其是在处理大规模数据时,可能需要额外的硬件和架构优化。GaussDB for MySQL:GaussDB for MySQL支持灵活的扩展性,包括横向扩展(添加更多的计算节点和存储节点)和纵向扩展(提升单个节点的性能)。这种可扩展性使得GaussDB for MySQL能够轻松应对业务流量的突发情况,满足不断变化的数据处理需求。综上所述,GaussDB for MySQL在数据处理能力上相较于MySQL具有显著优势。其存算分离的架构、高效的并行处理能力、优化的数据查询性能、数据压缩与存储技术以及可扩展性与灵活性都使得GaussDB for MySQL成为企业级数据库解决方案的优选之一。
上滑加载中
推荐直播
-
华为云码道 × 仓颉编程:工程化AI编码探索2026/05/27 周三 19:00-21:00
刘俊杰-华为云仓颉语言专家/李炎-华为云码道技术专家/王智鹏-OpenCangjie开源社区发起人
本场直播围绕华为云仓颉语言与华为云码道的深度结合,展示华为云智能编程从零基础到高效落地的完整生态能力。以华为云码道为引擎,仓颉语言为载体,带给大家日常提效、趣味创新到极速量产的开发体验。
回顾中
热门标签