- 博客(708)
- 资源 (12)
- 收藏
- 关注
原创 【GaussDB】从 sqlplus 到 gsql:Shell 中执行 SQL 文件方案的迁移与改造
摘要:本文分析了Oracle数据库shell脚本迁移到GaussDB的关键改造点。主要差异包括:1) GaussDB的sqlcode为字符类型,需创建转换函数;2) gsql执行参数需设置ON_ERROR_STOP=on才能返回正确状态码;3) 参数传递需通过set_config自定义变量实现;4) 错误输出需重定向2>&1。改造方案包括存储过程适配、shell脚本参数传递优化及SQL文件变量处理逻辑重构,最终实现了与Oracle相同的业务处理结果和日志输出效果。
2026-01-07 14:51:27
478
原创 【GaussDB】跨用户调用已授权的存储过程,可能会在存储过程内SQL的自定义函数表达式里报错没有权限
摘要:本文分析了GaussDB在开启plsql_security_definer参数时出现的跨用户存储过程权限异常问题。研究发现,当游标SQL中的自定义函数未执行表达式展平时,fetch操作会因权限校验失败而报错;而表达式展平后则不会报错。问题根源在于索引扫描预估行数低于1000行时不支持展平执行,导致权限校验机制不一致。通过添加/+rows(t1#1100)/提示可强制展平规避问题,但在复杂系统中定位问题代码段仍具挑战性。
2026-01-07 14:39:56
782
原创 【openGauss】数据库微观案例
摘要:本文分享了openGauss数据库的三个实用案例。首先探讨了rowid使用问题,包括Oracle迁移中的兼容性问题及优化方案;其次分析了GUC参数的局部配置方法,介绍了非全局参数设置技巧;最后讨论了分布式场景下hash分区键的类型限制问题,对比了普通建表与INCLUDING方式的差异。这些案例为openGauss数据库的优化使用提供了实用参考。
2025-12-29 10:04:13
360
原创 【openGauss】如何在openGauss/PostgreSQL手动清理XLOG/WAL 文件?
摘要:本文探讨了openGauss/PostgreSQL中预写式日志(WAL)的管理问题,重点分析了非归档模式下安全删除WAL日志的方法。文章首先比较了openGauss与Oracle的redo log机制差异,指出openGauss通过参数自动管理WAL日志创建和清理。随后详细列出了与WAL相关的关键配置参数(如wal_level、wal_segment_size等),并解释了这些参数对WAL日志维护的影响。最后提出了在空间紧张时手动清理WAL日志的需求,特别关注如何识别可安全删除的日志文件。
2025-12-29 09:53:54
572
原创 【opengauss】使用gs_probackup进行增量备份恢复
摘要:gs_probackup是对gs_basebackup的增强物理备份工具,支持PTRACK增量备份、合并备份、多线程并行操作等功能。通过配置参数enable_cbm_tracking=on开启PTRACK增量备份后,可进行全量备份和增量备份操作,并支持备份合并与恢复。典型流程包括:初始化备份路径和实例、执行全量/增量备份、查看备份状态、合并备份、恢复数据等操作。该工具还具备备份有效性检测、checksum校验、远程操作等特性,能有效管理数据库备份与恢复过程。
2025-12-23 10:45:44
352
1
原创 【GaussDB】在duckdb中查询GaussDB的数据
本文对比了DuckDB和GaussDB在复杂分析型SQL和简单事务型SQL上的性能表现。测试环境使用同一台虚拟机,CPU为Intel(R) CC150 @3.50GHz。在复杂SQL场景(仓库调拨库存分配)中,DuckDB执行时间仅98.8ms,而GaussDB需要650.575ms;即使DuckDB直接查询GaussDB的表也只需168ms。但在简单SQL循环执行场景中,GaussDB(208174ms)反而比DuckDB(324815ms)更快。
2025-12-23 10:26:50
837
1
原创 【openGauss】如何在openGauss中实现类似Oracle中constructor function、member function的功能
本文探讨了在openGauss 3.0中实现类似Oracle面向对象编程特性的方法。由于openGauss不支持Oracle中的对象类型构造器和成员函数,作者提出通过创建同名type和package的方式实现类似功能。具体方案包括:1)在package中创建self函数作为构造器;2)将原成员函数改写为package函数,并添加self参数;3)调用时使用包名.函数的方式。这种改写方式虽然采用面向过程实现,但保留了面向对象的编程思想,可视为一种通用改写规则。
2025-12-16 15:19:23
643
1
原创 【openGauss】让gsql和sqlplus输出包含有SQL及数据的完全一致的文本文件
摘要:本文探讨了从Oracle迁移到openGauss/MogDB时实现数据核对的技术方案。针对传统核对工具存在的格式不一致问题,作者提出了一种创新的JSON转换方法:通过创建表函数将查询结果转换为标准JSON格式,统一了sqlplus和gsql的输出格式。该方法解决了列宽不一致、提示符差异等难题,最终实现了两个数据库查询结果的完全一致输出。文中详细对比了两种数据库的多种输出方式,并提供了完整的实现脚本,为数据库迁移过程中的数据核对提供了高效可靠的解决方案。
2025-12-16 15:08:35
912
1
原创 【openGauss】从“functions in index expression must be marked IMMUTABLE“谈起
摘要:文章分析了Oracle和openGauss/PostgreSQL中函数索引的限制问题,重点探讨了to_char等日期函数作为函数索引的风险。在Oracle中,由于时区变化会导致函数索引返回不一致结果,可能引发数据混乱。openGauss/PostgreSQL则直接限制非IMMUTABLE函数创建索引。虽然可以通过创建自定义IMMUTABLE函数解决,但最佳实践仍是避免使用函数索引,优化SQL和表设计。最后提到openGauss的插件框架(如dolphin/whale)可提供兼容解决方案。
2025-12-11 16:30:00
1344
1
原创 【openGauss】带有out参数的存储过程及自定义函数的重载测试
摘要:本文探讨了openGauss数据库中函数重载的实现机制。研究发现,openGauss默认情况下仅支持基于存储过程名称和入参匹配的重载,通过设置proc_outparam_override参数可扩展为支持出参不同的重载。测试表明:1)非package中的ORACLE风格函数会被覆盖,PG风格函数支持入参不同的重载;2)package内procedure在开启参数后支持出参不同的重载;3)inout参数在关闭参数时视为in+out参数;
2025-12-11 16:00:00
889
1
原创 【openGauss】如何通过pg_trigger.tgtype获取触发器的各种触发条件
最近看到反馈兼容的dba_triggers视图中,同一个触发器的trigger_event被拆成了多行,和ORACLE中表现不一致,于是我进行了一些分析,发现是在其引用的information_schema.triggers视图中就已经拆开成了INSERT/DELETE/UPDATE,但是这些属性都是通过tgtype这一个int2整型的字段获取的,甚至连before/after/instead of/row/statement 等都是通过这一个字段。
2025-12-02 17:00:42
1040
1
原创 【GaussDB】如何从GaussDB发布包中提取出内核二进制文件
我实测这个方案在技术上的确是可以的,但是GaussDB官方发布包,层层压缩(《GaussDB文档中心-GaussDB内核包提取方法》),要解压8~9次才能解压出内核二进制,手动解压动不动就是空间不足或者路径超长了,操作非常麻烦,因此我就想到要写一个脚本来自动提取出内核二进制文件。直接和Cursor说让根据这个sh脚本再生成一个windows上的,分分钟就生成了一个ps1文件,只是这下需要额外安装7z,还要装gitbash,而且BUG又稍微多了点,有长路径问题,还有环境变量上下文切换异常的问题。
2025-12-02 16:54:15
932
3
原创 【openGauss】SQLCODE竟然不是数值类型?
摘要:本文分析了openGauss中SQLCODE与SQLSTATE在兼容模式下的转换规则。通过源码解析,揭示了数值型SQLCODE转换为字符串型SQLSTATE的算法原理,并提供了相应的PLPGSQL函数实现双向转换。测试验证了转换函数的正确性,并提出通过配置参数实现与Oracle错误代码兼容的方案,以降低应用迁移成本。该方案可帮助解决数值型变量接收SQLCODE时的类型不匹配问题,同时支持双轨运行期间的应用兼容需求。
2025-11-24 15:34:18
810
1
原创 【openGauss】OPENGAUSS/POSTGRESQL 中float类型到int类型的隐式转换
摘要:本文分析了Oracle和openGauss在浮点数转整数时结果差异的问题。测试发现,当小数部分为0.5时,Oracle返回1而openGauss返回0,但1.5时两者都返回2。通过分析openGauss源码发现其使用C++标准函数std::rint()实现银行家舍入法。进一步测试Oracle的binary_double类型转换时出现更多不一致结果,甚至出现整数类型显示小数的异常现象。文章建议在实际开发中谨慎处理类型转换,避免依赖特定数据库的行为特性。
2025-11-24 15:28:30
980
1
原创 【GaussDB】使用DBLINK连接到ORACLE
GaussDB 506版本新增支持通过DBLINK连接Oracle数据库。安装需在实例机器上部署Oracle客户端,推荐使用TPOPS平台白屏化操作,支持特定版本的instantclient并需校验cksum值。安装后可通过CREATE DATABASE LINK语法创建连接,支持基本SQL操作但不支持存储过程调用和部分数据类型。功能实现上,GaussDB通过gs_ora_fdw封装器与Oracle交互,并新增相关系统表和视图管理连接信息。
2025-11-21 17:03:41
671
原创 【openGauss】两种在openGauss中使用存储过程生成文本文件的方式
本文探讨了在openGauss中实现Oracle utl_file包功能的解决方案。主要介绍了两种方法:一是通过orafce兼容插件实现基本功能,并针对openGauss特性进行改进,结合pg_directory系统表实现目录管理;二是利用openGauss原生copy to语法结合AUTHID definer特性,直接实现查询结果导出文件的功能。
2025-11-18 17:09:25
885
1
原创 【openGauss】如何在openGauss中实现类似Oracle中constructor function、member function的功能
本文探讨如何在openGauss3.0中实现类似Oracle面向对象编程的功能。由于openGauss不支持Oracle的对象类型构造器和方法,作者提出通过创建同名package来解决:1) 使用package中的self函数构造对象;2) 将成员函数改写为package函数,添加self参数;3) 对于无需位置传参的场景,可直接使用type构造。这种改写方式使得面向对象逻辑得以保留,调用方式仅有微小差异,实现了Oracle对象类型在openGauss中的功能迁移。
2025-11-18 16:00:44
507
原创 【openGauss】让gsql和sqlplus输出包含有SQL及数据的完全一致的文本文件
摘要: 本文探讨了从Oracle迁移到openGauss/MogDB时如何进行高效数据核对。虽然官方提供mvd工具,但用户可能希望自定义核对,需解决多表批量核对、数值列求和、业务规则分组统计等问题。文章对比了sqlplus和gsql的多种输出方式(如spool、\o、控制台回显),分析格式一致性难点(列宽、提示符、大小写等),最终提出JSON转换方案:通过json_object(*)(Oracle)和row_to_json()(MogDB)统一输出格式,并结合表函数动态生成带SQL语句的核对报告。
2025-11-14 15:12:28
1300
1
原创 【openGauss】一种可能是目前最快的从ORACLE同步数据到MogDB(openGauss)的方式
本文提出了一种高效的Oracle到MogDB数据同步方案,通过结合sqluldr2工具的标准输出功能和gsql的\copy标准输入功能,利用Linux管道实现数据实时传输。该方法避免了中间文件存储,实现导入导出同步进行,理论上传输时间仅取决于较慢的一端。具体步骤包括:配置双数据库客户端环境,使用sqluldr2导出数据到标准输出,通过管道直接传递给gsql的\copy命令导入。测试表明该方法能正确同步数据且效率较高,为Oracle到MogDB的数据迁移提供了快速可行的解决方案。
2025-11-11 16:43:54
1120
原创 【openGauss】谈一谈openGauss对Oracle中lob类型的兼容情况
摘要:Oracle和openGauss在LOB(大对象)数据类型处理上有显著差异。Oracle中BLOB/CLOB可存储4GB数据,通过LOB定位器访问,需用专用包(如dbms_lob)操作;而openGauss基于PostgreSQL,BLOB/CLOB仅是TEXT/RAW的别名,最大1GB,可隐式互转。二进制数据处理需特别注意:openGauss需先将BLOB转RAW再转BYTEA才能正确使用函数,与Oracle的处理方式差异较大。迁移时需谨慎处理这些兼容性问题,避免数据错误。
2025-11-11 16:12:42
1113
原创 【openGauss】谈谈openGauss中的raw类型
OpenGauss数据库中的RAW类型处理机制解析 摘要:本文探讨了OpenGauss数据库中RAW类型的使用方法及其与Oracle的区别。OpenGauss支持18个RAW相关函数,包括hextoraw/rawtohex转换、rawcat拼接、rawcmp比较等。研究发现:1)RAW类型本质上是二进制数据,采用bytea方式存储;2)相同名称函数可能因参数类型不同产生不同结果;3)直接使用RAW函数比隐式转换为text处理效率更高;4)部分函数如rawlike需特殊处理通配符。
2025-11-06 15:50:35
1035
原创 【openGauss】谈一谈PostgreSQL及openGauss中的package
本文探讨了Oracle中的Package特性及其在PostgreSQL和openGauss中的实现差异。Oracle Package提供私有化函数、过程复用等优势,而PostgreSQL需通过创建Schema变通实现,存在管理复杂、性能不佳等问题。openGauss 2.1.0版本新增Package支持,采用pg_proc.propackageid字段关联包与函数,但存在多项限制:不支持同名过程、触发器调用、Schema同名等。
2025-11-03 16:18:44
1042
原创 【openGauss】构建一个兼容Oracle模式支持创建package的openGauss的docker镜像
OpenGauss 2.1.0新增package功能但需配置兼容模式为"A"。官方Docker镜像默认设为"PG"导致报错。解决方法:1)修改entrypoint.sh将参数改为A;2)准备安装包并修改Dockerfile添加阿里源;3)构建自定义镜像并运行。关键步骤包括DNS配置、Dockerfile修改和构建脚本执行,最终可成功创建支持package的OpenGauss容器。
2025-11-03 16:00:24
926
原创 【openGauss】带有out参数的存储过程及自定义函数的重载测试
摘要: OpenGauss与Oracle在函数重载机制上存在差异。Oracle通过PACKAGE支持同名函数重载,区分参数个数和类型。OpenGauss默认仅匹配存储过程名称和入参,不支持仅out参数不同的重载,但可通过参数behavior_compat_options='proc_outparam_override'启用此功能。测试表明,未启用时同名函数会被覆盖,启用后允许out参数不同的重载。该参数扩展了OpenGauss的函数重载能力,使其更接近Oracle的行为。
2025-10-31 15:37:25
930
原创 【openGauss】从“functions in index expression must be marked IMMUTABLE“谈起
摘要: 函数索引在数据库迁移中常引发“IMMUTABLE”错误,如openGauss/PG中to_char()函数因结果随环境变量变化(如时区)被禁止使用。Oracle虽允许此类索引,但会导致数据不一致问题——同一查询在不同时区可能返回不同结果。解决方案包括:1)遵循规范,避免在索引字段使用函数转换;2)通过自定义IMMUTABLE函数替代;3)利用openGauss插件框架(如whale)实现兼容。核心结论:函数索引存在风险,应优先优化SQL和表设计。
2025-10-27 16:09:04
1055
原创 【GaussDB】深入剖析Insert Select慢的定位全过程
摘要: GaussDB中批量插入索引性能问题的分析表明,当目标表存在主键时,insert into t_target select * from t_source 语句的插入时间从几秒骤增至200秒。通过官方文档发现,该数据库默认开启批量插入索引特性(batch_insert_index_types=rcr_ubtree),但实际性能未提升。结论:建议调整shared_buffers以优化批量插入性能,避免在小缓存环境下频繁触发索引页分裂。
2025-10-27 15:47:55
810
原创 openGauss基于PITR恢复测试
摘要:MogDB数据库PITR恢复操作指南 本文详细介绍了MogDB数据库基于时间点(PITR)的恢复流程。主要内容包括:1)完整的7步恢复操作流程;2)recovery.conf文件的关键配置参数说明(归档恢复和恢复目标设置);3)四种恢复场景模拟(命名还原点/XID/LSN/时间点恢复)的具体操作示例;4)故障模拟和恢复实施步骤。文档提供了从基础备份准备到最终恢复完成的完整技术方案,包含关键SQL命令和参数配置示例,适用于多种数据库恢复需求场景。
2025-10-24 09:03:22
554
原创 GaussDB慢sql信息收集和执行计划查看
GaussDB慢SQL分析与执行计划查看指南 摘要:本文介绍了GaussDB数据库在业务功能压力测试中慢SQL分析和优化的方法。主要内容包括:1)通过设置log_min_duration_statement等参数开启慢SQL记录;2)使用系统视图和函数查询慢SQL信息;3)执行计划查看方法,包括EXPLAIN命令的使用和结果分析。文章提供了详细的参数配置命令和SQL查询示例,帮助DBA快速定位和优化性能问题。
2025-10-21 17:05:14
1016
原创 GaussDB 集群故障应急修复:从线下实例异常到全面恢复的实战指南
停止异常的 6001、6002 节点(cm_ctl stop -n [节点编号] -D [数据目录]),随后登录 6003 节点的沙箱环境(通过chroot切换隔离环境),执行gs_ctl failover -D [6003数据目录]将其提升为主节点。etcd 存储着集群的拓扑结构和状态信息,主节点变更需通过 Raft 协议同步至所有 etcd 节点,元数据不一致会导致管控命令执行失败。即使后台集群恢复正常,前台管控界面可能持续显示“启动中”,这往往是之前失败的启动任务残留导致的流程阻塞。
2025-10-21 16:08:15
933
原创 【openGauss】正则表达式次数符号“{}“在ORACLE和openGauss中的差异
摘要: 本文探讨了正则表达式中{}在不同数据库和编程语言中的解析差异。在ORACLE中,{}若不满足{m}等标准格式,则被视为普通字符串;而openGauss等严格校验{}内数字格式,否则报错。通过源码分析发现,openGauss沿用PG逻辑,而不同语言(如JAVA/RUST报错,PHP/JS等不报错)对此处理不一。业务场景中,错误使用${1*}匹配占位符暴露了历史代码不规范问题,建议转义或修正逻辑。结论指出,技术标准存在多样性,迁移时需注意代码规范性调整。
2025-10-15 04:30:00
621
原创 【openGauss】1分钟掌握:openGauss活动会话CPU占用率获取
摘要: openGauss/MogDB中未直接提供会话CPU占用率查询功能。本文提出通过数据库视图获取会话线程ID,再结合系统命令(如top)计算CPU使用率的解决方案。脚本通过pg_stat_get_session_wlmstat获取活跃会话信息,匹配线程PID后,调用top命令实时采集CPU数据,最终生成包含数据库名、线程ID、CPU%、耗时及SQL语句的监控报表。该方法规避了侵入性代码修改,实现非侵入式监控,需依赖gsql、top等基础命令,支持自定义显示条数和连接参数。
2025-10-14 15:16:09
354
原创 【GaussDB】使用MySQL客户端连接到GaussDB的M-Compatibility数据库
摘要: GaussDB 505.1版本新增了MySQL高兼容模式(M-Compatibility),需通过指定DBCOMPATIBILITY='M'建库。该模式需配置plat_compat_server_port等参数,并可能遇到连接问题。测试显示,MySQL客户端和Java程序连接时均出现握手失败(如plat_compat_b_conn_handshake错误),需进一步排查协议兼容性。建议参考官方文档调整GUC参数,或联系技术支持解决兼容性问题。
2025-10-10 10:45:03
1226
2
原创 【GaussDB】排查应用高可用切换出现数据库整体卡顿及报错自治事务无法创建的问题
摘要: 客户在GaussDB 506.0数据库高可用切换测试中,发现应用并发200时出现自治事务创建超时报错("autonomous transaction failed to create autonomous session")。分析发现,线程池模式下并发创建自治事务会导致数据库卡顿。测试表明,当初始线程数(thread_pool_attr)不足时(默认256),自治事务连接会阻塞;调整该参数至4096后问题解决。
2025-10-10 10:34:26
924
原创 【GaussDB】在逻辑复制中剔除指定用户的事务
基于逻辑复制标签实现过滤,技术上可行,但打标签这个附加操作需要在执行sql前执行(除非使用触发器,但触发器属于高风险操作,不建议使用),如果漏执行,将会存在错误覆盖目标库的风险。历史表归档方案通过在源库建立历史表存储归档数据,配置复制规则排除历史表的删除操作,虽然会增加IO开销,但实现简单、安全性高,避免了事务过滤可能带来的风险。虽然插入历史表会产生额外IO,可能使数据归档操作时间翻倍,但相比剔除事务不同步的方式,历史表方式更加安全,避免剔除事务时遗漏某些关键事务。
2025-09-30 05:00:00
915
原创 【openGauss】Oracle与openGauss/GaussDB数据一致性高效核对方案
抛开那种直接count算行数的极不精确算法,现有的异构数据库的数据核对工具,一般是把数据都查到工具的内存里,对日期时间数字等非文本类型,进行统一的格式化处理,将一行的所有字段拼成一个长字符串,然后hash一下,得到一个值,比较两个库这行数据得到的这个hash值是否一致,则可以知道这行数据是否一致。而且假设表上没有主键,就只能把所有字段作为主键;所以,这种场景下,客户更需要的是,上线的时候,核对工具用最快的速度,直接告诉我,这两边数据是不是一致的,而不是经过很长一段时间的数据核对后,精确地告诉我差异在哪。
2025-09-30 04:30:00
1166
原创 【GaussDB】使用gdb定位GaussDB编译package报错
摘要 在Oracle迁移GaussDB过程中,遇到package编译报错"ERROR: Failed to query the 323 type in the cache"但无具体行号信息的问题。通过gdb调试分析,发现错误发生在errstart函数(位于elog.cpp)的4108行。测试用例表明,当package中procedure参数定义不一致(如声明为out参数但在实现中改为in)时会导致该错误。建议排查时重点关注参数定义一致性,并考虑使用符号表辅助调试。对于大型package,
2025-09-24 16:00:00
895
原创 【GaussDB】全密态等值查询功能测试及全密态技术介绍
GaussDB全密态等值查询功能测试表明,该技术可在服务端不解密数据的情况下实现等值查询,但存在局限性。测试结果显示: 需通过特定客户端连接并设置密钥才能使用全密态功能; 加密列支持等值查询和更新,但无法进行模糊查询和范围查询; 非密态连接查询加密列会报错,且直接查询显示为密文; 尽管字段类型显示为常规类型,实际已转为二进制存储。该技术有效解决了数据在传输和存储中的泄露风险,但当前功能仍受限于等值查询,更复杂的计算需求有待全同态加密技术的发展。
2025-09-23 16:03:51
770
原创 在Oracle\PG\GaussDB库中实现用户甲在其它用户的SCHEMA中创建表的方法及所属属主的差异
本文分析了不同数据库(Oracle、PostgreSQL、GaussDB/OpenGauss)中USER和SCHEMA的概念差异及实现方式。USER是数据库操作实体,在SQL标准中与ROLE不同,但PG系数据库将两者合并。SCHEMA作为逻辑容器,Oracle自动创建同名SCHEMA,而PG需手动创建。通过案例演示了如何实现用户跨SCHEMA建表:在Oracle中需授予CREATE ANY TABLE系统权限,PG中需授权USAGE和CREATE权限。测试表明,Oracle中表OWNER与创建者一致,PG中
2025-09-16 16:15:29
1242
原创 GaussDB 中 alter default privileges 的使用示例(下)
本文通过三个示例详细介绍了GaussDB中"alter default privileges"命令的使用方法。示例1展示了初始用户授权访问未来创建表/视图的操作流程;示例2演示了当前用户授权的简化操作;示例3则重点说明了如何指定SCHEMA进行精确授权。文章还附有完整的语法说明,包括对表、序列、函数等不同类型对象的授权子句。这些示例清晰地展现了该命令在实际授权管理中的灵活应用,帮助用户掌握GaussDB的默认权限控制机制。
2025-09-10 16:00:00
900
原创 GaussDB 中 alter default privileges 的使用示例(上)
摘要: 本文介绍了GaussDB中ALTER DEFAULT PRIVILEGES命令的功能与用法,并通过实验对比其与GRANT命令的差异。ALTER DEFAULT PRIVILEGES用于设置未来创建对象的默认权限,而GRANT仅对已存在对象生效。实验表明,若需用户持续访问新创建的对象,需结合两者使用。文章详细解析了命令语法,包括FOR ROLE/USER和IN SCHEMA选项,并以表权限为例说明授权与回收操作。该命令适用于表、序列、函数等对象,是数据库权限管理的重要工具。
2025-09-09 15:27:09
897
openGauss 产品描述 01.pdf
2021-07-31
openGauss 特性描述 01.pdf
2021-07-31
openGauss 管理员指南 01.pdf
2021-07-31
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