oracle坏块原因分析与修复方法

oracle坏块原因分析与修复方法
oracle坏块原因分析与修复方法

Oracle 坏块总结收藏

Oracle数据库出现坏块现象是指:在Oracle数据库的一个或多个数据块(一个数据块的容量在创建数据库时由db_block_size参数指定,缺省为8K)内出现内容混乱的现象。由于正常的数据块都有固定的合法内容格式,坏块的出现,导致数据库进程无法正常解析数据块的内容,进而使数据库进程报错乃至挂起,并级联导致整个数据库实例出现异常。

一.坏块的产生原因

坏块产生的原因大致有以下几种:

1.1 硬件问题

Oracle进程在处理一个数据块时,首先将其读入物理内存空间,在处理完成后,再由特定进程将其写回磁盘;如果在这个过程中,出现内存故障,CPU计算失误,都会导致内存数据块的内容混乱,最后反映到写回磁盘的数据块内容有误。同样,如果存储子系统出现异常,数据块损坏也就随之出现了。

1.2 操作系统BUG

由于Oracle进程对数据块的读写,都是以操作系统内核调用(system call)的方式完成的,如果操作系统在内核调用存在问题,必然导致Oracle进程写入非法的内容。

1.3 操作系统的I/O错误或缓冲问题

1.4 内存或paging问题

Oracle软件BUG

Oracle软件特定版本上,可能出现导致数据块的内容出现异常BUG。

1.5 非Oracle进程扰乱Oracle共享内存区域

如上文所述,在当数据块的内容被读入主机的物理内存时,如果其他非Oracle进程,对Oracle 使用的共享内存区域形成了扰乱,最终导致写回磁盘的数据块内容混乱。

1.6 异常关机,掉电,终止服务

异常关机,掉电,终止服务使进程异常终止,而破坏数据块的完整性,导致坏块产生。注:这也是为什么突然断电会导致数据库无法启动

由上可见,坏块的形成原因复杂。当出现坏块时,为了找到确切的原因,需要大量的分析时间和排查操作,甚至需要多次重现才能找出根本原因。但当故障发生在生产系统上,我们为了减少停机时间,会尽快实施应急权变措施以保证系统的可用性,这样就破坏了故障现场,对根本原因的分析因而也更加困难了。

二.坏块的预防

坏块问题破坏性大,但并非不可预防。

2.1 在https://www.360docs.net/doc/499667957.html,网站,Oracle定期发布基于特定软件版本的“已知问题(known issues)说明”。对于可能导致坏块的Oracle软件BUG,在Oracle公司内部,是作为高严重级别的问题进行处理,在“已知问题(known issues)说明”中,这些BUG以严重(Noticable)问题标出(标记为*或+),部分问题,Oracle还会发布警告(Alert)通告。在文档中,Oracle会提供相应的补丁或应对措施。

2.2 Oracle提供备份恢复工具-Recovery Manager,提供了扫描文件检查坏块的功能。

在Recovery Manager界面中,使用:

RMAN> BACKUP CHECK LOGICAL V ALIDATE DATAFILE n ;

可以检查数据文件是否包含坏块,同时并不产生实际的备份输出。

2.3 Dbv工具检查

注:因为dbv要求file后面跟的必须是一个文件扩展名,所以如果用裸设备存储

的,就必须使用ln链接裸设备到一个文件,然后再用dbv对这个链接文件进行检查。

ANAL YZE TABLE tablename V ALIDATE STRUCTURE CASCADE

它执行坏块的检查,但是不会标记坏块为corrupt,检测的结果保存在USER_DUMP_DEST 目录下的用户trace文件中。

2.4 利用exp工具导出整个数据库可以检测坏块

对以下情况的坏块是检测不出来的:

HWM以上的坏块是不会发现的

索引中存在的坏块是不会发现的

数据字典中的坏块是不会发现的

结合数据库性能综合考虑db_block_checksum和db_blockchecking参数。

当我们使用Recovery Manager进行实际的数据库备份时,同时也就进行了坏块

检查。但要注意的是,在线使用Recovery Manager扫描坏块和备份时,需要数

据库运行在归档模式(archive log),否则只能在数据库未打开的情况下进行。

对于操作系统问题和硬件故障,则需要相应厂商的配合支持。同时,避免在数

据库主机运行其他用户进程,避免异常停机,也会减少坏块发生的几率。

三.坏块故障的识别

遇到坏块问题时,数据库的异常表现通常有:

报告ORA-01578错误。

报告Ora-1110错误。

报告ORA-00600错误,其中,第一个参数为2000-8000,Cache layer 2000 –4000,Transaction layer 4000 –6000,Data layer 6000 - 8000。

Trace文件中出现Corrupt block dba: 0x160c5958 . found。

分析对象失败。

后台进程,如DBWR,LGWR出现长时间异常等待,如“LGWR wait for redo copy”。四.Oracle数据块损坏恢复总结

可以用DBV 命令来检测是否有坏块:

在恢复前使用DBV命令检查数据文件是否存在坏块

dbv file=d:\oracle\oradata\mydb\RONL Y.DBF blocksize=8192

查看数据坏块所在数据文件号及块号可以对表进行一次全表扫描,如:

select count(*) from tablename;

关于DBV 命令的具体使用,请参考blog:

https://www.360docs.net/doc/499667957.html,/tianlesoftware/archive/2009/12/16/5015164.aspx

4.1 没有备份的情况下:

4.1.1、使用exp/imp恢复

在这种情况下肯定会造成数据的丢失,在这种情况下应采取将数据导出然后重建表再进行导入的方法,来尽量恢复损坏数据块中的数据,但是在有坏块的情况下是不允许导出的,如下命令:

Exp test/test file=t.dmp tables=t;

导出命令在执行中会报ORA-01578错误,在这错误提示中会提示那个文件号的文件以及这个文件中的哪个块被损坏,如:ORA—01578:ORACLE 数据块损坏(文件号4,块号35)针对以上的提示首先查询那些对象被损坏:

Select tablespace_name,segment_type,owner,segment_name From dba_extents Where file_id=4 and 35 between block_id and block_id+blocks-1;

如果被损坏的块是索引,通常可以通过索引重建来解决,如果损坏的是数据(segment_type 为table),那么通过设置如下内部事件使得Exp操作跳过坏块。

