课程名称:Oracle11g数据库应用简明教程
实验题目:实验二数据字典
姓名:李日中 学号:2010324264班级:10计本3班 实验日期:2013-4-11
成绩:
一、 实验目的
1、学会如何使用常用的数据字典
字典的结构侧面了解如何创建了数据库对象
2比较Oracle数据库中几个数据字典的相同点与不同点
3从整体上,区分不同前缀的视图的用途与区别
二、 实验环境
Oracle 11g,客户端工具sqlplus
三、 实验主要内容和主要操作步骤
本实验使用system帐号登陆sqlplus客户端,密码为admin,如图:
(一)使用常用的数据字典
1、 使用数据字典dba_data_files查看表空间system所对应的数据文件的部分信息,如下:
col file_name format a50;
select file_name,tablespace_name,autoextensible from dba_data_files
where tablespace_name=’SYSTEM’;
2、 v$datafile与dba_data_files的区别,v$datafile记录了数据文件的动态信息
3、 使用v$datafile数据字典查看当前数据库的数据库文件动态信息,如下
col name format a70;
select file#,name,checkpoint_change# from v$datafile;
4、 查看当前是哪个数据库实例
方法一:select name from v$database
注意:列段值一般为大写,还有就是日期数据类型的。
方法二:select instance_name from v$instance;
注意:与上方法不同,这里查询出来的结果是小写的,为什么呢?答案在后面实验中。
5、 删除数据库实例方法
注意:该操作时在命令行环境下,而不是sqlplus环境下,命令如下:
oradim –delete –sid orcl //orcl为数据库实例的唯一标识sid
6、使用数据字典v$controlfile,查看当前数据库的控制文件的名称与路径,具体如下:
select name from v$controlfile;
7、 使用数据字典v$log查看当前数据库实例的日志文件的信息,具体如下:
select group#,archived,members,status from v$log;
8、 使用数据字典v$logfile查看当前数据库实例的日志文件的名称与路径,具体如下:
select member from v$logfile;
9、 对已有数据库实例的日志文件进行镜像操作,具体如下:
Alter database add logfile member ‘e:\app\Administrator\oradata\orcl\redo01b.log’ to group 1;
Alter database add logfile member ‘e:\app\Administrator\oradata\orcl\redo02b.log’ to group2;
Alter database add logfile member ‘e:\app\Administrator\oradata\orcl\redo03b.log’ to group 3;
10、使用dba_direcories查看那备份文件的名称与路径,具体如下
col owner format a10;
col directory_name format a20;
col directory_path format a50;
Select * from dba_directories;
11、使用数据字典dba_tablespaces,查看当前数据库实例的所有表空间的名称,具体如下:
Select tablespace_name from dba_tablespaces;
12、查看当前用户的系统权限和表级权限
Select * from user_sys_privs;
13、使用dba_tables视图,查看用户scott用户所有表的信息,具体如下:
Select table_name,tablespace_name,owner from dba_tables where owner=’SCOTT’;
14、使用user_users查看当前用户的信息,具体如下:
Select username,default_tablespace,account_status from user_users;
15、使用user_role_privs查看当前用户的角色,具体如下:
Select * from user_role_privs;
16、查看当前用户的所有表,具体如下:
Select table_name from user_tables;
17、查看当前会话具有的权限,具体如下:
Select * from session_privs;
18、使用v$session视图查看当前用户的会话信息,具体如下:
Select username,terminal from v$session where username is not null;
(二)比较Oracle数据库中几个数据字典的相同点与不同点
1、v$log和v$logfile
首先通过desc查看查看其表(视图)结构,具体如下:
desc v$log;
desc v$logfile;
Select * from v$log
Select * from v$logfile;
通过比较,可知,
1. v$log详细说明了重做日志文件的结构、属性以及动态变化情况,
v$logfile说明了重做日志文件的物理地址和当前在线状态。
(1)其中,v$log的status取值范围为CURRENT,ACTIVE,INACTIVE,UNUSED
CURRENT: 正在使用
ACTIVE: 刚切换完成,尚未发生检查点,实例恢复需要
INACTIVE: 没有使用
UNUSED: 尚未记录change的空白group
(2)另外,v$logfile中status是指group(日志组)的状态,v$log中status是指member的 状态,即日志文件的状态。
(3)v$logfile中type可为ONLINE(联机)或者OFFLINE(脱机),group#是日志文件组 的组编号,oracle至少有两个日志文件组,安装oracle默认为三个日志文件组。
(4)v$log中的thread#为日志线程ID,对应着一个数据库实例,这个差异只能在分布式环 境下才能测试,members表明该日志文件组下有多少个日志文件,sequence#表示序列, 这是概念是在切换日志文件并且归档的情况下,重用日志文件就会使用新的序列。
2、 v$datafile与dba_data_files的区别
desc v$datafile;
desc dba_data_files;
Select * from dba_data_files
Select * from v$datafile;
(1) 通过比较,可以知道,dba_data_files中的file_id、file_name和v$datafile中的file#、name是一一对应的,只是查询出来的结果顺序不一致而已
(2) 不过可以得出的结论是:v$datafile和dba_data_files都是数据字典里的视图,都记录了数据文件的信息,只是v$datafile记录数据文件的动态信息,即数据文件有了修改,更新后,v$datafile中的记录也会动态的跟着改变,这有oracle系统后台进程维护,它记录的数据会随着数据库实例的关闭而丢失;而dba_data_files则记录数据文件的一些静态信息。
(3) 另外,v$datafile可以在数据库处于mount状态下就可以查询,而dba_data_files则需要在数据库实例处于open状态下才可以查询。
3、 v$database和v$instance;
要比较v$database和v$instance这两个视图,必须对oracle中的database和instance概念有一个清晰的了解。
首先,database对应着物理上的数据文件,可以永久存在的,无论关机重启与否,它都存在于物理硬盘等介质,而instance则是一段可执行代码加载到内存(启动一个软件,如oracle管理系统),该实例的启动会将需要的物理上的文件,如数据文件加载到内存中去,当关机或重启时,内存中的数据则丢失。
弄清楚了这两个概念,现在比较如下:
desc v$database
由于字段太多,这里写进了文件,不截图,如下:
SQL>spool d:\desc_database;
SQL> desc v$database;
名称 是否为空? 类型
----------------------------------- -------- ------------------------
DBID NUMBER
NAME VARCHAR2(9)
CREATED DATE
RESETLOGS_CHANGE# NUMBER
RESETLOGS_TIME DATE
PRIOR_RESETLOGS_CHANGE# NUMBER
PRIOR_RESETLOGS_TIME DATE
LOG_MODE VARCHAR2(12)
CHECKPOINT_CHANGE# NUMBER
ARCHIVE_CHANGE# NUMBER
CONTROLFILE_TYPE VARCHAR2(7)
CONTROLFILE_CREATED DATE
CONTROLFILE_SEQUENCE# NUMBER
CONTROLFILE_CHANGE# NUMBER
CONTROLFILE_TIME DATE
OPEN_RESETLOGS VARCHAR2(11)
VERSION_TIME DATE
OPEN_MODE VARCHAR2(20)
PROTECTION_MODE VARCHAR2(20)
PROTECTION_LEVEL VARCHAR2(20)
REMOTE_ARCHIVE VARCHAR2(8)
ACTIVATION# NUMBER
SWITCHOVER# NUMBER
DATABASE_ROLE VARCHAR2(16)
ARCHIVELOG_CHANGE# NUMBER
ARCHIVELOG_COMPRESSION VARCHAR2(8)
SWITCHOVER_STATUS VARCHAR2(20)
DATAGUARD_BROKER VARCHAR2(8)
GUARD_STATUS VARCHAR2(7)
SUPPLEMENTAL_LOG_DATA_MIN VARCHAR2(8)
SUPPLEMENTAL_LOG_DATA_PK VARCHAR2(3)
SUPPLEMENTAL_LOG_DATA_UI VARCHAR2(3)
FORCE_LOGGING VARCHAR2(3)
PLATFORM_ID NUMBER
PLATFORM_NAME VARCHAR2(101)
RECOVERY_TARGET_INCARNATION# NUMBER
LAST_OPEN_INCARNATION# NUMBER
CURRENT_SCN NUMBER
FLASHBACK_ON VARCHAR2(18)
SUPPLEMENTAL_LOG_DATA_FK VARCHAR2(3)
SUPPLEMENTAL_LOG_DATA_ALL VARCHAR2(3)
DB_UNIQUE_NAME VARCHAR2(30)
STANDBY_BECAME_PRIMARY_SCN NUMBER
FS_FAILOVER_STATUS VARCHAR2(22)
FS_FAILOVER_CURRENT_TARGET VARCHAR2(30)
FS_FAILOVER_THRESHOLD NUMBER
FS_FAILOVER_OBSERVER_PRESENT VARCHAR2(7)
FS_FAILOVER_OBSERVER_HOST VARCHAR2(512)
CONTROLFILE_CONVERTED VARCHAR2(3)
PRIMARY_DB_UNIQUE_NAME VARCHAR2(30)
SUPPLEMENTAL_LOG_DATA_PL VARCHAR2(3)
MIN_REQUIRED_CAPTURE_CHANGE# NUMBER
SQL> spool off
desc v$instance
col name format a10 ;
Select dbid,name from v$database
Select instance_number,instance_name from v$instance
可以发现,v$database中的name和v$instance中的instance_name是一样的,只是列值区分大小写,通过这个也可以侧面知道,以dba——开头的视图的列值一般大小,而以v$开头的大部分列值是小写,进一步推测,跟物理上的文件(特别是数据文件)相关的列值就是大写,跟逻辑相关的,比如实例,存在内存的量列值就小写。
从上面的实验数据可以发现,v$database记录的是数据库文件的一些信息,而v$instance记录的是数据实例的信息,包括配置、启动信息等等。
4、user_tables、all_tables和dba_tables的区别
v$sql、v$sqltext和v$sqlarea
v$sga和v$sgastat
v$archived_log和v$archiv_dest
v$tablespace和dba_tablespaces
v$database和v$datafile
,dba_data_files属于静态数据字典中的视图,静态数据字典有三种类型,分别为:user_*、 all_*、 dba_*,要想访问这些视图必须具有相关权限,像“dba_data_files”就必须有DBA权限才可以访问;而v$datafile是属于动态性能视图(动态数据字典),这类视图是有系统管理员如SYS维护的视图,这类视图在数据库运行时是会不断进行跟新的,所以我只能对其进行只读访问而不能修改它们。
数据库在mount状态下,从dba_data_files查不出数据的,必须在open下才行
而v$datafile在mount状态下可以
V$datafile 和DBA_DATA_FILES的区别:
1. V$datafile是单数,DBA_DATA_FILES是复数。
2. V$datafile中的数据在mount状态时可以访问,DBA_DATA_FILES中的数据在open状态时才能访问。
3. V$datafile中的数据一般是小写,DBA_DATA_FILES中的数据一般是大写。
V$视图和DBA_视图
区别:
1. V$视图通常是单数,DBA视图通常是复数,例如V$DATAFILE与DBA_DATA_FILES;
2. 当数据库处于Nomout或者Mount时,许多V$视图已经是可用的,而DBA视图必须在数据库处于Open时才可用;
3. V$视图查询出来的数据多小写,DBA视图查询出的数据通常大写,所以在写WHERE条件时需特别小心;
4. V$视图中包含的是自实例启动以来的动态数据,在数据库关闭后会消失,查询V$视图时必须关注时效性,DBA视图中包含的是静态数据;
5. V$视图的基表是X$表,X$表是存在于内存中的虚表,DBA视图的基表是数据字典表,如SYS.OBJ$, SYS.FILE$等,这两种基表都很少有文档。