第三章Oracle 实例管理
<h1>Oracle 实例管理</h1>
<ul>
<li>数据库管理员最重要的日常工作之一,其中包括:
初始化参数文件的管理和维护
各种不同的方式启动或关闭Oracle Instance
对Oracle Instance 所出现的问题进行诊断和维护</li>
</ul>
<h2>3.1 初始化参数文件(initialization parameter files)</h2>
<ul>
<li>Oracle 数据库最重要的文件之一,实例启动时Oracle 将读入该文件的每个参数项,并使用这些参数来设置Oracle Instance。</li>
<li>Oracle 数据库中有两类型的参数:
显式:在初始化参数文件中有一个参数项。
隐式:在初始化参数文件中没有参数项,但使用Oracle 默认值。</li>
<li>可以有多个初始化参数文件,但是每次实例启动时只能读取一个初始化参数文件,不同的使用时段可能要切换其他初始化参数文件。</li>
<li>两种不同参数类型的初始化参数文件。
静态参数文件(PFILE):该文件为正文文件。文件名一般为initSID.ora.
动态参数文件(SPFILE):该文件为二进制文件。文件名一般为spfileSID.ora</li>
<li>8i和以前的产品只能使用静态参数文件,9i及以后的版本中可以使用静态初始参数文件,也可以使用动态服务器参数文件。</li>
<li>初始化参数文件的内容包括:
实例名和与该实例相关的数据库名。
控制文件的名称和位置。
系统全局区的配置,如shared pool 的配置。
还原段(回滚段)的配置。
该实例所能同时启动的进程数。
标准数据块的大小。
是否允许DBA远程登陆。</li>
</ul>
<h2>3.2 静态参数文件</h2>
<ul>
<li>查看静态参数文件:文件默认在$ORACLE_HOME/dbs 目录下
<pre><code>[oracle@oracle dbs]$ pwd
/u01/app/oracle/product/12.2.0/db_1/dbs
[oracle@oracle dbs]$ ls
D:tablespacesmldn_data01.dbf hc_orcl.dat lkORCL spfileorcl.ora
D:tablespacesmldn_temp01.dbf init.ora logfile
D:tablespacesmldn_temp02.dbf initorcl.ora orapworcl
[oracle@oracle dbs]$ cat initorcl.ora </code></pre></li>
</ul>
<h2>3.3 静态参数文件的创建和例子</h2>
<ul>
<li>安装完数据库就自动创建了一个样本初始化参数文件init.ora,之后可以复制一个:
<code>[oracle@oracle dbs]$ copy init.ora $ORACLE_HOME/dbs/initorcl.ora</code></li>
<li>查看静态参数文件:各项的值意思,略有不同。</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align: left;">name</th>
<th style="text-align: left;">type</th>
<th style="text-align: left;">value</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">show parameter;</td>
</tr>
<tr>
<td style="text-align: left;">Cache and I/O</td>
</tr>
<tr>
<td style="text-align: left;">db_block_size</td>
<td style="text-align: left;">integer</td>
<td style="text-align: left;">8192</td>
<td>标准数据块的大小(KB)</td>
</tr>
<tr>
<td style="text-align: left;">db_cache_size</td>
<td style="text-align: left;">big integer</td>
<td style="text-align: left;">12G</td>
<td>数据库高速缓冲区(database buffer cache)的大小</td>
</tr>
<tr>
<td style="text-align: left;">Database Identification</td>
</tr>
<tr>
<td style="text-align: left;">db_name</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">nvtdb02</td>
<td>数据库的名称</td>
</tr>
<tr>
<td style="text-align: left;">Diagnostice and Statistice</td>
</tr>
<tr>
<td style="text-align: left;">background_dump_dest</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">/u01/app/oracle/diag/rdbms/nvtdb02/NVTBISDB2/trace</td>
<td>数据库报警日志文件和后台进程追踪文件路径</td>
</tr>
<tr>
<td style="text-align: left;">user_dump_dest</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">/u01/app/oracle/diag/rdbms/nvtdb02/NVTBISDB2/trace</td>
<td>用户的追踪文件</td>
</tr>
<tr>
<td style="text-align: left;">File Configuration 两个控制文件路径</td>
</tr>
<tr>
<td style="text-align: left;">control_files</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">+DATA/nvtdb02/controlfile/current.264.1020758735,</td>
</tr>
<tr>
<td style="text-align: left;">control_files</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">+DATA/nvtdb02/controlfile/current.261.1020758735</td>
</tr>
<tr>
<td style="text-align: left;">Instance Identification -- 实例名</td>
</tr>
<tr>
<td style="text-align: left;">instance_name</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">NVTBISDB2</td>
</tr>
<tr>
<td style="text-align: left;">pools -- java池、大池、共享池大小</td>
</tr>
<tr>
<td style="text-align: left;">java_pool_size</td>
<td style="text-align: left;">big integer</td>
<td style="text-align: left;">512M</td>
</tr>
<tr>
<td style="text-align: left;">large_pool_size</td>
<td style="text-align: left;">big integer</td>
<td style="text-align: left;">1G</td>
</tr>
<tr>
<td style="text-align: left;">shared_pool_size</td>
<td style="text-align: left;">big integer</td>
<td style="text-align: left;">8G</td>
</tr>
<tr>
<td style="text-align: left;">Processes and Sessions -- 实例可最多开启2000个进程</td>
</tr>
<tr>
<td style="text-align: left;">processes</td>
<td style="text-align: left;">integer</td>
<td style="text-align: left;">2000</td>
</tr>
<tr>
<td style="text-align: left;">System Managed Undo and Rollback Segments</td>
</tr>
<tr>
<td style="text-align: left;">undo_management</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">AUTO</td>
<td>自动的还原段(回滚段)管理</td>
</tr>
<tr>
<td style="text-align: left;">undo_retention</td>
<td style="text-align: left;">integer</td>
<td style="text-align: left;">900</td>
<td>当某一事务(transaction)结束后其还原数据至少要保留900秒</td>
</tr>
<tr>
<td style="text-align: left;">undo_tablespace</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">UNDOTBS2</td>
<td>所使用的还原表空间</td>
</tr>
</tbody>
</table>
<h2>3.4 动态服务器参数文件</h2>
<ul>
<li>二进制文件,保存在服务器上,由Oracle 服务器自动维护,不可手动修改。</li>
<li>9i后引用,目的是能在不需要关闭和重启数据库的情况下修改实例或者数据库的配置。</li>
<li>另一好处是提供自我调优的能力,由于文件存放在服务器,因此恢复管理器(RMAN)可以备份这一参数文件。</li>
<li>存放路径:$ORACLE_HOME/dbs
<pre><code>[oracle@oracle dbs]$ pwd
/u01/app/oracle/product/12.2.0/db_1/dbs
[oracle@oracle dbs]$ ll
-rw-r----- 1 oracle oinstall 3584 Dec 21 20:38 spfileorcl.ora</code></pre></li>
</ul>
<h2>3.5 动态服务器参数文件的创建和参数的浏览</h2>
<ul>
<li>对应多哥的第四课:实例管理。内有说明动态静态文件的转换。</li>
<li>如果spfile文件破坏:先用spfile 转换成pfile,修改正确后再转换回spfile,替换重启能修复问题。</li>
<li>如果需要修改spfile 文件的参数,最好的办法是使用alter system set 这一Oracle 的sql命令,这样安全又简单。</li>
</ul>
<h2>3.6 启动数据库</h2>
<ul>
<li>startup命令执行顺序:
(1)首先使用服务器上的spfileSID文件启动实例。
(2)如果没有就使用默认的spfile文件启动实例。
(3)如果没有就使用initSID文件启动实例。
(4)如果没有就使用pfile文件启动实例(init.ora)。</li>
<li>startup 使用pfile 选项改变顺序:
<code>startup pfile='/u01/app/oracle/product/12.2.0/db_1/dbs/initorcl.ora'</code></li>
<li>startup NOMOUNT
只打开实例,连控制文件都不打开。
分配SGA、启动所需的全部进程、打开报警文件(alterSID.log)和追踪文件(trace)。</li>
<li>startup MOUNT
打开实例并打开控制文件
将数据库与已开启的实例关联起来。
利用初始化参数文件中的说明锁定并打开控制文件。
读控制文件以获取数据文件和重做日志文件的名称和状态信息,但并不检查这些文件是否存在。</li>
<li>startup OPEN
正常打开数据库的操作,打开启动数据库实例并打开控制文件。
打开所有联机数据文件。
打开所有的联机重做日志文件。
检查数据文件与联机重做日志文件是否存在,能不能打开,不存在报错。并检查数据库一致性。如有需要SMON后台进程则进行实例恢复。</li>
<li>使用命令修改数据库的状态:由NOMOUNT转为MOUNT,再转为OPEN。
<code>alter database open [READ WRITE] READ ONLY ;</code>--设置是可读可写。</li>
<li>只读状态不能产生重做日志信息,可进行如下操作:
执行查询。
使用本地管理的表空间来执行磁盘排序。
将数据文件脱机和联机,但不能对表空间进行这样的操作。
执行数据文件和表空间的脱机恢复。</li>
</ul>
<h2>3.7 将数据库置为限制模式</h2>
<ul>
<li>维护数据库的结构、对数据库进行导入和导出时可以限制模式来启动数据库。</li>
<li>限制模式下,只有具有RESTRICTED SESSION 权限的用户才可再登陆。</li>
<li>以限制模式启动数据库的命令:<code>startup restrict</code>。</li>
<li>修改数据库的状态为限制模式的命令:<code>alter system enable restricted session;</code>,新登陆的用户要有RESTRICTED SESSION 权限,已经登陆的用户无影响。</li>
<li>使用以上命令修改数据库的状态,不影响已经登陆的用户,所以要使用<code>alter system kill session;</code>命令来杀死已经登陆的用户。</li>
<li>修改为限制状态后再登记hr用户就有如下显示
<pre><code>[oracle@oracle ~]$ sqlplus hr/hr
ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege</code></pre></li>
<li>修改为正常状态:
<code>alter system disable restricted session;</code></li>
</ul>
<h2>3.8 关闭数据库</h2>
<ul>
<li>4种关闭数据库的方法
shutdown abort: 重启时要做数据恢复,强制退出。
shutdown Immediate: 没提交的数据进行回滚。
shutdown transactional: 等待提交结果。
shutdown normal: 等待会话结束。</li>
<li>使用以上命令没完成终止,导致oracle数据库异常。
lsnrct status 看到数据库状态locked
造成Oracle文件被lock,当我再次startup时,操作失败,因为文件依然被锁定状态。
报错ORA-01012: not logged on.</li>
<li>解决办法:杀掉Oracle 进程,重新开启
kill oracle 进程或者关掉oracle
<pre><code>ps -ef|grep ora_dbw0_$ORACLE_SID
kill -9 pid</code></pre></li>
</ul>
<h2>3.9 关闭数据库的实际例子</h2>
<ul>
<li>10g以上版本有几个默认登陆的用户,用<code>shutdown normal</code>命令要手动杀进程才能关闭。</li>
<li>做个测试shutdown transactional关闭的情况。</li>
</ul>
<h2>3.10 如何利用诊断文件来监督实例</h2>
<ul>
<li>
<p>11g的报警文件监控(实际工作)</p>
<pre><code>SQL> SELECT value FROM v$parameter where name='background_dump_dest';
/u01/app/oracle/diag/rdbms/dgnvtdb02/DGNVTBISDB/trace
[oracle@bisdbstdy /]$ cd /u01/app/oracle/diag/rdbms/dgnvtdb02/DGNVTBISDB/trace
[oracle@bisdbstdy trace]$ tail -f alert_DGNVTBISDB.log
--以Recovery of Online Redo Log才是正常的,如果是archice归档同步会有问题
Tue Aug 24 10:49:57 2021
Media Recovery Waiting for thread 2 sequence 52365 (in transit)
Recovery of Online Redo Log: Thread 2 Group 43 Seq 52365 Reading mem 0
Mem# 0: /d01/oradata/nvtdb02/onlinelog/standyredo33_1.log</code></pre>
</li>
<li>查看变量的值:
<code>show parameter;</code>
<code>SELECT * FROM v$parameter where name='background_dump_dest';</code></li>
<li>实际上我安装的数据库日志文件存放在<code>/u01/app/oracle/diag/rdbms/orcl/orcl/trace</code>中。(版本问题)</li>
<li>诊断文件是一种获取数据库信息的重要工具,对管理Oracle实例至关重要,重大事件有关信息,实例遇到的问题,帮助在日常工作中更好地管理数据库。</li>
<li>报警文件必须由DBA来管理,作为一名合格的数据库管理员,应该每天都要查看报警文件。获取数据库的诊断或出错信息,利用报警文件中提示到追踪文件查找更详细的信息。</li>
<li>诊断文件分三类:
报警文件(alertSID.log):background_dump_dest 这个变量存放路径
后台进程追踪文件(background trace files): background_dump_dest 这个变量存放路径
用户进程追踪文件(user trace files): user_dump_dest 这里保存路径。</li>
<li>查看报警文件的实例:
<pre><code>SELECT * FROM v$parameter where name like'%_dest';--查看文件的路径
select tablespace_name,status,contents from dba_tablespaces;--查看表空间名和状态的信息
alter tablespace users read only;--修改表空间的状态
alter tablespace users read write;--修改表空间的状态回原样
--查看报警文件alertSID.log文件</code></pre></li>
<li>后台进程追踪文件记录了任何后台进程,如LGWR、SMON等所遇到的错误。这些文件遇到报错才产生,可用来诊断和排错。文件名格式SID_lgwr_2460.trc之类的。</li>
<li>用户进程追踪文件的大小由max_dump_file_size参数来定义,默认10M。</li>
<li>用户进程追踪文件可由用户进程创建(用户会话错误时创建),也可由服务器进程创建(要修改动态参数SQL_TRACE)。</li>
<li>修改SQL_TRACE实例:该参数是动态参数,可在会话一级修改,也可以在实例一级修改。
会话一级开启用户进程追踪命令:
<code>alter session set sql_trace=true ;</code>
会话一级终止用户进程追踪命令:
<code>alter session set sql_trace=false ;</code>
实例一级终止用户进程追踪可以通过修改初始化参数文件来完成:
<code>sql_trace=true</code>
<strong>不要在实例一级开启用户进程追踪,产生大量的追踪文件浪费效率</strong></li>
</ul>
<h2>3.11 Oracle 11g 和Oracle 12c 诊断文件</h2>
<ul>
<li>11g和12c使用一个新的参数diagnostic_dest代替前面说的三个参数:background_dump_dest、user_dump_dest、core_dump_desc,默认值是:$ORACLE_BASE/diag。</li>
<li>自动诊断资料库(ADR):11g、12c引入的,方便Oracle 管理员维护和诊断Oracle 系统。(Automatic Diagnostic Repository, ADR)是一个基于文件的资料库,其中存储了数据库的诊断数据,如追踪、卸载的事件、报警日志和健康监督报告等。</li>
<li>对多个实例或者多个Oracle 数据库产品使用统一的目录结构,存储在数据库之外,关闭数据库也能使用。</li>
<li>diagnostic_dest设置了ADR的位置,如果参数为空或者没定义,启动数据库则通过以下方式来设定:
(1)如果设置了$ORACLE_BASE 环境变量,参数diagnostic_dest 将被设置为$ORACLE_BASE。
(2)如果$ORACLE_BASE 环境变量没有设置,则参数diagnostic_dest 将被设置为$ORACLE_HOME/log 。</li>
<li>11g和12c会产生两个报警文件:
正文格式,与旧版本的一致,存放在<code>/u01/app/oracle/diag/rdbms/orcl/orcl/trace</code>目录下。
XML格式的报警文件,可以通过以企业管理器和ADRCI工具(下小节有介绍)浏览,存放在<code>/u01/app/oracle/diag/rdbms/orcl/orcl/alert</code>目录下。</li>
<li>了解ADR的目录结构:
<pre><code>SQL> show parameter diagnostic_dest;--查看ADR的根目录
desc v$diag_info ; --查看报警文件的视图字段
select name,value from v$diag_info; --查询视图
name value
Diag Enabled TRUE
ADR Base /u01/app/oracle
ADR Home /u01/app/oracle/diag/rdbms/orcl/orcl
Diag Trace /u01/app/oracle/diag/rdbms/orcl/orcl/trace 存放正文格式的报警文件和前台或者后台进程追踪文件的位置。
Diag Alert /u01/app/oracle/diag/rdbms/orcl/orcl/alert 存放XML格式的报警文件的位置。
Diag Incident /u01/app/oracle/diag/rdbms/orcl/orcl/incident
Diag Cdump /u01/app/oracle/diag/rdbms/orcl/orcl/cdump
Health Monitor /u01/app/oracle/diag/rdbms/orcl/orcl/hm
Default Trace File /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_53648.trc 存放会话的追踪文件的路径,SQL追踪文件也存放在此处。
Active Problem Count 1
Active Incident Count 2</code></pre></li>
<li>12c后文件的存放变化比较大,p58。</li>
</ul>
<h2>3.12 Oracle 11g 和Oracle 12c 的ADRCI(ADRCI工具)</h2>
<ul>
<li>ADRCI是ADR的命令行解释器,是一个应用程序,能用来浏览或者编辑XML格式的报警文件、ADR中的追踪文件,能够以命令行的方式完成OEM所允许的所有工作。</li>
<li>进入到XML格式的报警文件目录,输入:adrci,则可开始使用。
show home 家目录全路径
show alert 显示全部报警文件记录
show alert -tail 显示10条报警文件记录
show alert -tail n n表示指定显示的报警文件记录数量
show alert -tail -F 利用报警信息对数据库进行追踪
show alert -P "MESSAGE_TEXT LIKE '%ORA_600%'" 搜索内容
show tracefile 显示家目录中所有追踪文件名
show tracefile %lgwr% 显示 家目录中所有追踪文件名中包含lgwr的追踪文件
show incident 显示所有incident的信息</li>
<li>12c两个新概念:问题(problem)和事件(incident)
problem是数据库中重大错误,这个错误在ADR中被追踪,有problem ID、priblem key等信息。
incident是一个问题的单一出现,在ADR中被追踪,有incident ID唯一识别。</li>
<li>ADRCI功能总结
在自动诊断资料库(ADR)中浏览诊断数据
浏览健康报告
将incident和问题信息打包成zip文件发送给Oracle 支持人员</li>
<li>其实命令:
help
help extended
help show home
exit</li>
<li>批量执行<code>[oracle@oracle alert]$ adrci exec="show home;show incident"</code></li>
</ul>
<h2>3.13 你应该掌握</h2>