oracle dds是什么

oracle dds是什么,第1张

2 DataGrid DDS产品介绍

21概述:

DataGrid DDS是基于分析oracle redo log技术的Oracle实时复制工具,具有简单灵活、高性能低成本的特点,部署和使用非常容易,对系统资源和运行环境的要求也非常低。DataGrid DDS能够帮助用户在复杂的应用环境下完成容灾备份、异构迁移、业务数据分发、基础数据整合集中等工作。

DataGrid DDS能做什么?

DataGrid DDS能够满足用户多种业务需求,主要有:

提高系统整体可用性

DataGrid DDS能够帮助用户提高Oracle数据库的可用性,无论是执行计划内停机(如系统升级、备份)还是遇到故障引起的非计划宕机(例如硬件故障、灾难、人为错误等),DataGrid DDS都能尽量减少宕机时间。提高可用性能够最大限度地减少数据丢失、经济损失和生产力的降低。

逻辑灾备和灾难恢复

对于大部分公司而言,灾备是一项巨大的工程,意味着高额的资金投入和人力成本。受到传统复制技术的限制,灾备必须拥有专用的硬件支持和专用的光纤传输链路,灾备距离和系统平台还有诸多的限制。此外,由于传统灾备系统的数据库不能随时打开使用,不但风险不能评估,而且巨大的投入也得不到回报。

DataGrid DDS使用逻辑数据复制技术,传递的是交易信息,因此传输数据量很小,保证了在低带宽环境下实现低延迟的Oracle数据异步复制,软件同时支持实时复制容灾和定时复制备份功能,是一种高效且低成本的数据库灾备方式。DataGrid DDS使用标准的IP网络进行通讯,灾备端的Oracle数据库可以部署在本地或远程容灾中心,距离没有限制。此外,由于复制的目的端数据库始终处于打开状态,因此,当生产数据库遇到计划内或非计划停机时,DataGrid DDS能够支持前端应用程序快速、无缝的切换到灾备数据库。与其它基于磁盘或文件系统的物理复制技术相比,不但省略了漫长的数据库recovery和启动时间,而且能够保证100%的切换成功率。

分担数据库负载

DataGrid DDS逻辑交易复制技术保证了目的端数据库始终处于可用状态,因此对于实时交易处理之外的只读应用,例如批量查询、报表处理、数据备份、统计分析等都可以交给复制的数据库处理。多种应用也不必在同一个交易数据库上争夺资源和时间窗口。生产系统运行和维护的压力得以释放,提高了稳定性,而不同的应用在分布的数据库上也可以得到分别的优化。

业务数据分发

DataGrid DDS能够完成企业范围内数据分发,从交易数据生产库实时复制到一个或多个本地或异地的数据库。DataGrid DDS支持多种数据分发拓扑结构,一对多,多对一,级联复制等。数据分发是一种典型的通过部署多服务器、多数据库来分担负载,提高响应速度的企业应用模式。

跨平台数据迁移

DataGrid DDS支持跨平台的数据传输,复制的源和目的系统可以在AIX、HP-UX、Solaris、Linux之间任意选择。DataGrid DDS同时支持Oracle 9i和Oracle 10g。对于用户来说,不但硬件平台的选择有很大的灵活性,也可以用DataGrid DDS来完成异构平台的数据库同步和迁移工作。

实时复制和批量复制

应用的需求影响着用户使用复制工具的模式,对于容灾和查询应用,连续的实时复制保证目的端数据库拥有和生产系统完全一样的数据状态;而对于定时备份、系统升级和定时分析等应用,用户则希望复制软件做到定时或周期性的批量数据迁移。在DataGrid DDS中批量复制和实时复制是相互独立又紧密结合的两个部分,通过管理员的 *** 作控制,DataGrid DDS完全满足用户在多种应用条件下的需求。

交易统计

DataGrid DDS在完成实时数据复制的同时,也跟踪到了数据库交易数量的变化,通过GUI界面,DBA可以随时查询到生产数据库在指定时间段的交易统计结果,通过分析这些数据,DBA能够量化生产数据库压力的变化,从而为数据库的扩容和升级提供了依据。

增强分析工具

DataGrid DDS提供了简单实用的数据库工具包,包括日志分析工具、文件分析工具、导入导出工具等,工具包能帮助有经验的DBA更深入的分析处理数据库的问题。