Alter session set events=’10231 trace name context forever,level 10’;

然后重新执行导出命令,导出相关的表,然后执行Drop Table命令删除相关表,之后重建表最后导入数据。

4.1.2、使用DBMS_REPAIR恢复

用DBMS_REPAIR当然也会丢失数据。这里不做详细的介绍,有兴趣的可以查看oracle的在线文档

4.2 使用Rman进行恢复:

首先要存在Rman的最新备份集,然后执行如下命令:

RMAN>backup validate datafile 4;

检查4号数据文件是否存在坏块

执行查询:

select * from v$database_block_corruption where file#=4;

如果4号文件存在坏块的话,那么将在结果集中有所显示,会显示损坏的块号,根据显示结果执行如下命令进行恢复:

RMAN>blockrecover datafile 4 block 35 from backupset;

该命令执行后即可恢复坏块,并且不会造成数据丢失,但是要求数据库必须要运行在归档模式下,否则RMAN无法发挥作用,而且通过RMAN做过最新的数据库备份

4.3 使用bbed恢复

使用bbed恢复时必须有数据文件的拷贝。

bbed就是英文block browse edit的缩写,用来直接查看和修改数据文件数据的一个工具。BBED在windows 8i中在$ORACLE_HOME/bin下可以找到,9i中似乎未随软件发布,故在windows没有这个工具,linux下需要编译:

然后把$ORACLE_HOME/rdbms/lib加到环境变量的PATH里面,就可以直接在命令中bbed 了。

BBED的缺省口令为blockedit,

For Oracle Internal Use only 请谨慎使用Oracle不做技术支持。

BBED具体的使用,参考blog:

https://www.360docs.net/doc/499667957.html,/tianlesoftware/archive/2009/12/14/5006580.aspx

五.如何查找坏块所含的数据表名称和数据的rowid

关于Rowid 的相关知识参看blog:

https://www.360docs.net/doc/499667957.html,/tianlesoftware/archive/2009/12/16/5020718.aspx

5.1. 首先肯定知道那个数据文件坏了,查出该文件的file_id,relative_fno,tablespace_name 利用dba_data_files可以查询file_id(整个数据库唯一序号),RELATIVE_FNO(相对一个表空间内的序号)

5.2. 找到坏块的ID(可以运行dbverify实现),假设找到的坏块ID为1234。

5.3.运行下面的查询,根据,坏块的file_id,block id查找该块对应的owner,segment_type, segment_name等信息

select owner,file_id,segment_name, segment_type, block_id, blocks from dba_extents

where file_id=13 and block_id<=1234 and (block_id + blocks- 1) >= 1234;

5.4. 根据坏块的file_id,owner,segment_name,block_id,如果是数据表的话,用下面的查询来得到对应坏块的rowid

假设owner : DA VE

segment_name: BL

file_id : 13

block_id : 162

运行下面的查询来获得该块所含的rowid(如果没有索引,可能就不能用下面的方式了): select /*+ index(DA VE, i_test) */ rowid

from DA VE.BL

where dbms_rowid.rowid_to_absolute_fno(rowid,'DA VE','BL')=13

and dbms_rowid.rowid_block_number(rowid)=162;

六,如何模拟坏块

DBA 的基本知识,制造坏块的方法很多的,可以用ultraedit,也可以用dd命令,同时也呆以用orapatch工具

6.1 orapatch 工具:

$orapatch open tools001.dbf write

patch>set hex --要用十六进制

patch>display 177 --orapatch以512字节为工作模式,假定想破坏第11个block即为:8k/512*11+1(file header)

patch>find 00400003 --选一个要编辑的点

patch>modify 00400002 --破坏

patch>exit

6.2 用编辑器打开datafile 以8192 字节为一大小(db 的block是8192)

下面是一个block 的开始的20个字节和结尾的 4 个字节

06 02 00 00 08 00 c0 02 6c 43 0d 00 00 00 01 02

00 00 00 00 -- block head

06 02 6c 43 -- block tail 这里有scn(6c 43) 的情况和block (06)的类型(01) 和head 的seq: 0x01 对应,只要改block尾部的4个字节中的或block开始的对应字节任何一个就一定会有ora-1578,但如果数据库有ora-1578的error不一定是这样引起的

btw :UE不是很好用winhex吧不错喔

6.3 BBED 工具

BBED具体的使用,参考blog:

https://www.360docs.net/doc/499667957.html,/tianlesoftware/archive/2009/12/14/5006580.aspx

七.如何利用dbms_repair来标记和跳过坏块

但是当数据量很大,或7*24的系统时,我们使用dbms_repair来处理。dbms_repair是从oracle8i 开始提供的。

准备工作:

create tablespace block datafile '/u01/block.dbf' size 5M;

create table DMM tablespace block as select * from all_tables;

commit;

CREATE INDEX indx_dmm on DMM(TABLE_NAME);

select count(*) from DMM;

COUNT(*)

----------

12896

7.1.创建管理表:

SQL> conn sys/admin as sysdba;

已连接。

SQL> exec DBMS_REPAIR.ADMIN_TABLES('REPAIR_TABLE',1,1,'USERS');

PL/SQL procedure successfully completed

SQL> exec DBMS_REPAIR.ADMIN_TABLES('ORPHAN_TABLE',2,1,'USERS');

PL/SQL procedure successfully completed

7.2.检查坏块:dbms_repair.check_object

/* Formatted on 2009-12-16 23:41:32 (QP5 v5.115.810.9015) */

Set serveroutput on;

DECLARE

cc NUMBER;

BEGIN

DBMS_REPAIR.check_object (schema_name => 'SYS', -- 注意此处是用户名

object_name => 'DMM',

corrupt_count => cc);

DBMS_OUTPUT.put_line ( TO_CHAR (cc));

END;

正常情况下输入为0.

如果有坏块,可以在创建的REPAIR_TABLE中查看块损坏信息:

/* Formatted on 2009-12-17 13:18:19 (QP5 v5.115.810.9015) */

SELECT object_name,

relative_file_id,

block_id,

marked_corrupt,

corrupt_description,

repair_description,

CHECK_TIMESTAMP

FROM repair_table;

注意:在8i下,check_object只会检查坏块,MARKED_CORRUPT为false,故需要执行第三步:定位坏块,fix_corrupt_blocks定位,修改MARKED_CORRUPT为true,同时更新CHECK_TIMESTAMP。9i以后经过check_object,MARKED_CORRUPT的值已经标识为TRUE了。所以可以直接进行第四步了。

