• [技术干货] 云部署有哪些方式?2025年最全部署方案指南,让企业少走弯路
    在数字化转型的浪潮中,云部署已成为企业不可或缺的选择。然而,面对众多的部署选项,许多技术决策者常常感到困惑:究竟哪种方式最适合我的业务?本文将深入剖析云部署的三种主流方式,从多个维度进行客观对比,帮助您做出明智决策。  一、公有云:成本与弹性的最优解核心特征:公有云是最典型的云部署模式,由云服务商提供共享的基础设施资源,多个租户通过互联网访问相同的计算、存储和网络资源。适用场景:初创企业和中小型企业流量波动明显的互联网业务开发和测试环境数据备份和灾难恢复优势分析:1. 成本效益:采用按需付费模式,无需前期硬件投资,可将资本支出转为运营支出2. 弹性扩展:可根据业务需求快速调整资源规模,轻松应对流量高峰3. 维护简便:服务商负责底层基础设施的维护和升级4. 全球部署:借助服务商的全球数据中心,快速实现业务国际化布局局限性:数据存储在第三方环境,对数据主权有严格要求的行业需要谨慎评估网络性能受互联网质量影响定制化程度相对有限二、私有云:安全与控制的平衡之道核心特征:私有云为企业提供专属的云环境,可以部署在企业自建的数据中心,也可以由第三方托管,但资源完全隔离。适用场景:金融机构、政府单位等监管严格的行业处理敏感数据的企业需要高度定制化的大型企业有特定合规要求的业务系统优势分析:1. 安全保障:物理隔离确保数据完全掌控在企业手中2. 合规支持:更容易满足行业监管要求3. 性能稳定:不受其他租户影响,资源独享4. 深度定制:可根据业务需求进行全方位定制局限性:初始投资较大,需要专业运维团队扩展速度相对较慢总体拥有成本较高三、混合云:灵活与稳健的完美融合核心特征:混合云结合了公有云和私有云的优势,通过专用网络连接,实现工作负载在两种环境间的无缝迁移。适用场景:业务需求波动大的中大型企业数字化转型过程中的传统企业需要兼顾创新与稳定的组织有特定数据驻留要求的国际化企业优势分析:1. 架构灵活:敏感数据存放在私有云,普通业务部署在公有云2. 成本优化:基础负载使用私有云,峰值负载借助公有云弹性3. 风险分散:避免单一供应商锁定4. 平滑演进:支持从传统架构到云原生的渐进式转型局限性:架构设计复杂,技术要求高需要管理多个环境,运维难度较大网络延迟和带宽成本需要重点考虑四、多云策略:避免依赖与优化选择核心特征:多云策略指同时使用两家及以上云服务商的服务,可能是多个公有云组合,也可能是多个私有云组合。适用场景:追求最高程度业务连续性的企业需要利用不同云服务商特色功能的企业希望增强议价能力的大型组织通过不同云服务商服务不同区域业务的跨国公司优势分析:1. 避免锁定:降低对单一供应商的依赖2. 最佳组合:为不同工作负载选择最合适的云平台3. 提升韧性:单个云服务商故障不影响全局业务4. 成本优化:利用供应商间的竞争获取更优价格局限性:管理复杂度最高需要掌握多种技术栈跨云数据传输成本较高五、四种部署方式的多维对比为了更直观地展示差异,我们从六个关键维度进行对比:  六、如何选择适合的云部署方式?选择云部署方式时,建议从以下几个角度进行考量:1. 业务需求:分析业务的关键性、流量模式和性能要求2. 合规要求:评估行业监管政策和数据主权要求3. 技术能力:评估现有团队的技术水平和运维能力4. 成本预算:综合考虑初始投入和长期运营成本5. 发展计划:考虑未来3-5年的业务发展规划实践建议:从小规模试点开始,逐步验证技术路线建立云治理框架,确保可控性和安全性考虑聘请第三方顾问进行客观评估制定清晰的迁移和回滚方案结语云部署没有"一刀切"的最佳方案,每种方式都有其独特的价值和适用场景。重要的是基于企业的实际需求、技术实力和发展战略,选择最适合的部署模式。随着技术的发展和业务需求的变化,云部署策略也需要持续优化和调整。在云时代,灵活性和适应性比任何时候都更加重要。希望本文能为您在云部署的决策过程中提供有价值的参考。
  • [问题求助] RDS for PostgreSQL 的数据包装器 obs_fdw如何使用
    没找到任何使用说明,和pg的parquet s3 fdw差不多的东西吗
  • OpenGauss的Schema
    创建了数据库之后,还需要创建模式(Schema)才能够存储数据库对象。通常在创建一个新的数据库时,默认会创建一个模式 public。背景信息schema又称作模式。通过管理schema,允许多个用户使用同一数据库而不相互干扰,可以将数据库对象组织成易于管理的逻辑组,同时便于将第三方应用添加到相应的schema下而不引起冲突。管理schema包括:创建schema、使用schema、删除schema、设置schema的搜索路径以及schema的权限控制。注意事项openGauss包含一个或多个已命名数据库。用户和用户组在openGauss范围内是共享的,但是其数据并不共享。任何与服务器连接的用户都只能访问连接请求里声明的那个数据库。一个数据库可以包含一个或多个已命名的schema,schema又包含表及其他数据库对象,包括数据类型、函数、操作符等。同一对象名可以在不同的schema中使用而不会引起冲突。例如,schema1和schema2都可以包含一个名为mytable的表。和数据库不同,schema不是严格分离的。用户根据其对schema的权限,可以访问所连接数据库的schema中的对象。进行schema权限管理首先需要对数据库的权限控制进行了解。不能创建以PG_为前缀的schema名,该类schema为数据库系统预留的。在每次创建新用户时,系统会在当前登录的数据库中为新用户创建一个同名Schema。对于其他数据库,若需要同名Schema,则需要用户手动创建。通过未修饰的表名(名称中只含有表名,没有“schema名”)引用表时,系统会通过search_path(搜索路径)来判断该表是哪个schema下的表。pg_temp和pg_catalog始终会作为搜索路径顺序中的前两位,无论二者是否出现在search_path中,或者出现在search_path中的任何位置。search_path(搜索路径)是一个schema名列表,在其中找到的第一个表就是目标表,如果没有找到则报错。(某个表即使存在,如果它的schema不在search_path中,依然会查找失败)在搜索路径中的第一个schema叫做“当前schema”。它是搜索时查询的第一个schema,同时在没有声明schema名时,新创建的数据库对象会默认存放在该schema下。每个数据库都包含一个pg_catalog schema,它包含系统表和所有内置数据类型、函数、操作符。pg_catalog是搜索路径中的一部分,始终在临时表所属的模式后面,并在search_path中所有模式的前面,即具有第二搜索优先级。这样确保可以搜索到数据库内置对象。如果用户需要使用和系统内置对象重名的自定义对象时,可以在操作自定义对象时带上自己的模式。Schema操作步骤创建管理用户及权限schema执行如下命令来创建一个schema。语法格式创建SCHEMACREATE SCHEMA schema_name [ AUTHORIZATION user_name ] ;修改SCHEMA  修改模式的名称ALTER SCHEMA schema_name RENAME TO new_name;修改模式的所有者。ALTER SCHEMA schema_name OWNER TO new_owner;删除SCHEMA及其对象。DROP SCHEMA schema_name;不要随意删除pg_temp或pg_toast_temp开头的模式,这些模式是系统内部使用的,如果删除,可能导致无法预知的结果。参数说明schema_name模式名称须知: 模式名不能和当前数据库里其他的模式重名。 模式的名称不可以“pg_”开头。取值范围:字符串,要符合标识符的命名规范。AUTHORIZATION user_name指定模式的所有者。当不指定schema_name时,把user_name当作模式名,此时user_name只能是角色名。取值范围:已存在的用户名/角色名。schema_element在模式里创建对象的SQL语句。目前仅支持CREATE TABLE、CREATE VIEW、CREATE INDEX、CREATE PARTITION、CREATE SEQUENCE、CREATE TRIGGER、GRANT子句。子命令所创建的对象都被AUTHORIZATION子句指定的用户所拥有。说明: 如果当前搜索路径上的模式中存在同名对象时,需要明确指定引用对象所在的模式。可以通过命令SHOW SEARCH_PATH来查看当前搜索路径上的模式。根据用户名创建模式。openGauss=# CREATE SCHEMA test AUTHORIZATION user1; CREATE SCHEMA查看当前搜索路径openGauss=# SHOW SEARCH_PATH; search_path ---------------- "$user",public (1 row)更改当前会话的默认Schema。openGauss=# SET SEARCH_PATH TO test1, public; SET删除SCHEMA及其对象。openGauss=# DROP SCHEMA test1; DROP SCHEMA使用以下命令查看现有的schema。openGauss=# SELECT current_schema(); current_schema ---------------- myschema (1 row)使用schema在特定schema下创建对象或者访问特定schema下的对象,需要使用有schema修饰的对象名。该名称包含schema名以及对象名,他们之间用“.”号分开。执行如下命令在myschema下创建mytable表。openGauss=# CREATE TABLE myschema.mytable(id int, name varchar(20)); CREATE TABLE如果在数据库中指定对象的位置,就需要使用有schema修饰的对象名称。执行如下命令查询myschema下mytable表的所有数据。openGauss=# SELECT * FROM myschema.mytable; id | name ----+------ (0 rows)常见错误:错误一:无法删除某个角色1. 检查依赖关系确认角色 test 是哪些模式的所有者:sql复制代码SELECT schema_name FROM information_schema.schemata WHERE schema_owner = 'test';若返回结果包含 test 模式,说明该角色是模式的所有者。2. 转移模式所有权将 test 模式的所有权转移给其他角色(如 admin 或新建角色):-- 方法1:直接转移给现有角色(需目标角色存在)ALTER SCHEMA test OWNER TO admin;再次删除,发现即可删除成功。错误二:删除角色关联所有者、对象较多openGauss=# drop role tony; ERROR: role "tony" cannot be dropped because some objects depend on it DETAIL: owner of database mydb owner of database human_staff 1 object in database human_staff1. 确认角色依赖关系通过错误提示可知,角色tony是以下对象的所有者:• 数据库mydb• 数据库human_staff• 数据库human_staff中的1个对象(如表、模式等)2. 转移数据库所有权若需保留数据库,需将其所有权转移给其他角色(如admin):openGauss=# alter database mydb owner to gauss; openGauss=# alter database human_staff owner to gauss;3. 处理数据库内的对象方法1:转移对象所有权将tony拥有的对象(如表、视图等)的所有权转移给其他角色:-- 切换到目标数据库\c human_staff -- 转移所有对象的所有权(慎用,需超级用户权限) REASSIGN OWNED BY tony TO admin; -- 或逐个转移特定对象 ALTER TABLE <table_name> OWNER TO admin; ALTER SCHEMA <schema_name> OWNER TO admin;4. 撤销角色权限若tony在其他数据库(如postgres)中有权限,需撤销这些权限:sql复制代码-- 切换到postgres数据库\c postgres-- 撤销对特定对象的权限REVOKE ALL ON DATABASE postgres FROM tony;REVOKE ALL ON SCHEMA public FROM tony; -- 示例:撤销对public模式的权限REVOKE ALL ON TABLE pg_class FROM tony; -- 示例:撤销对系统表的权限5. 清理共享依赖若tony的依赖关系涉及共享对象(如角色权限),需检查并清理:sql复制代码-- 查看共享依赖关系(需超级用户)SELECT * FROM pg_shdepend WHERE refobjid = (SELECT oid FROM pg_roles WHERE rolname = 'tony');-- 手动撤销相关权限REVOKE USAGE ON SCHEMA <schema_name> FROM tony; -- 示例:撤销对模式的使用权6. 删除角色完成上述步骤后,尝试再次删除角色:DROP ROLE tony;注意事项1. 权限要求:转移所有权、撤销权限等操作需由超级用户或具备足够权限的角色执行。2. 数据安全:使用DROP OWNED BY或DROP DATABASE前,务必确认无需保留相关数据。3. 系统依赖:若tony是系统管理员(rolsuper或rolsystemadmin),需先转移系统权限。
  • openGauss数据库下的Schema极速上手指南
    比较大的数据库:中国移动hr系统 财务系统  10086系统   梦网业务   游戏业务 和网   AI工作流逻辑概念:SCHEMA  业务模式   :划分业务的逻辑概念1.创建一个库:中国移动openGauss=# create database china_mobile;CREATE DATABASE\l  查看一下2.创建不同的schema,我这里创建的是hr 模式;   进入到china_mobileopenGauss=# \c china_mobile\dn  :查看没有创建hr模式之前有几个Schema2.1 创建hrchina_mobile=# create schema hr;CREATE SCHEMAchina_mobile=# \dn     List of schemas      Name       | Owner 【所有者】-----------------+-------...  省略..... hr              | gauss...  省略.....(13 rows)2.2 修改hr为renshialter schema hr rename to renshi;再改回去hralter schema renshi  rename to hr;2.3 删除hr schemachina_mobile=# drop schema hr;2.4 再创建回来;create schema hr;-------------------------------第一节课-----------------------3.开启2个窗口左侧:gaussgauss登录右侧:admin右侧:[gauss@localhost root]$ rlwrap gsql -d china_mobile -p 5432 -U admin两个指令:\dn gauss:china_mobile=# \dn     List of schemas      Name       | Owner -----------------+-------...省略hr              | gaussadmin:hr              | #测试:没有显示所有者,所以,你登录的那个客户端界面,不显示hr;#考试截图 考试:*****修改Schema hr,再次来看;china_mobile=# alter schema hr owner to admin;ALTER SCHEMA再次\dn ?两个都查看hr              | admin4.在模式hr下创建表,    两侧执行:查看当前是哪个模式?mydb=# select current_schema();current_schema ----------------public(1 row)#现在建表需要在表前面加:模式名china_mobile=> create table hr.emp(id int ,name char(20));CREATE TABLEchina_mobile=> \dtNo relations found. 没有表???难道幻听???验证:需要加模式名.表名才可以!!!china_mobile=> select * from hr.emp;id | name ----+------(0 rows)admin如果无法查询,则用gauss用给其授权;#在hr schema 的所有表上进行,授权china_mobile=# grant all on all tables in schema hr to admin;GRANT5.搜索路径的设置,可以解决不用hr的问题;当前用户,admin在其窗口下改,也可以。china_mobile=# show search_path;search_path   ----------------"$user",public(1 row)china_mobile=# set search_path to public,hr;SETchina_mobile=# show search_path;search_path -------------public, hr(1 row)表示:先从public模式下找表,再依次从后面的模式hr下找表。    #6.删除用户/角色操作,一般借助于AI即可。---查询所有的schema下的表-- 方法1 SELECT table_schema, table_nameFROM information_schema.tablesWHERE table_type = 'BASE TABLE'  AND table_schema NOT IN ('pg_catalog', 'information_schema');  information_schema.tables是标准SQL视图,包含所有表的元信息。table_type = 'BASE TABLE'确保只查询普通表(排除视图、临时表等)。table_schema NOT IN ('pg_catalog', 'information_schema')排除系统内置Schema,仅显示用户自定义的Schema下的表    --方法2  SELECT schemaname, tablenameFROM pg_tablesWHERE schemaname NOT IN ('pg_catalog', 'information_schema');#目标要显示所有的schema和表mydb=# set Search_path to hr,public;SETmydb=# show Search_path; search_path ------------- hr, public(1 row)mydb=# \dt                          List of relations Schema |  Name   | Type  | Owner |             Storage              --------+---------+-------+-------+---------------------------------- hr     | emp     | table | gauss | {orientation=row,compression=no} public | product | table | gauss | {orientation=row,compression=no} public | users   | table | gauss | {orientation=row,compression=no}(3 rows)--- 以admin其他用户登录,查看是否可以看到hr下的表;mydb=> select * from hr.emp;ERROR:  permission denied for schema hrLINE 1: select * from hr.emp;                      ^DETAIL:  N/Agauss用户有权限:最高的级别 Schema |  Name   | Type  | Owner |             Storage              --------+---------+-------+-------+---------------------------------- hr     | emp     | table | gauss | {orientation=row,compression=no} #admin 登录访问hr下的emp,则需要两步操作: ①修改模式所有者 mydb=# alter schema hr owner to admin; 在admin下可以测试\dt是否可以看到3个表 ;T SCHEMA ②授权查询权限 mydb=# grant select on hr.emp to admin#练习测试:总结:1.创建了一个Schema ,名字:hr;2.在hr下创建了一个表emp表;3.在gauss用户下,查询emp表;select * from hr.emp;  [后续企业中用oracle库,都加模式名]4.在窗口2以某个用户admin登录,查询hr.emp;发现不行;5.修改模式的所有权给admin,及授权查询权限给admin;完毕后去客户端界面查看模式是不是多了一个hr;  且代码测试;6.去删除某些无用的账户信息,发现可能出问题,借助于AI搞定。
  • [分享交流] ITIL4大师认证:让IT成为业务增长的核心驱动力—ITIL课程
    在现代企业的数字化转型中,IT部门的角色正在发生深刻变化。它不再只是一个支持性功能,而是企业业务创新和增长的重要推动力。**ITIL4大师认证(ITIL4 Master)**作为IT服务管理的最高级别认证,不仅帮助IT管理者建立系统化的IT运营框架,更强调如何通过IT创造可衡量的业务价值。在ITIL先锋论坛的讲座——《Master之路,解析ITIL大师应具备的知识结构》中,长河老师详细解析了如何通过ITIL4大师认证体系,让IT从“成本中心”转型为“业务价值中心”。本篇文章将结合该讲座内容,探讨如何利用ITIL4方法论提升企业的市场竞争力。ITIL4大师认证:让IT从运营支持转型为业务赋能传统观念中,IT被视为一个支撑部门,主要职责是保障系统稳定、提供基础设施和支持业务运作。然而,随着企业竞争加剧和客户需求变化,IT部门需要从“运营支持”向“业务赋能”转型,成为企业创新的核心。ITIL4如何帮助企业实现这一转变?IT战略与业务战略对齐ITIL4的**数字化与IT战略(Digital & IT Strategy, DITS)**模块,帮助企业确保IT投资和业务目标一致,提高IT的业务价值贡献率。提升IT服务的稳定性和效率通过事件管理(Incident Management)和问题管理(Problem Management),优化IT运维流程,减少业务中断,提高客户体验。加速IT项目交付,支持业务创新采用**高效服务管理(High Velocity IT, HVI)**方法,加快IT产品和服务的开发与交付周期,使企业能够迅速适应市场变化。优化IT投资回报(ROI)通过IT财务管理(IT Financial Management),确保每一笔IT支出都有明确的商业回报,从“成本中心”向“利润贡献者”转型。企业如果能够有效利用ITIL4的框架,将IT管理与业务增长目标结合,IT部门的价值将远远超越传统的支持性角色,成为企业发展的核心驱动力。案例分析:IT如何驱动企业业务增长?为了更直观地理解ITIL4如何帮助企业创造价值,我们来看一个零售行业的实际案例。背景:某国际零售企业的IT挑战库存管理问题:由于供应链系统落后,门店经常出现缺货或库存积压现象,影响销售额。电商平台不稳定:大促期间,电商系统崩溃,导致订单流失。IT投资缺乏透明度:企业高管难以衡量IT投资的业务价值,导致预算审批受限。如何应用ITIL4进行优化?优化供应链IT系统采用ITIL4的服务价值链(Service Value Chain, SVC),重构库存管理系统,使供应链端到端可视化,提高调配效率。通过需求管理(Demand Management),优化采购预测,减少库存积压。提升电商平台稳定性通过可用性管理(Availability Management),优化服务器架构,提高系统可靠性。采用容量管理(Capacity Management),确保系统能够动态扩展,应对高峰流量。建立IT投资与业务目标的对齐机制通过IT财务管理(IT Financial Management),构建ROI分析模型,确保IT支出能够带来直接的商业回报。最终成果供应链可视化能力提升,使库存管理精度提高35%。电商平台的崩溃率从3%下降至0.2%,确保销售高峰期系统稳定。通过精准的IT投资分析,年度IT成本降低15%,销售额增长10%。这个案例展示了ITIL4不仅是管理IT流程的工具,更是一个可以直接影响企业利润和增长的业务赋能体系。ITIL4大师认证如何帮助企业构建长期竞争优势?除了短期的运营优化,企业更需要长期构建IT能力,以确保持续竞争力。ITIL4大师认证提供了一整套方法论,使企业能够长期受益。通过IT服务管理提升客户体验采用ITIL4的**服务设计(Service Design)**方法,基于客户需求优化IT服务,提高满意度。在银行业,使用**需求管理(Demand Management)**优化在线银行服务,使客户能够享受更快速的响应。让IT成为创新驱动力通过高效服务管理(High Velocity IT, HVI),缩短产品开发周期,加快市场响应速度。在制造业,结合持续改进(Continual Improvement),提升智能制造能力,优化生产流程。确保IT治理与合规性通过信息安全管理(Information Security Management),确保数据安全合规,符合GDPR等法规要求。在金融行业,建立**治理与合规管理(Governance & Compliance)**体系,降低监管风险。通过以上方法,ITIL4大师认证不仅帮助企业提升IT运营能力,更为企业创造长期可持续的竞争优势。 ITIL先锋论坛讲座的启示:IT价值最大化的路径本次ITIL先锋论坛讲座强调了ITIL4大师认证如何帮助企业最大化IT价值,并将其转化为实际业务成果。如何让IT成为企业的核心价值创造者?从“IT支持”转向“IT战略伙伴”IT部门应参与企业战略决策,确保IT投资与业务目标保持一致。数据驱动决策,提高市场洞察能力通过服务绩效管理(Service Performance Management),基于数据制定精准的市场策略。持续优化IT服务,提高市场竞争力采用持续改进(Continual Improvement),定期优化IT运营,提高业务敏捷性。结语:ITIL4大师认证是IT管理者迈向业务领导者的关键ITIL4大师认证不仅仅是IT管理的高阶认证,更是IT领导者向业务管理者转型的重要工具。在企业数字化转型的时代,IT部门不再是一个成本中心,而是企业增长的驱动者。通过ITIL4大师认证,企业可以建立高效的IT服务管理框架,实现IT与业务的深度融合,最终推动企业的持续增长和市场竞争力的提升。对于希望提升IT管理价值、推动业务创新的企业和个人而言,深入学习ITIL4大师认证体系,将是未来成功的关键。
  • [问题求助] 【小白求助】为什么在gaussdb里面,表文件没有fsm和vm文件
    select oid,relfilenode,relname from pg_class where relname ='teacher'; oid | relfilenode | relname -------+-------------+--------- 17530 | 17542 | teacher然而在操作系统里面,只找到17542这个文件,没有像_vm,_fsm这些文件[Ruby@gauss-dis-134 base]$ find ./ -name 17542* ./17325/17542像在postgresql,openGauss,都是有_fsm,_vm的文件的
  • [问题求助] 【小白求助】为什么base目录下数据库目录名称与pg_database视图中的oid不匹配
    在postgresql或者openGauss中,数据文件目录的base目录下,名称和oid都是一一对弈对应的,如:openGauss=# select oid,datname from pg_database; oid | datname -------+------------- 1 | template1 16398 | db_web_data 15649 | template0 16400 | db_test2 16399 | db_test1 15654 | postgres 16405 | db_test123对应着文件系统的目录[omm@txy base]$ ls -ls total 120 20 drwx------ 2 omm dbgrp 20480 Oct 12 10:15 1 16 drwx------ 2 omm dbgrp 16384 Oct 12 10:15 15649 16 drwx------ 2 omm dbgrp 16384 Nov 3 23:24 15654 16 drwx------ 2 omm dbgrp 16384 Oct 16 15:44 16398 16 drwx------ 2 omm dbgrp 16384 Oct 23 17:03 16399 16 drwx------ 2 omm dbgrp 16384 Oct 23 17:03 16400 16 drwx------ 2 omm dbgrp 16384 Oct 23 17:25 16405 4 drwx------ 2 omm dbgrp 4096 Oct 12 10:14 pgsql_tmp但是在gaussdb,我发现并不是一样的gaussdb=> select oid,datname from pg_database; oid | datname -------+------------ 1 | template1 14942 | template0 17325 | db_ora 17457 | db_conn10w 17458 | db_default 14948 | postgres 16809 | test在文件目录里面反而是这些?[Ruby@gauss-dis-133 base]$ ls -lsa total 160 4 drwx------ 10 Ruby Ruby 4096 Nov 9 14:29 . 4 drwx------ 22 Ruby Ruby 4096 Nov 9 14:51 .. 16 drwx------ 2 Ruby Ruby 16384 Nov 9 08:18 1 16 drwx------ 2 Ruby Ruby 16384 Nov 9 08:18 14942 24 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 14948 20 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 16763 20 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 25211 20 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 25294 20 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 25295新建一个数据库gaussdb=> create database db_newdb; gaussdb=> select oid,datname from pg_database; oid | datname -------+------------ 1 | template1 14942 | template0 17325 | db_ora 17457 | db_conn10w 17458 | db_default 14948 | postgres 16809 | test 17521 | db_newdb很明显会发现多了33483这个目录,可是我新建这个db_newdb的oid是17521啊,为什么对不上呢?[Ruby@gauss-dis-133 base]$ ls -lsa total 160 4 drwx------ 10 Ruby Ruby 4096 Nov 9 14:29 . 4 drwx------ 22 Ruby Ruby 4096 Nov 9 14:51 .. 16 drwx------ 2 Ruby Ruby 16384 Nov 9 08:18 1 16 drwx------ 2 Ruby Ruby 16384 Nov 9 08:18 14942 24 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 14948 20 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 16763 20 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 25211 20 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 25294 20 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 25295 16 drwx------ 2 Ruby Ruby 16384 Nov 9 14:29 33483```
  • [问题求助] 求大佬解惑
    export class BookData{ id?: number bookName?: string bookBrief?: string bookAuthor?: string}export interface BookTable { tableName: string; sqlCreate: string; columns: string[];}import relationalStore from '@ohos.data.relationalStore'; import { BookData } from './BookData'; import CommonConstants from './CommonConstants'; import Rdb from './Rdb'; export default class BookTableTools {   private diaryTable = new Rdb(CommonConstants.DAIRY_TABLE.tableName, CommonConstants.DAIRY_TABLE.sqlCreate,     CommonConstants.DAIRY_TABLE.columns);   constructor(callback: Function = () => {   }) {     this.diaryTable.getRdbStore(callback);   }   getRdbStore(callback: Function = () => {   }) {     this.diaryTable.getRdbStore(callback);   }   insertData(object: BookData, callback: Function) {     const valueBucket: relationalStore.ValuesBucket = generateBucket(object);     this.diaryTable.insertData(valueBucket, callback);   } } function generateBucket(object: BookData): relationalStore.ValuesBucket {   let obj: relationalStore.ValuesBucket = {};   obj.bookBrief = object.bookBrief;   obj.bookName = object.bookName;   obj.bookAuthor = object.bookAuthor;   return obj; }import relationalStore from '@ohos.data.relationalStore'; import { BookTable } from './BookTable'; export default class CommonConstants {   static readonly STORE_CONFIG: relationalStore.StoreConfig = {     name: 'database.db',     securityLevel: relationalStore.SecurityLevel.S1   };   static readonly DAIRY_TABLE: BookTable = {     tableName: 'bookTable',     sqlCreate: 'CREATE TABLE IF NOT EXISTS bookTable(id INTEGER PRIMARY KEY AUTOINCREMENT, bookName TEXT, bookAuthor TEXT, bookBrief TEXT)',     columns: ['id', 'bookName', 'bookAuthor', 'bookBrief']   };   static readonly RDB_TAG = '[Debug.Rdb]';   static readonly TABLE_TAG = '[Debug.DiaryTable]';   static readonly INDEX_TAG = '[Debug.Index]'; }import relationalStore from '@ohos.data.relationalStore'; import Logger from '../common/Logger'; import CommonConstants from './CommonConstants'; export default class Rdb {   private rdbStore: relationalStore.RdbStore | null = null;   private tableName: string;   private sqlCreateTable: string;   private columns: Array<string>;   constructor(tableName: string, sqlCreateTable: string, columns: Array<string>) {     this.tableName = tableName;     this.sqlCreateTable = sqlCreateTable;     this.columns = columns;   }   getRdbStore(callback: Function = () => {   }) {     if (!callback || typeof callback === 'undefined' || callback === undefined) {       Logger.info(CommonConstants.RDB_TAG, 'getRdbStore() has no callback!');       return;     }     if (this.rdbStore !== null) {       Logger.info(CommonConstants.RDB_TAG, 'The rdbStore exists.');       callback();       return     }     let context: Context = getContext(this) as Context;     relationalStore.getRdbStore(context, CommonConstants.STORE_CONFIG, (err, rdb) => {       if (err) {         Logger.error(CommonConstants.RDB_TAG, `gerRdbStore() failed, err: ${err}`);         return;       }       this.rdbStore = rdb;       this.rdbStore.executeSql(this.sqlCreateTable);       Logger.info(CommonConstants.RDB_TAG, 'getRdbStore() finished.');       callback();     });   }   insertData(data: relationalStore.ValuesBucket, callback: Function = () => {   }) {     if (!callback || typeof callback === 'undefined' || callback === undefined) {       Logger.info(CommonConstants.RDB_TAG, 'insertData() has no callback!');       return;     }     let resFlag: boolean = false;     const valueBucket: relationalStore.ValuesBucket = data;     if (this.rdbStore) {       this.rdbStore.insert(this.tableName, valueBucket, (err, ret) => {         if (err) {           Logger.error(CommonConstants.RDB_TAG, `insertData() failed, err: ${err}`);           callback(resFlag);           return;         }         Logger.info(CommonConstants.RDB_TAG, `insertData() finished: ${ret}`);         callback(ret);       });     }   }   deleteData(predicates: relationalStore.RdbPredicates, callback: Function = () => {   }) {     if (!callback || typeof callback === 'undefined' || callback === undefined) {       Logger.info(CommonConstants.RDB_TAG, 'deleteData() has no callback!');       return;     }     let resFlag: boolean = false;     if (this.rdbStore) {       this.rdbStore.delete(predicates, (err, ret) => {         if (err) {           Logger.error(CommonConstants.RDB_TAG, `deleteData() failed, err: ${err}`);           callback(resFlag);           return;         }         Logger.info(CommonConstants.RDB_TAG, `deleteData() finished: ${ret}`);         callback(!resFlag);       });     }   }   updateData(predicates: relationalStore.RdbPredicates, data: relationalStore.ValuesBucket, callback: Function = () => {   }) {     if (!callback || typeof callback === 'undefined' || callback === undefined) {       Logger.info(CommonConstants.RDB_TAG, 'updateDate() has no callback!');       return;     }     let resFlag: boolean = false;     const valueBucket: relationalStore.ValuesBucket = data;     if (this.rdbStore) {       this.rdbStore.update(valueBucket, predicates, (err, ret) => {         if (err) {           Logger.error(CommonConstants.RDB_TAG, `updateData() failed, err: ${err}`);           callback(resFlag);           return;         }         Logger.info(CommonConstants.RDB_TAG, `updateData() finished: ${ret}`);         callback(!resFlag);       });     }   }   query(predicates: relationalStore.RdbPredicates, callback: Function = () => {   }) {     if (!callback || typeof callback === 'undefined' || callback === undefined) {       Logger.info(CommonConstants.RDB_TAG, 'query() has no callback!');       return;     }     if (this.rdbStore) {       this.rdbStore.query(predicates, this.columns, (err, resultSet) => {         if (err) {           Logger.error(CommonConstants.RDB_TAG, `query() failed, err:  ${err}`);           return;         }         Logger.info(CommonConstants.RDB_TAG, 'query() finished.');         callback(resultSet);         resultSet.close();       });     }   } }
  • [案例分享] postgresql创建表空间和database
    postgres=# create tablespace jackcao location 'D:\PostgreSQLdata\pg_tbs';警告: 表空间位置不应该位于数据目录内CREATE TABLESPACEpostgres=# create database jackcaodb tablespace jackcao;CREATE DATABASEpostgres=#
  • [案例分享] windows环境下查询端口是否被占用
    windows环境下查询端口是否被占用netstat -aon|findstr "具体的端口号",例如:netstat -aon|findstr "5432"TCP 0.0.0.0:5432 0.0.0.0:0 LISTENING 11108TCP 127.0.0.1:65432 0.0.0.0:0 LISTENING 1092TCP [::]:5432 [::]:0 LISTENING 11108UDP 127.0.0.1:65432 *:* 1092
  • [案例分享] psql: 错误: 连接到"localhost" (::1)上的服务器,端口5432失败:致命错误: 没有用于主机 "::1"
    问题:windows11环境下,安装好PostgreSQL后,postgres超级用户尝试登录实例,报错:C:\Program Files\PostgreSQL\15\bin>.\psql -U postgrespsql: 错误: 连接到"localhost" (::1)上的服务器,端口5432失败:致命错误: 没有用于主机 "::1", 用户 "postgres", 数据库 "postgres", no encryption 的 pg_hba.conf 记录解决办法:在pg_hba.conf文件中增加一条鉴权信息host all all ::1/128 trust然后重启数据库C:\Program Files\PostgreSQL\15\bin>pg_ctl.exe -D "D:\PostgreSQLdata" restart等待服务器进程关闭 .... 完成服务器进程已经关闭等待服务器进程启动 ....2022-11-14 11:56:25.199 CST [3264] 日志: 日志输出重定向到日志收集进程2022-11-14 11:56:25.199 CST [3264] 提示: 后续的日志输出将出现在目录 "log"中.完成服务器进程已经启动再次登录:C:\Program Files\PostgreSQL\15\bin>.\psql -U postgrespsql (15.1)输入 "help" 来获取帮助信息.postgres=#postgres=# \d没有找到任何关系.postgres=# \t开启只显示元组.postgres=#问题解决。附:windows测试环境完整的pg_hba.conf文件内容# PostgreSQL Client Authentication Configuration File# ===================================================## Refer to the "Client Authentication" section in the PostgreSQL# documentation for a complete description of this file. A short# synopsis follows.## This file controls: which hosts are allowed to connect, how clients# are authenticated, which PostgreSQL user names they can use, which# databases they can access. Records take one of these forms:## local DATABASE USER METHOD [OPTIONS]# host DATABASE USER ADDRESS METHOD [OPTIONS]# hostssl DATABASE USER ADDRESS METHOD [OPTIONS]# hostnossl DATABASE USER ADDRESS METHOD [OPTIONS]# hostgssenc DATABASE USER ADDRESS METHOD [OPTIONS]# hostnogssenc DATABASE USER ADDRESS METHOD [OPTIONS]## (The uppercase items must be replaced by actual values.)## The first field is the connection type:# - "local" is a Unix-domain socket# - "host" is a TCP/IP socket (encrypted or not)# - "hostssl" is a TCP/IP socket that is SSL-encrypted# - "hostnossl" is a TCP/IP socket that is not SSL-encrypted# - "hostgssenc" is a TCP/IP socket that is GSSAPI-encrypted# - "hostnogssenc" is a TCP/IP socket that is not GSSAPI-encrypted## DATABASE can be "all", "sameuser", "samerole", "replication", a# database name, or a comma-separated list thereof. The "all"# keyword does not match "replication". Access to replication# must be enabled in a separate record (see example below).## USER can be "all", a user name, a group name prefixed with "+", or a# comma-separated list thereof. In both the DATABASE and USER fields# you can also write a file name prefixed with "@" to include names# from a separate file.## ADDRESS specifies the set of hosts the record matches. It can be a# host name, or it is made up of an IP address and a CIDR mask that is# an integer (between 0 and 32 (IPv4) or 128 (IPv6) inclusive) that# specifies the number of significant bits in the mask. A host name# that starts with a dot (.) matches a suffix of the actual host name.# Alternatively, you can write an IP address and netmask in separate# columns to specify the set of hosts. Instead of a CIDR-address, you# can write "samehost" to match any of the server's own IP addresses,# or "samenet" to match any address in any subnet that the server is# directly connected to.## METHOD can be "trust", "reject", "md5", "password", "scram-sha-256",# "gss", "sspi", "ident", "peer", "pam", "ldap", "radius" or "cert".# Note that "password" sends passwords in clear text; "md5" or# "scram-sha-256" are preferred since they send encrypted passwords.## OPTIONS are a set of options for the authentication in the format# NAME=VALUE. The available options depend on the different# authentication methods -- refer to the "Client Authentication"# section in the documentation for a list of which options are# available for which authentication methods.## Database and user names containing spaces, commas, quotes and other# special characters must be quoted. Quoting one of the keywords# "all", "sameuser", "samerole" or "replication" makes the name lose# its special character, and just match a database or username with# that name.## This file is read on server startup and when the server receives a# SIGHUP signal. If you edit the file on a running system, you have to# SIGHUP the server for the changes to take effect, run "pg_ctl reload",# or execute "SELECT pg_reload_conf()".## Put your actual configuration here# ----------------------------------## If you want to allow non-local connections, you need to add more# "host" records. In that case you will also need to make PostgreSQL# listen on a non-local interface via the listen_addresses# configuration parameter, or via the -i or -h command line switches.# TYPE DATABASE USER ADDRESS METHOD#added by Jackcaohost all all 0.0.0.0/0 trusthost all all ::1/128 trust# "local" is for Unix domain socket connections onlylocal all all scram-sha-256# IPv4 local connections:#host all all 127.0.0.1/32 scram-sha-256# IPv6 local connections:#host all all ::1/128 scram-sha-256# Allow replication connections from localhost, by a user with the# replication privilege.#local replication all scram-sha-256#host replication all 127.0.0.1/32 scram-sha-256#host replication all ::1/128 scram-sha-256
  • [问题求助] 在mybatis中使用begin...end结构去批量更新或者批量插入时,sql没问题,拿出来能在gauss中执行,但是在Java层会报错RROR: there is no parameter $1
    在mybatis中使用begin...end结构去批量更新或者批量插入时,sql没问题,拿出来能在gauss中执行,但是在Java层会报错,在查看sql,download_count 入参是Integer类型的传入的值为0PL/pgSQL function inline_code_block line 2 at SQL statement ; bad SQL grammar []; nested exception is com.huawei.gauss200.jdbc.util.PSQLException: [127.0.0.1:62289/127.0.0.1:25108] ERROR: there is no parameter $1   在位置:referenced column: download_count PL/pgSQL function inline_code_block line 2 at SQL statement
  • [问题求助] opengauss新建的 表语句 create table "TT2" (id int,name varchar(100)),pg_table_size统计表大小异常
    表语句  create table "TT2" (id int,name varchar(100)), 用pg_table_size统计表大小,提示错误找不到关系。 如果是表   create table TT2(id int,name varchar(100))就可以正常统计大小, 疑问, 对于建表语句包含 “”的,怎么统计大小。
  • [运维管理] gaussdb(DWS)更新整表后表占用空间翻倍
    更新表全列数据后表占用空间翻倍;多次insert单条数据后用pg_table_size函数查看表占用空间大小没有变化,这是为什么?怎么避免数据膨胀?
  • [技术干货] PostgreSQL插件那么多,怎样管理最高效?
    云服务环境下,如何让客户更方便地在各个PostgreSQL的版本下安装插件和扩展功能,成为云服务厂商的一个挑战。华为云RDS for PostgreSQL通过插件管理功能,很好地解决了PostgreSQL版本与插件耦合的问题,帮助用户更直观、更快速地安装管理数据库插件。1.关于PostgreSQL插件众所周知,PostgreSQL支持很多插件,其中包括第三方插件。1. PostgreSQL发展至今,华为云已经从 PostgreSQL 9.5 版本演进到 PostgreSQL 14 版本,目前共支持7个大版本,每个大版本可以支持的插件并不完全相同,因此,判断每个版本支持哪些插件变得繁琐。2. 如我们所知,部分插件在安装时,必须要修改 shared_preload_libraries 这个参数,手动修改费时费力。3. 安装插件时只有超级用户才能进行安装,而超级用户权限太大,可以执行很多高危操作,容易造成云数据库异常不可用等非常严重的影响。以上种种可以看出PostgreSQL插件安装及管理相对复杂。为了让客户更方便地安装插件,华为云开发了插件管理功能,客户只需在交互界面上点击需要安装的插件,之后的安装就交由华为云后台完成即可,简单方便,省时省力。2. RDS for PostgreSQL插件管理功能PostgreSQL支持的插件很多,而且当前数据库支持安装哪些插件,用户并不能清楚直观地看出来,华为云插件管理功能将当前数据库支持安装的插件以列表形式全部显示出来,方便用户查看安装。前面提到,PostgreSQL的部分插件安装时,需要修改参数 shared_preload_libraries,华为云插件管理功能同时支持修改该参数。修改方法有两种,可以灵活取用:方法一:通过管理参数值功能批量修改 shared_preload_libraries 参数。方法二:在安装插件前,单独修改参数值实现对应插件库的加载。3. 注意事项shared_preload_libraries参数修改后需要重启实例才能生效。对于包含只读实例的PostgreSQL服务,修改主实例参数后,只读实例的参数将自动同步修改,在重启实例时,需要同时重启只读实例。部分插件在使用时,需要同时添加对应的GUC参数才能正常使用,比如 pg_cron 插件,需要先修改参数“cron.database_name”为需要使用的数据库。部分插件安装或卸载时,会同步安装或卸载其依赖插件,以及相关依赖表。例如:postgis_sfcgal插件依赖于postgis插件,创建插件postgis_sfcgal时,postgis插件会被优先自动同步创建;同时,卸载postgis插件时,会同步卸载postgis_sfcgal插件。4. 结束语华为云RDS for PostgreSQL插件管理功能,很好地帮助用户解决了到处网罗当前版本支持哪些插件的繁琐;以及不知道如何安装插件和知道方法后安装操作复杂的问题,提升了插件安装的用户体验。技术无止境,在云数据库使用领域,还有很多需要我们优化解决的地方,例如如何帮助用户识别当前数据库中可能存在的风险,查看当前数据库中的TOP SQL,如何帮助客户更好的管理数据库和账号等等。我们后续会针对这些点进行优化,给客户带来更多的惊喜。
总条数:36 到第
上滑加载中