22DataGrid DDS技术原理

221DataGrid DDS和Oracle Redo Logs

基于日志分析的实时复制技术

DataGrid DDS通过分析Oracle redo log获得实时交易信息,完成schema或table级别的数据复制。区别于早期的日志分析技术,DataGrid DDS对日志的整合和传输以交易为单位,使用该技术,在拥有高性能的同时还能更好的保证数据传输的一致性和完整性。对生产数据库也不会增加负载。

DataGrid DDS从Oracle redo logs里面获取所有的数据库改变信息。通过对信息的分析整合,DataGrid DDS将完整的交易信息复制到目的端。

DataGrid DDS不是等待Oracle redo log文件写满之后再处理,而是随时读取其数据块内容,间隔时间可以用参数指定,一般是秒级。DataGrid DDS也不会复制Oracle redo log的全部内容到目的端数据库,除指定复制对象(数据表)相关的DML/DDL *** 作之外,其他的信息将丢弃处理。

为了避免可能出现的复制错误,用户需要打开数据库的supplemental logging 和force logging参数以便DataGrid DDS能获取完整的数据信息。

置于裸设备或文件系统(包括ocfs)中的Oracle redo log可以被DataGrid DDS正常读取。如果用户使用的是Oracle 10g,并且将redo log保存在ASM(一种新的Oracle存储格式)中,则需要在裸设备或文件系统上手动创建一组与原有日志同步的redo log member,供DataGrid DDS复制使用。

Online 和 Archived Redo Logs

Oracle有两种类型的日志:在线日志和归档日志。一般情况下,DataGrid DDS从一组在线日志读取信息,因此,不要求Oracle数据库必须打开归档日志。但在某些特殊情况下,online redo log没来得及分析就被覆盖,此时,如果Oracle是归档模式,则DataGrid DDS将从归档日志读取需要的信息。

222复制对象和数据定位

复制对象的指定

DataGrid DDS支持两种级别的复制:1用户(schema)级复制;2表级复制。

用户级复制表示源端数据库指定用户(schema)下的所有表、视图、索引、过程、函数、包、序列等数据对象全部复制到目标端数据库指定的用户下。表级复制表示源端数据库指定用户(schema)下的单个表复制到目标端数据库指定用户下的单个表。

在使用DataGrid DDS时,用户通过编辑配置文件指定源端和目的端复制对象的映射关系,包括源端对象名,目的端对象名,目的主机编号等。源端和目的端对象名称可以不同,但结构必须一致。软件运行过程中,复制对象的映射参数会驻留内存,DataGrid DDS通过日志分析过滤,只处理指定复制对象有关的交易,其它用户或表的 *** 作信息则被丢弃。

Rowid mapping

早期的数据库逻辑复制软件要求被复制的数据表有主键索引,通过where子句查询的方式来定位DML *** 作的目标行。这种方法在数据修改较多或者表内行数较多的应用环境,特别是Update *** 作频繁的情况下,效率较低。

为了满足海量数据系统的应用要求,DataGrid DDS以Oracle内部rowid为参照进行复制数据定位。系统在初始化过程中会自动创建源端数据行和目的端数据行的rowid mapping映射表,为二进制格式,系统根据该映射关系找到DML *** 作的目标行。Rowid定位技术在海量数据环境下处理Update和Delete *** 作具有较大的性能优势。

223分级存储和交易队列

DataGrid DDS在数据传输部分使用了分级存储机制,在遇到系统错误引起的复制中断时,例如硬件故障、数据库故障、网络中断或延迟,分级存储机制能完好的保存已经合成的交易信息,避免数据丢失。这些数据以二进制文件格式存储在文件系统的缓存目录下,直到系统故障解决。恢复从缓存文件传输的中断点开始。

源端和目的端分级存储

DataGrid DDS的分级存储分为两级:第一级在复制源端,第二级在复制的目的端。Redo log里边的交易的信息被整合成缓存文件后,首先存放到源端的一级缓存目录;然后经过网络通讯进程处理被发送到目的端系统下的二级缓存目录保存;最后由装载进程负责装载到目的端数据库中。

