专注专心
分类: 信息化
2013-03-17 11:16:24
1.数据库环境
LEO1@LEO1> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
2.用SQL计算出你所用数据库的总容量,给出SQL语句和结果。
如果要计算数据库的总容量就需要知道数据库由哪几部分组成的,然后计算每部分的容量之和即可
(1)数据文件
路径:/u01/app/oracle/oradata/LEO1/
数据文件名 字节 M
leo1_01.dbf 419438592 400M
sysaux01.dbf 639639552 610M
system01.dbf 734011392 700M
undotbs01.dbf 173023232 165M
users01.dbf 5251072 5M
我们看一下对应表空间的使用情况
LEO1@LEO1> select df.tablespace_name "表空间名",totalspace "总空间M",freespace "剩余空间M",round((1-freespace/totalspace)*100,2) "使用率%"
from
(select tablespace_name,round(sum(bytes)/1024/1024) totalspace from dba_data_files group by tablespace_name) df,
(select tablespace_name,round(sum(bytes)/1024/1024) freespace from dba_free_space group by tablespace_name) fs
where df.tablespace_name=fs.tablespace_name order by df.tablespace_name ; 2 3 4 5
表空间名 总空间M 剩余空间M 使用率%
--------------------------------------------------------------------------------------
LEO1 400 237 40.75
SYSAUX 610 31 94.92
SYSTEM 700 8 98.86
UNDOTBS1 165 137 16.97
USERS 5 4 20
(2)临时文件
路径:/u01/app/oracle/oradata/LEO1/
临时文件名 字节 M
temp01.dbf 128983040 123
我们看一下对应表空间的使用情况
LEO1@LEO1> select file_name,tablespace_name,bytes/1024/1024,user_bytes/1024/1024 from dba_temp_files;
FILE_NAME TABLESPACE_NAME BYTES/1024/1024
--------------------------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/LEO1/temp01.dbf TEMP 123
(3)重做日志文件
路径:/u01/app/oracle/oradata/LEO1/
重做日志文件名 字节 M
redo01.log 52429312 50
redo02.log 52429312 50
redo03.log 52429312 50
三个是镜像关系,所以大小都一样
(4)控制文件
路径:/u01/app/oracle/oradata/LEO1/
控制文件名 字节 M
control01.ctl 9748480 9.29
control02.ctl 9748480 9.29
control03.ctl 9748480 9.29
三个也是镜像关系,所以大小都一样,控制文件的大小会根据数据库结构的变化而变化
(5)参数文件
路径:/u01/app/oracle/product/11.2.0/db_1/dbs
参数文件名 字节 M
spfileLEO1.ora 2560 0.003
参数文件是描述数据库属性的,记录了数据库非默认值的所有初始化参数
(6)告警日志
路径:/u01/app/oracle/diag/rdbms/leo1/LEO1/trace
告警日志 字节 M
alert_LEO1.log 2271951 2.166
告警日志记录数据库中所有的报错信息,会随着信息量的多少而变化,我们也可以清空告警日志
(7)密码文件
路径:/u01/app/oracle/product/11.2.0/db_1/dbs
密码文件名 字节 M
orapwLEO1 1536 0.002
密码文件保存着数据库管理员信息(ID passwd),只要数据库添加管理员就会在这里添加对应的信息
(8)dump文件和归档日志
Adump
Bdump
Cdump
Udump
这些都是记录数据库信息的日志文件,把它们的容量加在一起就是数据库总容量了
数据库容量公式:数据文件+临时文件+重做日志文件+控制文件+参数文件+告警日志+密码文件+……
Count:(400+610+700+165+5)+123+(50+50+50)+(9.29+9.29+9.29)+0.003+2.166+0.002=2183.041M
小结:所谓数据库就是文件的集合,那么数据库容量就是文件集合的容量。
3.用SQL计算出某个用户下所有对象的大小,给出SQL语句和结果。
我们要计算用户的所有对象就是计算一个schema的大小
段对象:凡是分配存储空间的对象就叫段对象
我最常用的用户名LEO1,下面我们就来看看这个用户的schema的所有对象
LEO1@LEO1> select owner,segment_name,segment_type,partition_name,bytes from dba_segments where owner='LEO1';
OWNER SEGMENT_NAME SEGMENT_TYPE PARTITION_NAME BYTES
------------------------------ ---------------------------------------- ------------------ -------------------- ----------
LEO1 LEO_WAGE TABLE 65536
LEO1 A TABLE 9437184
LEO1 B TABLE 131072
LEO1 LOCK1 TABLE 65536
LEO1 BIN$0tjf3nEXpL7gQKjAZAFAMQ==$0 TABLE 17825792
LEO1 C TABLE 65536
LEO1 LEO6 TABLE 9437184
LEO1 BIN$1Tcm4Wga5rPgQKjAZAEJvg==$0 TABLE 9437184
LEO1 BIN$1TkC0Ugo8mvgQKjAZAFAtQ==$0 TABLE 9437184
LEO1 LEO7 TABLE 9437184
LEO1 T1 TABLE 9437184
LEO1 LEO8 TABLE 9437184
LEO1 LEO9 TABLE 9437184
LEO1 LEO2 TABLE 9437184
LEO1 LEO3 TABLE 9437184
LEO1 LEO4 TABLE 9437184
LEO1 LEO1 TABLE 65536
LEO1 LEO5 TABLE 9437184
LEO1 PARTITION_LEO9 TABLE PARTITION P1 2097152
LEO1 PARTITION_LEO9 TABLE PARTITION P2 2097152
LEO1 PARTITION_LEO9 TABLE PARTITION P3 2097152
LEO1 PARTITION_LEO9 TABLE PARTITION P4 2097152
LEO1 PARTITION_LEO9 TABLE PARTITION P5 2097152
LEO1 PARTITION_LEO9 TABLE PARTITION P6 2097152
LEO1 PARTITION_LEO9 TABLE PARTITION PM 2097152
LEO1 PARTITION_LEO10 TABLE PARTITION P1 2097152
LEO1 PARTITION_LEO10 TABLE PARTITION P2 2097152
LEO1 PARTITION_LEO10 TABLE PARTITION P3 2097152
LEO1 PARTITION_LEO10 TABLE PARTITION P4 2097152
LEO1 PARTITION_LEO10 TABLE PARTITION P5 2097152
LEO1 PARTITION_LEO10 TABLE PARTITION P6 2097152
LEO1 PARTITION_LEO10 TABLE PARTITION PM 2097152
LEO1 PARTITION_LEO5 TABLE PARTITION P1 2097152
LEO1 PARTITION_LEO5 TABLE PARTITION P2 2097152
LEO1 PARTITION_LEO5 TABLE PARTITION P3 2097152
LEO1 PARTITION_LEO5 TABLE PARTITION P4 2097152
LEO1 PARTITION_LEO5 TABLE PARTITION P5 2097152
LEO1 PARTITION_LEO5 TABLE PARTITION P6 2097152
LEO1 PARTITION_LEO5 TABLE PARTITION PM 2097152
LEO1 SYS_C0010833 INDEX 65536
LEO1 BIN$0tjf3nEWpL7gQKjAZAFAMQ==$0 INDEX 3145728
LEO1 IDX_PARTITION_LEO9 INDEX 2097152
LEO1 LEO8_IDX INDEX 2097152
LEO1 LEO9_IDX INDEX 4194304
LEO1 IDX_LEO3 INDEX 2097152
LEO1 IDX_LEO1 INDEX 65536
LEO1 IDX_PARTITION_LEO10 INDEX PARTITION P1 262144
LEO1 IDX_PARTITION_LEO10 INDEX PARTITION P2 262144
LEO1 IDX_PARTITION_LEO10 INDEX PARTITION P3 262144
LEO1 IDX_PARTITION_LEO10 INDEX PARTITION P4 262144
LEO1 IDX_PARTITION_LEO10 INDEX PARTITION P5 262144
LEO1 IDX_PARTITION_LEO10 INDEX PARTITION P6 262144
LEO1 IDX_PARTITION_LEO10 INDEX PARTITION PM 327680
53 rows selected.
对象类型:表 分区表 索引 分区索引共四种
我们统计一下不同种类对象各多少size
LEO1@LEO1> select segment_type,sum(bytes)/1024/1024 total_size from dba_segments where owner='LEO1' group by segment_type;
SEGMENT_TYPE TOTAL_SIZE
------------------ ----------------------- -------
INDEX PARTITION 1.8125M
TABLE PARTITION 42M
TABLE 125.375M
INDEX 13.125M
公式:INDEX PARTITION+TABLE PARTITION+TABLE+INDEX
Count:1.8125+42+125.375+13.125=182.3125M
LEO1用户下所有对象的大小:182.3125M
4.用SQL计算某个表空间的大小及所包含对象的大小,给出SQL语句和结果。
我们看一下所有表空间的使用率(除了临时表空间)
LEO1@LEO1> select df.tablespace_name "表空间名",totalspace "总空间M",freespace "剩余空间M",round((1-freespace/totalspace)*100,2) "使用率%"
from
(select tablespace_name,round(sum(bytes)/1024/1024) totalspace from dba_data_files group by tablespace_name) df,
(select tablespace_name,round(sum(bytes)/1024/1024) freespace from dba_free_space group by tablespace_name) fs
where df.tablespace_name=fs.tablespace_name order by df.tablespace_name ; 2 3 4 5
表空间名 总空间M 剩余空间M 使用率%
--------------------------------------------------------------------------------------
LEO1 400 237 40.75
SYSAUX 610 31 94.92
SYSTEM 700 8 98.86
UNDOTBS1 165 137 16.97
USERS 5 4 20
我们经常使用的LEO1表空间使用情况已经perfect显示,现在我们需要统计的是LEO1表空间包含对象的大小,由于记录数较多,只把SQL语句写在这里了
LEO1@LEO1> select o.object_name,o.object_type,o.owner,s.tablespace_name,s.segment_name,s.bytes from dba_objects o,dba_segments s where s.tablespace_name='LEO1' and o.owner=s.owner and o.owner='LEO1' and o.object_type=s.segment_type;
5.在告警日志中找到一条错误信息,并贴出来(如果没有,自己造出一条错误信息)。
LEO1@LEO1> select name,status from v$datafile;
NAME STATUS
----------------------------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/LEO1/system01.dbf SYSTEM
/u01/app/oracle/oradata/LEO1/sysaux01.dbf ONLINE
/u01/app/oracle/oradata/LEO1/undotbs01.dbf ONLINE
/u01/app/oracle/oradata/LEO1/users01.dbf ONLINE
/u01/app/oracle/oradata/LEO1/leo1_01.dbf ONLINE 我们重命名这个数据文件名
LEO1@LEO1> alter database rename file '/u01/app/oracle/oradata/LEO1/leo1_01.dbf' to '/u01/app/oracle/oradata/LEO1/leo1_01_bak.dbf';
alter database rename file '/u01/app/oracle/oradata/LEO1/leo1_01.dbf' to '/u01/app/oracle/oradata/LEO1/leo1_01_bak.dbf'
*
ERROR at line 1:
ORA-01511: error in renaming log/data files 在重命名数据文件时报错
ORA-01121: cannot rename database file 5 - file is in use or recovery不能重命名数据文件,文件正在使用
ORA-01110: data file 5: '/u01/app/oracle/oradata/LEO1/leo1_01.dbf' 报错的是数据文件5
我们在重命名数据文件时报错
看一下alert_LEO1.log日志的内容
[oracle@leonarding1 trace]$ tail -200f alert_LEO1.log
Tue Mar 05 20:22:06 2013 这是错误发生的时间
alter database rename file '/u01/app/oracle/oradata/LEO1/leo1_01.dbf' to '/u01/app/oracle/oradata/LEO1/leo1_01_bak.dbf'
ORA-1511 signalled during: alter database rename file '/u01/app/oracle/oradata/LEO1/leo1_01.dbf' to '/u01/app/oracle/oradata/LEO1/leo1_01_bak.dbf'...
红色代表错误标识和我们在sqlplus中看到的一样,1511代表错误编号
[oracle@leonarding1 trace]$ oerr ora 1511 还可以使用oerr查看错误编码的英文解释
01511, 00000, "error in renaming log/data files" 重命名数据文件发生的错误编码1511
// *Cause: An error occurred during the ALTER DATABASE RENAME FILE command.
// *Action: Check the error stack for detailed error information.
6.学会使用官方文档,在网站tahiti.oracle.com 上查找V$session的描述信息,查出dbms_stats包的信息,并截图贴出来。
这是Oracle所有文档的统一入口,在这里可以找到数据库 应用服务 合并应用等所有的参考文档
我们数据库版本:Release 11.2.0.1.0
1. 所以我们应该查这个文档
2.左上角找到 Master Boot List 官方文档的索引
3.如果想查看《初始化视图+数据字典+动态性能视图》请参考《Reference》
4.选择 这个部分中search:v$session,结果中排在第一行的就是v$session信息,列举了每个字段的含义,v$session相应的命令
V$SESSION displays session information for each current session.
Column |
Datatype |
Description |
SADDR |
RAW(4 | 8) |
Session address |
SID |
NUMBER |
Session identifier |
SERIAL# |
NUMBER |
Session serial number. Used to uniquely identify a session's objects. Guarantees that session-level commands are applied to the correct session objects if the session ends and another session begins with the same session ID. |
AUDSID |
NUMBER |
Auditing session ID |
PADDR |
RAW(4 | 8) |
Address of the process that owns the session |
USER# |
NUMBER |
Oracle user identifier |
USERNAME |
VARCHAR2(30) |
Oracle username |
COMMAND |
NUMBER |
Command in progress (last statement parsed); for a list of values, see . These values also appear in the AUDIT_ACTIONS table. |
OWNERID |
NUMBER |
Identifier of the user who owns the migratable session; the column contents are invalid if the value is 2147483644 For operations using Parallel Slaves, interpret this value as a 4-byte value. The low-order 2 bytes represent the session number and the high-order bytes represent the instance ID of the query coordinator. |
TADDR |
VARCHAR2(8) |
Address of the transaction state object |
LOCKWAIT |
VARCHAR2(8) |
Address of the lock the session is waiting for; NULL if none |
STATUS |
VARCHAR2(8) |
Status of the session:
|
dbms_stats包信息在《PL/SQL Packages and Types Reference》文档中找,也是利用书列表,在这个文档中查询如下关键字即可找到
141 DBMS_STATS
Using DBMS_STATSThis section contains topics which relate to using the DBMS_STATS package.· Overview 概述
· Types 包类型
· Constants 常数
· Operational Notes 操作说明
· Deprecated Subprograms 不用的子过程
· Examples 例子,这段是非常常用的部分
这是DBMS_STATS包在官方文档中的描述
EXEC DBMS_STATS.GATHER_TABLE_STATS ('hr', 'employees'); 这是我们经常使用的分析表统计信息的存储过程。
2013.3.5
天津&spring
分享技术~成就梦想
Blog:
讲述技术人的非技术因素之故事1--------小白的故事
工作两年多的小白是一个很努力的员工,每天除了用心工作外,还坚持充电学习,两年来他除了把ORACLE10G和ORACLE11G的官方文档几乎读了个遍外,还购买了不少相关的书籍来学习。由于小白的项目组工作强度大,时常需要加班,因此小白工作学习外的时间就只够留给吃饭和睡觉了。那他的工作表现很出色吗,天道是否一定酬勤?实际情况却是很不如人意,虽然他了解很多相关知识,可是在实际工作应用中却不得要领,频频出错,领导经常对其提出批评,他自己也相当烦恼。
其实小白只是因为缺少了一种称之为“意识”的东西,这个意识就是,该如何学习。在他的学习过程中,他犯了很多错误。
1. 忽略了知识的重点。
小白读完了ORACLE官方文档的几乎所有内容,毅力让人钦佩!遗憾的是,他忽略了二八现象这个事实:20%的知识,解决80%的问题。小白根本不需要读完ORACLE所有文档,他所在的项目组是从事数据库开发相关工作的,而他却花费了大量的时间阅读完了至今他都尚未开始从事的数据库管理相关知识,比如备份恢复、RAC、DATAGUARD部署及高级数据同步复制相关的技术。这完全是没有必要的。
另外语法方面的资料,小白根本也无需去细读,去记忆,因为平时用的多的语法,自然记得住,遇到偶尔忘记的场合再去官方文档翻阅即可,现在GOOGLE等搜索引擎也非常强大,搜索到相关语法易如反掌。
人的精力是有限的,如果我们做到当前做什么事对应学习什么知识,尽量理解原理而不强记语法,将能省下多少宝贵的时间啊。
2. 从未考虑知识落地
小白曾经对我说过自己的烦恼,向我说明了他有多努力,看过了多少资料。我试探性的问他是否知道ORACLE的体系架构是什么?他很自信的做了回答,滔滔不绝,甚至还画了草图给我,回答的相当让人满意。我又问他是否知道索引的结构和原理是什么?再次得到完美的答复。
接下来我再问他,知道这个体系架构对我们工作有啥帮助呢?他一下子回答不上来了。我继续问他,那索引的结构和原理对我们工作中的数据库应用有啥好处呢?再次答不上来。
原来这就是问题的关键所在!
知识要落地,要思考应用的场合,这就是我除了要让他把握学习重点外的第二个建议。他的学习其实就是为了学习而学习,没有思考应用场景的学习,是没有任何意义。
后来我建议小白来听我在公司开讲的ORACLE系列讲座,让他明白原来了解体系结构后我们居然可以将一条SQL从42秒调整到不足0.01秒;了解索引结构后,我们居然可以优化我们身边最为常见的SQL语句,比如COUNT(*),MAX()等等。而在此之前,这些语句根本不会让他对索引产生联想。他终于彻底明白了什么叫知识落地,明白了意识有多么重要!
我最后强调,不只是ORACLE,其实学习任何技术都一样的,没有思考过你所学的某技术有什么用,没有想过如何落地,如何应用到实际工作中去,都是毫无意义的学习,纯粹浪费生命。
3. 选择技术使用场景
近来小白连续犯错,他学习了并行度这个章节后,知道并行可以有效的利用多个CPU,将自己的代码加进了并行度,结果忽略了生产系统不只是跑他这一个应用这个事实。导致代码上生产后生产系统资源大量争用。直至最后我们定位到问题在他的代码中,将写法修正,取消了并行度后,系统终于恢复正常。
他为什么会犯这个错误,主要是因为他只专注于技术本身而忽略了应用的场景,如果是凌晨2点的某个大任务操作,他的这个设置就很好,因为那个时刻大多其他应用都已经停止运行了,资源不利用白不利用。
这就是什么时候选择什么技术。小白还有一个有趣的故事,就是在我给他提这第三个建议之后的一周,他又使用了并行,这次他不是在代码中写死,而是选择临时性场合使用,在凌晨2点运行系列特定脚本。结果这次他运行的比想象的慢的多,还不如之前未用并行的时候。
大家知道什么原因吗,其实还是因为不知道什么时候选择什么技术。这次他不会影响他人了,因为凌晨静悄悄。但是他影响了自己。因为他的任务的特点是小而多,平均0.01秒不到可以完成一条SQL执行。他忽略了另外一个细节,并行是需要调度的,调度是需要开销的,调度的开销甚至达到0.1秒,那不是越跑越慢了。所以小任务实际上是不需要考虑并行的。
小白的故事说完了,其实要是早些年,他或许不会有这些苦恼,因为学习资料少,他即便不抓重点也不至于学到筋疲力尽;此外他的诸多失误都和性能有关,而早些年大多IT系统压力很小,在基本功能满足后性能问题几乎可以忽略不计,那小白也就没错可犯了。
再次强调,当今的IT建设项目,如果不对海量数据和高并发带来的性能问题进行有效的架构设计、部署规划,你的项目基本上就被判了死刑。而ORACLE新版本为什么对应大量技术文档,很大一部分原因是ORACLE新版本提供了更多的性能调优产品。为什么现在新技术如此繁多,其实也是源于此,难道内存数据库和列式数据及分布式数据库的产生,不是为了让系统跑的更快一些吗,只是这里要注意,他们不可能替代传统关系型数据库,因为他们都有各自适合的应用场合。