7.3.定位坏块:dbms_repair.fix_corrupt_blocks

只有将坏块信息写入定义的REPAIR_TABLE后,才能定位坏块。

/* Formatted on 2009-12-17 13:29:01 (QP5 v5.115.810.9015) */

DECLARE

cc NUMBER;

BEGIN

DBMS_REPAIR.fix_corrupt_blocks (schema_name => 'SYS',

object_name => 'DMM',

fix_count => cc);

DBMS_OUTPUT.put_line (a => TO_CHAR (cc));

END;

7.4.跳过坏块:

我们前面虽然定位了坏块,但是,如果我们访问table:

SQL> select count(*) from SYS.DMM;

ORA-01578: ORACLE 数据块损坏(文件号14,块号154)

ORA-01110: 数据文件14: 'D: \BLOCK.DBF'

还是会得到错误信息。这里需要用skip_corrupt_blocks来跳过坏块:

/* Formatted on 2009-12-17 13:30:17 (QP5 v5.115.810.9015) */

exec dbms_repair.skip_corrupt_blocks(schema_name => 'SYS',object_name => 'DMM',flags => 1);

SQL> select count(*) from SYS.DMM;

COUNT(*)

----------

12850

丢失了12896-12850=46行数据。

7.5.处理index上的无效键值;dump_orphan_keys

/* Formatted on 2009-12-17 13:34:55 (QP5 v5.115.810.9015) */

DECLARE

cc NUMBER;

BEGIN

DBMS_REPAIR.dump_orphan_keys (schema_name => 'SYS',

object_name => 'INDX_DMM',

object_type => 2,

repair_table_name => 'REPAIR_TABLE',

orphan_table_name => 'ORPHAN_TABLE',

key_count => CC);

END;

通过以下命令可以知道丢失行的信息:

SQL> SELECT * FROM ORPHAN_TABLE;

我们根据这个结果来考虑是否需要rebuild index.

7.6.重建freelist:rebuild_freelists

/* Formatted on 2009-12-17 13:37:57 (QP5 v5.115.810.9015) */

exec dbms_repair.rebuild_freelists(schema_name => 'SYS',object_name => 'DMM');

八.设置内部事件使exp跳过坏块

我们可以用设置event的方法来处理坏块:先模拟出坏块,然后用dbv检查,此时,不用dbms_repair,而用下面的方法:

8.1. 先exp该表试验一下

在这种情况下,如果有备份,需要从备份中恢复,如果没有备份,那么坏块部分的数据肯定要丢失了

在这个时候导出是不允许的:

E:\>exp system/admin file=t.dmp tables=t

报错如下:

即将导出指定的表通过常规路径...

. . 正在导出表T

EXP-00056: 遇到ORACLE 错误1578

ORA-01578: ORACLE 数据块损坏(文件号4,块号35)

ORA-01110: 数据文件4: 'E:\ORACLE\ORADA TA\EYGLE\BLOCK.DBF'

导出成功终止,但出现警告。

8.2. 对于不同的情况需要区别对待,如果损失不是数据而是重要的oracle内部信息,则不能用set event。

首先你需要检查损坏的对象,使用以下SQL:

/* Formatted on 2009-12-17 14:00:42 (QP5 v5.115.810.9015) */

SELECT tablespace_name,

segment_type,

owner,

segment_name

FROM dba_extents

WHERE file_id = 4 AND 35 BETWEEN block_id AND block_id + blocks - 1;

8.3. 如果损失的是数据,ok,可以设置内部事件,使exp跳过这些损坏的block

10231事件指定数据库在进行全表扫描时跳过损坏的块

ALTER SYSTEM SET EVENTS='10231 trace name context forever,level 10' ;

然后我们可以导出未损坏的数据

E:\> exp system/admin file=t.dmp tables=t

即将导出指定的表通过常规路径...

. . 正在导出表T 8036 行被导出

在没有警告的情况下成功终止导出。

然后我们可以drop table,recreate,然后导入数据

8.4. 重建表,再导入

SQL> connect sys/admin as sysdba

已连接。

SQL> drop table t;

表已丢弃。

E:\>imp system/admin file=t.dmp tables=t

. 正在将system的对象导入到system

. . 正在导入表"T" 8036行被导入

成功终止导入,但出现警告。

E:\>exit

SQL> select count(*) from t;

COUNT(*)

----------

8036

完成数据恢复.

损失的行数可以从2个行数相减计算:

8192 - 8036 = 156 行数据

8.5如果要取消events设置,做以下操作:

1. 如果你在初始化参数中设置的

注释之

2. 如果在命令行设置的

alter system set events='10231 trace name context off';

oracle常用命令及格式

oracle常用命令及格式 一:关于日志管理的 1.切换日志:sql> alter system switch logfile; 2.切换checkpoints:sql> alter system checkpoint; 3.增加日志组:sql> alter database add logfile [group 4] sql> ('/disk3/log4a.rdo','/disk4/log4b.rdo') size1m; 4.增加日志成员 sql> alter database add logfile member sql> '/disk3/log1b.rdo' to group 1, sql> '/disk4/log2b.rdo' to group 2; 5.改变日志文件名字或路径 sql> alter database rename file 'c:/oracle/oradata/oradb/re do01.log' sql> to 'c:/oracle/oradata/redo01.log'; (此处注意,那个文件路径的输入格式) 6.删除日志文件组:sql> alter database drop logfile group 3;

7.删除日志文件成员 sql> alter database drop logfile member 'c:/oracle/oradata/ redo01.log'; 8.清除日志文件内容 sql> alter database clear [unarchived] logfile 'c:/oracle/l og2a.rdo'; 二、关于表空间管理的 1.创建表空间 sql> create tablespace tablespace_name datafile 'c:\oracle\ oradata\file1.dbf' size100m, sql> 'c:\oracle\oradata\file2.dbf' size100mminimum extent 5 50k [logging/nologging] sql> default storage (initial 500k next 500k maxextents 500 pctinccease 0) sql> [online/offline] [permanent/temporary] [extent_managem ent_clause]

Oracle SQLPlus 常用命令及解释