在网络传输出现中断或大量延迟的情况下,DataGrid DDS在源端仍然继续读取并分析数据库日志产生的交易信息,这些信息暂时不能发送到目标端系统,不断地积累在源端的缓存目录下,直到通讯恢复。源端缓存保证了故障情况下复制数据的完整性。

目的端的缓存目录将保存交易信息文件直到它们正确的装载到目的端的数据库内,如果因为目的数据库的故障或关闭,装载不能进行,从源端传送过来的数据文件将在目的端缓存目录下保存。数据库恢复后,缓存文件会严格按照交易时间顺序进行装载。

文件的格式和大小

交易信息以文件为单位进行传输、缓存和装载,该文件为DataGrid独有的二进制格式,其内部的表达方式与Oracle内部处理方式相类似,避免了很多复杂的信息转换,因此具有很高的效率。

缓存文件的总量为源端实际产生redo log日志量的1/3~1/4左右。DataGrid DDS不设置缓存空间控制机制,用户可以根据每天交易产生的Oracle redo log日志量和以上比例计算需要预留的缓存空间。

内存管理和大交易处理

DataGrid DDS启动后,将在源端和目的端系统上开辟多个内存区供各进程使用,用来驻留参数、传递消息信号、缓存分析交易的中间信息等。内存区的大小由系统参数指定,目的是防止无限制的使用内存引起系统资源紧张或系统崩溃。

在复制源端,如果遇到数据库产生非常大的交易,DataGrid DDS会连续分析直到整个交易提交,其间产生的中间信息可能达到GB级。在这种情况下,DataGrid DDS会自动将这些信息缓存在磁盘上等待处理,磁盘缓存由后台进程自动处理,容量没有限制。

交易队列

DataGrid DDS严格按照Oracle数据库内部SCN顺序执行交易的复制和装载,保证复制数据的绝对一致性。

DataGrid DDS在跟踪redo log过程中,每隔一个固定的时间(通常是秒级)读取一次日志文件,分析出本次读出数据的内容,同时记录下该段数据的起始和终止SCN号。下一次读取redo log时,从上一次获取的终止SCN位置开始。多个实例的RAC模式下,则以SCN为参考给每个实例执行的交易进行排队,然后按照排队顺序形成缓存文件。缓存文件也严格按照交易的顺序进行编号、传递。所有的交易在目的端装载的顺序与它们在源端产生的顺序完全相同,这是保证数据完整性和一致性的关键。

224使用和部署DataGrid DDS

在线部署

DataGrid DDS的安装非常简单,不需要特殊的软硬件支持,软件本身完全在Oracle数据库的外部,不需要在Oracle中增加表空间,不需要在复制的表上添加索引和主键,也不需要停机做基础数据同步工作。

整个安装过程可以在线进行,甚至可以在数据库正常执行交易的过程中执行,因为DataGrid DDS不用借助任何第三方工具就可以进行在线的批量数据初始化工作,初始化结束后,无缝切换到增量数据复制过程。这样的功能对于一些需要724连续运行的系统来说非常重要,因为在安装维护过程中,频繁的停机会给生产系统带来很大的安全隐患和工作难度。

跨平台支持和兼容性

使用逻辑复制技术的DataGrid DDS,其跨平台能力是用户非常欢迎的。DataGrid DDS能够支持不同版本Unix/Linux系统下的混合复制,对于具有复杂硬件环境的企业系统来说,异构能力可以节省大量的资源和成本,旧设备得到充分的利用。

不同Oracle版本的支持能力也非常有价值,对于一些724运行的Oracle9i数据库来说,DataGrid DDS可以帮助它们在线的升级到Oracle 10g。

*** 作系统 数据库版本 数据类型 数据对象

AIX Oracle9i NUMBER Table

HPUX Oracle9i RAC CHAR View

HPUX(IA64) Oracle VARCHAR/VARCHAR2 Package

Solaris Oracle10g RAC DATE Package body

Linux TIMESTAMP Index

BLOB/CLOB Sequence

RAW/LONG RAW Procedure

ROWID Function

Trigger

表1:DataGrid DDS支持的系统及对象

多种复制模式

DataGrid DDS支持一对一,一对多,多对一,以及级联复制等多种复制模式。无论在哪种模式下,复制的源和目的系统都是独立的部分,可以单独的使用、维护和优化,这也是逻辑复制技术受到用户青睐的重要原因之一。

