学习oracle的目的:
一致性
性能
一致性的要求优先于性能
处理模型
C/S模型
客户端:用户和用户进程
服务器端:服务器进程、实例和数据库本身
概念:
实例/instance: 后台进程+共享内存 用于管理和控制数据库
数据库/database: 物理文件的集合 为实例提供数据,如数据文件,控制文件,参数文件,日志文件等
数据库服务器/database server: 软件+实例+数据库
oracle数据库环境有以下两部分:
oracle软件,存放在服务器本地硬盘上
oracle数据库,存放在共享存储上
实例
oracle数据库启动后首先在内存中划分一片空间,并启动一些进程,而内存和进程统称oracle数据库实例,数据库关闭后,实例就被关闭
一个数据库可以对应多个实例,如两个,四个等,一般没有单数的。用户可以通过连接到的实例访问数据库,可以实现负载均衡,提高并发等的效果,这种结构叫做oracle的RAC技术。
[oracle@localhost ~]$ ps -ef | grep ora
[oracle@localhost ~]$ ipcs
SQL> startup;
然后再次查看进程和内存相关的信息,即可发现进程和内存中有了oracle相关的信息
oracle启动后在内存中独享一块内存区域。
连接/connection:
连接是从客户端到Oracle 实例的一条物理路径。连接可以在网络上建立,或者通过IPC 机制建立。通常会在客户进程与一个专用服务器或一个调度器之间建立连接。
会话/session:
会话是实例中存在的一个逻辑实体。这就是你的会话状态(session state),也就是表示特定会话的一组内存
中的数据结构.提到”数据库连接”时,大多数人首先想到的就是“会话”。在服务器中的会话上执行SQL、提交事务和运行存储过程。
进程/process:
指定了一个实例在操作系统级别能同时运行的进程数,包括后台进程与服务器进程。
由上面的分析可知,一个服务器/前台进程可能同时对应对个会话,因此通常sessions的值是大于processes的值
通常的设置公式
Oracle 11g R1以及之前版本
sessions=(1.1 * processes) + 5
Oracle 11g R2
sessions=(1.5 * processes) + 22
SQL> shutdown immediate;
[oracle@localhost ~] sqlplus/nolog[oracle@localhost ] s q l p l u s / n o l o g [ o r a c l e @ l o c a l h o s t ] ps -ef | grep ora
SQL> CONN SCOTT/orcle;
SQL> SELECT SID,SERIAL#,USERNAME FROM V$SESSION WHERE USERNAME IS NOT NULL;
SQL> ho ps -ef | grep ora
SQL> select name,value from v parameterwherename=′processes′;SQL>selectname,valuefromv p a r a m e t e r w h e r e n a m e = ′ p r o c e s s e s ′ ; S Q L > s e l e c t n a m e , v a l u e f r o m v parameter where name=’sessions’;
SQL> select (1.5*150)+22 from dual;
320 504
oracle的体系结构主要分三类
内存结构
进程结构
存储结构
概览:
内存结构
SGA: 系统/共享全局区
Shared Pool/共享池
Database Buffer Cache/数据库缓冲区高速缓存
Redo Log Buffer/重做日志缓冲区
Large Pool/大池
Java Pool/JAVA池
Streams Pool/流池
…
PGA: 进程/私有全局区
Private SQL area
Session memory
…
存储结构
物理存储结构
控制文件
日志文件
数据文件
逻辑存储结构 表空间,,段 区,,块
进程结构
服务器进程(前台进程): Server Process
后台进程:
DBWn/数据库写进程
LGWR/日志写进程
ARCn/归档写进程
SMON/系统监视器
PMON/进程监视器
RECO/恢复进程
CKPT/检查点进程
SQL> SHOW PARAMETER MEMORY_TARGET
SQL> show parameter memory_max_target
AMM在后台会启动一个内存管理(Memory Manager,mman)的进程
########### #####
留存,。。。
内存管理形式
自动内存管理
自动SGA管理
手工SGA管理
自动PGA管理
手动PGA管理
SQL> show parameter target;
SQL> show parameter lock_sga
SQL> alter system set sga_target=1024 scope=both;
SQL> alter system set memory_target=0 scope=both;
SQL> show parameter target;
SQL> alter system set sga_target=0 scope=both;
SQL> alter system set memory_target=0 scope=both;
SQL> show parameter target;
SQL> show parameter workarea_size_policy
SQL> show parameter workarea_size_policy
alter system set memory_max_target=100 scope=sfile;
SGA 系统/共享全局区,所有的进程可以访问,共享访问。
最容易出问题的就是共享池和高速缓存。
SQL> SHOW PARAMETER SGA;
NAME TYPE VALUE
lock_sga boolean FALSE #是否锁定在物理内存上
pre_page_sga boolean FALSE #实例启动时,是否加载所有的内存
sga_max_size big integer 1584M #最大的sga内存
sga_target big integer 0 #表示进行自动内存管理
Shared Pool 实现代码的共享和重用
包含三部分:
库缓存(Library Cache)
用于存储SQL语句及相关的解析,执行计划,PL/SQL程序块等
共享SQL区
存放语法分析结果和执行计划等
私有SQL区
存放绑定变量,环境和会话信息等
数据字典缓存(Data Dictionary Cache)
存放数据字典信息,包括表、视图等对象的结构信息,用户以及对象权限信息,按行(row)存储,所以也叫Row Cache
结果集(Result Cache)
缓存查询的结果,可以在服务器端缓存,也可以在客户端缓存
Database Buffer Cache
服务器进程,针对每一个连接启动一个服务器进程
数据在buffer cache,如果没有,就找dbf/数据文件
server process读取数据
dbw将修改后的数据写入数据文件
缓冲区状态:
已连接:正在进行读/写的瞬间
干净: 数据文件和内存中一致,该内存可以重用
空闲: 未使用的内存空间,该内存可以重用
脏: 内存中的数据发生了修改,需要写回dbf dirty block
如果没有空闲和干净的内存空间,则触发dbwn
Redo Log Buffer
buffer cache中的数据一旦有修改就会产生该日志
log buffer通过LGWR写入到redo log中,写满后会进行切换
ARCn将redo log归档到归档日志
Large Pool
RMAN备份恢复的时候
执行并行查询的时候
执行大量排序操作的时候
共享服务器的时候
Java Pool
存储过程可以使用java写
数据库内部存在jvm
Streams Pool
由Oracle Streams使用
SQL> col component for a30;
SQL> select component,current_size,min_size,max_size from v$sga_dynamic_components;
PGA 进程/私有全局区
作用:
PGA是服务器进程使用的内存空间,后台进程也有PGA
在PGA中进行数据排序
PGA只有服务器进程可以访问,独享内存空间
PGA和服务器进程是关键点
构成:
1、private SQL area
静态区: 会话结束释放
动态区: sql执行结束释放
2、Session Memory
3、SQL Work Areas(主要)
1、sort_area_size 排序空间大小
2、sort_area_retained_size 排序空间释放到的最小空间大小
3、hash_area_size 多表访问需要哈希空间
4、hash_join_enable 哈希空间相关
5、bitmap_merge_area_size 位图区
6、create_bitmap_area_size 位图区创建
7、open_cursors 一个会话可以执行的SQL的数量
8、_pga_max_size 每一个会话能分配的最大的PGA大小
手动指定空间时,如果在排序时需要的排序空间不够时,服务器进程会在临时数据文件上拿到空间再进行排序,在PGA中的排序叫内存排序,在临时数据文件中的排序叫磁盘排序,如果一次磁盘排序不够,还需要多次排序。
建议使用自动管理,我们只需要分配一个PGA总空间,其他的自动调整,但是在自动管理中,每个服务器进程能够使用的PGA空间仍然要有限制。
SQL> SHOW PARAMETER AREA;
可以看出,默认为自动
SQL> select name,value from v$pgastat where name in(‘maximum PGA allocated’,’total PGA allocated’);
SQL> col name for a20
SQL> col value for a20
SQL> col desc for a20
SQL> SELECT KSPPINM “Name”,ksppstvl/1024/1024 ||’M’ “Value”,
ksppdesc “Desc” from x ksppix,x k s p p i x , x ksppcv y
where x.indx = y.indx
and ksppinm = ‘_pga_max_size’;
生产环境中可根据上述查询结果来估算PGA空间大小。
SQL> alter system set 内存参数=大小
ora_XXXX_orcl
功能 实例名 sid
生产环境中,前台进程远远多于后台进程。
后台进程
DBWn: 将buffer cache中的脏数据写入到dbf中,只写不读。
执行时间点:
SQL> show parameter db_writer_processes;
SQL> alter system set db_writer_processes=20 scope=spfile;
alter system set db_writer_processes=20 scope=both;
SQL> alter system checkpoint;
socket 插槽数
core
LGWR: 将log buffer中的数据写入到redo log中。
LGWR触发条件:
1、用户提交
2、有三分之一的log buffer未被写入磁盘
3、有大于1M的log buffer未被写入磁盘
4、每隔三秒
5、DBWn需要写入的数据的SCN大于LGWR记录的SCN,触发LGWR写入,日志写入优先(Write-Ahead-Log)
CKPT: 周期性触发,更新检查点信息,更新到控制文件和每个数据文件头部。
检查点类型
完全检查点
执行ALTER SYSTEM CHECKPOINT
正常关闭实例
增量检查点
检查点队列
该队列是脏数据块所对应的buffer header,dbwn按照这个写
SMON: 主内,监控实例内部,实例恢复,如整理碎片,清理不使用的临时段。
PMON: 主外,监控用户连接
在用户进程失败时执行进程恢复
清除数据库缓冲区高速缓存
释放该用户进程使用的资源
监视会话是否发生空闲会话超时
将数据库服务动态注册到监听程序
ARCn: 将写满后的redo log写入到归档日志中。
可以收集事物处理重做数据,并将该数据传输到备用目标位置
MMON: 自我监视和自我管理支持进程
MMNL: MMON辅助进程
ADDM: 自动数据库诊断监视器
MMAN: 自动内存管理
LREG: 监听注册进程
前台进程
服务器进程
应用程序服务器产生到数据库服务器的连接,多个连接形成一个连接池。
sqlplus / as sysdba
此时,加上之前的那个连接总共两个连接。
用户的信息到达应用程序服务器后,由应用程序服务器随机选择连接到达数据库服务器,执行完成后,把执行结果返回给用户。
用户进程
用户客户端产生的进程,我们不关心。
逻辑结构
段、区、块
Segments/Extents/DataBlocks
从存储的角度只有段
记录到数据字典
创建段
表空间 tablespace
表空间是数据库的最大逻辑存储结构,和物理数据文件相对应,一个表空间可以由多个数据文件组成,一个数据文件只能属于一个表空间
主要的几个表空间:
SYSTEM: 系统表空间,用于存放内部表和数据字段的数据,如表名、列名、用户名。
#查看数据字典的信息
SQL> COL TABLE_NAME FOR A30
SQL> COL COMMENTS FOR A30
SQL> SELECT * FROM DICT;
#查看数据库内部表的信息
SQL> COL VIEW_NAME FOR A30
SQL> COL VIEW_DEFINITION FOR A30
SQL> SELECT * FROM V$FIXED_VIEW_DEFINITION;
SYSAUX: 系统辅助表空间,由ORACLE自行维护
UNDO: 存放撤销信息的表空间
USERS; 建议用户使用的表空间,scott用户的表就在这个表空间上
建议:不同应用系统存放在不同的表空间上,不同的表空间的文件放在不同的磁盘上,减少并发,提高性能。
段 一个独立的逻辑存储结构,用于存储表、索引或簇等占用空间的对象,一个段只能属于一个数据库对象
有以下几种段:
数据段
数据段存放的是数据表中的数据,数据段的增大时向数据段增加区,创建表时,系统自动创建一个同名的段
索引段
包含了用于提高系统性能的索引,一旦建立索引,系统自动创建一个同名的索引段
回滚段
也叫撤销段,该段保存了回滚的条目,oracle将修改前的旧数据存放在回滚段中,利用这个,可以撤销未提交的操作
临时段
当执行创建索引、查询等操作时,系统会使用一些临时空间用来保存解析过的查询语句以及在排序过程中产生的临时数据
区 段空间分配时最小的单位,由连续的数据块组成
块 组成区的最小单位,通常是操作系统数据块的整数倍,ORACLE支持同时使用多种大小
#查看标准数据库块大小
SQL> COL NAME FOR A30
SQL> COL VALUE FOR A30
SQL> SELECT NAME,VALUE FROM V$PARAMETER WHERE NAME=’db_block_size’;
块组成部分:
块头 存放数据块的基本信息,如块的物理地址,块所属段的类型
表目录 如果是数据表,存放数据表的相关信息
行目录 如果有行数据,那么存储行信息
空余空间 新行插入和存在行的更新
行数据 存放表数据和索引数据
表空间: 大于数据文件的逻辑概念
分类:
基本表空间: 一般为用户使用的永久性表空间,存储用户永久性数据
临时表空间: 临时表空间是一个磁盘空间,存储用户在执行ORDER BY等语句进行排序或汇总时产生的临时数据,默认情况下所有用户都使用temp作为默认的临时表空间,也允许使用其他临时表空间作为默认临时表空间,需要在创建用户时指定
大文件表空间: 存储大型数据
非标准数据块表空间:在一个实例中创建数据库大小不同的表空间
撤销表空间:存储事务的撤销数据,在数据恢复时使用,一个数据库中可以有多个撤销表空间,但是数据库一次只能使用一个,默认使用自动创建的undotbs撤销表空间。
默认:
SYSTEM: 数据字典
SYSAUX: 辅助系统表空间
UNDOTBS1: UNDO回滚段,存储修改前的数据
TEMP: 临时表空间,会话使用
USERS:
状态属性:
ONLINE: 在线,允许访问该表空间中的数据
OFFLINE: 离线,不允许访问该表空间的数据
READ ONLY: 只读,只允许读
必须处于ONLINE状态
不能包含任何事务的回滚段
不能处于在线备份期间
READ WRITE: 读写,可以读写
必须处于ONLINE状态
SQL> select tablespace_name,contents from dba_tablespaces;
SQL> col file_name for a50
SQL> set linesize 300
SQL> select distinct file_name,tablespace_name from dba_data_files;
SQL> SELECT SEGMENT_TYPE,SEGMENT_NAME,OWNER FROM DBA_SEGMENTS WHERE TABLESPACE_NAME=’USERS’;
SQL> create table hehe (c1 varchar2(10)) segment creation immediate;
SQL> select tablespace_name,extent_id,bytes,file_id,block_id from dba_extents where segment_name=’HEHE’;
SQL> select name from v$datafile where file#=&file_id;
SQL> select block_size * &block_id from dba_tablespaces where tablespace_name=’&tablespace_name’;
SQL> create tablespace newtab datafile ‘/u01/app/oracle/oradata/orcl/newtab01.dbf’ size 10m extent management local autoallocate segment space management auto;
SQL> create table newtable(c1 date) tablespace newtab;
SQL> select extent_id,segment_name,segment_type,tablespace_name,bytes from dba_extents where segment_name=’NEWTABLE’;
SQL> alter table newtable allocate extent;
SQL> alter tablespace newtab offline;
SQL> insert into newtable values(sysdate);
SQL> alter tablespace newtab online;
SQL> insert into newtable values(sysdate);
SQL> alter tablespace newtab read only;
SQL> insert into newtable values(sysdate);
SQL> alter tablespace newtab read write;
SQL> insert into newtable values(sysdate);
?将表空间脱机或者只读后,可以删除表吗?
SQL> select tablespace_name,status from dba_tablespaces;
SQL> alter tablespace newtab add datafile ‘/u01/app/oracle/oradata/orcl/newtab02.dbf’ size 50m;
SQL> select distinct file_name,tablespace_name,autoextensible from dba_data_files;
SQL> alter database datafile ‘/u01/app/oracle/oradata/orcl/newtab02.dbf’ autoextend on next 50m maxsize 2g;
SQL> alter database datafile ‘/u01/app/oracle/oradata/orcl/newtab02.dbf’ resize 70m;
SQL> drop tablespace newtab including contents and datafiles;
段管理
使用自动段管理,使用位图进行管理
SQL> select tablespace_name,segment_space_management from dba_tablespaces;
手动转换自动请新创建表空间。
区管理
区管理方法为每个表空间设置,应用于表空间中的所有段,可使用字典管理或者本地管理,但是请不要使用字典管理。
字典管理:
使用两张表对区进行管理
本地管理:
使用位图来管理区
使用uniform size指定每次分配的区大小
SQL> create tablespace dabiao datafile ‘/u01/app/oracle/oradata/orcl/dabiao_01.dbf’ size 5g extent management local uniform size 150m;
SQL> select name,bytes/1024/1024 from v$datafile
SQL> select tablespace_name,next_extent,min_extlen from dba_tablespaces;
SQL> create tablespace xiaobiao datafile ‘/u01/app/oracle/oradata/orcl/xiaobiao_01.dbf’ size 2g extent management local uniform size 150k;
SQL> select name,bytes/1024/1024 from v$datafile;
SQL> select tablespace_name,next_extent,min_extlen from dba_tablespaces;
SQL> create tablespace xiaobiao1 datafile ‘/u01/app/oracle/oradata/orcl/all_01.dbf’ size 2g extent management local autoallocate;
物理结构
数据文件
操作系统块 os blocks
数据库的几类文件
CONTROL FILE 控制文件 在线
DATA FILE 数据文件 在线
REDO LOG FILE 重做日志文件 在线
PARAMETER FILE 参数文件 在线
ARCHIVE LOG FILE 归档日志文件 离线
PASSWORD FILE 密码文件 离线
alert file 告警文件
trace file 追踪文件
在线文件 文件实时改变,不能进行操作
离线文件 文件生成后不会改变
安全:
复用:一个不行就两个
分散:一个地方不保险就整两个地方
作用:
用于记录数据库的物理结构,属于重要角色,没有控制文件,实例立即崩溃,数据库的启动和正常运行都离不开控制文件。
包含的内容:
数据库物理结构信息
数据库归档历史信息
各个数据文件的SCN号和系统检查点信息
RMAN元数据
性质:
控制文件是一个二进制文件,不可以通过文本编辑器编辑,该文件由oracle自行维护,oracle建议至少有两份冗余,并且放在不同的磁盘上。
查看:
SQL> show parameters control_files;
SQL> select * from v$controlfile;
默认块大小为16K
作用:
用来存储实际数据,数据文件是存储数据的物理概念。
查看:
SQL> col name for a50
SQL> select file#,name,status from v$datafile;
SQL> select * from dba_data_files;
SQL> select * from dba_temp_files;
数据文件的状态
ONLINE: 联机状态
OFFLINE: 脱机状态
OFFLINE DROP: 删除数据文件
将数据文件OFFLINE时,不影响表空间的状态,但是表空间的状态会影响到数据文件的状态。
作用:记录数据文件的每一个变化过程,保证数据库一致性
包含:
三组redo log
每组中有多个成员
成员和成员之间是完全相同的关系
无需备份,无法备份
使用复用来保护
状态:
unused 刚启用的时候,还没有循环过来
inactive 没有启用
ctive 启用
current 当前
丢失:
unused 不影响
inactive 不影响
active 数据库不会立即崩溃,此时,如果数据库正常关闭,则没有影响
数据库立即崩溃则会存在问题
current 数据库立即崩溃,会导致数据库损坏
数据库运行时,数据文件严重不一致。
数据文件的一致性依赖于redo log,当数据库异常崩溃时,需要使用redo log来构造脏块进行实例恢复。
产生过程:
当有连接到数据库,服务器进程会将数据文件中的数据读取到buffer cache,服务器进程会忠实地严格按照时间点将buffer cache中的数据块的改变记录到PGA,当满足条件时,写入到log buffer,lgwr会将log buffer中的数据记录到redo log中,redo log有三份,写满第一份,然后切换到第二份,写满继续切换,而arcn进程将redo log再写入到归档日志中。
记录的东西:
1、buffer数据块地址
2、时间点
3、做了什么改变,增加/删除,有修改吗?
oracle会产生大量的日志,日志会有I/O,也会存在性能问题。
日志工作机制:归档
所有已提交事务,oracle保证不丢失。
日志写入优先。
事务:一条或者多条增删改语句组成事务,事务的范围为两个commit之间的范围。
事务的一致性非常重要。
1)在提交事务的时候写入dbf数据文件,但是会有性能和用户体验的问题
2)提交事务会产生大量日志,日志通过PGA到达log buffer,而log buffer因为时间和空间大小等限制通过lgwr快速写入到redo log。
3)提交的时候触发lgwr将log buffer写入到redo log。
SQL> grant select on sh.sales to scott;
SQL> create table mysales as select * from sh.sales;
SQL> delete from mysales;
SQL> COMMIT;
日志实现了快速提交。
缓存有两种:
读缓存:读取数据的时候可以在缓存中找,写的时候必须直接修改磁盘,将会产生磁盘I/O
写缓存:oracle通过日志实现了写缓存,buffer cache提高了读和写的性能。
oracle只有buffer cache和存储的缓存提供了写缓存,而硬盘只有读缓存。
lgwr会绕过文件系统的缓存直接写入到存储的缓存。
buffer 缓冲区
cache 缓存处
优化:
1、日志写入频繁需要磁盘的IOPS较高,上千次起。
2、每次写入量小
3、顺序写,无需条带化,可以raid10和raid01
大小:
9i以前一般为3M
10g以后会自动调整
SQL> select * from v$sgainfo where name in (‘Fixed SGA Size’,’Redo Buffers’,’Granule Size’);
v$sgainfo?
日志组
SQL> SET LINESIZE 300
SQL> select * from v$log;
通过查询发现,默认有三个日志组,每个组有一个成员。
SQL> COL MEMBER FOR A50
SQL> select * from v$logfile;
通过查询可以查看日志组的成员路径。
每组中可配置多个,每个成员完全一样,互为备份。
日志文件的重要性高于数据文件。
redo log切换时间尽可能不低于10-20分钟
SQL> SELECT TO_CHAR(FIRST_TIME,’YYYY-MM-DD HH24:MI:SS’) F_TIME,SEQUENCE# FROM V$LOG_HISTORY;
通过调整大小来测试日志文件的切换时间。
如果没有结果,说明日志还没切换,使用手工多切换几次。
SQL> ALTER SYSTEM SWITCH LOGFILE;
相关操作语句
SQL> ALTER DATABASE ADD LOGFILE GROUP 5 ‘/u01/app/oracle/oradata/orcl/redo05_1.log’ SIZE 50M;
SQL> ALTER DATABASE ADD LOGFILE MEMBER ‘/u01/app/oracle/oradata/orcl/redo05_2.log’ TO GROUP 5;
SQL> ALTER SYSTEM SWITCH LOGFILE;
SQL> select * from v$logfile;
select GROUP#,SEQUENCE#,BYTES,BLOCKSIZE,MEMBERS,STATUS,FIRST_CHANGE#,NEXT_CHANGE#,NEXT_TIME from v$log;
[oracle@localhost ~] ll l l ORACLE_HOME/dbs
动态参数文件为spfileorcl.ora
静态:9i之前,文本文件
在启动的时候读取该文件,根据该文件设置实例,读取内容到内存,关闭该文件,不再使用,如果要改参数,只能重启数据库才能生效。
动态:9i之后,二进制文件,不要用vim编辑该文件
可以动态修改,不是所有的参数都可以动态修改。
查找顺序:
启动的时候根据 ORACLESID设置的SID的名称在dbs目录下查找到spfile O R A C L E S I D 设 置 的 S I D 的 名 称 在 d b s 目 录 下 查 找 到 s p f i l e ORACLE_SID.ora文件,如果没有就查找init ORACLESID.ora文件。环境变量 O R A C L E S I D . o r a 文 件 。 环 境 变 量 ORACLE_SID在oracle用户的~/.bash_profile文件中配置。
SQL> select name,value from v$parameter;
SQL> select name,value from v$spparameter;
SQL> select name,value from v$parameter where isbasic=’TRUE’;
[oracle@localhost dbs] exportORACLESID=haha[oracle@localhostdbs] e x p o r t O R A C L E S I D = h a h a [ o r a c l e @ l o c a l h o s t d b s ] echo $ORACLE_SID
[oracle@localhost dbs]$ sqlplus / as sysdba
SQL> startup;
可以发现实例启动失败,因为没有找到参数文件
修改参数文件
ALTER SYSTEM SET = SCOPE = MEMORY | SPFILE | BOTH
默认为both,静态参数要指定spfile
静态参数文件和动态参数文件的互相转换
SQL> create pfile from spfile;
[oracle@localhost ~] ll l l ORACLE_HOME/dbs
initorcl.ora为静态参数文件
SQL> create spfile from pfile;
[oracle@localhost ~] ll l l ORACLE_HOME/dbs
spfileorcl.ora为动态参数文件
参数类型
详情见官方手册All Books–>Reference–>V$PARAMETER
选项ISSYS_MODIFIABLE定义了值变更后如何才能生效
IMMEDIATE为立即生效
DEFERRED为新建会话生效
FALSE为重启实例生效
强烈建议使用sql developer工具
SQL> select name,value,issys_modifiable from v$parameter; 没看成 ,,,
修改参数
因为参数在动态参数文件和内存中都有,所以语法如下:
ALTER SYSTEM SET PARAMETER_NAME=parameter_value [comment=’注释’] scope=[memory|spfile|both] [sid=’sid’|’*’]
memory表示只修改内存中的参数值,重启实例后就消失。
spfile表示只修改参数文件,下次重启生效
both表示两个都修改,默认。
会话级别:
SQL> alter session set nls_date_format=’yyyy-mm-dd’;
SQL> select sysdate from dual;
SQL> exit
[oracle@localhost ~]$ sqlplus / as sysdba
SQL> select sysdate from dual;
系统级别:
alter system set sga_max_size=2048000000 scope=both;
返回错误提示,表示不能两个都修改
alter system set sga_max_size=2048000000 scope=spfile;
语句执行正常。
[oracle@localhost dbs]$ rm -rf initorcl.ora
SQL> startup;
返回错误提示,表示SGA_MAX_SIZE的值不能超过MEMORY_TARGET的值
我们需要修改参数文件,而数据库无法启动便无法修改参数文件,出现矛盾。
解决办法为由动态参数文件生成静态参数文件,修改静态参数文件即可
SQL> create pfile from spfile;
[oracle@localhost ~] ll l l ORACLE_HOME/dbs
initorcl.ora为静态参数文件
修改SGA_MAX_SIZE的值符合要求,保存退出。
SQL> create spfile from pfile;
SQL> startup;
即可正常启动
SQL> col IN_EFFECT FOR A20;
SQL> COL IN_FILE FOR A20;
SQL> select p.value in_effect,s.value in_file from v parameterpjoinv p a r a m e t e r p j o i n v spparameter s on p.name=s.name where p.name=’db_file_multiblock_read_count’;
SQL> alter system set db_file_multiblock_read_count=16 scope=memory;
SQL> alter system set db_file_multiblock_read_count=64 scope=spfile;
SQL> select p.value in_effect,s.value in_file from v parameterpjoinv p a r a m e t e r p j o i n v spparameter s on p.name=s.name where p.name=’db_file_multiblock_read_count’;
SQL> alter system set db_file_multiblock_read_count=16 [scope=all];
OR 重设
SQL> alter system reset db_file_multiblock_read_count;
SQL> alter system set log_buffer=10m;
这是一个静态参数,所以会失败
环境变量
export ORACLE_BASE=/u01/app/oracle 所有oracle软件安装的路径
export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1 所有软件安装的目录
export ORACLE_SID=orcl
export PATH= PATH: P A T H : ORACLE_HOME/bin
export NLS_LANG=”SIMPLIFIED CHINESE_CHINA.UTF8”
注意sqlplus登录时的提示语言
无需再使用. oraenv来配置环境变量
hash 实现缓存管理
哈希
缓存,命中率相当高,在hash表中保存了执行过的所有的路径,当缓存很大时,一定比PATH查找速度快吗?
hash 命令哈希
-p /bin/ls haha 添加哈希表
-t ls 查看指定命令的哈希表
-d ls 删除指定命令的哈希表
-r 清空所有的hash表
启动和关闭
实例启动:
第一阶段:启动实例
SQL> startup nomount;
找到参数文件,根据参数文件,划分内存空间和启动数据库进程
[oracle@localhost ~]$ ps -ef
[oracle@localhost ~]$ ipcs -a
SQL> desc v$parameter;
SQL> show parameter control;
第二阶段:打开控制文件
SQL> alter database mount;
根据参数文件中的设置,找到控制文件,打开控制文件.
第三阶段:打开数据库
SQL> alter database open;
根据控制文件打开数据文件和redo log文件。
实例关闭
有四个选项可以选择
默认是normal
1、abort
模拟突然掉电
内存被清空、内存中的数据没有写入数据文件
事务被立即中断
没有提交、没有回滚
2、immediate
强制中断当前正在运行的所有事务,回滚这些事务
回滚完毕,强制中断所有的连接
将实例中的所有数据写入数据文件
3、transactional
等待正在运行的事务,一直到他们提交或者回滚
所有事务主动结束以后(提交或者回滚),强行中断连接
将实例里面的数据写入数据文件
清空缓存
如果有事务一直没有提交或者回滚,实例无法关闭
4、normal
等待事务的主动提交或者回滚
等待用户主动断开连接
如果有一个用户没有断开连接,那么数据库无法关闭
通常,2/3/4被认为是干净的,一致的,有序的关闭,关闭时,PMON会回滚未结束的事务,CKPT进程会执行完全检查点,通知DBWn进程将所有脏块写入数据文件,LGWR将log buffer中的内容写入redo log
startup force命令是先执行shutdown abort,再执行startup,被认为是不安全的
归档日志
SQL> select log_mode from v$database;
SQL> SHOW PARAMETER LOG_ARCHIVE_DEST;
SQL> show parameter log_archive;
在root 下
mkdir /data/archive/2 -p
chown oracle:oinstall /data/ -R
chmod 777 /data/
在oracle下
cd /u01/app/oracle/
mkdir data
mkdir data/archive/1 -p
mkdir data/archive/3 -p
SQL> alter system set log_archive_dest_1=’location=/u01/app/oracle/data/archive/1’ scope=spfile;
SQL> alter system set log_archive_dest_2=’location=/data/archive/2’ scope=spfile;
SQL> alter system set log_archive_dest_3=’location=/u01/app/oracle/data/archive/3’ scope=spfile;
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter database open;
SQL> select log_mode from v database;SQL>selectarchiverfromv d a t a b a s e ; S Q L > s e l e c t a r c h i v e r f r o m v instance;
SQL> alter system switch logfile;
SQL> select name from v$archived_log;
[oracle@localhost dbs]$ ll /data/archive/{1,2}
SQL> alter system set log_archive_max_processes=3;
SQL> alter system set log_archive_dest_state_1=defer scope=pfile;
alter system set log_archive_dest_state_2=defer;
alter system set log_archive_dest_state_3=defer;
SQL> alter system set log_archive_dest_2=enable;
服务器参数文件
SQL> SELECT NAME,VALUE,ISMODIFIED FROM V$PARAMETER;
SQL> SHOW PARAMETER;
其他文件
密码文件
作用:主要进行DBA权限的身份认证
DBA用户:具有sysdba,sysoper权限的用户被称为dba用户。默认情况下sysdba角色中存在sys用户,sysoper角色中存在system用户
Oracle的两种认证方式;
1.使用与操作系统集成的身份验证
2.使用Oracle数据库的密码文件进行身份认证
密码文件的位置
Linux下的存放位置: ORACLEHOME/dbs/orapw O R A C L E H O M E / d b s / o r a p w ORACLE_SID
即:/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapworcl
Windows下的存放位置:$ORACLE_HOME/database/PWD%ORACLE_SID%.ora
警告文件
作用:记录oracle的运行信息和错误信息,如数据库启动、关闭,建立表空间,增加数据文件,空间扩展失败,实例启动失败等
SQL> show parameter background
/u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
告警日志是应用于实例和数据库的关键操作的连续记录,名称为alert_SID.log.
包括的关键操作:
所有启动和关闭命令,包括中间命令,如ALTER DATABASE MOUNT
实例的所有内部错误
任何检测到的数据块损坏情况
任何已经发生的记录锁定死锁
影响数据库物理结构的所有操作,如创建或重命名数据文件
调整初始化参数的操作
所有日志开关和日志归档
追踪日志
追踪日志由各个后台进程生成,一般在遇到错误时生成,所在目录和告警日志一起
SQL> select value from v$parameter where name=’background_dump_dest’;
[oracle@localhost trace]$ tail -f alert_orcl.log
SQL> shutdown immediate;
SQL> startup;
跟踪文件
后台进程跟踪文件
SQL> show parameter background
/u01/app/oracle/diag/rdbms/orcl/orcl/trace/.trc
用户进程跟踪文件
SQL> show parameter background
/u01/app/oracle/diag/rdbms/orcl/orcl/trace/ora.trc