Oracle SQLPlus 常用命令及解释 1.@ 执行位于指定脚本中的SQLPlus语句。可以从本地文件系统或Web服务器中调用脚本。可以为脚本中的变量传递值。在iSQL*Plus中只能从Web服务器中调用脚本。 2.@@ 执行位于指定脚本中的SQL*Plus语句。这个命令和@(“at”符号)命令功能差不多。在执行嵌套的命令文件时它很有用,因为它会在与调用它的命令文件相同的路径或url中查找指定的命令文件。在iSQL*Plus中只支持url形式。 3./ 执行保存在SQL缓冲区中的最近执行的SQL命令或PL/SQL块。在SQL*Plus命令行中,可在命令提示符或行号提示符使用斜线(/)。也可在iSQL*Plus的输入区中使用斜线(/)。斜线不会列出要执行的命令。 4.ACCEPT 可以修改既有变量,也可定义一个新变量并等待用户输入初始值,读取一行输入并保存到给出的用户变量中。ACCEPT在iSQL*Plus中不可用。 5.APPEND 把指定文本添加到SQL缓冲区中当前行的后面。如果text的最前面包含一个空格可在APPEND和text间输入两个空格。如果text的最后是一个分号,可在命令结尾输入两个分号(SQL*Plus会把单个的分号解释为一个命令结束符)。APPEND 在iSQL*Plus中不可用。 6.ARCHIVE LOG 查看和管理归档信息。启动或停止自动归档联机重做日志,手工(显示地)归档指定的重做日志,或者显示重做日志文件的信息。 7.ATTRIBUTE 为对象类型列的给定属性指定其显示特性,或者列出单个属性或所有属性的当前显示特性。 8.BREAK 分开重复列。指定报表中格式发生更改的位置和要执行的格式化动作(例如,在列值每次发生变化时跳过一行)。只输入BREAK而不包含任何子句可列出当前的BREAK定义。 9.BTITLE 在每个报表页的底部放置一个标题并对其格式化,或者列出当前BTITLE定义。

oracle课后题答案

一、选择题 1. 若关系的某一属性组的值能唯一地标识一个元组,我们称之为(B)。 A、主码 B、候选码 C、外码 D、联系 2. 以下不属于数据库模式的三要素的是(C)。 A、数据结构 B、数据操作 C、数据控制 D、完整性约束 3. 以下对关系性质的描述中,哪个是错误的?(B) A、关系中每个属性值都是不可分解的 B、关系中允许出现相同的元组 C、定义关系模式时可随意指定属性的排列次序 D、关系中元组的排列次序可以任意交换 二、填空题 1.数据管理发展的三个阶段是人工管理、文件管理和数据库系统管理。 2.数据库系统的三级模式包括逻辑模式、用户模式、物理模式。 三、思考题 1. 数据库管理系统的主要功能有哪些? 1)数据定义功能。DBMS提供相应数据语言来定义(DDL)数据库结构,它们是刻画数据库框架,并被保存在数据字典中。 2)数据存取功能。DBMS提供数据操纵语言(DML),实现对数据库数据的基本存取操作:检索,插入,修改和删除。 3)数据库运行管理功能。DBMS提供数据控制功能,即是数据的安全性、完整性和并发控制等对数据库运行进行有效地控制和管理,以确保数据正确有效。 4)数据库的建立和维护功能。包括数据库初始数据的装入,数据库的转储、恢复、重组织,系统性能监视、分析等功能。 5)数据库的传输;DBMS提供处理数据的传输,实现用户程序与DBMS之间的通信,通常与操作系统协调完成。 2.思考关系规范化的过程。 答:对于存在数据冗余、插入异常、删除异常问题的关系模式,应采取将一个关系模式分解为多个关系模式的方法进行处理。一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式,这就是所谓的规范化过程。 3.思考数据库设计的步骤。 答:1需求分析、2概念设计阶段、3逻辑结构设计阶段、4数据库物理结构设计阶段、5数据库实施阶段、6数据库运行和维护阶段。

Oracle数据库日常维护手册

Oracle数据库日常维护手册 在Oracle数据库运行期间,DBA应该对数据库的运行日志及表空间的使用情况进行监控,及早发现数据库中存在的问题。 一、Oracle警告日志文件监控 Oracle在运行过程中,会在警告日志文件(alert_SID.log)中记录数据库的一些运行情况: ●数据库的启动、关闭,启动时的非缺省参数; ●数据库的重做日志切换情况,记录每次切换的时间,及如果因为检查点(checkpoint)操作没有执行完成造成不能切换,会记录不能切换的原因; ●对数据库进行的某些操作,如创建或删除表空间、增加数据文件; ●数据库发生的错误,如表空间不够、出现坏块、数据库内部错误(ORA-600) DBA应该定期检查日志文件,根据日志中发现的问题及时进行处理 问题处理 启动参数不对检查初始化参数文件 因为检查点操作或归档操作没有完成造成重做日志不能切换如果经常发生这样的情况,可以考虑增加重做日志文件组;想办法提高检查点或归档操作的效率; 有人未经授权删除了表空间检查数据库的安全问题,是否密码太简单;如有必要,撤消某些用户的系统权限 出现坏块检查是否是硬件问题(如磁盘本生有坏块),如果不是,检查是那个数据库对象出现了坏块,对这个对象进行重建 表空间不够增加数据文件到相应的表空间 出现ORA-600根据日志文件的内容查看相应的TRC文件,如果是Oracle的bug,要及时打上相应的补丁 二、数据库表空间使用情况监控(字典管理表空间)