一对一的复制常见于灾备应用

PowerBuilder(PB)和Oracle分别是前端开发工具和RDBMS的主流产品 PB提供了两种与Oracle连接的接口 PowerSoft内置的数据库接口(Native Database Interface)和ODBC接口

PowerBuilder与Oracle的连接

假定已安装Oracle客户端应用程序 可用Sqlplus或Tnsping等是否能连接到Oracle数据库 确定在SQLNET配置文件中使用的数据库别名(Database Alias 又称服务器名 Server Name) 如有疑问 可在Oracle客户端程序目录下tnsname ora文件中找到 另外保证搜索路径已包括SQLNET应用程序的安装目录(如C:\ORAWIN \BIN)

进入PB的Database Profiles画笔 可看到所有已安装的数据库接口(PB 缺省安装的是Oracle 版的接口 如使用低版本的Oracle 需在安装时指定) 选择 O Oracle 点击 New 按钮 进入Database Profile Setup对话框 在 Connection 页输入下列信息 Profile Name:为该Database Profile起一个有意义的名称 Server:@TNS:ServerName 其中ServerName为上述数据库别名(服务器名) 如@TNS:ORA ;注意 PB 则没有前面那个@TNS:!!!

Login ID:Oracle数据库中实际的用户名 由于PB初次连接到数据库时要自动建立五个系统表(PowerBuilder Catalog Table:PBCATTBL PBCATCOL PBCATEDT PBCATFMT PBCATVLD 存储表的扩展属性) 因此第一个连接到Oracle的用户必须具有建表 给PUBLIC角色授权等权限 例如可用SYSTEM用户进行第一次连接 此后的连接对用户则无特殊要求

Password:该用户的口令

设置上述内容后 即可连上Oracle 为优化数据库连接 还可设置下列选项

Prompt for Database Information:连接时是否提示用户输入用户名和口令

Generate Trace:启动DB跟踪工具 跟踪连接

Thread Safe:开发需要多线程环境支持的分布式应用时 选择该项 缺省为未选 适用于非分布应用

PBDBMS:与存储过程调用方式有关的参数 Oracle为 或更高版本时 清除该选项 此时带IN OUT参数的存储过程可作为数据窗口数据源 版本以下 选择该项 调用PBDBMS Put Line建立存储过程的SQL语句 缺省是选中

Commit on Disconnect:断开连接时 指定提交或回退未提交的事务

Case Sensitive:连接的Oracle服务器是否区分大小写 注意该项选中时 所有主键 包含主键的表名 外键须全为大写字符

PowerBuilder Catalog Tables Owner:指定拥有PB系统表的用户 缺省为 SYSTEM 如果要使用多种显示格式或有效性规则 可以在不同的用户下建立几套系统表

Table Criteria:指定满足哪些条件的表 视图和同义词可在 Select Tables 对话框中显示出来 例如DEV用户下销售子系统的表都以SALE开头 则可以用SALE% DEV TABLE VIEW 指定只显示DEV用户以SALE开头的表和视图

Asynchronous:选择该项 可在一个复杂的SQL语句执行过程中 返回第一行结果前 切换到其他 *** 作

Number of Seconds to Wait:若上一项选中 还可进一步通过该项指定检索数据时 等待数据库响应的时间

Retrieve Blocking Factor:决定数据窗口对象一次可从数据库取出的记录数

Number of SQL Staments Cached:PB可将数据窗口对象产生的SQL语句和嵌入式SQL语句保存在SQL语句缓冲区 该参数指定缓冲区为PB保留的SQL语句数目 该数值可由下式计算 SQLCache=服务器OPEN CURSORS数 (保留的游标数) 本连接预期使用的最大游标数

Disable Bind:指定是否将输入变量与SQL语句绑定 此参数影响PB为数据窗口对象生成INSERT语句的方式

Static Bind:数据窗口对象检索数据前是否检测SELECT语句的合法性

在Syntax页 还可指定日期 时间的格式等 在Preview页可查看Database Profile设置对应的PowerScript写法

Oracle存储过程的使用

归纳起来PB 中调用Oracle存储过程有以下四种方法

方法一 以关键字RPCFUNC声明存储过程

方法二 以DECLARE PROCEDURE语句声明存储过程

方法三 以动态SQL语句实现

