OCA读书笔记(12) - 数据库维护
查询优化器统计信息
搜集统计信息:
不是实时的:
SQL> conn /as sysdba
Connected.
SQL> grant select on dba_objects to scott;
Grant succeeded.
SQL> conn scott/tiger
Connected.
SQL> create table t as select * from dba_objects;
Table created.
SQL> select NUM_ROWS,BLOCKS from user_tables where table_name='T';
NUM_ROWS BLOCKS
---------- ----------
统计信息不会实时的写入数据字典
SQL> exec dbms_stats.gather_table_stats('scott','t');
PL/SQL procedure successfully completed.
SQL> select NUM_ROWS,BLOCKS from user_tables where table_name='T';
NUM_ROWS BLOCKS
---------- ----------
50401 713
1.通过手动收集
2.自动收集:通过数据库作业:Administration->Jobs->GATHER_STATS_JOB
正在审核的统计信息
如何使SCOTT模式中E表的统计信息处于未发布状态:
新创建表e:
create table e as select * from emp;
e表创建后,统计信息没有搜集,因此,我们看不到统计信息:
select num_rows, to_char(last_analyzed,'mm/dd/yy hh24:mi:ss') from user_tables where table_name = 'E';
NUM_ROWS TO_CHAR(LAST_ANALYZ
---------- -------------------
将e表的统计信息发布选项设置为false
begin
dbms_stats.set_table_prefs (
ownname => 'SCOTT',
tabname => 'E',
pname => 'PUBLISH',
pvalue => 'FALSE'
);
end;
一旦您将发布首选项设置为false,收集的统计信息就将被标记为正在审核,下面是现在该表的统计信息:
收集统计信息:
begin
dbms_stats.gather_table_stats (
ownname => 'SCOTT',
tabname => 'E',
estimate_percent=> 100
);
end;
/
查看统计信息:
NUM_ROWS TO_CHAR(LAST_ANAL
---------- -----------------
可以看到行数没变,同时last_analyzed 值也没变,那么,刚收集的统计信息发生了什么变化呢?统计信息被标记为正在审核
正在审核的统计信息可在视图 USER_TAB_PENDING_STATS 中看到:
select num_rows, to_char(last_analyzed,'mm/dd/yy hh24:mi:ss') from user_tab_pending_stats
where table_name = 'E';
NUM_ROWS BLOCKS TO_CHAR(LAST_ANALYZ
---------- ---------- -------------------
14 4 2013-10-24 01:17:56
现在表有14行,显示正在审核的统计信息,同时显示有收集时间,想让优化程序看到这些正在审核的统计信息,您可以发布它们:
begin
dbms_stats.publish_pending_stats('SCOTT', 'E');
end;
/
检查视图user_tab_pending_stats,会发现它现在是空的
select num_rows, to_char(last_analyzed,'mm/dd/yy hh24:mi:ss') from user_tab_pending_stats
where table_name = 'E';
o rows selected
如果现在检查USER_TABLES,会看到最新的统计信息:
select num_rows,to_char(last_analyzed,'yyyy-mm-dd hh24:mi:ss') from user_tables where table_name='E';
NUM_ROWS TO_CHAR(LAST_ANALYZ
---------- -------------------
14 2013-10-24 01:17:56
AWR
1.AWR的定义:Automatic Workload Repository(自动工作量资料档案库 )
AWR中存的是快照,快照是由MMON(Memory Monitor )进程生成,MMON进程每隔一段时间会
收集数据库的统计信息并且根据统计信息自动生成大量的指标,并将统计信息以及指标写入到磁盘中这
个过程就是对数据库执行一次快照
2.AWR的作用:AWR提供了收集数据库的诊断信息,对潜在问题进行分析以及进行自我调整的功能
3.AWR的管理:创建,删除,配置
3.1. 查看当前的AWR保存策略
col SNAP_INTERVAL format a20
col RETENTION format a20
select * from dba_hist_wr_control;
DBID SNAP_INTERVAL RETENTION TOPNSQL
---------- -------------------- -------------------- ----------
262089084 +00000 01:00:00.0 +00007 00:00:00.0 DEFAULT
以上结果表示,每小时产生一个SNAPSHOT,保留7天
3.2. 调整AWR配置
AWR配置都是通过dbms_workload_repository包进行配置
3.2.1 调整AWR产生snapshot的频率和保留策略,如将收集间隔时间改为30分钟一次
并且保留5天时间(单位都是分钟):
begin
dbms_workload_repository.modify_snapshot_settings(interval=>60, retention=>7*24*60);
end;
/
SQL> select * from dba_hist_wr_control;
DBID SNAP_INTERVAL RETENTION TOPNSQL
---------- -------------------- -------------------- ----------
1318209987 +00000 00:30:00.0 +00005 00:00:00.0 DEFAULT
3.2.2 关闭AWR,把interval设为0则关闭自动捕捉快照
begin
dbms_workload_repository.modify_snapshot_settings(interval=>0);
end;
/
3.2.3 手工创建一个快照
begin
DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
end;
/
3.2.4 查看快照
col SNAP_ID for 99
col STARTUP_TIME for a25
col BEGIN_INTERVAL_TIME for a25
col END_INTERVAL_TIME for a25
col SNAP_LEVEL for 9
set linesize 1000
set pagesize 100
select SNAP_ID,STARTUP_TIME,BEGIN_INTERVAL_TIME,END_INTERVAL_TIME,SNAP_LEVEL from DBA_HIST_SNAPSHOT
order by 1;
3.2.5 手工删除指定范围的快照
begin
DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(low_snap_id =>38, high_snap_id =>42);
end;
/
mmon收集统计信息的三个级别:
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
statistics_level string TYPICAL
basic:自动优化功能基本关闭
tipical:默认值
all:用于手动诊断sql的其他信息
BASELINE
基线:
是一组已经存储的统计信息和指标,可用于跨越时间进行对比
当MMON进程保存AWR快照时,会根据统计信息生成大量的指标,这些都自动生成,而基线的生成必须有DBA完成
过一段时间会清除快照,默认是7天后清除,基准是快照的一个或多个对,将一直保存到专门删除为止,可将从基线
派生的指标与当前活动级别派生的指标进行比较,从而帮助确定活动和行为中的更改
创建基线:
execute dbms_workload_repository.create_baseline(start_snap_id=>18,end_snap_id=>19,baseline_name=>'pridapm');
ADDM
实验:生成ADDM(Automatic Database Diagnostic Monitor )报告
conn system/a
设置ADDM的敏感度
begin
dbms_advisor.set_default_task_parameter('ADDM','DB_ACTIVITY_MIN',30);
end;
/
创建AWR快照:
execute dbms_workload_repository.create_snapshot;
通过创建表并运行匿名PL/SQL块来生成一些活动来模拟工作负荷:
create table tmptab as select * from all_objects;
begin
for i in 1..10 loop
insert into tmptab select * from all_objects;
delete tmptab;
end loop;
commit;
end;
再次创建快照:
execute dbms_workload_repository.create_snapshot;
使用database control,以用户system登录到数据库
在数据库主页上,单击related links区域中的advistor central连接,列出的第一个报告是
作为快照结果生成的ADDM报告
选择最新ADDM报告对应的单选按钮,并单击view result按钮。对报告进行研究:它将显示近几
分钟的活动高峰,下面有多个发现。单击发现,可看到活动性质以及导致活动的语句。
删除此实验表:
drop table tmptab purge;
ADVISOR
使用顾问程序体系结构
顾问程序:
实验:使用STA进行sql优化
使用oracle提供的程序包进行sql优化:
conn /as sysdba
grant ADVISOR to scott;
conn scott/tiger
create table manual_sta(id varchar2(10),name varchar2(128));
insert into manual_sta select object_id,object_name from dba_objects;
commit;
在id列上创建一个索引,并收集统计信息。
create index idx_manual_sta on manual_sta(id);
exec dbms_stats.gather_table_stats(user,'manual_sta',cascade=>true);
调用STA对SQL语句进行调优:
declare
l_task_id varchar2(20);
l_sql varchar2(2000);
begin
l_sql := 'select * from manual_sta where id=2000';
l_task_id := dbms_sqltune.create_tuning_task(
sql_text=>l_sql,
user_name=>'SCOTT',
scope=>'COMPREHENSIVE',
time_limit=>30,
task_name=>'MANUAL_STA'
);
end;
执行sql调优任务
begin
dbms_sqltune.execute_tuning_task('MANUAL_STA');
end;
显示调优结果
set serveroutput on size 999999
set long 99999999
select dbms_sqltune.report_tuning_task('MANUAL_STA') from dual;
显示结果中会建议建一个函数索引
表空间告警
1.安装hr用户
检查hr是否存在,如果不存在,如果不存在先创建hr
2.将表空间的空间阈值定义成默认值,如:
exec DBMS_SERVER_ALERT.SET_THRESHOLD(-
dbms_server_alert.tablespace_pct_full,-
NULL,NULL,NULL,NULL,1,1,NULL,-
dbms_server_alert.object_type_tablespace,NULL);
3. 创建实验表空间tbsalert,大小为120MB,文件名为alert1.dbf,不要设置自动扩展,不要为表空间设置阈值:
create tablespace tbsalert datafile '/u01/app/oracle/oradata/orcl/alert1.dbf' size 120M;
4.改变表空间tbsalert的告警阈值,55%为普通警告,70%为严重警告:
begin
DBMS_SERVER_ALERT.SET_THRESHOLD(DBMS_SERVER_ALERT.TABLESPACE_PCT_FULL,
DBMS_SERVER_ALERT.OPERATOR_GE,
'55',
DBMS_SERVER_ALERT.OPERATOR_GE,
'70',
1,
1,
null,
DBMS_SERVER_ALERT.OBJECT_TYPE_TABLESPACE,
'TBSALERT');
end;
/
5.检查新的阈值:
select warning_value,critical_value
from dba_thresholds
where metrics_name='Tablespace Space Usage' and
object_name='TBSALERT';
6.从数据字典dba_alert_history中查询表空间tbsalert的reason和resolution:
select reason,resolution
from dba_alert_history
where object_name='TBSALERT';
REASON RESOLUT
-------------------------------------------------------- -------
Threshold is updated on metrics "Tablespace Space Usage" cleared
7.创建测试环境,在表空间tbsalert上创建新表,如:
conn hr/hr
create table employees1 tablespace tbsalert as select * from hr.employees;
create table employees2 tablespace tbsalert as select * from hr.employees;
create table employees3 tablespace tbsalert as select * from hr.employees;
create table employees4 tablespace tbsalert as select * from hr.employees;
create table employees5 tablespace tbsalert as select * from hr.employees;
alter table employees1 enable row movement;
alter table employees2 enable row movement;
alter table employees3 enable row movement;
BEGIN
FOR i in 1..10 LOOP
insert into employees1 select * from employees1;
insert into employees2 select * from employees2;
insert into employees3 select * from employees3;
insert into employees4 select * from employees4;
insert into employees5 select * from employees5;
commit;
END LOOP;
END;
/
insert into employees1 select * from employees1;
insert into employees2 select * from employees2;
insert into employees3 select * from employees3;
commit;
8.检查表空间tbsalert使用空间比例:
select sum(bytes) * 100 / 125829120
from dba_extents
where tablespace_name = 'TBSALERT';
SUM(BYTES)*100/125829120
------------------------
60
等待大约10分钟,运行以下查询:
select reason from dba_outstanding_alerts where object_name = 'TBSALERT';
REASON
--------------------------------------------------------
Tablespace [TBSALERT] is [60 percent] full
9.往表空间tbsalert增加数据:
insert into employees4 select * from employees4;
commit;
insert into employees5 select * from employees5;
commit;
查看表空间tbsalert的空间比例:
select sum(bytes) * 100 / 125829120
from dba_extents
where tablespace_name = 'TBSALERT';
SUM(BYTES)*100/125829120
------------------------
75
等待大约10分钟,执行查询:
select reason
from dba_outstanding_alerts
where object_name = 'TBSALERT';
REASON
--------------------------------------------------------
Tablespace [TBSALERT] is [75 percent] full
10. 减少表空间tbsalert的空间大小:
delete employees1 where department_id=50;
commit;
delete employees2 where department_id=50;
commit;
delete employees3 where department_id=50;
commit;
11. 对表employees1,employees2,employees3进行空间收缩:
alter table employees1 shrink space;
alter table employees2 shrink space;
alter table employees3 shrink space;
查看表空间的空间比例:
select sum(bytes) * 100 / 125829120
from dba_extents
where tablespace_name = 'TBSALERT';
SUM(BYTES)*100/125829120
------------------------
53.90625
12. 等待大约10分钟,执行如下查询:
select reason, message_level
from dba_outstanding_alerts
where object_name = 'TBSALERT';
no rows selected
发现没有数据,空间问题解决之后,告警自动消失,进入告警历史:
select OBJECT_NAME, OBJECT_TYPE, REASON
from dba_alert_history
where OBJECT_NAME='TBSALERT';
OBJECT_NAME OBJECT_TYPE REASON
----------- ----------- --------------------------------------------------------
TBSALERT TABLESPACE Threshold is updated on metrics "Tablespace Space Usage"
TBSALERT TABLESPACE Tablespace [TBSALERT] is [53 percent] full
13. 将表空间tbsalert的空间阈值设置为数据库默认的:
begin
DBMS_SERVER_ALERT.SET_THRESHOLD(DBMS_SERVER_ALERT.TABLESPACE_PCT_FULL,
null,
null,
null,
null,
null,
null,
null,
DBMS_SERVER_ALERT.OBJECT_TYPE_TABLESPACE,
'TBSALERT');
end;
/
select warning_value, critical_value
from dba_thresholds
where metrics_name = 'Tablespace Space Usage'
and object_name = 'TBSALERT';
no rows selected
14. 删除表空间tbsalert:
drop tablespace tbsalert including contents and datafiles;
OCA读书笔记(12) - 数据库维护的更多相关文章
- 机器学习实战 - 读书笔记(12) - 使用FP-growth算法来高效发现频繁项集
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第12章 - 使用FP-growth算法来高效发现频繁项集. 基本概念 FP-growt ...
- 强化学习读书笔记 - 12 - 资格痕迹(Eligibility Traces)
强化学习读书笔记 - 12 - 资格痕迹(Eligibility Traces) 学习笔记: Reinforcement Learning: An Introduction, Richard S. S ...
- Android开发艺术探索》读书笔记 (12) 第12章 Bitmap的加载和Cache
第12章 Bitmap的加载和Cache 12.1 Bitmap的高速加载 (1)Bitmap是如何加载的?BitmapFactory类提供了四类方法:decodeFile.decodeResourc ...
- OCA读书笔记(2) - 安装Oracle软件
Objectives: •Describe your role as a database administrator (DBA) and explain typical tasks and tool ...
- 《http权威指南》读书笔记12
概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...
- 『TCP/IP详解——卷一:协议』读书笔记——12
2013-08-24 14:22:46 4.5 ARP举例 首先要介绍一些tcpdump这个强大的Linux命令,它不但可以分析封包的流向,连封包的内容也可以监听,如果数据段没有加过密我们就可以做一些 ...
- Android权威编程指南读书笔记(1-2章)
第一章 Android应用初体验 1.4用户界面设计 <?xml version="1.0" encoding="utf-8"?> ADT21开发版 ...
- OCA读书笔记(1) - 浏览Oracle数据库架构
Objectives: List the major architectural components of Oracle DatabaseExplain the memory structuresD ...
- OCA读书笔记(3) - 使用DBCA创建Oracle数据库
Objectives: •Create a database by using the Database Configuration Assistant (DBCA) •Generate databa ...
随机推荐
- 巧用test判断来写shell脚本
感觉最近很忙啊,阿里巴巴和百度马上就要笔试了,算法神马的还没有看..还是安心学习linux吧,决定在接下来的一周里,每天写一个shell script #!/bin/bash #输出提示语句,请输入一 ...
- BZOJ 1486: [HNOI2009]最小圈( 二分答案 + dfs判负圈 )
二分答案m, 然后全部边权减掉m, 假如存在负圈, 那么说明有平均值更小的圈存在. 负圈用dfs判断. ------------------------------------------------ ...
- on、where、having的区别(转载)
on.where.having的区别 on.where.having这三个都可以加条件的子句中,on是最先执行,where次之,having最后.有时候如果这先后顺序不影响中间结果的话,那最终结果是相 ...
- 跟我一起写 Makefile(一)
跟我一起写 Makefile 陈皓 概述—— 什么是makefile?也许非常多Winodws的程序猿都不知道这个东西,由于那些Windows的IDE都为你做了这个工作,但我认为要作一个好的和pro ...
- HTML学习笔记(七)
1. 假设想让div中的内容(content)垂直居中,能够将line-height的值设置与div的高度相等来实现. 2. 超伪类链接的四种形式: watermark/2/t ...
- PYTHON学习第二天[脑图][2]
控制流语句:if , for ,while , break , continue
- delphi json(CDS包含了Delta数据包)
在delphi中,数据集是最常用数据存取方式.因此,必须建立JSON与TDataSet之间的互转关系,实现数据之间通讯与转换.值得注意的是,这只是普通的TDataset与JSON之间转换,由于CDS包 ...
- Kendo UI开发教程(22): Kendo MVVM 数据绑定(十一) Value
Value绑定可以把ViewModel的某个属性绑定到DOM元素或某个UI组件的Value属性.当用户修改DOM元素或UI组件的值时,绑定的ViewModel的值也随之发生改名.同样,如果ViewMo ...
- Locally weighted linear regression(局部加权线性回归)
(整理自AndrewNG的课件,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 前面几篇博客主要介绍了线性回归的学习算法,那么它有什么不足的地方么 ...
- Transformations 方块转换
题目是中文题,就不做什么解释了,纯模拟题,主要要搞清楚这几种装换方式下标的变化: 第一种:顺时针旋转90度: c[j][n-i+1]=a[i][j]; 第二种:旋转180度: c[n-i+1][n-j ...