数据库运行了一段时间后,由于不断的在表空间上创建和删除对象,会在表空间上产生大量的碎片,DBA应该及时了解表空间的碎片和可用空间情况,以决定是否要对碎片进行整理或为表空间增加数据文件。 select tablespace_name, count(*) chunks , max(bytes/1024/1024) max_chunk from dba_free_space group by tablespace_name; 个人收集整理 上面的SQL列出了数据库中每个表空间的空闲块情况,如下所示: TABLESPACE_NAME CHUNKS MAX_CHUNK -------------------- ---------- ---------- INDX 1 57.9921875 RBS 3 490.992188 RMAN_TS 1 16.515625 SYSTEM 1 207.296875 TEMP 20 70.8046875 TOOLS 1 11.8359375 USERS 67 71.3671875个人收集整理 其中,CHUNKS列表示表空间中有多少可用的空闲块(每个空闲块是由一些连续的Oracle 数据块组成),如果这样的空闲块过多,比如平均到每个数据文件上超过了100个,那么该表空间的碎片状况就比较严重了,可以尝试用以下的SQL命令进行表空间相邻碎片的接合: alter tablespace 表空间名 coalesce; 然后再执行查看表空间碎片的SQL语句,看表空间的碎片有没有减少。如果没有效果,并且表空间的碎片已经严重影响到了数据库的运行,则考虑对该表空间进行重建。 MAX_CHUNK列的结果是表空间上最大的可用块大小,如果该表空间上的对象所需分配的空间(NEXT值)大于可用块的大小的话,就会提示ORA-1652、ORA-1653、ORA-1654的错误信息,DBA应该及时对表空间的空间进行扩充,以避免这些错误发生。 对表空间的扩充对表空间的数据文件大小进行扩展,或向表空间增加数据文件,具体操作见“存储管理”部份。 三、查看数据库的连接情况

Oracle基本语法

Oracle的历史 ?Oracle 公司( 甲骨文) 创始人: Larry Ellison 32岁,公司提供数据库服务. ?公司成立于1977 年, 83 年公司更名为Oracle ,原名为”软件开发实验室”. ?Oracle 数据库适用于大型企业 ?竞争对手 –微软的SQLServer –IBM 的DB2 ?目前的版本 – 2.0~7.0 , 8.0 , 8i , 9i , 10g Oracle的服务: 我的电脑右键选择管理--服务和应用程序—服务 -----是数据库或例程的系统标识符 ------是Oracle主目录名称 这几个服务之间的关系: 启动顺序:1、OracleTNSListener必须启动 2、OracleServer必须启动 3、OracleDBConsole启动依赖于OracleServer SqlPlus SqlPlus是Oracle任何版本都自带的数据库操作工具,使用它可以完成大部分的数据库操作。 SqlPlus可以“开始→程序→Oracle”启动,也可以命令行启动(互动) 1.命令行启动sqlPlus sqlplus 用户名/密码@orcl

或 sqlplus 用户名@orcl 如果用户是管理员要在sqlplus 用户名/密码@主机字符串as sysdba “/”是用户名和密码分隔符号 “@”是密码和数据库的分隔符号 “orcl”是数据库的名称,在安装时指定 常用命令(互动) connect 切换用户 show user 显示当前用户 set linesize 1000 设置行显示长度 set pagesize 1000 设置分页长度 desc dept 查看表结构 select table_name from user_tables 查询当前用户的表 / 运行上一条SQL语句 clear screen 清除屏幕 edit 编辑 spool d:/a 保存输出结果到某个位置 spool off 保存结束 quit 退出 list 查看最后一条语句 @ 文件名.sql 运行外部文件中的SQL语句

oracle中常用函数大全

oracle中常用函数大全 1、数值型常用函数 函数返回值样例显示 ceil(n) 大于或等于数值n的最小整数select ceil(10.6) from dual; 11 floor(n) 小于等于数值n的最大整数select ceil(10.6) from dual; 10 mod(m,n) m除以n的余数,若n=0,则返回m select mod(7,5) from dual; 2 power(m,n) m的n次方select power(3,2) from dual; 9 round(n,m) 将n四舍五入,保留小数点后m位select round(1234.5678,2) from dual; 1234.57 sign(n) 若n=0,则返回0,否则,n>0,则返回1,n<0,则返回-1 select sign(12) from dual; 1 sqrt(n) n的平方根select sqrt(25) from dual ; 5 2、常用字符函数 initcap(char) 把每个字符串的第一个字符换成大写select initicap('mr.ecop') from dual; Mr.Ecop lower(char) 整个字符串换成小写select lower('MR.ecop') from dual; mr.ecop replace(char,str1,str2) 字符串中所有str1换成str2 select replace('Scott','s','Boy') from dual; Boycott substr(char,m,n) 取出从m字符开始的n个字符的子串select substr('ABCDEF',2,2) from dual; CD length(char) 求字符串的长度select length('ACD') from dual; 3 || 并置运算符select 'ABCD'||'EFGH' from dual; ABCDEFGH 3、日期型函数 sysdate当前日期和时间select sysdate from dual;

Oracle 笔试题目带答案

1.( )程序包用于读写操作系统文本文件。(选一项) A、Dbms_output B、Dbms_lob C、Dbms_random D、Utl_file 2.( )触发器允许触发操作的语句访问行的列值。(选一项) A、行级 B、语句级 C、模式 D、数据库级 3.( )是oracle在启动期间用来标识物理文件和数据文件的二进制文件。(选一项) A、控制文件 B、参数文件 C、数据文件 D、可执行文件 4.CREATE TABLE 语句用来创建(选一项) A、表 B、视图 C、用户 D、函数 5.imp命令的哪个参数用于确定是否要倒入整个导出文件。(选一项) A、constranints B、tables C、full D、file 6.ORACLE表达式NVL(phone,'0000-0000')的含义是(选一项) A、当phone为字符串0000-0000时显示空值 B、当phone为空值时显示0000-0000 C、判断phone和字符串0000-0000是否相等 D、将phone的全部内容替换为0000-0000 7.ORACLE交集运算符是(选一项) A、intersect B、union C、set D、minus 8.ORACLE使用哪个系统参数设置日期的格式(选一项) A、nls_language

B、nls_date C、nls_time_zone D、nls_date_format 9.Oracle数据库中,通过()访问能够以最快的方式访问表中的一行(选一项) A、主键 B、Rowid C、唯一索引 D、整表扫描 10.Oracle数据库中,下面()可以作为有效的列名。(选一项) A、Column B、123_NUM C、NUM_#123 D、#NUM123 11.Oracle数据库中,以下()命令可以删除整个表中的数据,并且无法回滚(选一项) A、drop B、delete C、truncate D、cascade 12.Oracle中, ( )函数将char或varchar数据类型转换为date数据类型。(选一项) A、date B、to_date C、todate D、ctodate 13.ORACLE中,执行语句:SELECT address1||','||address2||','||address2 "Address" FROM employ; 将会返回()列(选一项) A、0 B、1 C、2 D、3 14.Oralce数据库中,以下()函数可以针对任意数据类型进行操作。(选一项) A、TO_CHAR B、LOWER C、MAX D、CEIL 15.partition by list(msn_id)子句的含义是(选一项) A、按msn_id列进行范围分区 B、按msn_id列进行列表分区

