• 如何检测库内中文表名和中文字段名
    gaussdb版本是8115数据库是GBK编码如何检测库内中文表名和中文字段名?
  • 华为云GaussDB弹性扩展方法
    华为云GaussDB的存算分离架构通过解耦计算与存储资源,实现高效的弹性扩展。  一、存算分离架构下的弹性扩展机制1. ​​架构设计原理​​​​分层解耦​​:计算层(无状态):负责SQL解析、事务处理等,可动态增减节点。存储层(分布式存储GaussOS):数据多副本(默认3副本)持久化,独立扩容存储空间。​​资源池化​​:基于Kubernetes容器化调度,计算与存储资源独立分配,支持分钟级扩缩容。2. ​​弹性扩展实现方式​​​​计算层扩展​​:​​横向扩容(Scale Out)​​:增加计算节点,新节点自动注册到集群,负载均衡器动态分配请求。示例:从16节点扩展到32节点,事务吞吐量线性提升(理论扩展比0.7以上)。​​纵向扩容(Scale Up)​​:升级单节点配置(如CPU/内存),需短暂停机。​​存储层扩展​​:存储空间按需独立扩容,无需联动计算节点(如从10TB扩容到100TB)。支持​​秒级存储扩容​​,通过调整存储池容量上限实现。​​多模态负载隔离​​:通过逻辑集群(Virtual Warehouse)实现多业务负载隔离,不同业务按需分配计算资源,数据实时共享。3. ​​在线扩容技术​​​​数据重分布​​:扩容时自动触发数据分片迁移(Rebalance),通过分布式事务保证一致性,业务无感知。​​无锁设计​​:在线扩容期间支持读写操作(仅短时阻塞DDL),避免业务中断。二、自动扩缩容的触发条件自动扩缩容基于实时监控与预测算法,主要触发场景如下:​​触发类型​​​​监控指标​​​​阈值/策略​​​​动作​​​​资源瓶颈​​CPU/内存使用率>80%持续5分钟自动增加计算节点​​存储容量不足​​磁盘使用率>85%存储空间自动扩容​​并发压力​​连接数/查询队列堆积连接数达上限或队列积压超时横向扩展计算节点​​业务预测​​历史负载时序分析(LSTM模型)大促前流量预测(如电商节日)提前预扩容资源​​性能下降​​查询延迟(P99)超过基线50%动态分配OLAP/OLTP资源 三、最佳实践与案例​​金融核心系统​​:邮储银行采用GaussDB存算分离架构,支撑日均20亿笔交易,突发流量下自动扩容至128节点,RPO=0(零数据丢失)。​​物联网时序处理​​:智慧港口场景中,存储层独立扩容至PB级,计算节点按设备增量分钟级扩展,写入延迟<200ms。​​Serverless模式​​:开启Serverless后,系统根据SQL查询负载自动切换行存/列存格式,资源利用率提升40%,成本降低30%。四、注意事项​​版本兼容性​​:扩容节点需与集群版本一致,跨版本需先升级。​​业务影响​​:离线扩容时集群短暂只读,建议选择在线模式。​​成本优化​​:结合自动缩容(业务低谷期释放资源),避免过度扩容。​​总结一下​​:GaussDB通过存算分离架构,实现计算与存储资源的独立弹性扩展,而自动扩缩容由实时监控+AI预测驱动,覆盖资源瓶颈、容量预警、业务规划等场景,确保高性能与高性价比的平衡。
  • 华为开发者空间 GaussDB的实践案例 建议反馈贴
    体验华为开发者空间GaussDB的实践案例,反馈改进建议,请直接在评论区反馈即可体验指导:cid:link_0,更多华为开发者空间GaussDB案例也可在此贴反馈。
  • CNN残差网络解决梯度消失
    残差网络(Residual Network,ResNet)是卷积神经网络(CNN)领域里程碑式的架构创新,由何恺明(Kaiming He)等人于2015年提出。其核心目标是通过​​残差学习​​(Residual Learning)解决深度网络训练中的​​退化问题​​(Degradation Problem),即当网络层数增加时,性能不升反降的现象,而梯度消失正是退化问题的主因之一。   传统深度神经网络直接学习目标映射函数 H(x) = y(例如输入图像到分类标签的映射)。但当网络过深时,优化 H(x) 变得困难,梯度在反向传播中逐层衰减(梯度消失)或爆炸,导致深层参数难以更新。ResNet创新性地引入​​残差映射​​:定义残差函数 F(x) = H(x) - x,目标变为学习 F(x);输出改写为 H(x) = F(x) + x,其中 x 是输入,F(x) 是卷积层堆叠的变换。​​关键优势​​:​​恒等映射的简易性​​:若当前层无需复杂变换(即 H(x) = x 最优),则学习 F(x) = 0 比直接学习 H(x) = x 更易实现;​​梯度传播的捷径​​:跳跃连接(Skip Connection)使输入 x 直连输出层,反向传播时梯度可绕过中间层直接传递,避免因链式法则导致梯度逐层衰减。 二、结构设计:残差块与网络架构ResNet通过堆叠​​残差块​​(Residual Block)构建深层网络,分为两种类型:​​基本残差块​​(用于浅层网络如ResNet-18/34)结构:两个3×3卷积层 + 跳跃连接公式:y = F(x) + x,其中 F(x) 为两层卷积操作。​​瓶颈残差块​​(用于深层网络如ResNet-50/101/152)结构:1×1卷积(降维)→ 3×3卷积(特征提取)→ 1×1卷积(升维)目的:减少参数量,提升计算效率。 经典ResNet架构对比​​网络版本​​​​残差块类型​​​​深度(层数)​​​​参数量​​​​适用场景​​ResNet-18基本残差块1811M轻量级任务,移动端ResNet-34基本残差块3421M中等复杂度任务ResNet-50瓶颈残差块5025M主流图像任务ResNet-101瓶颈残差块10144M高精度检测/分割ResNet-152瓶颈残差块15260M极致精度需求任务注:深度包含卷积层、池化层和全连接层。 三、解决梯度消失的机制:前向与反向传播分析1. ​​前向传播:信息无损传递​​跳跃连接保留原始输入信息,确保深层网络至少不弱于浅层网络(恒等映射保障);即使中间层 F(x) 学习效果差,输出 y = F(x) + x 仍包含 x 的有效信息。2. ​​反向传播:梯度直达通道​​设损失函数为 L,反向传播至残差块输出时,梯度计算为:∂L/∂x = ∂L/∂y * (∂F(x)/∂x + 1)​​关键点​​:+1 项确保梯度至少以1的系数传递至前层,避免梯度消失(传统链式法则中梯度可能因连续乘法趋近0)。✅ ​​实验验证​​:ResNet-152在ImageNet上训练时,梯度在152层中仍稳定传播,而传统网络(如VGG-19)在30层后梯度已显著衰减。 四、应用与演进​​核心任务​​:图像分类(ImageNet冠军)、目标检测(Faster R-CNN、Mask R-CNN)、图像分割、医学影像分析;​​架构演进​​:与注意力机制结合(如ResNet + SE-Net),通过通道加权增强特征表达;轻量化设计(如MobileNet-V2引入倒残差块),适配移动端部署。  五、总结:ResNet的意义ResNet通过​​残差学习​​和​​跳跃连接​​,解决了深度神经网络的​​梯度消失​​与​​退化问题​​,使训练百层以上网络成为可能。其设计核心在于:学习残差 F(x) 而非直接映射 H(x),降低优化难度;跳跃连接构建梯度传播捷径,保障深层网络参数有效更新;模块化残差块支持灵活扩展,推动CV领域向超深网络演进。何恺明团队凭借ResNet获得2016年CVPR最佳论文,其思想已被Transformer等架构借鉴,成为深度学习基石之一。
  • 数据库迁移与存储过程
     ​​一、自动化工具辅助迁移​​​​SQLShift:异构存储过程智能转换​​​​核心能力​​:​​SQL Server → GaussDB​​:支持 T-SQL 到 PL/pgSQL 的精准转换,覆盖 300+ 语法点(如临时表、系统函数、数据类型)。示例:SELECT ... INTO #temp → CREATE TEMP TABLE ... AS非标语法修复:自动重构表别名作用域(如 UPDATE a SET ... FROM tableA a → UPDATE tableA a SET ...)。​​Oracle → GaussDB​​:通过 PL/SQL 到 PL/pgSQL 转换(需间接利用 PostgreSQL 兼容性),支持函数定义、事务控制等重构。​​批量处理​​:单次支持上百个存储过程转换,自动识别兼容性风险并生成报告。​​华为 DRS(Data Replication Service)​​:负责​​数据全量+增量迁移​​,但​​不处理存储过程逻辑​​,需与 SQLShift 配合使用。支持实时同步期间的业务验证,减少停机时间。 ​​二、手动调整与适配关键点​​即使使用工具,仍需人工干预以下场景:​​语法差异深度适配​​:​​Oracle 特有语法​​:ROWNUM → ROW_NUMBER() OVER()CONNECT BY → WITH RECURSIVE​​SQL Server 特性​​:@@IDENTITY → LASTVAL()游标逻辑需改写为 GaussDB 的 FOR ... IN 循环。​​函数与错误处理重构​​:函数替换:SYSDATE → CURRENT_TIMESTAMP,NVL() → COALESCE()。异常处理:Oracle 的 PRAGMA EXCEPTION_INIT 需转为 GaussDB 的 EXCEPTION WHEN ... 块。​​分布式事务优化​​:GaussDB 的分布式架构需避免跨节点事务锁竞争,例如将 SELECT ... FOR UPDATE 替换为 SKIP LOCKED。手动适配关键语法:-- Oracle PL/SQL → GaussDB SQL示例 -- 1. 游标处理 -- Oracle DECLARE CURSOR c_emp IS SELECT empno, ename FROM emp; v_empno emp.empno%TYPE; v_ename emp.ename%TYPE; BEGIN OPEN c_emp; LOOP FETCH c_emp INTO v_empno, v_ename; EXIT WHEN c_emp%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_empno || ' ' || v_ename); END LOOP; CLOSE c_emp; END; -- GaussDB适配 DO $$ DECLARE rec record; BEGIN FOR rec IN SELECT empno, ename FROM emp LOOP RAISE INFO '% %', rec.empno, rec.ename; END LOOP; END $$; -- 2. 异常处理 -- Oracle BEGIN UPDATE emp SET sal = sal * 1.1 WHERE empno = 7369; IF SQL%NOTFOUND THEN RAISE_APPLICATION_ERROR(-20001, '员工不存在'); END IF; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('错误: ' || SQLERRM); END; -- GaussDB适配 DO $$ BEGIN UPDATE emp SET sal = sal * 1.1 WHERE empno = 7369; IF NOT FOUND THEN RAISE EXCEPTION '员工不存在'; END IF; EXCEPTION WHEN OTHERS THEN RAISE INFO '错误: %', SQLERRM; END $$; ​​三、迁移全流程最佳实践​​​​评估与规划​​:​​兼容性扫描​​:使用 SQLShift 预检存储过程,标记不兼容对象(如示例中 SP_TSA_WAR 被标记为不兼容)。首先需要评估现有存储过程的迁移难度,识别兼容性问题: #存储过程语法差异分析工具(伪代码) def analyze_procedures(source_db_type, procedure_files): compatibility_map = { 'oracle': { 'plsql_syntax': ['ROWNUM', 'START WITH CONNECT BY', 'PACKAGE BODY'], 'functions': ['TO_CHAR', 'NVL', 'DECODE'], 'datatypes': ['NUMBER', 'VARCHAR2', 'DATE'] }, 'sqlserver': { 't_sql_syntax': ['BEGIN TRANSACTION', 'RAISERROR', '@@ROWCOUNT'], 'functions': ['GETDATE()', 'ISNULL', 'LEN'], 'datatypes': ['INT', 'VARCHAR', 'DATETIME'] } } issues = [] for file in procedure_files: content = open(file, 'r').read() for feature, patterns in compatibility_map[source_db_type].items(): for pattern in patterns: if pattern in content: issues.append(f"发现不兼容语法:{pattern}") return issues issues = analyze_procedures('oracle', ['procedure1.sql', 'procedure2.sql']) print(issues)关键差异点包括:语法差异:PL/SQL vs. SQL Server T-SQL vs. GaussDB SQL数据类型映射:如NUMBER→DECIMAL,VARCHAR2→VARCHAR函数替换:如TO_DATE→TO_TIMESTAMP系统变量:如ROWNUM→ROW_NUMBER()事务处理:如COMMIT WORK→COMMIT​​版本适配​​:明确 GaussDB 版本限制(如 V2.0-3.x 不支持 uuid_generate_v4())。​​分阶段迁移​​:建议采用 "先数据后逻辑" 的策略:数据模型迁移使用 GaussDB Migration Toolkit 进行表结构迁移处理外键、索引、约束的差异存储过程转换优先迁移基础功能的存储过程采用 "翻译 + 适配" 的方式处理复杂逻辑增量迁移验证灰度发布部分业务,对比迁移前后结果使用数据比对工具验证数据一致性 ​​测试与验证​​:​​数据一致性​​:通过 DRS 校验全表记录数及关键字段抽样。​​性能压测​​:使用 TPC-C/TPC-H 对比迁移前后 TPS 及响应延迟。使用 Git 管理存储过程代码,建立版本控制编写自动化测试脚本,确保每次变更的质量设计回滚方案,在出现问题时能快速恢复# 自动化测试脚本 #!/bin/bash # 1. 执行迁移脚本 psql -U username -d dbname -f migrate_procedures.sql # 2. 运行测试用例 psql -U username -d dbname -f test_cases.sql > test_results.txt # 3. 检查测试结果 if grep -q "FAILED" test_results.txt; then echo "测试失败,开始回滚..." psql -U username -d dbname -f rollback_script.sql exit 1 else echo "所有测试通过" exit 0 fi ​​四、常见风险与规避策略​​​​临时表堆积​​:工具自动将 ON COMMIT DROP 重构为显式清理链(DELETE ROWS + DROP),避免内存溢出。​​业务逻辑断裂​​:如 SQL Server 的 NEWID() 无直接等价函数时,工具建议重构为应用层生成 UUID。​​事务中断​​:自动标记需外部控制的 COMMIT 语句,防止存储过程内提交导致连接终止。 ​​总结​​​​优先使用 SQLShift 实现 70%-90% 的自动化转换​​,结合 DRS 保障数据同步。​​人工重点攻关​​:分布式事务、递归查询、非标函数等复杂逻辑。​​分阶段验证​​:从非核心业务到关键系统逐步推进,通过灰度发布控制风险。参考 华为 DRS 迁移指南 部署数据同步。
  • [问题求助] 如果想把 Oracle/SQL Server 数据库迁移到 GaussDB,但是又有大量复杂的存储过程怎么办?
    国产化替代,少不了从 Oracle SQL Server 等传统关系型数据库向国产化数据库(如 GaussDB)进行迁移。但是存储过程的改写需要理解复杂的业务逻辑,并熟悉两种数据库之间的语法差异。大多数情况是由 DBA 专家配合业务开发手动改写?这个过程会很缓慢,2025 年 AI 已经极大的发展,有没有更方便好用的方法或工具?
  • [问题求助] 云数据库GaussDB如何配置SSL认证
    购买了云数据库GaussDB集中式版, 通过官网的开发指南了解到可以通过SSL连接云数据库,产品页面也可以下载证书。 但是找不到如何配置服务端SSL。 云数据库默认已经开启SSL了吗? 还是需要登录云数据库所在的服务器进行配置?  能否提供一个官方指导和说明? 
  • [问题求助] [BUG]For Key Share等语句执行报错信息优化
    执行如下SQL语句:SELECT 1 FROM ONLY BasicEntityTest x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x报错: For Key Share and For No Key Update is not support for ustore.错误提示语法有问题,建议: The USTORE storage engine does not support For Key Share and For No Key Update.参考: cid:link_0
  • 数据库的三权分立模式是什么
    三权分立模式下系统管理员权限限制解析1. 三权分立的核心逻辑三权分立是将传统系统管理员权限拆分为三类独立角色:系统管理员(System Admin):负责基础设施管理(如创建实例、分配资源)。安全管理员(Security Admin):负责权限与审计管理(如用户创建、审计策略配置)。数据库管理员(Database Admin):负责数据操作(如表创建、数据读写)。2. 常见问题选项描述正确性原因解析系统管理员不再具有OPRADMIN权限正确OPRADMIN权限通常用于操作管理(如备份、恢复),三权分立后划归安全管理员或数据库管理员。系统管理员不再具有CREATEROLE权限正确CREATEROLE(创建角色)属于安全管理范畴,三权分立后由安全管理员负责。系统管理员不再具有AUDITADMIN权限正确AUDITADMIN(审计管理)属于安全控制权限,三权分立后从系统管理员权限中剥离。系统管理员只有对自己作为所有者的对象有权限错误系统管理员仍保留基础的系统资源管理权限(如实例监控、存储分配),并非仅局限于“自己创建的对象”。对象权限(如表读写)由数据库管理员负责。3. 三权分立前后权限对比权限类型传统单管理员模式三权分立模式系统资源管理系统管理员全量拥有系统管理员保留(如服务器配置、实例启动)安全与审计系统管理员全量拥有安全管理员负责(用户创建、审计策略)数据操作权限系统管理员全量拥有数据库管理员负责(表创建、数据读写)角色与权限管理系统管理员全量拥有安全管理员负责(角色创建、权限分配)4. 常见的错误混淆点“系统管理员只有对自己作为所有者的对象有权限”这一描述错误,原因在于:对象权限与系统权限的区分:系统管理员的核心职责是管理底层基础设施(如硬件、实例),而非数据对象(如表、视图)。数据对象权限由数据库管理员分配,与“对象所有者”无关。最小权限原则的应用:三权分立限制的是“跨领域权限”(如系统管理员不能管理审计),但未完全剥夺其系统层面的管理权限。总结三权分立的核心是通过权限拆分实现“权责分离”,系统管理员的权限被限制在基础设施管理范畴,而安全、审计、数据操作等权限被剥离给其他角色。常见的说法:“系统管理员只有对自己作为所有者的对象有权限”是错误的,因为系统管理员的权限范围不局限于对象所有权,而是保留系统级管理职责。
  • [问题求助] 线下DWS 8.1.1.5版本的升级途径是多少?
    目前的DWS 版本8.1.1.5的升级稳定版本的途径是不是8.1.1.5-》8.1.3-ESL.8.SP1 -》8.2.1-ESL.8目前这种升级方式有银行据点升级过没?使用上是否有什么问题?有直升8.1.1.x-》8.2.1.x的版本发布计划?
  • GaussDB PG 支持的标准日期时间类型​​详解
    一、GaussDB PG 支持的标准日期时间类型​​GaussDB PG 完全兼容 PostgreSQL 的日期时间类型体系,常用类型包括:类型名称描述存储空间示例值DATE仅存储日期(年、月、日)4 字节2025-05-20TIME [WITHOUT TIME ZONE]仅存储时间(时、分、秒),默认无时区8 字节14:30:45TIMESTAMP [WITHOUT TIME ZONE]存储日期和时间(年、月、日、时、分、秒),默认无时区8 字节2025-05-20 14:30:45TIMESTAMP WITH TIME ZONE存储日期、时间及时区信息(实际存储为 UTC 时间+时区偏移)12 字节2025-05-20 14:30:45+08​​二、“DATETIME”类型的替代方案​​若您习惯使用 DATETIME 类型(常见于 MySQL),在 GaussDB PG 中可通过以下方式替代:​​1. 直接使用 TIMESTAMP WITHOUT TIME ZONE​​DATETIME 在标准 SQL 中通常等价于 TIMESTAMP WITHOUT TIME ZONE(无时区的日期时间)。GaussDB PG 完全支持此类型,可直接替代:-- 创建表时使用 TIMESTAMP 替代 DATETIMECREATE TABLE example ( id INT, event_time TIMESTAMP WITHOUT TIME ZONE -- 等价于 MySQL 的 DATETIME);-- 插入数据(格式兼容)INSERT INTO example VALUES (1, '2025-05-20 14:30:45');​​2. 若需有时区信息,使用 TIMESTAMP WITH TIME ZONE​​若业务需要记录时区(如跨时区的日志),推荐使用 TIMESTAMPTZ(TIMESTAMP WITH TIME ZONE 的缩写):CREATE TABLE timezone_example ( log_id INT, log_time TIMESTAMPTZ -- 存储带时区的时间戳(自动转换为 UTC 存储));-- 插入带时区的时间(会自动转换为 UTC)INSERT INTO timezone_example VALUES (1, '2025-05-20 14:30:45+08'); -- 实际存储为 2025-05-20 06:30:45 UTC​​三、注意事项​​​​类型别名与兼容性​​GaussDB PG 支持部分类型别名(如 TIMESTAMPTZ 是 TIMESTAMP WITH TIME ZONE 的别名),但建议使用标准名称以避免歧义。​​时间格式解析​​GaussDB PG 支持多种时间格式(如 YYYY-MM-DD HH24:MI:SS、YYYYMMDDHH24MISS),插入时需确保格式与声明的类型匹配。若需自定义格式,可使用 TO_TIMESTAMP 函数显式转换:-- 将字符串 '20250520143045' 转换为 TIMESTAMPSELECT TO_TIMESTAMP('20250520143045', 'YYYYMMDDHH24MISS'); -- 结果:2025-05-20 14:30:45​​时区处理​​TIMESTAMP WITHOUT TIME ZONE 仅存储本地时间,不涉及时区转换,适合业务逻辑明确不跨时区的场景(如本地业务日志)。TIMESTAMP WITH TIME ZONE 存储的是 UTC 时间+时区信息,适合需要跨时区同步的场景(如全球用户行为记录)。​​四、总结​​GaussDB PG 模式下​​完全支持标准的日期时间类型​​,若需替代“DATETIME”,推荐使用 TIMESTAMP WITHOUT TIME ZONE(无时区)或 TIMESTAMP WITH TIME ZONE(有时区)。根据业务需求选择即可,两者均能满足大部分日期时间存储与计算场景。
  • Roach工具与OpenGauss备份适配性
    ​​Roach工具(GaussRoach.py)支持对OpenGauss数据库的备份​​,但需注意其适用范围和功能特点。以下是关键信息总结:✅ 1. ​​Roach与OpenGauss的兼容性​​Roach(通过GaussRoach.py脚本调用)是​​专为GaussDB(基于OpenGauss内核)设计的物理备份工具​​,适用于分布式集群环境。它支持对OpenGauss集群的​​全量物理备份​​,包括数据文件、WAL日志、配置文件等,确保备份一致性。🔧 2. ​​支持的备份类型与功能​​​​物理备份​​:全量备份:备份集群所有数据节点(DN)、协调节点(CN)、GTM节点及配置文件。增量备份:通过--backup-mode=PTRACK参数启用基于页面跟踪的增量备份。​​多存储介质支持​​:可备份至本地磁盘(DISK)、华为云OBS、NBU(Veritas NetBackup)、EISOO等。​​高级管理功能​​:支持备份集删除、校验、断点续传,以及双集群容灾恢复。⚠️ 3. ​​使用限制​​​​仅限分布式集群​​:Roach​​不支持集中式单节点部署​​的OpenGauss,仅适用于多节点集群。​​依赖归档模式​​:备份前需​​开启WAL归档​​(命令:python3 GaussRoach.py -t config --archive=true -p)。​​需主节点执行​​:备份操作必须在集群主节点发起。🔄 4. ​​备份恢复流程​​​​备份命令示例​​:python3 GaussRoach.py -t backup --media-type DISK --media-destination /backup_path ​​恢复命令示例​​:python3 GaussRoach.py -t restore --media-type DISK --media-destination /backup_path --backup-key <备份ID>  5. ​​替代方案(单节点OpenGauss)​​若使用集中式单节点OpenGauss,可选用以下工具替代Roach:​​gs_probackup​​:专为单机设计的物理备份工具,支持增量备份和PITR。​​gs_dump​​:逻辑备份工具,导出SQL脚本或归档文件,适用于小规模数据迁移。📌 ​​总结​​Roach是OpenGauss分布式集群的​​首选物理备份工具​​,提供全量/增量备份及多介质支持,但需注意其​​不适用于单机环境​​。对于单节点部署,建议使用gs_probackup或gs_dump。具体工具选择需结合集群架构和备份需求。
  • [问题求助] gaussdb未知错误,怎么排查
    系统内存报错
  • [运维管理] 删除数据库权限怎么限制?怎么回收?
    删除数据库权限怎么限制?怎么回收?
  • 请问如何申请华为GaussDB的技术认证?就是证明产品能在GaussDB上正常运行的证书
    请问如何申请华为GaussDB的技术认证?就是证明产品能在GaussDB上正常运行的证书
总条数:331 到第
上滑加载中