-
gs_dump在命令中可以写多个IP吗(主机和备机)?是否支持和gs_loader一样自动选择主节点
-
GaussDB大揭秘,启动GaussDB实例操作场景GaussDB支持在停止数据库实例后,手动重新开启实例。注意事项仅支持启动实例状态是“已停止”的实例。 启动实例过程中不支持磁盘扩容、规格变更、备份、重置密码、重启实例、删除实例等操作。 当DN分片内停止状态的节点数量超过分片副本数的一半时,可能导致实例异常,建议停止所有节点后启动实例。操作步骤登录管理控制台。 单击管理控制台左上角的,选择区域和项目。 在页面左上角单击,选择“数据库 > 云数据库 GaussDB”,进入云数据库 GaussDB信息页面。 在“实例管理”页面,选择目标实例,单击“操作”列的“更多 > 启动实例”。 在启动实例弹框,单击“确定”,启动实例。 启动实例稍后刷新实例列表,查看启动结果。如果实例状态为“正常”,说明实例启动成功。
-
设置GaussDB实例安全组规则操作场景安全组是一个逻辑上的分组,为同一个虚拟私有云内具有相同安全保护需求,并相互信任的弹性云服务器和GaussDB实例提供访问策略。如果账号已经申请创建时支持不指定安全组的白名单,则不需要执行本章节,而且在实例详情页也不会有内网安全组信息。为了保障数据库的安全性和稳定性,在使用GaussDB实例之前,您需要设置安全组,开通需访问数据库的IP地址和端口。内网连接GaussDB实例时,设置安全组分为以下两种情况: ECS与GaussDB实例在相同安全组时,默认ECS与GaussDB实例互通,无需设置安全组规则。 ECS与GaussDB实例在不同安全组时,需要为GaussDB和ECS分别设置安全组规则。 设置GaussDB安全组规则:为GaussDB所在安全组配置相应的入方向规则。 设置ECS安全组规则:安全组默认规则为出方向上数据报文全部放行,此时,无需对ECS配置安全组规则。当在ECS所在安全组为非默认安全组且出方向规则非全放通时,需要为ECS所在安全组配置相应的出方向规则。 通过弹性公网IP连接实例时,需要为GaussDB所在安全组配置相应的入方向规则。 本节主要介绍如何为GaussDB实例设置相应的入方向规则。关于添加安全组规则的详细要求,可参考《虚拟私有云用户指南》的“添加安全组规则”章节。注意事项因为安全组的默认规则是在出方向上的数据报文全部放行,同一个安全组内的弹性云服务器和GaussDB实例可互相访问。安全组创建后,您可以在安全组中定义各种访问规则,当GaussDB实例加入该安全组后,即受到这些访问规则的保护。默认情况下,一个租户可以创建500条安全组规则。 建议一个安全组内的安全组规则不超过50条。 当需要从安全组外访问安全组内的GaussDB实例时,需要为安全组添加相应的入方向规则。 所有鲲鹏云服务器规格不支持配置不连续端口。 如果您在鲲鹏云服务器中添加安全组规则时,使用了不连续端口号,那么除了该条规则不会生效,该规则后的其他规则也不会生效。比如:您先配置了安全组规则A(不连续端口号22,24),再配置了下一条安全规则B(独立端口号9096),则安全组规则A和B均不会生效。出方向规则通常不适用于数据库实例。仅在数据库实例充当客户端时,出方向规则才适用。数据库实例位于VPC(虚拟私有云 Virtual Private Cloud)中但不可公开访问,则您还可以使用VPN连接。创建分布式版实例时,如果需要修改内网安全组,请确保入方向规则TCP协议端口包含:40000-60480,20050,5000-5001,2379-2380,6000,6500, - ( + 100)。(例如设置的数据库端口为8000,则安全组中需要包含8000-8100)。 创建集中式版实例时,如果需要修改内网安全组,请确保入方向规则TCP协议端口包含:20050,5000-5001,2379-2380,6000,6500, - ( + 100)。(例如设置的数据库端口为8000,则安全组中需要包含8000-8100)。操作步骤登录管理控制台。 单击管理控制台左上角的,选择区域和项目。 在页面左上角单击,选择“数据库 > 云数据库 GaussDB”,进入云数据库 GaussDB信息页面。 在“实例管理”页面,选择目标实例,单击实例名称,进入实例的“基本信息”页面。 设置安全组规则。 在“网络信息”模块,单击安全组名称,进入安全组页面。 点击放大 在“入方向规则”子页签下单击“添加规则”,在“添加入方向规则”弹出框中填写安全组信息,单击“确定”。 单击“+”可以依次增加多条入方向规则。
-
创建GaussDB数据库用户操作场景创建云数据库GaussDB实例时,系统默认同步创建root用户,您可根据业务需要,添加其他用户。您可通过以下方式创建数据库用户: 通过DAS创建数据库用户 通过SQL语句创建数据库用户 约束限制 仅支持集中式版V2.0-8.100.0及以上版本的实例。通过DAS创建数据库用户登录管理控制台。 单击管理控制台左上角的,选择区域和项目。 在页面左上角单击,选择“数据库 > 云数据库 GaussDB”,进入云数据库 GaussDB信息页面。 在“实例管理”页面,选择需要登录的目标数据库,单击操作列表中的“登录”,进入数据管理服务实例登录界面。 可以在“实例管理”页面,单击目标实例名称,进入实例的“基本信息”页面,在页面右上角,单击“登录”,进入数据管理服务实例登录界面。正确输入数据库用户名和密码,单击“登录”,即可登录到数据库。 在界面上方选择“SQL操作 > SQL查询”。 执行以下命令创建数据库用户。 create user 账号名;通过SQL语句创建数据库用户 您也可以通过CREATE USER创建数据库用户
-
创建GaussDB数据库操作场景云数据库GaussDB实例创建成功后,您可根据业务需要,创建更多数据库。创建数据库时,需要遵循相关设计规范建议,详情请参见开发设计建议。您可通过以下方式创建数据库:通过DAS创建数据库 通过SQL语句创建数据库 通过DAS创建数据库 登录管理控制台。 单击管理控制台左上角的,选择区域和项目。 在页面左上角单击,选择“数据库 > 云数据库 GaussDB”,进入云数据库 GaussDB信息页面。 在“实例管理”页面,选择需要登录的目标数据库,单击操作列表中的“登录”,进入数据管理服务实例登录界面。 可以在“实例管理”页面,单击目标实例名称,进入实例的“基本信息”页面,在页面右上角,单击“登录”,进入数据管理服务实例登录界面。在“自定义登录”页签,选择需要登录的节点,正确输入数据库用户名和密码,单击“测试连接”。测试连接通过后,单击“登录”,即可登录到数据库。 创建数据库。 在首页数据库列表栏单击“新建数据库”。在弹窗中填写数据库名称、字符集、Template等信息,单击“确定”。 您也可以在界面上方选择“SQL操作 > SQL查询”。执行以下命令创建数据库。 create database 数据库名;
-
GaussDB 使用gs_loader工具导入数据操作场景对于copy to导出的文件,可以使用gs_loader工具进行数据导入。gs_loader将控制文件支持的语法转换为\COPY语法,然后利用已有的\COPY功能,做主要数据导入工作,同时gs_loader将\COPY结果记录到日志中。注意事项gs_loader工具当前不支持M-Compatibility数据库。 使用gs_loader前请确保gs_loader版本与gsql版本、数据库版本保持一致。 gs_loader当前仅支持集中式版。 gs_loader导入过程中,不需要转码场景下,单行数据(包含tuple的元数据,以下均包含)小于1GB-1B;转码场景下单行数据小于256MB-1B,对以下转码场景进行了特殊处理:UTF-8 -> GB18030/GB18030_2022的限制为小于512MB-1B,UTF-8 -> GBK的限制为小于1GB-1B。 建议单个导入文件的大小不超过1GB。gs_loader对单个导入文件的大小没有限制,但是对大文件数据的导入通常会比较耗时,因此建议在使用的过程中,对较大的数据文件进行切分,启动多个gs_loader进程以append的形式向表中写入数据(如果有truncate的需要则需要单独执行truncate,而不是将truncate写入控制文件中)。在CPU资源足够时,这种做法可以有效地提升导入速率。 迁移准备 准备弹性云服务器或可通过公网访问GaussDB。 通过弹性云服务器连接GaussDB数据库实例,需要创建一台弹性云服务器。 创建并登录弹性云服务器,请参见《弹性云服务器快速入门》中“购买弹性云服务器”和“登录弹性云服务器”。通过公网地址连接GaussDB数据库实例,需具备以下条件。 先对GaussDB数据库实例绑定公网地址,如何绑定公网地址,请参见绑定弹性公网IP。 保证本地设备可以访问GaussDB数据库实例绑定的公网地址。 在准备的弹性云服务器或可访问GaussDB数据库的设备上,安装gsql客户端,并连接到GaussDB数据库实例。详情请参见使用gsql连接数据库。操作步骤创建控制文件,准备数据文件。 创建控制文件,将数据导入到loader_tbl表中,如'/tmp/data/loader.ctl'。其中WHEN要求每行第二个字符为','。LOAD DATA truncate into table loader_tbl WHEN (2:2) = ',' fields terminated by ',' trailing nullcols ( id integer external, name char(32), con ":id || '-' || :name", dt date )b,创建guc参数文件,如'/tmp/data/guc.txt'。set a_format_copy_version='s1';c,创建数据文件,如'/tmp/data/data.csv'。1,OK,,2007-07-8 2,OK,,2008-07-8 3,OK,,2009-07-8 4,OK,,2007-07-8 43,DISCARD,,2007-07-8 ,,, 32,DISCARD,,2007-07-8 a,ERROR int,,2007-07-8 8,ERROR date,,2007-37-8 ,,,, , 8,ERROR fields,,2007-37-8 ,,, 5,OK,,2021-07-302.创建用户并授予使用权限。CREATE USER load_user WITH PASSWORD '************'; GRANT ALL ON SCHEMA public TO load_user; SELECT copy_summary_create() WHERE NOT EXISTS(SELECT * FROM pg_tables WHERE schemaname='public' AND tablename='gs_copy_summary'); GRANT ALL PRIVILEGES ON public.gs_copy_summary To load_user; SELECT copy_error_log_create() WHERE NOT EXISTS(SELECT * FROM pg_tables WHERE schemaname='public' AND tablename='pgxc_copy_error_log'); GRANT ALL PRIVILEGES ON public.pgxc_copy_error_log To load_user; \c - load_user Password for user load_user:3.创建目标导入表,如在gs_example数据库下创建loader_tbl表。\c gs_example Password for user load_user: CREATE TABLE loader_tbl ( ID NUMBER, NAME VARCHAR2(20), CON VARCHAR2(20), DT DATE );4.进行导入。退出当前登录连接。\q执行导入前,先确认gs_loader工具有可执行权限。确保当前路径有文件写入权限(gs_loader在处理过程中会生成一些临时文件,导入完成后自动删除)。gs_loader control=/tmp/data/loader.ctl data=/tmp/data/data.csv db=gs_example bad=/tmp/data/loader.bad guc_param=/tmp/data/guc.txt errors=5 port=8000 passwd=************ user=load_user -h 192.*.*.139;执行结果如下。gs_loader: version 0.1 5 Rows successfully loaded. log file is: /tmp/data/loader.log其中/tmp/data/data.csv文件的前四行和最后一行被导入,第5行和第7行第二个字符不是','被忽略;第6行,第10行和第13行全部字段为空被忽略;第8行,第9行和第12行由于错误的字段值而不被导入。定义的'bad=/tmp/data/loader.bad'可以查看出错的行,执行结果回显的'/tmp/data/loader.log'记录了导入的日志信息。
-
一、引言数据库是企业业务系统的核心组件,其稳定性和性能直接影响业务的连续性和用户体验。传统的数据库运维方式主要依赖于人工监控和手动处理,这种方式不仅效率低下,而且容易因为人为因素导致故障处理不及时,甚至引发更大的问题。因此,引入智能运维技术,实现数据库的自动化监控和故障预警,对于提高企业业务系统的稳定性和可靠性具有重要意义。天翼云GaussDB作为一款分布式云数据库产品,具有高性能、高可用性和可扩展性等特点。然而,随着业务规模的不断扩大,数据库运维工作也面临着越来越多的挑战。为了应对这些挑战,天翼云GaussDB引入了智能运维技术,通过自动化监控和故障预警系统,实现对数据库运行状态的实时监控和故障预警,提高了运维效率和系统稳定性。二、自动化监控系统的构建自动化监控是智能运维的基础,通过实时监控数据库的运行状态,可以及时发现潜在的问题并进行处理。天翼云GaussDB的自动化监控系统采用了分布式架构,由数据采集模块、数据处理模块、监控分析模块和展示模块组成,实现了对数据库性能的全面监控。数据采集模块数据采集模块负责实时收集GaussDB的各项运行数据,包括CPU使用率、内存占用率、磁盘I/O、网络吞吐量等性能指标,以及数据库连接数、查询响应时间等业务指标。采集方式包括API接口调用、日志文件解析等,确保数据的准确性和实时性。数据处理模块数据处理模块对采集到的数据进行清洗、整合和标准化处理,形成统一的数据格式,便于后续的分析和监控。同时,数据处理模块还负责对数据进行存储和管理,确保数据的可靠性和安全性。监控分析模块监控分析模块基于机器学习算法和规则引擎,对处理后的数据进行分析和挖掘,识别潜在的性能瓶颈、资源不足和安全漏洞等问题,并生成相应的预警信息。同时,监控分析模块还可以根据历史数据,对数据库的运行趋势进行预测,为运维人员提供决策支持。展示模块展示模块将监控分析模块生成的预警信息和数据可视化展示给用户,包括仪表盘、趋势图、告警列表等,便于用户快速了解数据库的运行状况。同时,展示模块还提供了灵活的查询和筛选功能,方便用户根据需求进行数据的分析和处理。三、故障预警系统的实现故障预警是智能运维的核心功能之一,通过实时监测数据库的运行状态,并在发现潜在问题时及时发出预警,可以有效降低故障发生的概率和影响。天翼云GaussDB的故障预警系统采用了多种技术和方法,实现了对数据库故障的精准预警。阈值预警阈值预警是最基本的预警方式之一,通过设定各项性能指标的阈值,当实际值超过阈值时触发预警。天翼云GaussDB的阈值预警系统支持自定义阈值和动态调整阈值,确保预警的准确性和及时性。异常检测异常检测是一种基于机器学习算法的预警方式,通过对历史数据的学习和分析,建立数据库运行状态的模型,当实际状态与模型发生较大偏差时触发预警。天翼云GaussDB的异常检测系统采用了多种机器学习算法,如聚类算法、回归算法等,实现了对数据库运行状态的精准预测和预警。关联分析关联分析是一种基于数据挖掘技术的预警方式,通过分析不同性能指标之间的关联关系,发现潜在的问题和故障。天翼云GaussDB的关联分析系统支持对多项性能指标进行关联分析,如CPU使用率与内存占用率的关联、查询响应时间与数据库连接数的关联等,为运维人员提供了全面的故障预警信息。智能告警智能告警是故障预警系统的最终输出,通过将预警信息以可视化的方式展示给用户,并提供相应的处理建议,帮助运维人员快速定位问题并进行处理。天翼云GaussDB的智能告警系统支持多种告警方式,如邮件告警、短信告警、语音告警等,确保告警信息的及时传达和处理。四、智能运维实践案例为了更好地说明天翼云GaussDB智能运维的实践效果,以下将以某企业的实际案例为例进行介绍。案例背景某企业是一家快速发展的互联网企业,随着业务的不断扩张,数据库的数量和复杂度急剧增加。传统的数据库运维方式已经无法满足企业的需求,运维效率低下,故障处理不及时,严重影响了业务的连续性和用户体验。因此,该企业决定引入天翼云GaussDB的智能运维解决方案,实现对数据库运行状态的实时监控和故障预警。实施过程在实施过程中,该企业首先完成了对GaussDB的自动化监控系统的部署和配置,实现了对数据库各项运行数据的实时采集和处理。同时,该企业还根据业务需求,设定了相应的阈值和规则,确保预警系统的准确性和及时性。在实施过程中,该企业还充分利用了GaussDB提供的日志管理平台,对数据库的日志文件进行集中收集和分析。通过日志分析,该企业发现了多个潜在的性能瓶颈和安全隐患,并及时进行了优化和改进。实践效果通过引入天翼云GaussDB的智能运维解决方案,该企业实现了对数据库运行状态的实时监控和故障预警。在实际运行过程中,预警系统多次准确预警了潜在的故障和问题,为运维人员提供了及时的处理建议。同时,通过日志分析和优化改进,该企业的数据库性能得到了显著提升,业务连续性和用户体验也得到了有效保障。五、总结与展望天翼云GaussDB的智能运维实践为企业提供了高效、可靠的数据库运维解决方案。通过自动化监控和故障预警系统,实现了对数据库运行状态的实时监控和精准预警,提高了运维效率和系统稳定性。未来,随着云计算技术的不断发展和完善,天翼云GaussDB的智能运维解决方案将不断优化和创新,为企业带来更多的价值和收益。持续优化为了进一步提高智能运维的效果和准确性,天翼云GaussDB将持续优化自动化监控和故障预警系统。通过引入更先进的机器学习算法和数据分析技术,提高预警系统的智能化程度和预测准确性。同时,还将加强与其他系统的集成和协同工作,实现更全面的故障预警和应急响应。创新服务随着企业业务的不断发展和变化,对于数据库运维的需求也将不断变化。天翼云GaussDB将不断创新服务模式和功能,满足企业的多样化需求。例如,可以引入自动化运维脚本和工具集,帮助企业快速实现特定运维任务的自动化处理;还可以提供定制化的监控预警方案,根据企业的业务需求进行个性化配置和优化。加强合作天翼云GaussDB将加强与合作伙伴的合作和交流,共同推动智能运维技术的发展和应用。通过共享经验和资源,共同研究和解决运维过程中的难点和问题,推动智能运维技术的不断创新和进步。总之,天翼云GaussDB的智能运维实践为企业提供了高效、可靠的数据库运维解决方案。未来,随着技术的不断发展和完善,天翼云GaussDB将继续秉承开放合作、创新发展的理念,不断推出更加先进、更加智能的运维解决方案,为企业数字化转型和业务发展提供有力支撑。
-
使用DAS的导出和导入功能迁移GaussDB数据操作场景数据管理服务(Data Admin Service,简称DAS)是用来登录和操作华为云上数据库的Web服务,提供数据库开发、运维、智能诊断的一站式云上数据库管理平台,方便用户使用和运维数据库。当进行数据备份或迁移时,支持使用DAS的数据导出功能,获取完整的数据信息,再将数据从本地或者从OBS桶导入目标数据表。更多信息,请参见导入导出。约束限制导入单文件大小最大可达1GB。 可以支持导入的数据文件类型包括CSV格式和SQL文件格式。 暂不支持BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB等二进制类型字段的导入。 不支持使用跨区域的OBS桶导出导入数据。导出数据登录管理控制台。 单击管理控制台左上角的,选择区域和项目。 在页面左上角单击,选择“数据库 > 云数据库 GaussDB”,进入云数据库 GaussDB信息页面。 在“实例管理”页面,选择需要登录的目标数据库,单击操作列表中的“登录”,进入数据管理服务数据库登录界面。 正确输入数据库用户名和密码,单击“登录”,即可进入的数据库并进行管理。 在顶部菜单栏选择“导入·导出”>“导出”。 在导出页面,单击左上角“新建任务”,可根据需要选择“导出数据库”或“导出SQL结果集”。下文以导出数据库为例,导出SQL结果集同理。 也可通过单击“快速导出”,选择目标数据库,在创建快速导出任务弹窗中选择存储位置,并单击“确定”。在导出数据库弹出页面,您可按需选填“基本信息”及“高级选项”,并在页面右侧选择需要导出的表。说明: SQL结果集导出任务中,执行SQL的最大限制是5M。 数据库分用户库和系统库,系统库不支持导出功能。如需导出,需把创建用户数据库,业务部署到用户库,然后再执行导出操作。 DAS在执行导出操作时,会连接到备库进行导出,可以有效规避导出时对主库的性能影响,但当备库复制延迟较大时,会存在“导出的数据不是最新数据“的可能性。 设置完导出任务信息,单击弹出页面下部“确定”,创建导出任务。 在导出任务列表页面,可查看任务ID、任务类型、任务状态、进度等信息。 可在列表操作栏,单击“查看详情”,在任务详情弹出页面,查看本次导出任务执行的详情信息。导入数据在顶部菜单栏选择“导入·导出 > 导入”。 DAS支持从本地选取文件导入,同时也支持从OBS桶中直接选择文件进行导入操作。 图4 新建导入任务上传文件在导入页面单击左上角的“新建任务”,在弹出框选择导入类型,选择文件来源为“上传文件”、附件存放位置等信息并上传文件,选择导入数据库,设置字符集类型,按需勾选选项设置及填写备注信息。为了保障数据安全,DAS将文件保存在OBS桶中。说明: 出于数据隐私性保护目的,DAS需要提供一个用户的OBS存储,用来接收用户上传的附件信息,DAS会自动连接到该OBS文件,进行内存式读取,整个过程您的数据内容不会存储在DAS的任何存储介质上。 导入完成后若勾选删除上传的文件选项,则该文件导入目标数据库成功后,将从OBS桶中自动删除。 从OBS桶中选择 在导入页面单击左上角的“新建任务”,在弹出框设置导入类型,选择文件来源为“从OBS中选择”,在OBS文件浏览器弹窗中选择待导入文件,选择导入数据库,设置字符集类型,按需勾选选项设置及填写备注信息。说明: 从OBS桶中直接选择文件导入,导入目标数据库成功后,OBS桶不会删除该文件。导入信息设置完成后,单击“创建导入任务”即可。由于导入任务可能会覆盖原有的数据,需再次确认无误后单击“确定”。 可在导入任务列表中查看导入进度等信息,在操作栏单击“查看详情”,可在任务详情弹出框中,了解本次导入任务成功、失败等执行情况及耗时。
-
在GaussDB数据库中,联表操作通常是通过SQL的JOIN子句来实现的。JOIN子句基于两个或多个表之间的共同字段将它们进行结合,从而能够根据需要从相关联的表中获取信息。以下是GaussDB中常用的几种JOIN操作及其用法:1. INNER JOIN(内连接)内连接会返回左表和右表中能关联起来的数据。语法:SELECT t1.column1, ..., t2.column1, ...FROM table1 t1INNER JOIN table2 t2ON t1.common_field = t2.common_field;示例:假设有两个表,Students(学生表)和Score(学生成绩表),通过学号(sno)进行关联。SELECT t1.sno, t1.sname, t2.sno, t2.scgradeFROM students t1INNER JOIN score t2ON t1.sno = t2.sno;2. LEFT JOIN(左连接)左连接会返回左表中所有记录,且在右表中找到的关联数据列也会被一起返回。如果右表中没有与左表匹配的记录,则结果中右表的部分会包含NULL。语法:SELECT t1.column1, ..., t2.column1, ...FROM table1 t1LEFT JOIN table2 t2ON t1.common_field = t2.common_field;示例:SELECT t1.sno, t1.sname, t2.sno, t2.scgradeFROM students t1LEFT JOIN score t2ON t1.sno = t2.sno;3. RIGHT JOIN(右连接)右连接会返回右表中所有记录,且在左表中找到的关联数据列也会被一起返回。如果左表中没有与右表匹配的记录,则结果中左表的部分会包含NULL。语法:SELECT t1.column1, ..., t2.column1, ...FROM table1 t1RIGHT JOIN table2 t2ON t1.common_field = t2.common_field;示例:SELECT t1.sno, t1.sname, t2.sno, t2.scgradeFROM students t1RIGHT JOIN score t2ON t1.sno = t2.sno;4. FULL JOIN(全连接)全连接会返回左表和右表中的所有记录。对于在其中一个表中存在但在另一个表中不存在的记录,结果中相应的部分会包含NULL。语法:SELECT t1.column1, ..., t2.column1, ...FROM table1 t1FULL JOIN table2 t2ON t1.common_field = t2.common_field;示例:SELECT t1.sno, t1.sname, t2.sno, t2.scgradeFROM students t1FULL JOIN score t2ON t1.sno = t2.sno;5. CROSS JOIN(交叉连接)交叉连接会返回两个表的笛卡尔积,即两个表中所有记录的组合。这种连接通常不常用,因为它可能会产生大量的结果集。语法:SELECT t1.column1, ..., t2.column1, ...FROM table1 t1CROSS JOIN table2 t2;注意事项在进行联表操作时,确保要连接的字段具有相同或兼容的数据类型。使用JOIN子句时,可以根据需要添加WHERE子句来进一步筛选结果集。对于大型数据集,联表操作可能会消耗较多的系统资源,因此在实际应用中需要注意性能问题。通过以上介绍,您应该能够在GaussDB数据库中有效地使用JOIN子句进行联表操作。
-
1.对象关系管理 --对象权限-授权与回收 授予权限使用GRANT,回收权限使用REVOKE; 2.对象权限管理演示 --表的对象权限。 GRANT SELECT ON SJZT.TEST1 TO USER1; GRANT INSERT ON SJZT.TEST1 TO USER1; GRANT UPDATE ON SJZT.TEST1 TO USER1; GRANT DELETE ON SJZT.TEST1 TO USER1; GRANT TRUNCATE ON SJZT.TEST1 TO USER1; GRANT REFERENCES ON SJZT.TEST1 TO USER1; GRANT ALTER ON SJZT.TEST1 TO USER1; GRANT DROP ON SJZT.TEST1 TO USER1; GRANT COMMENT ON SJZT.TEST1 TO USER1; GRANT INDEX ON SJZT.TEST1 TO USER1; GRANT VACUUM ON SJZT.TEST1 TO USER1; --DATABASE,SCHEMA,FUNC/PROC 的对象权限。 GRANT CREATE ON SCHEMA SJZT TO USER1; --schema里面创建对象权限。 GRANT CONNECT ON DATABASE SJZT TO USER1;--连接某个数据库的权限。 GRANT EXECUTE ON SJZT.FUN/SJZT.PROC(存储过程或函数) TO USER1; --对某个存储过程和函数的执行权限。 GRANT USAGE ON SCHEMA SJZT TO USER1; --授予对于某个schema的登陆权限。 GRANT SELECT ON TABLE SJZT.TEST1 TO USER1 WITH GRANT OPTION; 3.查看对象权限 --查看系统表pg_class的 relacl 字段获取表相关的授权信息。 sjzt=> select relacl from pg_class where relname='test1'; relacl --------------------------------------------------------- {sjzt=arwdDxt/sjzt,user1=ar*wdDx/sjzt,user1=APmiv/sjzt} --可以看到:sjzt用户对表SJZT.TEST1的权限有:arwdDxt a:INSERT r:SELECT w:UPDATE d:DELETE D:TRUNCATE x:REFERENCES t:TRIGGER --user1用户对表:sjzt.test1的权限有:arwdDx / APmiv a:INSERT r*:SELECT ,*表示还可以将SELECT授予别人。 w:UPDATE d:DELETE D:TRUNCATE x:REFERENCES A:ALTER P:DROP m:COMMENT i:INDEX v:VACUUM 4.对象权限说明 --参数 参数说明 参数 参数说明 r:SELECT C:CREATE w:UPDATE c:CONNECT a:INSERT T:TEMPORARY d:DELETE A:ALTER D:TRUNCATE P:DROP x:REFERENCES m:COMMENT t:TRIGGER i:INDEX X:EXECUTE v:VACUUM U:USAGE *:再授权选项 我们可以通过当前模式下:pg_class 表查看 test1表,有哪些用户对他有哪些权限。 5.总结 relcal :列所展示的展示的都是权限的简称,所以我们需要熟记GaussDB里面这些简称每个代表的含义。这样才能快速查看表的权限问题。 本文作者:薛双奇
-
1.GaussDB数据库登陆退出审计功能查看 --数据库登陆退出审计的查看。 --(1)审计功能默认打开。 gaussdb=> show audit_enabled; audit_enabled --------------- on (1 row) --数据库的登陆退出进行审计:默认打开。 gaussdb=> show audit_login_logout; audit_login_logout -------------------- 7 (1 row) 2.验证登陆退出的审计功能 --(2)新登陆一个窗口: [omm@gaussdb01 cn_5001]$ gsql -d sjzt -U sjzt -W Gauss_123 -p 8000 gsql ((GaussDB Kernel 503.1.0.SPC1200 build c28d95e9) compiled at 2023-07-05 16:26:07 commit 5703 last mr 11933 release) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. sjzt=> (3)查看数据库的登陆审计信息。 gaussdb=> select * from pg_query_audit('2023-09-01 12:59:00', '2023-09-01 16:00:00') where username<>'rdsAdmin'; time | type | result | userid | username | database | client_conninfo | object_name | detail_info | node_name | thread_id | local_port | remote_port ------------------------+---------------+--------+--------+----------+----------+-----------------+-------------+----------------------------------------------------------+-----------+---------------------------------+------------+------------- 2023-09-01 13:01:07+08 | login_success | ok | 16900 | sjzt | sjzt | gsql@[local] | sjzt | login db(sjzt) success,the current user is:sjzt, SSL=off | cn_5001 | 139950822323968@746859667984405 | 8000 | null (1 row) --可以看到sjzt用户登陆sjzt数据库。但是这个里面的审计信息会记录数据库 --内部私网数据交互的信息,所以每秒中产生的rdsAdmin用户的登陆退出日志非常多。 --我们使用了sjzt用户,才可以看到登陆退出日志。 --(4)现在退出登陆。 [omm@gaussdb01 cn_5001]$ gsql -d sjzt -U sjzt -W Gauss_123 -p 8000 gsql ((GaussDB Kernel 503.1.0.SPC1200 build c28d95e9) compiled at 2023-07-05 16:26:07 commit 5703 last mr 11933 release) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. sjzt=> \q --(5)继续查看退出的审计信息。 gaussdb=> select * from pg_query_audit('2023-09-01 12:59:00', '2023-09-01 16:00:00') where username<>'rdsAdmin'; time | type | result | userid | username | database | client_conninfo | object_name | detail_info | node_name | thread_id | local_port | remote_port ------------------------+---------------+--------+--------+----------+----------+-----------------+-------------+----------------------------------------------------------+-----------+---------------------------------+------------+------------- 2023-09-01 13:01:07+08 | login_success | ok | 16900 | sjzt | sjzt | gsql@[local] | sjzt | login db(sjzt) success,the current user is:sjzt, SSL=off | cn_5001 | 139950822323968@746859667984405 | 8000 | null 2023-09-01 13:04:20+08 | user_logout | ok | 16900 | sjzt | sjzt | gsql@[local] | sjzt | session timeout, logout db(sjzt) success | cn_5001 | 139950822323968@746859860894315 | 8000 | null (2 rows) 3.关闭数据库登陆退出审计的功能 (6)关闭数据库的登陆退出的审计功能。 --关闭数据库的审计: [omm@gaussdb01 ~]$ gs_guc set -Z coordinator -Z datanode -N all -I all -c "audit_login_logout = 0" The gs_guc run with the following arguments: [gs_guc -Z coordinator -Z datanode -N all -I all -c audit_login_logout = 0 set ]. Begin to perform the total nodes: 3. Popen count is 3, Popen success count is 3, Popen failure count is 0. Begin to perform gs_guc for coordinators. Command count is 3, Command success count is 3, Command failure count is 0. Total instances: 3. Failed instances: 0. ALL: Success to perform gs_guc! Begin to perform the total nodes: 3. Popen count is 3, Popen success count is 3, Popen failure count is 0. Begin to perform gs_guc for datanodes. Command count is 3, Command success count is 3, Command failure count is 0. Total instances: 9. Failed instances: 0. ALL: Success to perform gs_guc! (7)检查登陆退出审计 gaussdb=> show audit_login_logout; audit_login_logout -------------------- 7 (1 row) --我们发现没有变化,即登陆退出的审计不是立即可以关闭的。 (8)重启集群 --关闭集群 [omm@gaussdb01 ~]$ cm_ctl stop cm_ctl: stop cluster. cm_ctl: stop nodeid: 1 cm_ctl: stop nodeid: 2 cm_ctl: stop nodeid: 3 ................................ cm_ctl: stop cluster successfully. cm_ctl: stopping the ETCD cluster. .............. cm_ctl: The ETCD cluster stops successfully. [omm@gaussdb01 ~]$ --启动集群 [omm@gaussdb01 ~]$ cm_ctl start cm_ctl: starting the ETCD cluster. . cm_ctl: the ETCD cluster starts successfully. cm_ctl: checking cluster status. cm_ctl: checking cluster status. cm_ctl: checking finished in 1792 ms. cm_ctl: start cluster. cm_ctl: start nodeid: 1 cm_ctl: start nodeid: 2 cm_ctl: start nodeid: 3 ............... cm_ctl: start cluster successfully. --(9)检查登陆退出审计参数。 gaussdb=> show audit_login_logout; audit_login_logout -------------------- 0 (1 row) --可以发现,登陆退出的审计功能已经关闭。 4.关闭登陆退出审计功能后验证是否记录审计日志 (10)登陆退出并查看日志 [omm@gaussdb02 ~]$ date Fri Sep 1 13:14:09 CST 2023 [omm@gaussdb02 ~]$ gsql -d sjzt -U sjzt -W Gauss_123 -p 8000 gsql ((GaussDB Kernel 503.1.0.SPC1200 build c28d95e9) compiled at 2023-07-05 16:26:07 commit 5703 last mr 11933 release) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. sjzt=> \q gaussdb=> select * from pg_query_audit('2023-09-01 12:59:00', '2023-09-01 16:00:00') where username<>'rdsAdmin'; time | type | result | userid | username | database | client_conninfo | object_name | detail_info | node_name | thread_id | local_port | remote_port ------------------------+----------------+--------+--------+-----------+-----------+---------------------+-------------+----------------------------------------------------------+-----------+---------------------------------+------------+------------- 2023-09-01 13:01:07+08 | login_success | ok | 16900 | sjzt | sjzt | gsql@[local] | sjzt | login db(sjzt) success,the current user is:sjzt, SSL=off | cn_5001 | 139950822323968@746859667984405 | 8000 | null 2023-09-01 13:04:20+08 | user_logout | ok | 16900 | sjzt | sjzt | gsql@[local] | sjzt | session timeout, logout db(sjzt) success | cn_5001 | 139950822323968@746859860894315 | 8000 | null 2023-09-01 13:10:33+08 | user_logout | ok | 16900 | sjzt | sjzt | gsql@[local] | sjzt | session timeout, logout db(sjzt) success | cn_5001 | 139950872786688@746860233783267 | 8000 | null 2023-09-01 13:10:42+08 | system_stop | ok | | null | null | null | null | system stop fast success | cn_5001 | null | null | null 2023-09-01 13:10:42+08 | user_logout | ok | 16420 | root | postgres | gsql@[local] | postgres | session timeout, logout db(postgres) success | cn_5001 | 139951683720960@746860242507692 | 8000 | null 2023-09-01 13:11:52+08 | internal_event | ok | 0 | [unknown] | [unknown] | [unknown]@[unknown] | file | create a new audit file | cn_5001 | 14 (6 rows) --可以发现:11:14分并没有记录到登陆退出的审计日志。 登陆退出审计功能关闭后,不再记录登陆和退出日志。 5.开启数据库登陆退出的审计功能 (11)重新开启登陆退出的审计功能。 --开启审计功能,同样需要重启集群才能生效。 gs_guc set -Z coordinator -Z datanode -N all -I all -c "audit_login_logout = 7" cm_ctl stop cm_ctl start gaussdb=> show audit_login_logout; audit_login_logout -------------------- 7 (1 row) gaussdb=> select * from pg_query_audit('2023-09-01 12:59:00', '2023-09-01 16:00:00') where username='root' and database='postgres'; time | type | result | userid | username | database | client_conninfo | object_name | detail_info | node_name | thread_id | local_port | remote_port ------------------------+---------------+--------+--------+----------+----------+-------------------+-------------+--------------------------------------------------------------+-----------+---------------------------------+------------+------------- 2023-09-01 13:10:42+08 | user_logout | ok | 16420 | root | postgres | gsql@[local] | postgres | session timeout, logout db(postgres) success | cn_5001 | 139951683720960@746860242507692 | 8000 | null 2023-09-01 13:19:19+08 | login_failed | failed | 16420 | root | postgres | [unknown]@[local] | postgres | login db(postgres)failed with no password, SSL=off | cn_5001 | 140573868291840@746860759463930 | 8000 | null 2023-09-01 13:19:25+08 | login_success | ok | 16420 | root | postgres | gsql@[local] | postgres | login db(postgres) success,the current user is:root, SSL=off | cn_5001 | 140573868291840@746860765764587 | 8000 | null 2023-09-01 13:23:41+08 | login_success | ok | 16420 | root | postgres | gsql@[local] | postgres | login db(postgres) success,the current user is:root, SSL=off | cn_5001 | 140573847254784@746861021688743 | 8000 | null 2023-09-01 13:24:00+08 | user_logout | ok | 16420 | root | postgres | gsql@[local] | postgres | session timeout, logout db(postgres) success | cn_5001 | 140573847254784@746861040399637 | 8000 | null 2023-09-01 13:24:08+08 | login_success | ok | 16420 | root | postgres | gsql@[local] | postgres | login db(postgres) success,the current user is:root, SSL=off | cn_5001 | 140573847254784@746861048330684 | 8000 | null 2023-09-01 13:24:22+08 | user_logout | ok | 16420 | root | postgres | gsql@[local] | postgres | session timeout, logout db(postgres) success | cn_5001 | 140573847254784@746861062082322 | 8000 | null (7 rows) 6.总结 1)系统登陆退出的审计,开启和关闭都需要重启集群。 2)pg_query_audit,审计日志只记录在本节点登陆和退出的用户,在集群其他节点登陆和退出不会在当前节点记录。在其他节点无论登陆退出多少次,在当前节点下都无法查询到。 3)集群级别的审计日志需要使用:pgxc_query_audit 表来查看。 我们上面看的都是本地登陆的信息。 SELECT * FROM pgxc_query_audit('2023-09-01 12:59:00', '2023-09-01 16:00:00')where username='root' and database='postgres'; 本文作者:薛双奇
-
1.GaussDB数据库登陆退出审计功能查看 --数据库登陆退出审计的查看。 --(1)审计功能默认打开。 gaussdb=> show audit_enabled; audit_enabled --------------- on (1 row) --数据库的登陆退出进行审计:默认打开。 gaussdb=> show audit_login_logout; audit_login_logout -------------------- 7 (1 row) 2.验证登陆退出的审计功能 --(2)新登陆一个窗口: [omm@gaussdb01 cn_5001]$ gsql -d sjzt -U sjzt -W Gauss_123 -p 8000 gsql ((GaussDB Kernel 503.1.0.SPC1200 build c28d95e9) compiled at 2023-07-05 16:26:07 commit 5703 last mr 11933 release) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. sjzt=> (3)查看数据库的登陆审计信息。 gaussdb=> select * from pg_query_audit('2023-09-01 12:59:00', '2023-09-01 16:00:00') where username<>'rdsAdmin'; time | type | result | userid | username | database | client_conninfo | object_name | detail_info | node_name | thread_id | local_port | remote_port ------------------------+---------------+--------+--------+----------+----------+-----------------+-------------+----------------------------------------------------------+-----------+---------------------------------+------------+------------- 2023-09-01 13:01:07+08 | login_success | ok | 16900 | sjzt | sjzt | gsql@[local] | sjzt | login db(sjzt) success,the current user is:sjzt, SSL=off | cn_5001 | 139950822323968@746859667984405 | 8000 | null (1 row) --可以看到sjzt用户登陆sjzt数据库。但是这个里面的审计信息会记录数据库 --内部私网数据交互的信息,所以每秒中产生的rdsAdmin用户的登陆退出日志非常多。 --我们使用了sjzt用户,才可以看到登陆退出日志。 --(4)现在退出登陆。 [omm@gaussdb01 cn_5001]$ gsql -d sjzt -U sjzt -W Gauss_123 -p 8000 gsql ((GaussDB Kernel 503.1.0.SPC1200 build c28d95e9) compiled at 2023-07-05 16:26:07 commit 5703 last mr 11933 release) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. sjzt=> \q --(5)继续查看退出的审计信息。 gaussdb=> select * from pg_query_audit('2023-09-01 12:59:00', '2023-09-01 16:00:00') where username<>'rdsAdmin'; time | type | result | userid | username | database | client_conninfo | object_name | detail_info | node_name | thread_id | local_port | remote_port ------------------------+---------------+--------+--------+----------+----------+-----------------+-------------+----------------------------------------------------------+-----------+---------------------------------+------------+------------- 2023-09-01 13:01:07+08 | login_success | ok | 16900 | sjzt | sjzt | gsql@[local] | sjzt | login db(sjzt) success,the current user is:sjzt, SSL=off | cn_5001 | 139950822323968@746859667984405 | 8000 | null 2023-09-01 13:04:20+08 | user_logout | ok | 16900 | sjzt | sjzt | gsql@[local] | sjzt | session timeout, logout db(sjzt) success | cn_5001 | 139950822323968@746859860894315 | 8000 | null (2 rows) 3.关闭数据库登陆退出审计的功能 (6)关闭数据库的登陆退出的审计功能。 --关闭数据库的审计: [omm@gaussdb01 ~]$ gs_guc set -Z coordinator -Z datanode -N all -I all -c "audit_login_logout = 0" The gs_guc run with the following arguments: [gs_guc -Z coordinator -Z datanode -N all -I all -c audit_login_logout = 0 set ]. Begin to perform the total nodes: 3. Popen count is 3, Popen success count is 3, Popen failure count is 0. Begin to perform gs_guc for coordinators. Command count is 3, Command success count is 3, Command failure count is 0. Total instances: 3. Failed instances: 0. ALL: Success to perform gs_guc! Begin to perform the total nodes: 3. Popen count is 3, Popen success count is 3, Popen failure count is 0. Begin to perform gs_guc for datanodes. Command count is 3, Command success count is 3, Command failure count is 0. Total instances: 9. Failed instances: 0. ALL: Success to perform gs_guc! (7)检查登陆退出审计 gaussdb=> show audit_login_logout; audit_login_logout -------------------- 7 (1 row) --我们发现没有变化,即登陆退出的审计不是立即可以关闭的。 (8)重启集群 --关闭集群 [omm@gaussdb01 ~]$ cm_ctl stop cm_ctl: stop cluster. cm_ctl: stop nodeid: 1 cm_ctl: stop nodeid: 2 cm_ctl: stop nodeid: 3 ................................ cm_ctl: stop cluster successfully. cm_ctl: stopping the ETCD cluster. .............. cm_ctl: The ETCD cluster stops successfully. [omm@gaussdb01 ~]$ --启动集群 [omm@gaussdb01 ~]$ cm_ctl start cm_ctl: starting the ETCD cluster. . cm_ctl: the ETCD cluster starts successfully. cm_ctl: checking cluster status. cm_ctl: checking cluster status. cm_ctl: checking finished in 1792 ms. cm_ctl: start cluster. cm_ctl: start nodeid: 1 cm_ctl: start nodeid: 2 cm_ctl: start nodeid: 3 ............... cm_ctl: start cluster successfully. --(9)检查登陆退出审计参数。 gaussdb=> show audit_login_logout; audit_login_logout -------------------- 0 (1 row) --可以发现,登陆退出的审计功能已经关闭。 4.关闭登陆退出审计功能后验证是否记录审计日志 (10)登陆退出并查看日志 [omm@gaussdb02 ~]$ date Fri Sep 1 13:14:09 CST 2023 [omm@gaussdb02 ~]$ gsql -d sjzt -U sjzt -W Gauss_123 -p 8000 gsql ((GaussDB Kernel 503.1.0.SPC1200 build c28d95e9) compiled at 2023-07-05 16:26:07 commit 5703 last mr 11933 release) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. sjzt=> \q gaussdb=> select * from pg_query_audit('2023-09-01 12:59:00', '2023-09-01 16:00:00') where username<>'rdsAdmin'; time | type | result | userid | username | database | client_conninfo | object_name | detail_info | node_name | thread_id | local_port | remote_port ------------------------+----------------+--------+--------+-----------+-----------+---------------------+-------------+----------------------------------------------------------+-----------+---------------------------------+------------+------------- 2023-09-01 13:01:07+08 | login_success | ok | 16900 | sjzt | sjzt | gsql@[local] | sjzt | login db(sjzt) success,the current user is:sjzt, SSL=off | cn_5001 | 139950822323968@746859667984405 | 8000 | null 2023-09-01 13:04:20+08 | user_logout | ok | 16900 | sjzt | sjzt | gsql@[local] | sjzt | session timeout, logout db(sjzt) success | cn_5001 | 139950822323968@746859860894315 | 8000 | null 2023-09-01 13:10:33+08 | user_logout | ok | 16900 | sjzt | sjzt | gsql@[local] | sjzt | session timeout, logout db(sjzt) success | cn_5001 | 139950872786688@746860233783267 | 8000 | null 2023-09-01 13:10:42+08 | system_stop | ok | | null | null | null | null | system stop fast success | cn_5001 | null | null | null 2023-09-01 13:10:42+08 | user_logout | ok | 16420 | root | postgres | gsql@[local] | postgres | session timeout, logout db(postgres) success | cn_5001 | 139951683720960@746860242507692 | 8000 | null 2023-09-01 13:11:52+08 | internal_event | ok | 0 | [unknown] | [unknown] | [unknown]@[unknown] | file | create a new audit file | cn_5001 | 14 (6 rows) --可以发现:11:14分并没有记录到登陆退出的审计日志。 登陆退出审计功能关闭后,不再记录登陆和退出日志。 5.开启数据库登陆退出的审计功能 (11)重新开启登陆退出的审计功能。 --开启审计功能,同样需要重启集群才能生效。 gs_guc set -Z coordinator -Z datanode -N all -I all -c "audit_login_logout = 7" cm_ctl stop cm_ctl start gaussdb=> show audit_login_logout; audit_login_logout -------------------- 7 (1 row) gaussdb=> select * from pg_query_audit('2023-09-01 12:59:00', '2023-09-01 16:00:00') where username='root' and database='postgres'; time | type | result | userid | username | database | client_conninfo | object_name | detail_info | node_name | thread_id | local_port | remote_port ------------------------+---------------+--------+--------+----------+----------+-------------------+-------------+--------------------------------------------------------------+-----------+---------------------------------+------------+------------- 2023-09-01 13:10:42+08 | user_logout | ok | 16420 | root | postgres | gsql@[local] | postgres | session timeout, logout db(postgres) success | cn_5001 | 139951683720960@746860242507692 | 8000 | null 2023-09-01 13:19:19+08 | login_failed | failed | 16420 | root | postgres | [unknown]@[local] | postgres | login db(postgres)failed with no password, SSL=off | cn_5001 | 140573868291840@746860759463930 | 8000 | null 2023-09-01 13:19:25+08 | login_success | ok | 16420 | root | postgres | gsql@[local] | postgres | login db(postgres) success,the current user is:root, SSL=off | cn_5001 | 140573868291840@746860765764587 | 8000 | null 2023-09-01 13:23:41+08 | login_success | ok | 16420 | root | postgres | gsql@[local] | postgres | login db(postgres) success,the current user is:root, SSL=off | cn_5001 | 140573847254784@746861021688743 | 8000 | null 2023-09-01 13:24:00+08 | user_logout | ok | 16420 | root | postgres | gsql@[local] | postgres | session timeout, logout db(postgres) success | cn_5001 | 140573847254784@746861040399637 | 8000 | null 2023-09-01 13:24:08+08 | login_success | ok | 16420 | root | postgres | gsql@[local] | postgres | login db(postgres) success,the current user is:root, SSL=off | cn_5001 | 140573847254784@746861048330684 | 8000 | null 2023-09-01 13:24:22+08 | user_logout | ok | 16420 | root | postgres | gsql@[local] | postgres | session timeout, logout db(postgres) success | cn_5001 | 140573847254784@746861062082322 | 8000 | null (7 rows) 6.总结 1)系统登陆退出的审计,开启和关闭都需要重启集群。 2)pg_query_audit,审计日志只记录在本节点登陆和退出的用户,在集群其他节点登陆和退出不会在当前节点记录。在其他节点无论登陆退出多少次,在当前节点下都无法查询到。 3)集群级别的审计日志需要使用:pgxc_query_audit 表来查看。 我们上面看的都是本地登陆的信息。 SELECT * FROM pgxc_query_audit('2023-09-01 12:59:00', '2023-09-01 16:00:00')where username='root' and database='postgres'; 本文作者:薛双奇
-
1.用户管理 --用户创建 --创建用户: --创建用户并设置密码 gaussdb=> create user user1 identified by 'Gauss_123'; CREATE ROLE --创建用户并授予权限:sysadmin gaussdb=> create user user2 with sysadmin password 'Gauss_123'; CREATE ROLE --创建用户时指定用的寿命 gaussdb=> create user user3 with VALID BEGIN '2023-09-04 23:59:59' VALID UNTIL '2023-09-10 00:00:00' identified by 'Gauss_123' CONNECTION LIMIT 100; CREATE ROLE --修改用户具有sysadmin权限。 gaussdb=> alter user user1 with sysadmin; ALTER ROLE --重命名用户 gaussdb=> alter user user2 rename to user4; ALTER ROLE gaussdb=> drop user user4; DROP ROLE --删除有数据的用户; --无法删除,有四个对象在sjzt数据库里。 gaussdb=> drop user user1 cascade; ERROR: role "user1" cannot be dropped because some objects depend on it DETAIL: 4 objects in database sjzt --解决方法。 revoke all on database sjzt from user1; DROP user user1; --如果数据库是用户user1创建的. alter database sjzt owner to sjzt; DROP user user1; 2.表空间管理 --表空间管理 --创建表空间: --创建自定义表空间 gaussdb=> create tablespace tbs2 relative location 'tablespace/tbs2' maxsize '10M'; CREATE TABLESPACE gaussdb=> select * from pg_tablespace_location((select oid from pg_tablespace where spcname='tbs2')); pg_tablespace_location ------------------------ tablespace/tbs2 (1 row) gaussdb=> create user jack with password 'Gauss_123'; CREATE ROLE --只在第一个节点上手工创建目录。 cd /data/cluster/data mkdir my_tbs chown -R omm:ommm my_tbs chmod -R 775 my_tbs gaussdb=> create tablespace tbs3 owner jack location '/data/cluster/data/my_tbs/tbs3'; CREATE TABLESPACE gaussdb=> select oid,* from pg_tablespace; oid | spcname | spcowner | spcacl | spcoptions | spcmaxsize | relative -------+------------+----------+--------+------------+------------+---------- 1663 | pg_default | 10 | | | | f 1664 | pg_global | 10 | | | | f 18203 | tbs2 | 16420 | | | 10240 K | t 18208 | tbs3 | 18204 | | | | f (4 rows) --可以看到,虽然只在第一个目录创建了表空间的目录,但是创建成功后, --集群所有自定义表空间的信息都复制到了所有节点。 --所以创建自定义表空间,只需要在一个节点上创建目录即可,不需要在所有的节点都创建。 [omm@gaussdb01 my_tbs]$ cd tbs3/ [omm@gaussdb01 tbs3]$ ll total 16 drwx------ 3 omm omm 4096 Sep 4 18:57 PG_9.2_201611171_cn_5001 drwx------ 3 omm omm 4096 Sep 4 18:57 PG_9.2_201611171_dn_6001_6002_6003 drwx------ 3 omm omm 4096 Sep 4 18:57 PG_9.2_201611171_dn_6004_6005_6006 drwx------ 3 omm omm 4096 Sep 4 18:57 PG_9.2_201611171_dn_6007_6008_6009 [omm@gaussdb02 my_tbs]$ cd tbs3/ [omm@gaussdb02 tbs3]$ ll total 16 drwx------ 3 omm omm 4096 Sep 4 18:56 PG_9.2_201611171_cn_5002 drwx------ 3 omm omm 4096 Sep 4 18:56 PG_9.2_201611171_dn_6001_6002_6003 drwx------ 3 omm omm 4096 Sep 4 18:56 PG_9.2_201611171_dn_6004_6005_6006 drwx------ 3 omm omm 4096 Sep 4 18:56 PG_9.2_201611171_dn_6007_6008_6009 [omm@gaussdb02 tbs3]$ [omm@gaussdb03 my_tbs]$ cd tbs3/ [omm@gaussdb03 tbs3]$ ll total 16 drwx------ 3 omm omm 4096 Sep 4 18:57 PG_9.2_201611171_cn_5003 drwx------ 3 omm omm 4096 Sep 4 18:57 PG_9.2_201611171_dn_6001_6002_6003 drwx------ 3 omm omm 4096 Sep 4 18:57 PG_9.2_201611171_dn_6004_6005_6006 drwx------ 3 omm omm 4096 Sep 4 18:57 PG_9.2_201611171_dn_6007_6008_6009 [omm@gaussdb03 tbs3]$ ---查看表空间 gaussdb=> select oid,* from pg_tablespace; oid | spcname | spcowner | spcacl | spcoptions | spcmaxsize | relative -------+------------+----------+--------+------------+------------+---------- 1663 | pg_default | 10 | | | | f 1664 | pg_global | 10 | | | | f 18203 | tbs2 | 16420 | | | 10240 K | t 18208 | tbs3 | 18204 | | | | f (4 rows) gaussdb=> alter tablespace tbs3 rename to tbs4; --重命名 ALTER TABLESPACE gaussdb=> alter tablespace tbs4 owner to jack; --修改属主 ALTER TABLESPACE gaussdb=> alter tablespace tbs4 resize maxsize unlimited; --修改大小 ALTER TABLESPACE gaussdb=> alter tablespace tbs4 reset (random_page_cost); --修改访问页的成本值。 ALTER TABLESPACE gaussdb=> drop tablespace tbs4; --删除表空间。 DROP TABLESPACE 3.数据库管理 --数据库管理 --创建数据库: gaussdb=> create database mydb2; CREATE DATABASE gaussdb=> create database mydb3 with owner=jack encoding='UTF-8' LC_COLLATE='zh_CN.UTF-8' LC_CTYPE='zh_CN.UTF-8' DBCOMPATIBILITY='ORA' TABLESPACE=tbs2 CONNECTION LIMIT=1000; CREATE DATABASE --指定了数据库mydb3的拥有者(owner)、编码(encoding)、字符集(LC_COLLATE)、字符分类(LC_CTYPE)、兼容模式(DBCOMPATIBILITY)、 --默认表空间(TABLESPACE)、并发连接限制(CONNECTION LIMIT) --修改数据库属性: gaussdb=> alter database mydb3 rename to mydb4; --修改数据库的名字 ALTER DATABASE gaussdb=> alter database mydb2 owner to user1; --修改数据库的属主 ALTER DATABASE gaussdb=> alter database mydb2 set tablespace tbs2; --设置数据库的表空间。 ALTER DATABASE gaussdb=> drop database mydb4; --删除数据库。 DROP DATABASE --查看数据库。 gaussdb=> \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+-----------+---------+-------+----------------------- mydb2 | user1 | SQL_ASCII | C | C | postgres | rdsAdmin | SQL_ASCII | C | C | =Tc/rdsAdmin + | | | | | rdsAdmin=CTc/rdsAdmin+ | | | | | rdsBackup=c/rdsAdmin + | | | | | rdsRepl=c/rdsAdmin + | | | | | root=c/rdsAdmin + | | | | | rdsMetric=c/rdsAdmin sjzt | sjzt | SQL_ASCII | C | C | =Tc/sjzt + | | | | | sjzt=CTc/sjzt + | | | | | sjzt=APm/sjzt template0 | rdsAdmin | SQL_ASCII | C | C | =c/rdsAdmin + | | | | | rdsAdmin=CTc/rdsAdmin template1 | rdsAdmin | SQL_ASCII | C | C | =c/rdsAdmin + | | | | | rdsAdmin=CTc/rdsAdmin (5 rows) --系统表查看数据库。 gaussdb=> select * from pg_database; datname | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace | datcompatibility | datacl | datfrozenxid64 | datminmxid | dattimezone -----------+--------+----------+------------+----------+---------------+--------------+--------------+---------------+--------------+---------------+------------------+-------------------------------------------------------------------------------------------------------------------+----------------+------------+------------- template1 | 10 | 0 | C | C | t | t | -1 | 12732 | 0 | 1663 | MYSQL | {=c/rdsAdmin,rdsAdmin=CTc/rdsAdmin}| 3 | 1 | PRC template0 | 10 | 0 | C | C | t | f | -1 | 12732 | 0 | 1663 | MYSQL | {=c/rdsAdmin,rdsAdmin=CTc/rdsAdmin}| 3 | 0 | PRC postgres | 10 | 0 | C | C | f | t | -1 | 12732 | 0 | 1663 | MYSQL | {=Tc/rdsAdmin,rdsAdmin=CTc/rdsAdmin,rdsBackup=c/rdsAdmin,rdsRepl=c/rdsAdmin,root=c/rdsAdmin,rdsMetric=c/rdsAdmin} | 3 | 0 | PRC mydb2 | 18191 | 0 | C | C | f | t | -1 | 12732 | 0 | 18203 | MYSQL | | 3 | 0 | PRC sjzt | 16900 | 0 | C | C | f | t | -1 | 12732 | 0 | 1663 | MYSQL | {=Tc/sjzt,sjzt=CTc/sjzt,sjzt=APm/sjzt}| 3 | 0 | PRC (5 rows) gaussdb=> 4.总结 GaussDB中可以设置用户的寿命,这是它的一个特色。表空间可以自定义,并且只需要在一个节点创建目录授权即可。数据库的创建,支持:ORA,MYSQL,TD,PG四种模式。 作者:薛双奇
Gauss松鼠会小助手2
发表于2024-12-16 11:10:01
2024-12-16 11:10:01
最后回复
yd_214057753
2025-08-19 10:16:54
4717 5 -
1.创建行存表 sjzt=> create table emp(id int,ename varchar(20),sal number,empno int,deptno int) distribute by hash(empno); CREATE TABLE insert into emp values(1,'xsq1',2000,6379,10); sjzt=> create table dept(deptno int,name varchar(20)); CREATE TABLE sjzt=> create table emp1 as select * from emp where sal<2000; INSERT 0 0 sjzt=> create table emp2 as table emp; INSERT 0 0 2.创建表并使用特定表空间 -- 表不存在时才创建,使得当该表存在时该建表语句不会报错 -- 事务结束时检查字段是否有重复 -- 缺省值为'GA' --需要给用户授予表空间的CREATE权限,才可以在表空间中创建对象。 gaussdb=> grant create on tablespace tbs3 to sjzt; GRANT sjzt=> CREATE TABLE IF NOT EXISTS warehouse_t1 ( W_WAREHOUSE_SK INTEGER NOT NULL, W_WAREHOUSE_ID CHAR(16) NOT NULL, W_WAREHOUSE_NAME VARCHAR(20) UNIQUE DEFERRABLE, W_SUITE_NUMBER CHAR(10), W_STATE CHAR(2) DEFAULT 'GA', W_GMT_OFFSET DECIMAL(5,2) ) TABLESPACE tbs3; NOTICE: CREATE TABLE / UNIQUE will create implicit index "warehouse_t1_w_warehouse_name_key" for table "warehouse_t1" CREATE TABLE -- 创建非日志表,即不写入预写日志 -- 主键约束,-- 唯一键约束,-- 检查列约束 sjzt=> CREATE UNLOGGED TABLE warehouse_t2 ( W_WAREHOUSE_SK INTEGER PRIMARY KEY, W_WAREHOUSE_ID CHAR(16) NOT NULL, W_WAREHOUSE_NAME VARCHAR(20) UNIQUE, W_GMT_OFFSET DECIMAL(5,2) , CONSTRAINT W_CONSTR_KEY2 CHECK(W_WAREHOUSE_SK > 0 AND W_WAREHOUSE_NAME IS NOT NULL) ) WITH(fillfactor=70); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "warehouse_t2_pkey" for table "warehouse_t2" NOTICE: CREATE TABLE / UNIQUE will create implicit global secondary index "warehouse_t2_w_warehouse_name_key_g" for table "warehouse_t2" CREATE TABLE 3.列存表创建 --列存表创建: -- 局部聚簇存储 -- 带有压缩特性的列存储表(列存储表不支持约束) sjzt=> CREATE TABLE warehouse_t3 ( W_WAREHOUSE_SK INTEGER NOT NULL, W_WAREHOUSE_ID CHAR(16) NOT NULL, W_WAREHOUSE_NAME VARCHAR(20), W_GMT_OFFSET DECIMAL(5,2), PARTIAL CLUSTER KEY(W_WAREHOUSE_SK, W_WAREHOUSE_ID) ) WITH (ORIENTATION = COLUMN, COMPRESSION=HIGH); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'w_warehouse_sk' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE 4.修改表的属性 --修改表属性: --WHERE条件创建表。 sjzt=> create table emp1 as select * from emp where sal<2000; NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'id' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. INSERT 0 0 --AS 创建表。 sjzt=> create table emp2 as table emp; NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'id' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. INSERT 0 1 --修改列属性。 sjzt=> alter table emp1 modify sal number(10,2); ALTER TABLE --重命名列名称。 sjzt=> alter table emp1 rename column ename to name; ALTER TABLE --无法直接创建主键,必须保护分布列。emp1的分布列是ID; sjzt=> alter table emp1 add primary key (empno); ERROR: Cannot create index whose evaluation cannot be enforced to remote nodes sjzt=> \d+ emp1 Table "sjzt.emp1" Column | Type | Modifiers | Storage | Stats target | Description --------+-----------------------+-----------+----------+--------------+------------- id | integer | | plain | | name | character varying(20) | | extended | | sal | numeric(10,2) | | main | | empno | integer | | plain | | deptno | integer | | plain | | Has OIDs: no Distribute By: HASH(id) Location Nodes: ALL DATANODES Options: orientation=row, compression=no --添加主键,需要增加分布列。 sjzt=> alter table emp1 add primary key (empno,id); NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "emp1_pkey" for table "emp1" ALTER TABLE --添加检查约束。 sjzt=> alter table emp1 add constraint chk_dept check (deptno is not null); ALTER TABLE --GaussDB目前不支持外键约束。 sjzt=> alter table emp1 add constraint fk_dept foreign key (deptno) references dept(deptno); ERROR: FOREIGN KEY ... REFERENCES constraint is not yet supported. --设置sal列为非空约束。 sjzt=> alter table emp1 modify sal constraint chk_sal not null; ALTER TABLE --重命名约束名称 sjzt=> alter table emp1 rename constraint chk_dept to chk_deptno; ALTER TABLE --重置schema; sjzt=> alter table emp1 set schema mydb1; ALTER TABLE --表重命名 sjzt=> alter table mydb1.emp1 rename to emp2; ALTER TABLE sjzt=> \d mydb1.emp2 Table "mydb1.emp2" Column | Type | Modifiers --------+-----------------------+----------- id | integer | not null name | character varying(20) | sal | numeric(10,2) | not null empno | integer | not null deptno | integer | Indexes: "emp1_pkey" PRIMARY KEY, btree (empno, id) TABLESPACE pg_default Check constraints: "chk_deptno" CHECK (deptno IS NOT NULL) 5.总结 (1)使用表空间需要有对表空间的CREATE权限。 (2)GaussDB MYSQL兼容模式不支持外键。 (3)GaussDB 支持列存和行存表。 作者:薛双奇
-
1.范围分区表相关技术包括如下 分区表: (1)按照数字范围分区 (2)包含START,END关键字的按照数字范围分区 (3)分区表的分区指定特定的表空间。 (4)删除包含某个数字值的分区。 (5)添加分区 (6)重命名分区 (7)移动分区到某个指定表空间 (8)在某个值处对某个分区进行拆分 (9)将两个分区合并成一个分区。 (10)分区交换技术 2.范围分区表的详细演练 --范围分区表。 CREATE TABLE part_tbl1 (a int, b int) PARTITION BY RANGE(a) ( PARTITION part1 VALUES LESS THAN (10), PARTITION part2 VALUES LESS THAN (100), PARTITION part3 VALUES LESS THAN (MAXVALUE) ); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'a' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE sjzt=> --包含START 和END 关键字的分区表。 sjzt=> CREATE TABLE part_tbl2 (a int, b int) PARTITION BY RANGE(a) ( partition part1 START(1) END(100) EVERY(50), partition part2 END(200), partition part3 START(200) END(300), partition part4 start(300) ); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'a' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE --创建范围分区表: -- 按照属性范围划分分区,指定分区。 CREATE TABLE pt1 ( id INTEGER, name Varchar(20), score DECIMAL(5,2) ) PARTITION BY RANGE(score) ( PARTITION P1 VALUES LESS THAN(60) tablespace tbs3, PARTITION P2 VALUES LESS THAN(85) tablespace tbs3, PARTITION P3 VALUES LESS THAN(MAXVALUE) tablespace tbs3 ); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'id' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE sjzt=> --插入数据: sjzt=> insert into pt1 values(1,'Jerry',99); INSERT 0 1 sjzt=> insert into pt1 values(2,'Tom',80); INSERT 0 1 sjzt=> insert into pt1 values(3,'Jack',55); INSERT 0 1 --查询分区表: sjzt=> select * from pt1 partition (p3); id | name | score ----+-------+------- 1 | Jerry | 99.00 (1 row) --查询分区表的分区 sjzt=> select p.relname,c.relname from pg_partition p,pg_class c where p.parentid=c.oid; relname | relname -----------+----------- part3 | part_tbl1 part2 | part_tbl1 part1 | part_tbl1 part_tbl1 | part_tbl1 part4 | part_tbl2 part3 | part_tbl2 part2 | part_tbl2 part1_2 | part_tbl2 part1_1 | part_tbl2 part1_0 | part_tbl2 part_tbl2 | part_tbl2 p3 | pt1 p2 | pt1 p1 | pt1 pt1 | pt1 (15 rows) -- 删除分区: --删除90所在的分区,看到分区P3已经没有了。 sjzt=> alter table pt1 drop partition for(90); ALTER TABLE sjzt=> select p.relname,c.relname from pg_partition p,pg_class c where p.parentid=c.oid; relname | relname -----------+----------- part3 | part_tbl1 part2 | part_tbl1 part1 | part_tbl1 part_tbl1 | part_tbl1 part4 | part_tbl2 part3 | part_tbl2 part2 | part_tbl2 part1_2 | part_tbl2 part1_1 | part_tbl2 part1_0 | part_tbl2 part_tbl2 | part_tbl2 p2 | pt1 p1 | pt1 pt1 | pt1 (14 rows) -- 增加分区: sjzt=> alter table pt1 add partition p3 values less than (95); ALTER TABLE sjzt=> alter table pt1 add partition p4 values less than (MAXVALUE); ALTER TABLE -- sjzt=> select p.relname,c.relname from pg_partition p,pg_class c where p.parentid=c.oid; relname | relname -----------+----------- part3 | part_tbl1 part2 | part_tbl1 part1 | part_tbl1 part_tbl1 | part_tbl1 part4 | part_tbl2 part3 | part_tbl2 part2 | part_tbl2 part1_2 | part_tbl2 part1_1 | part_tbl2 part1_0 | part_tbl2 part_tbl2 | part_tbl2 pt1 | pt1 p4 | pt1 p3 | pt1 p2 | pt1 p1 | pt1 (16 rows) --分区表修改: --重命名分区 sjzt=> alter table pt1 rename partition p4 to pmax; ALTER TABLE --移动对象到别的表空间。 sjzt=> alter table pt1 move partition pmax tablespace tbs2; ALTER TABLE --在90处分割分区。 sjzt=> alter table pt1 split partition p3 at (90) into (partition p4,partition p5); ALTER TABLE --分离完成后没有P3了。 sjzt=> select p.relname,c.relname from pg_partition p,pg_class c where p.parentid=c.oid; relname | relname -----------+----------- part3 | part_tbl1 part2 | part_tbl1 part1 | part_tbl1 part_tbl1 | part_tbl1 part4 | part_tbl2 part3 | part_tbl2 part2 | part_tbl2 part1_2 | part_tbl2 part1_1 | part_tbl2 part1_0 | part_tbl2 part_tbl2 | part_tbl2 p4 | pt1 pt1 | pt1 pmax | pt1 p5 | pt1 p2 | pt1 p1 | pt1 (17 rows) --合并完成后没有P4,P5了,最后剩下P3; sjzt=> alter table pt1 merge partitions p4,p5 into partition p3; ALTER TABLE sjzt=> select p.relname,c.relname from pg_partition p,pg_class c where p.parentid=c.oid; relname | relname -----------+----------- part3 | part_tbl1 part2 | part_tbl1 part1 | part_tbl1 part_tbl1 | part_tbl1 part4 | part_tbl2 part3 | part_tbl2 part2 | part_tbl2 part1_2 | part_tbl2 part1_1 | part_tbl2 part1_0 | part_tbl2 part_tbl2 | part_tbl2 p3 | pt1 pt1 | pt1 pmax | pt1 p2 | pt1 p1 | pt1 (16 rows) CREATE TABLE T1 ( id INTEGER, name Varchar(20), score DECIMAL(5,2) ); sjzt=> insert into t1 values(3,'Jack',85); INSERT 0 1 sjzt=> select * from t1; id | name | score ----+------+------- 3 | Jack | 85.00 (1 row) sjzt=> select * from pt1 partition(p3); id | name | score ----+------+------- (0 rows) -- 普通表与分区表数据交换 --分区交换技术是Oracle特有的,现在GaussDB也实现了。 sjzt=> alter table pt1 exchange partition (p3) with table t1; ALTER TABLE sjzt=> select * from pt1 partition(p3); id | name | score ----+------+------- 3 | Jack | 85.00 (1 row) -- 查询分区表属性信息 SELECT t1.oid, t1.relname, partstrategy, boundaries, t1.reltablespace, t1.parentid FROM pg_partition t1, pg_class t2 WHERE t1.parentid = t2.oid AND t2.relname = 'pt1' AND t1.parttype = 'p'; oid | relname | partstrategy | boundaries | reltablespace | parentid -------+---------+--------------+------------+---------------+---------- 26455 | p3 | r | {95.00} | 0 | 26419 26427 | pmax | r | {NULL} | 18203 | 26419 26424 | p2 | r | {85} | 18236 | 26419 26423 | p1 | r | {60} | 18236 | 26419 (4 rows) 3.总结 GaussDB分区表里面有两个比较有特色的内容: (1)分区交换技术,这个只在oracle里面出现过,现在GaussDB也实现了这个功能。 (2)保护START,END 关键字创建分区表。这个也是第一次见,比较新鲜。 作者:薛双奇
上滑加载中
推荐直播
-
华为云码道 × 仓颉编程:工程化AI编码探索2026/05/27 周三 19:00-21:00
刘俊杰-华为云仓颉语言专家/李炎-华为云码道技术专家/王智鹏-OpenCangjie开源社区发起人
本场直播围绕华为云仓颉语言与华为云码道的深度结合,展示华为云智能编程从零基础到高效落地的完整生态能力。以华为云码道为引擎,仓颉语言为载体,带给大家日常提效、趣味创新到极速量产的开发体验。
回顾中
热门标签