Oracle 官方安装文档

rpm -q grep binutils-2.* \ elfutils-libelf-0.* \ glibc-2.* \ glibc-common-2.* \ libaio-0.* \ libgcc-4.* \ libstdc++-4.* \ make-3.* \ compat-libstdc++-33 \ elfutils-libelf-devel-0.* \ glibc-devel-2.* \ gcc-4.* \ gcc-c++-4.* \ libaio-devel-0.* \ libstdc++-devel-4.* \ unixODBC-2.* \ unixODBC-devel-2.* \ sysstat-7.* 2.如缺少相应的补丁包,可以到系统安装盘安装相关的补丁包 cd /media/Enterprise\ Linux\ dvd\ 20090127/Server/ rpm -Uvh grep binutils-2.* rpm -Uvh elfutils-libelf-0.* rpm -Uvh glibc-2.* rpm -Uvh glibc-common-2.* rpm -Uvh libaio-0.* rpm -Uvh libgcc-4.* rpm -Uvh libstdc++-4.* rpm -Uvh make-3.* rpm -Uvh compat-libstdc++-33 rpm -Uvh elfutils-libelf-devel-0.* rpm -Uvh glibc-devel-2.* rpm -Uvh gcc-4.* rpm -Uvh gcc-c++-4.* rpm -Uvh libaio-devel-0.* rpm -Uvh libstdc++-devel-4.* rpm -Uvh unixODBC-2.* rpm -Uvh unixODBC-devel-2.* rpm -Uvh sysstat-7.*

Oracle试题(含答案)

_C++_CSD/ESD1405 1. 把工资大于1000的first_name,salary 显示出来,按工资排序,工资相同按first_name降序的SQL语句是? A. select first_name,salary from s_emp order by salary,first_name B. select first_name,salary from s_emp order by salary,first_name asc C. select first_name,salary from s_emp order by salary desc,first_name D. select first_name,salary from s_emp order by salary,first_name desc 正确答案:D 2. 已知数据库中有员工表s_emp和部门表s_dept,具体字段如下: 员工表字段介绍: ID 员工编号 LAST_NAME 员工姓 FIRST_NAME 员工名 USERID 用户编号 START_DATE 入职日期 COMMENTS 员工备注信息 MANAGER_ID 员工的领导ID TITLE 员工的职位 DEPT_ID 部门的编号 SALARY 员工的月薪 COMMISSION_PCT 提成 部门表的字段介绍: ID 部门编号 NAME 部门名 REGION_ID 地区编号 注:以下所有数据库相关题目,均使用这两个表 把s_emp表中的每个人的全名和工资列出来的SQL语句是? A. select first_name|last_name ,salary from s_emp

oracle数据库基本操作

实战经验Oracle数据库基本操作步步详解来源:2007年06月12日15:34网友评论:0条点击: 274 一,约束操作 1:更改约束名称: ALTER TABLE TName RENAME CONSTRAINT oldname TO newname; 2:删除约束 ALTER TABLE TName DROP CONSTRAINT cname 3:停止约束 ALTER TABLE TName MODIFY CONSTRAINT cname DISABLE; 4:起用约束 ALTER TABLE TName MODIFY CONSTRAINT cname ENABLE VALIDATE; 5:新增约束 ALTER TABLE TName ADD CONSTRAINT cname FOREIGN KEY (ORG_ID) REFERENCES ref_table (ORGID); 二,字段操作 1:更改字段数据类型: ALTER TABLE TName MODIFY(ORG_ID VARCHAR2(50 BYTE)); 2:更改字段数据长度: ALTER TABLE TName MODIFY(ORG_ID VARCHAR2(80 BYTE)); 3:修改表的列名 alter table TName rename column xx to yy; 三,表操作 1:删除表数据: truncate table TName; 2:复制空表结构 create table new_table as select * from old_table where 1=2; 3:复制表(含记录) create table new_table as select * from old_table ; 四,存储过程 1:命令行编译存储过程 ALTER PROCEDURE procedure_name COMPILE;

oracle考试试题及答案

试题一 一、填空题(每小题4分,共20分) 1、数据库管理技术经历了人工管理、文件系统、数据库系统三个阶段 2、数据库三级数据结构是外模式、模式、内模式 3、Oracle数据库中,SGA由数据库缓冲区,重做日志缓冲区,共享池组成 4、在Oracle数据库中,完正性约束类型有Primay key约束。Foreign key约束,Unique约束,check约束,not need约束 5、PL/SQL中游标操作包括声明游标,打开游标,提取游标,关闭游标 二、正误判断题(每小题2分,共20分) 1、数据库中存储的基本对象是数据(T) 2、数据库系统的核心是DBMS(T) 3、关系操作的特点是集合操作(T) 4、关系代数中五种基本运算是并、差、选择、投影、连接(F) 5、Oracle进程就是服务器进程(F) 6、oraclet系统中SGA所有用户进程和服务器进程所共享(T) 7、oracle数据库系统中数据块的大小与操作系统有关(T) 8、oracle数据库系统中,启动数据库和第一步是启动一个数据库实例(T) 9、PL/SQL中游标的数据是可以改变的(F) 10、数据库概念模型主要用于数据库概念结构设计() 三、简答题(每小题7分,共35分) 1、何谓数据与程序的逻辑独立性和物理独立性? 2、试述关系代数中等值连接与自然连接的区别与联系? 3、何谓数据库,数据库设计一般分为哪些阶段? 4、简述Oracle逻辑数据库的组成?