方法四 调用函数PBDBMS Put Line

一般情况下 方法一能得到较好的运行效率和更完善的功能 因此推荐使用方法一 但是某些类型的存储过程只能使用其他方法 以下重点介绍方法一和方法二

两种方法比较起来 有以下几点主要区别

)方法一适用于具有IN OUT和IN OUT参数的存储过程 而方法二仅支持IN和OUT参数 不支持IN OUT参数

)方法一对参数的数目无限制 方法二最多支持 个参数

)方法一不支持记录(Recorder)的传递 方法二可传递和接收记录

方法一 *** 作步骤

)在用户对象画笔中创建一个Class Standard类型的 从Transaction继承的用户对象

)在此用户对象中 声明Local External Functions 将存储过程以RPCFUNC关键字声明为外部函数 在Declare Local External Functions对话框中按Procedures按钮选择要调用的后台存储过程 或直接输入类似subroutine TEST(long id ref string name)RPCFUNC ALIAS FOR DEVTEST 的语句 例如DEVTEST的参数为(id IN NUMBER name IN OUT VARCHAR )

)保存该用户对象

)在Application画笔中 进入应用属性对话框 在Variable Types页 将上Transaction用户对象设置为缺省的全局变量SQLCA

)脚本中 编码调用相应的外部函数 形式 SQLCA函数名(参数) 如可用 SQLCATEST(ln id ls name) 调用例子中定义的DEVTEST存储过程 其中ln id ls name为调用参数

方法一注意事项

)由于PB中String类型的数据长度是动态分配的 因此对Ref String类型的参数 每次调用前需要申请足够的空间 例如上例从输入的id值检索name 后台声明的NAME数据类型为VARCHAR ( ) 每次调用SQLCATEST前需要用ls name=SPACE( )置ls name为足够长度的空串

lishixinzhi/Article/program/PB/201311/24641

oracle 数据库的第三方工具,当今oracle数据库主流工具之一面oracle数据库则是当今主流数据库之一世界一百强几乎都用这个数据库

补充:TOAD里面与oracle有关的功能,基本上都可以在ORACLE自带的SQLPLUS里面实现只是他把很多的命令图形化了可以让记不住命令的人快速入门

用途就是让人更加方便的管理数据库

要确保SQL Developer可以运行,你需要确保以下条件:

1 你的计算机上已经安装了Java SE Development Kit (JDK)。SQL Developer需要JDK才能运行。如果你还没有安装JDK,则需要先下载并安装它。

2 下载并安装SQL Developer软件。你可以从Oracle官方网站下载SQL Developer安装包,并按照安装向导进行安装。

3 确保计算机上已经安装了数据库驱动程序。如果你想连接到Oracle数据库,那么需要安装Oracle数据库驱动程序。

4 配置SQL Developer连接属性。在SQL Developer中,你需要配置连接属性以便连接到你的数据库。这包括主机名、端口号、用户名、密码等信息。

5 确保你的计算机上具有足够的内存和处理能力以运行SQL Developer。如果你的计算机性能不足,则可能会出现SQL Developer运行缓慢或无法运行的问题。

如果你已经满足以上条件,则应该可以成功运行SQL Developer。

表空间是数据库中最大的逻辑单位与存储空间单位 数据库系统通过表空间为数据库对象分配空间 表空间在物理上体现为磁盘数据文件 每一个表空间由一个或多个数据文件组成 一个数据文件只可与一个表空间相联系 这是逻辑与物理的统一 了解表空间和数据文件的的属性及使用率 是数据库管理员的一项重要职责 在本文中笔者将以oracle为例 详细介绍查询Oracle数据库表空间信息和数据文件信息的方法 希望能帮助大家更深入了解表空间的知识和应用

一 如何查看Oracle数据库中表空间信息的方法

从Oracle数据库中工具入手

使用oracle enterprise manager console工具 这是oracle的客户端工具 当安装oracle服务器或客户端时会自动安装此工具 在windows *** 作系统上完成oracle安装后 通过下面的方法登录该工具 开始菜单——程序——Oracle OraHome ——Enterprise Manager Console(单击)——oracle enterprise manager console登录——选择 独立启动 单选框—— 确定 —— oracle enterprise manager console 独立 ——选择要登录的 实例名 ——d出 数据库连接信息 ——输入 用户名/口令 (一般使用sys用户) 连接身份 选择选择SYSDBA—— 确定 这时已经成功登录该工具 选择 存储 ——表空间 会看到如下的界面 该界面显示了表空间名称 表空间类型 区管理类型 以 兆 为单位的表空间大小 已使用的表空间大小及表空间利用率

