本帖最后由 群发软件 于 2017-9-8 21:23 编辑
一: 数据库
数据库(database)是一个数据集合.
无论数据库是采用关系结构还是面向对象结构, oracle数据库都将其数据存放在数据文件中. 在其内部, 数据库结构数据对文件的逻辑映射, 使不同的数据分开存储, 这些逻辑划分称为表空间.
表空间和文件介绍:
1: 表空间
表空间(tablespace)是数据库的逻辑划分, 每个数据库至少有一个表空间,叫做系统表空间(system 表空间). 一个表空间只能属于一个数据库.
每个表空间由同一个磁盘上的一个或多个文件组成, 这些文件称为数据文件. 表空间的特性:
1)控制数据库数据磁盘分配
2)限制用户在表空间中可以使用的磁盘空间大小
3)表空间具有 online, offline, readonly, readwrite属性
修改表空间的属性:
SQL> alter tablespace 表空间名称 属性;
查询表空间状态:
SQL> select tablespace_name, status from dba_tablespaces;
注意: system, undo, temp表空间不能设为offline属性.
4)完成部分数据库的备份与恢复
5)表空间通过数据文件来扩大, 表空间的大小等于构成该表空间的所以数据文件的大小只和.
查询表空间与数据文件对应关系:
SQL> select tablespace_name, bytes, file_name from dba_data_files;
基于表空间的几个操作:
1)查询用户缺省表空间:
SQL> select username, default_tablespace from dba_users;
2)查询表与存储该表的表空间:
SQL> select table_name, tablespace_name from user_tables;
3)修改用户缺省表空间:
SQL> alter user username default tablespace tablespace_name;
4)将数据从一个表空间移动到另一个表空间:
SQL> alter table table_name move tablespace tablespace_name;
2: 数据文件
每个表空间由同一个磁盘上的一个或多个文件组成, 这些文件叫做数据文件(datafile),数据文件只能属于一个表空间. 数据文件创建后可以改变大小. 创建新的表空间需要创建新的数据文件. 数据文件一旦加入到表空间中, 就不能从表空间中移走, 也不能与其他表空间发生联系.数据库必须的三类文件是 data file, control file, redolog file. 其他文件 prameter file,password file, archived log files并不是数据库必须的, 他们只是辅助数据库的.
查看数据库的物理文件组成:
1)查看数据文件: SQL> select * from v$datafile;
2)查看控制文件: SQL> select * from v$controlfile;
3)查看日志文件: SQL> select * from v$logfile;
二: 实例
通俗的讲实例就是操作oracle数据库的一种手段.
数据库实例也称作服务器, 是用来访问数据库文件集的存储结构及后台进程的集合.
一个数据库可以被多个实例访问(称为真正的应用群集选项).
决定实例的大小及组成的各种参数或者存储在名称init.ora的初始化文件中, 或者隐藏在数据库内部的服务器参数文件中. 通过spfile引用该文件, spfile存储在spfile.ora文件中.
实例启动时读取初始化文件, 数据库系统管理员可以修改该文件, 对初始化文件的修改只有在下次启动时才有效.
Instance分为两部分:
1: memory structure(内存结构)
memory structure分为两部分:SGA(System Global Area)区是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息,
它是在Oracle 服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。
包括:
.share pool
.datafase buffer cache
.redo log buffer
.other structures
PGA(Program Global Area)区包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反PGA 是只被一个进程使用的区域,PGA 在创建进程时分配在终止进程时回收
2: background process(后台进程)
包括: .PMON 负责在一个Oracle 进程失败时清理资源
.SMON 检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复
.DBWR 负责将更改的数据从数据库缓冲区高速缓存写入数据文件
.LGWR 将重做日志缓冲区中的更改写入在线重做日志文件
.CKPT 负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。
Oracle体系概论
在正式开始学习Oracle体系结构之前,我们先通过下面的图片对Oracle体系结构有个初步把握。
1、Oracle服务体系(Oracle Service)由实例(Instance)和数据库(Database)两部分内容组成。
其中数据库是我们计算机上实实在在存在的一系列磁盘文件,而实例则是由一组管理数据库的内存结构和进程结构两部分内容组成;
2、实例:负责与数据库进行交互,在oracle数据库客户端/服务器模式中,任何用户都无法绕过实例,直接与数据库进行交互;非RAC模式下,一个实例通常只对应一个数据库;我们可以通过HASH(ORACLE_SID,ORACLE_HOME)确定实例的哈希地址,即确定实例唯一性;
二、Oracle体系组成图,中英文对照版
说明:下面的体系组成部分,我们会在后面一点点详细讲解,图片所示内容初步了解即可:
三、“桥梁”——监听
1、监听(Listener):用于监视从客户端发起对数据库的连接请求,请求信息中包含登录用户名、登录密码、连接实例等信息内容,监听对于这部分请求信息进行合法性鉴别,如果信息合法,则抛给服务进程进行客户端请求服务;可以通俗理解成,监听是连接用户进程和服务进程的“桥梁”;
2、监听路径:E:\app\tom\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora
3、监听格式:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)
四、Oracle 服务器两种最常见的处理请求方式:
1、分类:
专用服务器(dedicated server)连接和共享服务器(shared server)连接。
2、含义:
专用服务器模式下,1个服务器进程只服务于1个客户端连接请求;
共享服务器模式下,采用”共享进程“池服务于客户端连接请求,即共享进程池中哪个服务进程有空闲就服务于客户端连接请求,如果所有的服务器进程都处于繁忙状态,则客户端连接请求处于等待状态;3、适用场景说明:
当预期客户机连接总数较小,或客户机向数据库服务器发起请求持续时间比较长,请使用专有模式;
当大量客户机同时要连接数据库并且有效地利用系统资源时,特点是高并发、事务量小,此种情景模式下请使用共享模式
4、注意:
共享服务器模式必须使用net services,即必须配置tns信息——网络配置信息,;
我们可以通过在DOS命令行中执行 lsnrctl service 命令来查看连接模式;
5、lsnrctl service命令执行结果集
Microsoft Windows [版本 6.1.7600]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。
C:\Users\neusoft>lsnrctl service
LSNRCTL for 32-bit Windows: Version 11.2.0.1.0 - Production on 09-12月-2014 21:2
0:37
Copyright (c) 1991, 2010, Oracle. All rights reserved.
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
服务摘要..
服务 "CLRExtProc" 包含 1 个实例。
实例 "CLRExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
处理程序:
"DEDICATED" 已建立:0 已被拒绝:0
LOCAL SERVER
服务 "orcl" 包含 1 个实例。
实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
处理程序:
"DEDICATED" 已建立:144 已拒绝:0 状态:ready
LOCAL SERVER
服务 "orclXDB" 包含 1 个实例。
实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
处理程序:
"D000" 已建立:0 已被拒绝:0 当前: 0 最大: 1022 状态: ready
DISPATCHER <machine: NEUSOFT-PC, pid: 2112>
(ADDRESS=(PROTOCOL=tcp)(HOST=neusoft-PC)(PORT=49160))
命令执行成功
6、查看共享模式参数:
我们可以通过在SQLPLUS界面输入show parameter shared查看共享模式参数
例如:SQL> show parameter shared
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address integer 0
max_shared_servers integer
shared_memory_address integer 0
shared_pool_reserved_size big integer 13212057
shared_pool_size big integer 0
shared_server_sessions integer
shared_servers integer 1
7、查看调节器参数:
可以通过在sqlplus中执行show parameter dispatchers查看共享服务器模式下调度器参数情况信息
8、备注说明:
共享模式现在在应用程序中已经很少使用,因为现在程序中都已经具备这种功能,不需要单独在oracle中进行设置;
五、数据库文件
1、组成分类:数据库文件由控制文件、数据文件、重做日志文件3大类文件组成;
2、文件分布路径:E:\app\tom\oradata\orcl,如下图:
3、数据库分类文件样式图:
4、类型分类:
其中控制文件和重做日志文件属于离线文件,数据文件属于在线文件。所谓离线是指不需要oracle服务启动也可以使用,反而,在线是需要Oracle正常启动后才能正常作业;
5、数据文件查询方法:
SELECT * FROM V$DATAFILE;
或
SELECT * FROM DBA_DATA_FILES;
六、SGA
1、含义:
(SYSTEM GLOBAL AREA)系统全局区域,还有一种通俗称呼是(SHARE GLOBAL AREA)共享全局区域,存储Oracle数据库实例(instance)的数据和控制文件信息,1个实例只有1个SGA,数据库实例启动时,SGA的内存被自动分配,当数据库实例关闭时,SGA内存被回收;
2、SGA组成体系:
共享池(shared pool)数据缓存区(database buffer cache)
重做日志缓冲区(redo logbuffer)
Java 池(Java pool)
大型池(large pool)(可选的, Oracle9iRelease2版本中才开始出现)
数据流池(streams pool)(Oracle 10g 新增)
数据字典缓存区(datadictionary cache)
其他杂项信息(others)
3、共享池
Ⅰ组成范围:
①库高速缓存区(Library Cache):
共享SQL区(与之对应的有“私有SQL区”,在PGA中存放)
SQL AREA:存放sql语句文本、分析树已编译的版本、执行计划执行时采取的步骤;
PL/SQL AREA,存放PL/SQL中编译代码、调试代码、解析树等信息;
说明:
1、 从用户进程发起的sql或pl/sql代码,oracle首先会在共享SQL区中寻找是否存在历史已缓存的数据结果集,如果有则不需要进行重新解析,直接复制一份返回给PGA私有SQL区进行执行,如果没有,则先进行代码分析,分析完毕后存放于共享SQL区,然后再复制一份给PGA私有SQL区进行执行
2、 Library Cache大小由共享池大小(share_pool_size)决定,不可以直接进行调整。
3、 存放共享SQL区的目的是为了以后减少解析时间,复用已有的解析成果。但是任何SQL或者PL/SQL代码最终都是在PGA中的私有SQL区进行执行、排序等操作;
4、 任何用户都可以通过V$sqlarea访问共享SQL区;
②数据字典缓存区(data dictionary cache):
存放用户、权限、表对象、表中字段等所对应的数据字典的副本,如果不存在,则会报错。主要是负责语法、语义的解析;、
举例:比如我需要执行selecth.last_name,h.salary from hr.employees h;
oracle会检查这个待执行的sql语句中是否存在拼写错误,检查是否存在employees这张表,检查是否存在hr这个用户,检查当前登录用户是否有权限对hr.employees表有操作权限,检查表中是否有last_name、salary这两个字段;
数据字典缓冲区是数据库对应磁盘文件的副本,如果数据解析时,数据缓冲区没有内容,则会到数据库磁盘文件中进行检索并复制一份副本给数据字典缓存区;
③用户全局区域(User Global Area):
在共享连接模式下,如果大型池(large pool)启用,则UGA属于大型池,否则属于共享池;
Ⅱ共享池管理:
1、刷新共享池:ALTERSYSTEMFLUSHSHARED_POOL
说明:
刷新共享池会将SGA中的share_pool中的数据全部清除,这个操作不建议在并发量大的时间操作,
另外操作完毕后,oracle解析sql或pl/sql的时间可能会增加,但是性能会很快重新提升,
这个操作可以作为oracle性能调优的手段之一,减少共享内存中的碎片;
2、更改共享池大小:ALTERSYSTEMSET SHARED_POOL_SIZE=66M;
3、 共享池size过大或过小,都会影响Oracle性能;
4、 共享池中多大量的小内存块组成,内存块大小一般为4KB,我们使用大量的小内存块来避免碎片的问题,共享池中使用LRU方法进行管理,下面补充LRU的相关知识;
什么是LRU算法?
LRU是Least Recently Used的缩写,即最少使用页面置换算法,是为虚拟页式存储管理服务的。LRU法则下,Oracle内存中最近使用的数据就会被依次放入头部,当内存空间满时,就会将最近很少使用的内存区域中的数据清除出共享内存区;
4、数据缓存区(data buffer cache)
数据缓存区的大小是由内存块大小(DB_BLOCK_SIZE)*内存块数量(DB_BLOCK_CACHE)决定,因为DB_BLOCK_SIZE是由数据库创建时决定,一般大小是4K,如需更改则需要重新创建数据库,所以我们一般不需要更改,那我们只能通过修改动态参数DB_BLOCK_CACHE进而控制数据缓存区的大小。在Oracle9i以后版本中出现了另外一个参数DB_CACHE_SIZE控制数据缓存区大小,即DB_CACHE_SIZE= DB_BLOCK_CACHE* DB_BLOCK_SIZE。
Oracle通过LRUW链条对数据缓存区中的脏块(即数据缓存区中数据发生变化并且没有写入数据文件中的数据)进行管理;
我们可以通过:ALTER SYSTEM FLUSH BUFFER_CACHE;语句实现对数据缓存区的刷新;
从oracle10g开始,可以通过SGA_TARGET参数实现动态智能化管理SGA;
oracle11g更加智能化,通过MEMORY_TARGET参数实现动态智能化管理SGA和PGA;
Oracle9i需要手工分配max_sga_size
↓
Oracle10g自动管理SGA,设置sga_target,sga_target<=max_sga_size
↓
Oracle11g自动管理SGA和PGA,设置memory_target,我们称之为ASMM;
说明:
通过上面各Oracle版本对于内存的管理,不难看出Oracle在朝着越来越智能化的方向发展,但是作为优秀的DBA人员,至少应当是熟悉Oracle对于共享内存处理的原理,以方便问题的排查、解决;
5、 重做日志缓冲区(redo logbuffer)
REDO记录数据修改时的记录,主要用于数据库异常情况下的数据回滚;
UNDO记录数据修改前的状态,主要用于ROLLBACK时的操作处理;
5、Oracle10g内存管理(了解)
在 Oracle 10g中,与内存相关的参数可以归为两类: |
l 自动调优的SGA参数:目前这些参数包括DB_CACHE_SIZE、 SHARED_POOL_SIZE、LARGE_POOL_SIZE和JAVA_POOL_SIZE。 |
l 手动SGA参数:这些参数包括LOG_BUFFER、STREAMS_POOL、 DB_NK_CACHE_SIZE、DB_KEEP_CACHE_SIZE和DB_RECYCLE_CACHE_SIZE。 |
在Oracle 10g中,任何时候你都能查询V$SGAINFO,来查看SGA的哪些组件的大小可以调整。 |
注意要使用自动SGA内存管理,参数STATISTICS_LEVEL必须设置为TYPICAL或ALL。如果不支持统计集合,数据库就没有必要的历史信息来确定大小。 |
SQL> SELECT * FROM V$SGAINFO;
NAME BYTES RESIZEABLE
-------------------------------- ---------- ----------
Fixed SGA Size 1374584 No
Redo Buffers 5410816 No
Buffer Cache Size 452984832 Yes
Shared Pool Size 226492416 Yes
Large Pool Size 8388608 Yes
Java Pool Size 8388608 Yes
Streams Pool Size 0 Yes
Shared IO Pool Size 0 Yes
Granule Size 8388608 No
Maximum SGA Size 711430144 No
Startup overhead in Shared Pool 67108864 No
Free SGA Memory Available 8388608
12 rows selected
我们可以通过V$SGA的状态
SQL> SHOW SGA
Total System Global Area 711430144 bytes
Fixed Size 1374584 bytes
Variable Size 251659912 bytes
Database Buffers 452984832 bytes
Redo Buffers 5410816 bytes
alter system set sga_target=1000m scope=both;
指定区域为spfile时(包括修改SGA_MAX_SIZE本身),SGA_TARGET可以大于MAX_SGA_SIZE的大小,Oracle会在下次启动时自动变更max_sga_size的大小=总和;
PRE_PAGA_SGA默认值为false,这个参数设置作用是:是否将全部SGA置入物理内存中;
**********下面内容为课堂试验部分**********
SQL> --共享池过小或过大都会影响数据库性能,我们可以通过下面语句实现共享池的刷新
SQL> alter system flush shared_pool;
系统已更改。
SQL> --但是上面语句不建议在白天数据并发量很大的时候操作,此操作可以将共享池中缓
存数据清除;
SQL> --我们可以通过pre_page_sga参数实现oracle实例启动时将分配给sga的物理内存一次
性加载上
SQL> alter system set pre_page_sga=true scope=spfile;
系统已更改。
SQL> --我们可以通过lock_sga参数实现sga锁定在物理内存中;
SQL> alter system set lock_sga=true scope=spfile;
系统已更改。
--下面是更改共享池最大内存大小的过程
SQL> --查询共享池内存大小
SQL> show parameter sga_max_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 680M
SQL> --sga_max_size参数是sga最大内存,可以手工调整,调整完毕需要重启数据库实例
SQL> alter system set sga_max_size=660M;
alter system set sga_max_size=660M
*
第 1 行出现错误:
ORA-02095: 无法修改指定的初始化参数
SQL> --上面的错误可以通过后面加scope(范围)解决
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string E:\APP\NEUSOFT\PRODUCT\11.2.0\
DBHOME_1\DATABASE\SPFILEORCL.O
RA
SQL> alter system set sga_max_size=800M scope=spfile;
系统已更改。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 836976640 bytes
Fixed Size 1377812 bytes
Variable Size 658508268 bytes
Database Buffers 171966464 bytes
Redo Buffers 5124096 bytes
数据库装载完毕。
数据库已经打开。
SQL> show parameter sga_max_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 800M
--通过v$sgainfo视图可以查看sga各组成部件的明细及大小
SQL> select * from v$sgainfo;
NAME BYTES RES
-------------------------------- ---------- ---
Fixed SGA Size 1377812 No
Redo Buffers 5124096 No
Buffer Cache Size 171966464 Yes
Shared Pool Size 524288000 Yes
Large Pool Size 4194304 Yes
Java Pool Size 4194304 Yes
Streams Pool Size 0 Yes
Shared IO Pool Size 0 Yes
Granule Size 4194304 No
Maximum SGA Size 836976640 No
Startup overhead in Shared Pool 58720256 No
NAME BYTES RES
-------------------------------- ---------- ---
Free SGA Memory Available 125829120
已选择12行。SQL> --查看sga组件信息
SQL> show sga
Total System Global Area 836976640 bytes
Fixed Size 1377812 bytes
Variable Size 658508268 bytes
Database Buffers 171966464 bytes
Redo Buffers 5124096 bytes
SQL> --查询共享池中空闲信息
SQL> select * from V$SGASTAT st where st.POOL='shared pool' and st.NAME='free memory';
POOL NAME BYTES
------------ -------------------------- ----------
shared pool free memory 415369404
SQL> --通过v$sga_dynamic_components视图查看sga各部件信息
SQL> select component as 数据对象,granule_size as 颗粒大小 from V$sga_Dynamic_Components;
数据对象 颗粒大小
---------------------------------------------------------------- ----------
shared pool 4194304
large pool 4194304
java pool 4194304
streams pool 4194304
DEFAULT buffer cache 4194304
KEEP buffer cache 4194304
RECYCLE buffer cache 4194304
DEFAULT 2K buffer cache 4194304
DEFAULT 4K buffer cache 4194304
DEFAULT 8K buffer cache 4194304
DEFAULT 16K buffer cache 4194304
数据对象 颗粒大小
---------------------------------------------------------------- ----------
DEFAULT 32K buffer cache 4194304
Shared IO Pool 4194304
ASM Buffer Cache 4194304
已选择14行。
SQL> --这里的颗粒大小也是作为实际变更sga组件大小的依据
SQL> --sga中共享池中有共享sql区域,用于存放历史期间执行过的sql语句信息,我们可以通过v$sqlarea视图进行查看
Oracle由实例和数据库组成,实例是由数据一个开辟的共享内存区SGA(System Global Area)和一系列后台进程组成的,其中SGA最主要被划分为共享池(shared pool)、数据缓冲区(db_cache)和日志缓冲区(log buffer)三类。后台进程包括PMON、SMON、LCKn、RECO、CKPT、DBWR、LGWR、ARCH等系列进程。
数据库是由数据文件、参数文件、日志文件、控制文件、归档日志文件等系列文件组成的,其中归档日志最终可能会被转移到新的存储介质中,用于备份恢复使用。
PGA(Program Global Area)区,不是共享内存,是私有不共享的。主要有三点作用:第一,保存用户的连接信息,如会话属性、绑定变量等;第二,保存用户权限等重要信息,当用户进程与数据库建立会话时,系统会将这个用户的相关权限查询出来,然后保存在这个会话区内;第三,当发起的指令需要排序的时候,PGA正是这个排序区,如果在内存中可以放下排序的尺寸,就在内存PGA区内完成,如果放不下,超出的部分就在临时表空间中完成排序,也就是在磁盘中完成排序。
set autotrace on 开始跟踪SQL的执行计划和执行的统计信息
set linesize 1000
set timing on 表示跟踪语句执行完成的时间
2、体系结构原理
sql查询语句执行过程:用户首次执行该SQL指令时,该指令从磁盘中获取用户连接信息和相关权限信息,并保存在PGA内存里。当用户再次执行时,由于 SESSION之前未被断开重连。连接信息和相关权限信息就可以在PGA内存中直接获取,避免了物理读。
首次执行该SQL结束后,SGA内存区的共享池里已经保存了该SQL惟一指令HASH值,并保留了语法语意检查检查及执行计划等相关解析 动作的劳动成果,当再次执行该SQL时,由于 该SQL指令的HASH值和共享池里保存的相匹配了,所以之前的硬解析动作就无须再做,不仅跳过了相关语法检查,对于该选取哪种执行计划也无须考虑,直接拿来主义就好了。
Oracle的后台进程:
PMON的含义为Processes Monitor,是进程监视器
SOMON的含义为System Monitor,理解为系统监视器。
sql更新语句的执行过程 :
在回滚空间的相应回滚段事务表上分配事务槽,从而在回滚表空间分配空间。该动作需要记录日志写进日志缓存区。
在数据缓存区中创建object_id=29的前镜像,前镜像数据也会写进磁盘的数据文件里(回滚表空间的数据文件),这些动作都会记录日志,并将写进日志缓存区,LGWR也在忙着将日志缓存区的数据写入磁盘形成Redo文件。
此时用户如果执行了提交,日志缓存区立即要记录这个提交信息,然后把回滚段事务标记为非激活INACTIVE状态,表示允许重写。
如果执行了回滚,Oracle需要从回滚段中将前镜像object_id=29的数据读出来,修改数据缓存区,完成回滚。这个过程 依然要产生日志,要写数据进日志缓存区。
(用于准备回滚的前镜像数据的生成和普通数据操作差不多,唯一的差别就在于一个是刷新到磁盘的普通文件里,一个是刷新到磁盘的回滚数据文件里)
数据库的一致读:
查询的结果由查询的那个时刻决定了,数据新的变化是不予理睬的。Oralce的回滚段不仅仅是保证了数据的回退,其实还提供了另外一个功能,保证数据的一致读 。
一致读的原理:SCN(System Change Number),是一个只会增加不会减少的递增数据,存在于Oracle的最小单位块里,当某块改变时SCN就会递增。
数据库的回滚段记录事务槽,是用来分配回滚空间的,如果你更新了某块,事务就被写进事务槽里。如果未提交或者回滚,该块数据就存在活动事务,数据库读到此块可以识别到这种情况的存在。
Oracle在做一致读时,首先是看发起的SCN是否大于当前被查询块的SCN,如果小于,毫无疑问从回滚事务段获取前镜像数据。如果SCN确实大于当前被查询块的SCN,还要确保该块没有活动事务,否则还是要去前镜像查找。
内存参数相关操作
(1)查看show parameter sga show parameter pga
show parameter shared_pool_size 查看共享池
show parameter db_cache_size 查看数据缓冲池大小
show parameter log_buffer 查看日志缓冲区大小
(2)修改数据库的内存参数
alter system set <parameter_name>=<value> scope=memory|spfile|both [sid=<sid_name>] memory:只改变当前实例运行,重新启动数据库后失效。
spfile:只改变spfile的设置,不改变当前实例运行,重新启动数据库后生效。
both:同时改变实例及spfile,当前更改立即生效,重新启动数据库仍然有效。
需要注意的是:scop=XXX可以不写,默认为scope=both,此外log_buffer等参数必须重启才会生 效,因此alter system set log_buffer=15000000 scope=memory或者是scope=both就会报错,只支持
alter system set log_buffer=15000000 scop=spfile,然后重启后生效。
(3)查看Oracle归档进程
ps -ef| grep arc
登录数据库以后输入 archive log list命令,Database log mode展示数据库的归档模式。更改数据 的归档模式比较麻烦,需要重启数据库,将数据库置于mount状态后,输入alter database archivelog(反之则为alter database noarchivelog),然后再开启数据库alter database open,才可 以将数据库更改为归档模式。
(4)启停的体会
参数文件及控制文件和数据库的启动与关闭是息息相关的,数据库的启动可以分为三个阶段,分别 是nomount、mount和open。startup nomount、startup mount和alter database open三步分别启动。
startup nomount阶段,Oracle必须读取到数据库的参数文件(PFILE或者SPFILE),如果读不到该 参数文件,数据库根本无法nomount成功!如果读到参数文件,将完成一个非常重要的事,就是根据参 数文件上的内存分配策略分配相应的内存区域,并启动相应的后台进程,换而言之,就是创建了实例的 instance。 show parameter spfile
startup mount阶段,Oracle继续根据参数文件上描述的控制文件的名称及位置,去查找控制文件, 一旦查找到立即锁定该控制文件。控制文件里记录了数据库中数据文件、日志文件、检查点信息等非常 非常重要的信息,所以Oracle成功锁定控制文件,就为后续读取操作这些文件打下了基础,锁定控制文 件成功就表示数据库mount成功,为实例和数据库之间桥梁的搭建打下了基础。
alter database open阶段,根据控制文件记录的信息,定位到数据库文件、日志文件等,从而正式 开通了实例和数据库之间的桥梁。
(5)文件的体会
show parameter spfile; 参数文件位置
show parameter control 控制文件位置
select file_name from dba_data_files; 数据文件位置
select group#,member from v$logfile; 日志文件位置
show parameter recovery 归档文件位置
show parameter dump 告警日志文件
lsnrctl status,查看监听的状态命令
lsnrctl stop,关闭监听的命令
lsnrctl start,开启监听的命令
3、体系学习让SQL性能提升千倍
共享池中缓存下来的SQL语句以及HASH出来的唯一值,都可以在v$sql中对应的SQL_TEXT和SQL_ID字段中查询到,而解析的次数和执行的次数可以从PARSE_CALLS和EXECUTIONS字段中获取。
(1)substitution variables(替换变量)
use substitution variables to supplement the following: where conditions、order by clauses、column expressions、table names、entire select statements
select order_no from t_order where order_no=&order_no
(2)绑定变量优化 批量提交
二、逻辑体系
数据库(DATABASE)由若干表空间(TABLESPACE)组成,表空间(TABLESPACE)由若干段(SEGMENT)组成,段(SEGMENT)由若干区(EXTENT)组成,区(EXTENT)又是由Oracle的最小单元块(BLOCK)组成。块、区、段、表空间。
1、数据块(数据块头、表目录区、行目录、可用空间、行数据区域)
数据块头(包含了此数据块的概要信息,例如 块地址 及此数据块所属的段(segment)的类型(比如到底是表还是索引);表目录区,只要有一行数据插入到数据库块中,那该行数据所在的表的信息将被存储到这个区域;行目录,存放你插入的行的地址;可用空间区;行数据区域,存储具体的行的信息或者索引的信息,这部分占用了数据块绝大部分的空间。
2、段、区
EXTENT是Oracle数据库分配空间的最小单位,请注意分配这两个字眼。
在Oracle数据库中,只要segment创建成功,数据库就一定为其分配了包含若干个数据块(data block)
的初始数据扩展(initial extent);接下来T表(也就是segment T)中开始插入数据,很快初始数据扩展中的数据块都装满了,而且又有新数据插入需要空间,此时Oracle会自动为这个段分配一个新增数据扩展(incremental extent),这个新增数据是一个段中己有有数据扩展之后分配的后续数据扩展,容量大于或等于之前的数据扩展。
3、表空间(系统表空间、临时表空间、回滚表空间、数据表空间)
dba_tablespaces描述了数据库中所有表空间的信息
--查看block尺寸
show parameter db_block_size
select block_size from dba_tablespaces where tablespace_name='SYSTEM'
--查看不同表空间的相关信息
select file_name,tablespace_name,autoextensible,bytes from dba_data_files
select file_name,bytes,autoextensible from dba_temp_files
select sum(bytes/1024/1024 from dba_free_space where tablespace_name='';
show parameter undo
select tablespace_name,sum(bytes)/1024/1024 from dba_temp_files
select DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE from dba_uses where username=''
--切换所有用户到指定临时表空间
alter database default temporary tablespace temp_ljb
临时表空间的应用
Oracle可以为每个用户指定不同的临时表空间,每个临时表空间的数据文件都在磁盘的不同位置 上,这样可以有效地避免IO竞争。
在Oracle 10以后推出的临时表空间组,可以做到为同一用户的不同SESSION设置不同的临时表空 间,这可以说在缓解IO竞争方面再次迈出了大大的一步。
create temporary tablespace temp1 ' ' size 100M tablespace group temp_grp1;
create temporary tablespace temp2 ' ' size 100M tablespace group temp_grp1;
--把临时表空间移到TMP_GRP1组里
alter tablespace temp_ljb tablespace group temp_grp1
--把ljb用户的默认临时表空间TEMP_LJB更改为临时表空间组temp_grp1
alter user LJB temporary tablesapce temp_grp1
all_tables
select username,session_num,tablespace from v$sort_usage
4、PCTFREE与性能
行迁移:当一个行上的更新操作(原来的数据存在且没有减少)导致当前的数据不能在容纳在当前块,我们需要进行行迁移。一个行迁移意味着整行数据将会移动,仅仅保留的是一个转移地址。因此整行数据都被移动,原始的数据块上仅仅保留的是指向新块的一个地址信息。
其实消除行迁移的一个简单方法,就是数据重建。
发现表是否存在迁迁移的方法:
@?/rdbms/admin/utlchain.sql --建立表
analyze table T_ORDER list chained rows into chained_rows
select count(*) from chained_rows where table_name='T_ORDER'
三、表的设计成就英雄
select a.name,b.value from v$statname a,v$mystat b where a.statistic#=b.statistic# and a.name='redo size'
产生日志的大小:利用v$statname和v$mystat两个动态性能视图来跟踪当前SESSION操作产生的日志量,使用方法简单:首次先执行该脚本,查看日志大小,随即执行更新语句,再执行该脚本返回的日志大小,两者相减,就是此次产生日志的大小。
1、delete与truncate
delete删除并不能释放空间,虽然delete将很多块的记录删除了,但是空块依然保留,Oracle在查询时依然会去查询这此空块。而truncate是一种释放高水平位的动作,这些空块被回收,空间也就释放了。
不过truncate显然不能代替delete,因为truncate是一种DDL操作而非DML操作,truncate后面是不能带条件的,truncate table t where...是不允许的。但是如果这些whete条件能形成有效的分区,Oracle是支持在分区表中做truncate分区的,命令大致为alter table t truncate partition '分区名',如果whete条件就是分区条件,那等同于换角度实现了truncate table where ...的功能。
2、全局临时表
从数据安全性来看,对表记录的操作写日志是不可避免的,否则备份恢复就无从谈起了,只是现实中我们真的有一部分应用对表的某些操作是不需要恢复的,比如运算过程中临时处理的中间结果集,这时我们就可以考虑用全局临时表来实现。
全局临时表分为两种类型,一种是基于会话的全局临时表(commit preserve rows),一种是基于事务的全局临时表(on commit delete rows)。
create global temporary table T_TMP_session on commit preserve rows as select * from dba_objects where 1=2;
create global temporary table t_tmp_transaction on commit delete rows as select * from dba_objects where 1=2; 无论插入更新还是删除,操作普通表产生的日志都比全局临时表要多。
四、索引天下妙不可言
谁能深刻地理解和掌握索引的知识,谁就能在数据库相关工作中发挥巨大的作用。
五、宝典、规范让你少做事
--查看具体SQL占用了temp表空间
SELECT
SQL.SQL_ID, T.BLOCKS*16/1024/1024, S.USERNAME, S.SCHEMANAME,
T.TABLESPACE, T.SEGTYPE, T.EXTENTS, S.PROGRAM,
S.OSUSER, S.TERMINAL, S.SID, S.SERIAL#,SQL.SQL_TEXT
FROM V$SORT_USAGE T,V$SESSION S,V$SQL SQL WHERE T.SESSION_ADDR=S.SADDR AND T.SQLAD DR=SQL.ADDRESS AND T.SQLHASH=SQL.HASH_VALUE;