5、试任举一例说明游标的使用方法? 五、设有雇员表emp(empno,ename,age,sal,tel,deptno), 其中:empno-----编号,name------姓名,age -------年齡,sal-----工资,tel-----电话 deptno-----部门号。 请按下列要求分别晨SQL*PLUS下编程。(每小题3分,共15分)?1、查询家有电话的职工信息。 ?2、查询工资在500至800元之间的雇员信息 ?3、按年龄递增顺序显示雇员编号、姓名、年龄、工资 ?4、求部门号为D_01的平均工资 ?5、查找部门号为D_01的40岁以上而工资在400元以下的雇员名单。 1、SQL>SELECT * FROM emp WHERE tel NOT NULL; 2、SQL>SELECT * FROM emp WHERE BETWEEN 500 AND 800; 3、SQL>SELECT empno,ename,age,sal FROM emp ORDER BY age ASC; 4、SQL>SELECT AVG(sal) FROM emp WHERE deptno='D_01'; 5、SQL>SELECT ename FROM emp WHERE deptno='D_01' AND age>40 AND Sal<400; ? 试题一答案 一、填空题 1、人工管理、文件系统、数据库系统 2、外模式、模式、内模式 3、数据库缓冲区,重做日志缓冲区,共享池 4、Primay key约束。Foreign key约束,Unique约束,check约束,not need 约束 5、声明游标,打开游标,提取游标,关闭游标 二、正误判断题 1、T 2、T 3、T 4、F 5、F 6、T 7、T 8、T 9、F 三、(略) 五、 1、SQL>SELECT * FROM emp WHERE tel NOT NULL; 2、SQL>SELECT * FROM emp WHERE BETWEEN 500 AND 800; 3、SQL>SELECT empno,ename,age,sal FROM emp ORDER BY age ASC; 4、SQL>SELECT AVG(sal) FROM emp WHERE deptno='D_01'; 5、SQL>SELECT ename FROM emp WHERE deptno='D_01' AND age>40 AND Sal<400; 试题二

处理数据损坏

Oracle 实训张大鹍手打总结 Oracle 实训张大鹍手打总结 处理数据损坏

一、关于bbed bbed用于检测坏块和处理坏块。 BBED(OracleBlockBrowerandEDitor Tool),用来直接查看和修改数据文件数据的一个工具,是Oracle一款内部工具,可以直接修改Oracle数据文件块的内容,在一些极端恢复场景下比较有用。该工具不受Oracle支持,所以默认是没有生成可执行文件的,在使用前需要重新连接。 二、编译bbed 1、进入lib目录 [oracle@zdk ~]$ cd $ORACLE_HOME [oracle@zdk db_1]$ cd rdbms/lib/ [oracle@zdk lib]$ pwd /u01/app/oracle/product/10.2.0.1/db_1/rdbms/lib 2、激活bbed [oracle@zdk lib]$ make -f ins_rdbms.mk /u01/app/oracle/product/10.2.0.1/db_1/rdbms/lib/bbed Linking BBED utility (bbed) rm -f /u01/app/oracle/product/10.2.0.1/db_1/rdbms/lib/bbed gcc-o/u01/app/oracle/product/10.2.0.1/db_1/rdbms/lib/bbed -L/u01/app/oracle/product/10.2.0.1/db_1/rdbms/lib/ -L/u01/app/oracle/product/10.2.0.1/db_1/lib/ -L/u01/app/oracle/product/10.2.0.1/db_1/lib/stubs/ -L/usr/lib -lirc

Linux安装oracle11gR2官方步骤

Linux安装oracle11gR2官方步骤 原创2016年12月10日01:32:16 ?标签: ?oracle ?4121 ?Linux环境下安装Oracle11gR2 o下载安装介质 o检查Linux环境 o安装和配置JDK o检查Oracle安装必须包 o添加用户组和用户 o修改内核参数 o创建oracle11gR2安装目录 o修改oracle用户环境变量 o解压安装oracle11gR2 o运行脚本 Linux环境下安装Oracle11gR2 下载安装介质 ?Linux系统iso(本人使用centos7为例) https://www.360docs.net/doc/499667957.html,/CentosSoft/ ?oracle11gR2安装包 https://www.360docs.net/doc/499667957.html,/technetwork/database/enterprise-edition/download s/112010-win64soft-094461.html

?JDK 检查Linux环境 ?检查系统位数 uname -m ? 1 ?检查内存(两条命令都可以) grep MemTotal /proc/meminfo free ? 1 ? 2 ?查看交换空间大小 grep SwapTotal /proc/meminfo ? 1 ?查看tmp空间大小(不能小于1G) df -h /tmp ? 1 ?查看内核版本 (最好是oracle推荐的linux版本,如果不是建议修改/etc/redhat-release的内容来伪装一下)

cat /proc/version vim /etc/redhat-release 修改为:redhat-7 ? 1 ? 2 ? 3 ? 4 ?查看内核版本 uname -r 2.6.18-128.el5PAE ? 1 ? 2 安装和配置JDK ?卸载自带的openJDK: rpm -a q | grep java | xargs rpm -e --nodeps ? 1 ?建立JDK安装目录: mkdir /usr/java ? 1 ?用XFTP或SFTP把JDK拷贝到linux ?安装JDK: chmod 777 jdk-7u67-linux-x64.rpm rpm -ivh jdk-7u67-linux-x64.rpm ? 1 ? 2 ?配置JDK环境变量: vim /etc/profile export JAVA_HOME=/usr/java/jdk1.7.0_67 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA _HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin ? 1

PL_SQL命令的使用大全

SQL*PLUS命令的使用大全[zt] Oracle的sql*plus是与oracle进行交互的客户端工具。在sql*plus中,可以运行sql*plus命令与sql*plus语句。 我们通常所说的DML、DDL、DCL语句都是sql*plus语句,它们执行完后,都可以保存在一个被称为sql buffer的内存区域中,并且只能保存一条最近执行的sql语句,我们可以对保存在sql buffer中的sql 语句进行修改,然后再次执行,sql*plus一般都与数据库打交道。 除了sql*plus语句,在sql*plus中执行的其它语句我们称之为sql*plus命令。它们执行完后,不保存在sql buffer的内存区域中,它们一般用来对输出的结果进行格式化显示,以便于制作报表。 下面就介绍一下一些常用的sql*plus命令: 1. 执行一个SQL脚本文件 SQL>start file_name SQL>@ file_name 我们可以将多条sql语句保存在一个文本文件中,这样当要执行这个文件中的所有的sql语句时,用上面的任一命令即可,这类似于dos中的批处理。 2. 对当前的输入进行编辑 SQL>edit 3. 重新运行上一次运行的sql语句 SQL>/ 4. 将显示的内容输出到指定文件 SQL> SPOOL file_name 在屏幕上的所有内容都包含在该文件中,包括你输入的sql语句。 5. 关闭spool输出 SQL> SPOOL OFF 只有关闭spool输出,才会在输出文件中看到输出的内容。 6.显示一个表的结构 SQL> desc table_name 7. COL命令: 主要格式化列的显示形式。 该命令有许多选项,具体如下: COL[UMN] [{ column|expr} [ option ...]] Option选项可以是如下的子句: ALI[AS] alias CLE[AR] FOLD_A[FTER] FOLD_B[EFORE] FOR[MA T] format HEA[DING] text JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]} LIKE { expr|alias} NEWL[INE] NEW_V[ALUE] variable NOPRI[NT]|PRI[NT] NUL[L] text OLD_V[ALUE] variable ON|OFF WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED] 1). 改变缺省的列标题