从Oracle数据库中命令方法入手

通过查询数据库系统中的数据字典表(data dictionary tables)获取表空间的相关信息 首先使用客户端工具连接到数据库 这些工具可以是SQLPLUS字符工具 TOAD PL/SQL等 连接到数据库后执行如下的查询语句

select a a 表空间名称 c c 类型 c c 区管理 b b / / 表空间大小M (b b a a )/ / 已使用M substr((b b a a )/b b ) 利用率from(select tablespace_name a sum(nvl(bytes )) a from dba_free_space group by tablespace_name) a (select tablespace_name b sum(bytes) b from dba_data_files group by tablespace_name) b (select tablespace_name c contents c extent_management c from dba_tablespaces) cwhere a a =b b and c c =b b ;

该语句通过查询dba_free_space dba_data_files dba_tablespaces这三个数据字典表 得到了表空间名称 表空间类型 区管理类型 以 兆 为单位的表空间大小 已使用的表空间大小及表空间利用率 dba_free_space表描述了表空间的空闲大小 dba_data_files表描述了数据库中的数据文件 dba_tablespaces表描述了数据库中的表空间

上面语句中from子句后有三个select语句 每个select语句相当于一个视图 视图的名称分别为a b c 通过它们之间的关联关系 我们得到了表空间的相关信息

语句执行结果如下

上面描述中分别介绍了查看Oracle数据库中表空间信息的工具方法和命令方法

二 查询Oracle数据库中数据文件信息的方法

查看Oracle数据库中数据文件信息的工具方法

使用上面介绍过的方法登录oracle enterprise manager console工具 选择 存储 ——数据文件 会看到如下的界面 该界面显示了数据文件名称 表空间名称 以 兆 为单位的数据文件大小 已使用的数据文件大小及数据文件利用率

查看Oracle数据库中数据文件信息的命令方法

通过查询数据库系统中的数据字典表(data dictionary tables)获取数据文件的相关信息 首先使用客户端工具连接到数据库 这些工具可以是SQLPLUS字符工具 TOAD PL/SQL等 连接到数据库后执行如下的查询语句

select b file_name 物理文件名 b tablespace_name 表空间 b bytes/ / 大小M (b bytes sum(nvl(a bytes )))/ / 已使用M substr((b bytes sum(nvl(a bytes )))/(b bytes) ) 利用率from dba_free_space a dba_data_files bwhere a file_id=b file_idgroup by b tablespace_name b file_name b bytesorder by b tablespace_name

上面描述中分别介绍了查看Oracle数据库中数据文件信息的工具方法和命令方法

三 查看临时表空间和数据库文件的方法

在oracle数据库中 临时表空间主要用于用户在使用order by group by语句进行排序和汇总时所需的临时工作空间 要查询数据库中临时表空间的名称 大小及数据文件 可以查询数据字典dba_tablespaces及dba_data_files 命令如下

select a talbespace_name 表空间名称 b bytes 大小bytes b file_name 数据文件名from dba_tablespaces a dba_data_files bWhere a talbespace_name=b talbespace_name and ntents= TEMPORARY ;

查询结果如下

从oracle i开始 可以创建Temporary tablespace类表空间 即 临时 表空间 这类表空间使用临时文件 临时文件的信息被存储在数据字典V$tempfile中 命令如下

Select file# status name from V$tempfile;

查询数据字典V$tempfile结果如下

在上面介绍的方法中 建议掌握命令方法 因为你的环境可能没有图形工具 而SQLPLUS一般情况下都是可以使用的 有了命令脚本 很容易得到表空间和数据文件的相关信息 另外 数据库管理员应该多整理命令脚本 在需要时直接执行脚本以提高工作效率

lishixinzhi/Article/program/Oracle/201311/18471

以上就是关于oracle dds是什么全部的内容,包括:oracle dds是什么、PB内置Oracle数据库接口的使用方法[1]、toad for oracle 10 做什么用的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9843463.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存