oracle模拟试题答案汇总

备注:题号相同的题目或者增加的一些题目是11级网络的模拟试题 第 1 题,选择题(2分): ORACLE中,游标可以分为三类,下面不是Oracle游标的是( 1 )。 (1) 系统游标 (2) 显式游标 (3)隐式游标 (4) REF游标 第 2 题,选择题(2分):PL/SQL块中定义了一个带参数的游标:CURSOR emp_cursor(dnum NUMBER) IS SELECT sal,comm FROM emp WHERE deptno=dnum; 那么正确打开此游标的语句是(1) (1) OPEN emp_cursor(20); (2) OPEN emp_cursor FOR 20; (3) OPEN emp_cursor USING 20; (4) FOR rmp_rec IN emp_cursor[20] LOOP ... END LOOP; 第 3 题,选择题(2分): 有关ORACLE索引说法正确的是(A ) (1) 索引的数据和表的数据分开存储,但索引组织表除外 (2) 所有索引中的数据是顺序排序 (3) 分区表的索引必须统一存储 (4) 只能对分区表的索引进行分区 第 4 题,选择题(2分): 下列有关包的使用说法错误的是( A) (1) 必须先创建包头,然后创建包体 (2) 在不同的包内模块可以重名 (3) 包的私有过程不能被外部程序调用 (4) 包体中的全局过程和函数必须在包 第 5 题,选择题(2分): 以下定义的哪个变量是非法的?( A) (1) var_ab number default:=1; var_ab number default 1; (2) var_ab number not null :='0'; (3) var_ab number; (4) var_ab number:=3; 第 6 题,选择题(2分): PL/SQL块中不能直接使用的SQL命令是(A) (1) drop (2) insert (3) update

ORACLE坏块(ORA-01578)处理方法

ORACLE坏块(ORA-01578)处理方法 文章分类:数据库 0.模拟出现坏块环境 SQL> CREATE TABLESPACE "TEST" 2 LOGGING 3 DATAFILE 'D:\ORACLE\ORADATA\ALAN\TEST.ora' SIZE 1M EXTENT 4 MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO 5 / 表空间已创建。 SQL> create user alantest identified by alantest 2 default tablespace test 3 temporary tablespace temp; 用户已创建 SQL> grant dba to alantest; 授权成功。 SQL> connect alantest/alantest 已连接。 SQL> show user USER 为"ALANTEST" SQL> create table test_alan as select * from dba_objects; RMAN> backup database format='c:\rmanbackup\FULL_%U'; 启动 backup 于 07-7月 -06 正在使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: sid=18 devtype=DISK 通道 ORA_DISK_1: 正在激活 full 数据文件备份集 通道 ORA_DISK_1: 正在指定备份集中的数据文件 在备份集中包含当前的 SPFILE 备份集中包括当前控制檔 输入数据文件 fno=00001 name=D:\ORACLE\ORADATA\ALAN\SYSTEM01.DBF 输入数据文件 fno=00002 name=D:\ORACLE\ORADATA\ALAN\UNDOTBS01.DBF 输入数据文件 fno=00003 name=D:\ORACLE\ORADATA\ALAN\INDX01.DBF 输入数据文件 fno=00005 name=D:\ORACLE\ORADATA\ALAN\USERS01.DBF

oracle常用命令大全和环境变量路径

Oracle 命令大全 底部为环境变量配置路径。 1 运行SQLPLUS工具 sqlplus 2 以OS的默认身份连接 / as sysdba 3 显示当前用户名 show user 4 直接进入SQLPLUS命令提示符 sqlplus /nolog 5 在命令提示符以OS身份连接 connect / as sysdba 6 以SYSTEM的身份连接 connect system/xxxxxxx@服务名 7 显示当然用户有哪些表 select * from tab; 8 显示有用户名和帐户的状态 select username,account_status from dba_users; 9 将SCOTT帐号解锁(加锁) alter user scott account unlock(lock); 10 以SCOTT的身份连接并且查看所属表 connect scott/tiger select * from tab; 11 查看EMP的表结构及记录内容 desc emp select empno,ename from emp; 12 以OS的身份登看SGA,共享池,CACHE的信息 connect / as sysdba show sga select name,value/1024/1024 from v$sga; show parameter shared_pool_size select value/1024/1024 from v$parameter where name ='shared_pool_size';

show parameter db_cache_size select value/1024/1024 from v$parameter where name ='db_cache_size'; 13 查看所有含有SIZE的信息 show parameter size bitmap_merge_area_size integer 1048576 create_bitmap_area_size integer 8388608 db_16k_cache_size big integer 0 db_2k_cache_size big integer 0 db_32k_cache_size big integer 0 db_4k_cache_size big integer 0 db_8k_cache_size big integer 0 db_block_size integer 4096 db_cache_size big integer 33554432 db_keep_cache_size big integer 0 db_recycle_cache_size big integer 0 NAME TYPE V ALUE ------------------------------------ ----------- ------------- global_context_pool_size string hash_area_size integer 1048576 java_max_sessionspace_size integer 0 java_pool_size big integer 33554432 large_pool_size big integer 8388608 max_dump_file_size string UNLIMITED object_cache_max_size_percent integer 10 object_cache_optimal_size integer 102400 olap_page_pool_size integer 33554432 oracle_trace_collection_size integer 5242880 parallel_execution_message_size integer 2148 NAME TYPE V ALUE ------------------------------------ ----------- ------------- sga_max_size big integer 143727516 shared_pool_reserved_size big integer 2516582 shared_pool_size big integer 50331648 sort_area_retained_size integer 0 sort_area_size integer 524288 workarea_size_policy string AUTO 14 显示SGA的信息 select * from v$sgastat; POOL NAME BYTES

相关文档
最新文档