> 文档中心 > Oracle数据库运维方案及优化

Oracle数据库运维方案及优化


Oracle数据库运维方案及优化

运维优化
本文详细讲解了如何对Oracle数据库进行运维,从各个方面来说明了如何去运维。

文章目录

  • Oracle数据库运维方案及优化
    • 前言:
      • Oracle数据库性能优化
    • 一 为啥要运维,运维哪些内容?
    • 二 检查数据库基本状况
      • 2.1 检查Oracle实例状态
      • 2.2 检查Oracle服务进程
      • 2.3 检查Oracle监听状态
    • 三 检查系统和oracle日志文件
    • 四 检查Oracle对象状态
      • 4.1 检查Oracle控制文件状态
      • 4.2 检查Oracle在线日志状态
      • 4.3 检查Oracle表空间的状态
      • 4.4 检查Oracle所有数据文件状态
      • 4.5 检查无效对象
      • 4.6 检查所有回滚段状态
    • 五 检查Oracle初始化文件中相关参数值
      • 5.1 检查Oracle初始化文件中相关参数值
      • 5.2 检查数据库连接情况
      • 5.3 检查系统磁盘空间
      • 5.4 检查表空间使用情况
      • 5.5 检查一些扩展异常的对象
      • 5.6 检查system表空间内的内容
      • 5.7 检查对象的下一扩展与表空间的最大扩展值
    • 六 检查数据库安全性
      • 6.1 检查系统安全日志信息
      • 5.2 检查用户修改密码
    • 七 其他检查
      • 7.1 Oracle Job是否有失败
      • 7.2 监控数据量的增长情况
      • 7.3 检查失效的索引
      • 7.4 检查不起作用的约束
      • 7.5 检查无效的trigger
    • 后记

前言:

在上一篇文章中我们讲了关于Oracle数据库的性能方面的优化,这篇文章咱们讲讲关于运维方面的优化吧。
上一篇文章的地址:

Oracle数据库性能优化

一 为啥要运维,运维哪些内容?

数据库的运维主要结合 目标系统的实际情况,提供切实可行的运维建设机制, 内容覆盖 ORACLE 数据库的日常维护、紧急故障处理,软件升级等,客户可依据 服务内容进行相应的定制。我们将会提供全面的、针对性的服务解决方案,以保 证客户系统稳定、高效、可靠的运行,以达到对业务系统的有效支持。

二 检查数据库基本状况

对数据库的基本状况进行检查,其中包含:

  • 检查 Oracle 实例状态
  • 检查 Oracle 服务进程
  • 检查 Oracle 监听进程

2.1 检查Oracle实例状态

SQL> select instance_name,host_name,startup_time,status,database_status from v$instance;

其 中 “STATUS” 表 示 Oracle 当 前 的 实 例 状 态 , 必 须 为 “OPEN” ; “DATABASE_STATUS”表示 Oracle 当前数据库的状态,必须为“ACTIVE”。

select name,log_mode,open_mode from v$database;

其中“LOG_MODE”表示 Oracle 当前的归档方式。“ARCHIVELOG”表示数据 库运行在归档模式下,“NOARCHIVELOG”表示数据库运行在非归档模式下。

2.2 检查Oracle服务进程

$ ps -ef|grep ora_|grep -v grep&&ps -ef|grep ora_|grep-v grep|wc –l

在检查 Oracle 的进程命令输出后,输出显示至少应包括以下一些进程:

  • Oracle 写数据文件的进程,输出显示为:“ora_dbw0_CKDB”
  • Oracle 写日志文件的进程,输出显示为:“ora_lgwr_ CKDB”
  • Oracle 监听实例状态的进程,输出显示为:“ora_smon_CKDB”
  • Oracle 监听客户端连接进程状态的进程,输出显示为:“ora_pmon_CKDB”
  • Oracle 进行归档的进程,输出显示为:“ora_arc0_ CKDB”
  • Oracle 进行检查点的进程,输出显示为:“ora_ckpt_ CKDB”
  • Oracle 进行恢复的进程,输出显示为:“ora_reco_ CKDB”

2.3 检查Oracle监听状态

/home/oracle>lsnrctl status

“Services Summary”项表示 Oracle 的监听进程正在监听哪些数据库实例, 输出显示中至少应该有“CKDB”这一项。
检查监听进程是否存在:

[oracle@AS14 ~]$ps -ef|grep lsn|grep  -v grep

三 检查系统和oracle日志文件

检查相关的日志文件,包含:检查操作系统的日志文件,检查 Oracle 日志 文件,检查 Oracle 核心转储目录,检查 Root 用户和 Oracle 用户的 email,总 共四个部分。

3.1 检查操作系统日志文件

 cat /var/log/messages |grep failed

查看是否有与 Oracle 用户相关的出错信息。

3.2 检查oracle日志文件

[oracle@AS14 ~]$ cat /data/oracle/admin/CKDB/bdump/alert_CKDB.log |grep ora- [oracle@AS14 ~]$ cat /data/oracle/admin/CKDB/bdump/alert_CKDB.log |grep err [oracle@AS14 ~]$ cat /data/oracle/admin/CKDB/bdump/alert_CKDB.log |grep fail

Oracle 在运行过程中,会在警告日志文件(alert_SID.log)中记录数据库的 一些运行情况:数据库的启动、关闭,启动时的非缺省参数;数据库的重做日志 切换情况,记录每次切换的时间,及如果因为检查点(checkpoint)操作没有执行 完成造成不能切换,会记录不能切换的原因;对数据库进行的某些操作,如创建 或删除表空间、增加数据文件;数据库发生的错误,如表空间不够、出现坏块、 数据库内部错误(ORA-600)等。定期检查日志文件,根据日志中发现的问题及时 进行处理:

问题 处理
启动参数不对 检查初始化参数文件
因为检查点操作或归档操作没有完成造成重做日志不能切换 如果经常发生样的情况,可以考虑增加重做日志文件组;想办法提高检查点或归档操作的效率;
有人未经授权删除了表空间 检查数据库的安全问题,是否密码太简单;如有必要,撤消某些用户的系统权限
出现坏块 检查是否是硬件问题(如磁盘本生有坏块),如果不是,检查是那个数据库对象出现了坏块,对这个 对象进行重建
表空间不够 增加数据文件到相应的表空间出现
ORA-600 根据日志文件的内容查看相应的 TRC 文件,如果是 Oracle 的 bug,要及时打上相应的补丁

3.3 检查Oracle核心转储目录

$ls $ORACLE_BASE/admin/CKDB/cdump/*.trc|wc -l$ls $ORACLE_BASE/admin/CKDB/udump/*.trc|wc –l

如果上面命令的结果每天都在增长,则说明 Oracle 进程经常发生核心转储。 这说明某些用户进程或者数据库后台进程由于无法处理的原因而异常退出。频繁 的核心转储特别是数据库后台进程的核心转储会导致数据库异常终止。

3.4 检查Root用户和Oracle用户的email

tail –n 200 /var/mail/roottail –n 200 /var/mail/oracle

查看有无与 Oracle 用户相关的出错信息。

四 检查Oracle对象状态

检查相关 Oracle 对象的状态,包含:检查 Oracle 控制文件状态,检查 Oracle 在线日志状态,检查 Oracle 表空间的状态,检查 Oracle 所有数据文件状态,检 查 Oracle 所有表、索引、存储过程、触发器、包等对象的状态,检查 Oracle 所 有回滚段的状态,总共六个部分。

4.1 检查Oracle控制文件状态

 select status,name from v$controlfile; 
STATUSNAME/data/oradata/CKDB/control01.ctl/data/oradata/CKDB/control02.ctl/data/oradata/CKDB/control03.ctl

输出结果应该有 3 条以上(包含 3 条)的记录,“STATUS”应该为空。状态 为空表示控制文件状态正常。

4.2 检查Oracle在线日志状态

 select group#,status,type,member from v$logfile;

输出结果应该有 3 条以上(包含 3 条)记录, “STATUS” 应该为非 “INVALID”,非“DELETED”。 注:“STATUS”显示为空表示正常。

4.3 检查Oracle表空间的状态

SQL> select tablespace_name,status from dba_tablespaces;

在这里插入图片描述
输出结果中 STATUS 应该都为 ONLINE.

4.4 检查Oracle所有数据文件状态

SQL> select name,status from v$datafile;

在这里插入图片描述
输出结果中“STATUS”应该都为“ONLINE”。

SQL> select file_name,status from dba_data_files;

在这里插入图片描述
输出结果中“STATUS”应该都为“AVAILABLE”。

4.5 检查无效对象

select owner,object_name,object_type from dba_objects where status!='VALID' and owner!='SYS' and owner!='SYSTEM';

如果有记录返回,则说明存在无效对象。若这些对象与应用相关,那么需要 重新编译生成这个对象,或者:

SELECT owner, object_name, object_type FROM dba_objects WHERE status= 'INVALID';

4.6 检查所有回滚段状态

SQL> select segment_name,status from dba_rollback_segs;

输出结果中所有回滚段的“STATUS”应该为“ONLINE”。

五 检查Oracle初始化文件中相关参数值

检查 Oracle 相关资源的使用情况,包含:检查 Oracle 初始化文件中相关的 参数值,检查数据库连接情况,检查系统磁盘空间,检查 Oracle 各个表空间使 用情况,检查一些扩展异常的对象,检查 system 表空间内的内容,检查对象的 下一扩展与表空间的最大扩展值,总共七个部分。

5.1 检查Oracle初始化文件中相关参数值

SQL> select resource_name,max_utilization,initial_allocation, limit_value from v$resource_limit;

若 LIMIT_VALU-MAX_UTILIZATION<=5 ,则表明 与 RESOURCE_NAME 相关的
Oracle 初 始 化 参 数 需 要 调 整 。 可 以 通 过 修 改 Oracle 初 始 化 参 数 文 件
$ORACLE_BASE/admin/CKDB/pfile/initORCL.ora 来修改。

5.2 检查数据库连接情况

查看当前会话连接数,是否属于正常范围。

select sid,serial,username,program,machine,status from v$session;

Oracle数据库运维方案及优化

其中:SID会话(session)的 ID 号;SERIAL#会话的序列号,和 SID 一起用来唯一标识一个会话;USERNAME建立该会话的用户名;PROGRAM这个会话是用什么工具连接到数据库的;STATUS当前这个会话的状态,ACTIVE 表示会话正在执行某些任务,INACTIVE 表示当前会话没有执行任何操作; 

如果建立了过多的连接,会消耗数据库的资源,同时,对一些“挂死”的连接可能需要手工进行清理。如果 DBA 要手工断开某个会话,则执行:(一般不建 议使用这种方式去杀掉数据库的连接,这样有时候 session 不会断开。容易引起 死连接。建议通过 sid 查到操作系统的 spid,使用 ps –ef|grep spidno 的方式 确认 spid 不是 ORACLE 的后台进程。使用操作系统的 kill -9 命令杀掉连接 )

alter system kill session  'SID,SERIAL#';

注意:上例中 SID 为 1 到 10(USERNAME 列为空)的会话,是 Oracle 的后台进 程,不要对这些会话进行任何操作。

5.3 检查系统磁盘空间

如果文件系统的剩余空间过小或增长较快,需对其进行确认并删除不用的文 件以释放空间。

 df -h

Oracle数据库运维方案及优化

5.4 检查表空间使用情况

SQL> select f.tablespace_name,a.total,f.free,round((f.free/a.total)*100) "% Free" from(select tablespace_name, sum(bytes/(1024*1024)) total from dba_data_files group by tablespace_name) a,(select tablespace_name, round(sum(bytes/(1024*1024))) free from dba_free_space group by tablespace_name) fWHERE a.tablespace_name = f.tablespace_name(+)order by "% Free";

如果空闲率%Free 小于 10%以上(包含 10%),则注意要增加数据文件来扩展 表空间而不要是用数据文件的自动扩展功能。请不要对表空间增加过多的数据文 件,增加数据文件的原则是每个数据文件大小为 2G 或者 4G,自动扩展的最大限 制在 8G。

5.5 检查一些扩展异常的对象

select Segment_Name, Segment_Type, TableSpace_Name, (Extents/Max_extents)*100 PercentFrom sys.DBA_SegmentsWhere Max_Extents!= 0 and (Extents/Max_extents)*100>=95 order By Percent;

如果有记录返回,则这些对象的扩展已经快达到它定义时的最大扩展值。对 于这些对象要修改它的存储结构参数。

5.6 检查system表空间内的内容

select distinct(owner)  from dba_tables where tablespace_name='SYSTEM' and owner!='SYS' and owner!='SYSTEM' unionselect distinct(owner)  from dba_indexeswhere tablespace_name='SYSTEM' and owner!='SYS' and owner!='SYSTEM';

如果记录返回,则表明 system 表空间内存在一些非 system 和 sys 用户的对 象。应该进一步检查这些对象是否与我们应用相关。如果相关则把这些对象移到 非 System 表空间,同时应该检查这些对象属主的缺省表空间值。

5.7 检查对象的下一扩展与表空间的最大扩展值

select a.table_name, a.next_extent, a.tablespace_name from all_tables a,(select tablespace_name, max(bytes) as big_chunk from dba_free_spacegroup by tablespace_name ) fwhere f.tablespace_name = a.tablespace_name and a.next_extent > f.big_chunkunionselect a.index_name, a.next_extent, a.tablespace_name from all_indexes a,(select tablespace_name, max(bytes) as big_chunk from dba_free_spacegroup by tablespace_name ) fwhere f.tablespace_name = a.tablespace_name and a.next_extent > f.big_chunk; 

如果有记录返回,则表明这些对象的下一个扩展大于该对象所属表空间的最 大扩展值,需调整相应表空间的存储参数。

六 检查数据库安全性

检查 Oracle 数据库的安全性,包含:检查系统安全信息,定期修改密码, 总共两个部分。

6.1 检查系统安全日志信息

系统安全日志文件的目录在/var/log 下,主要检查登录成功或失败的用户 日志信息。
检查登录成功的日志:

[root@rac2 ~]  grep -i accepted /var/log/secureJan8 08:44:43 rac2 sshd[29559]:  Accepted password for  root  from  ::ffff:10.10.10.6   port 1119 ssh2……

检查登录失败的日志:

[root@rac2 ~] grep -i inval /var/log/secure &&grep-i failed /var/log/secure Jan9 10:30:44 rac2 sshd[3071]:  Invalid user ydbuser  from ::ffff:192.168.3.5Jan9 10:30:56 rac2 sshd[3071]: Failed password for invalid user ydbuser from ::ffff:192.168.3.5 port 36005 ssh2Jan9 10:30:56 rac2 sshd[3071]: Failed password for invalid user ydbuser from ::ffff:192.168.3.5 port 36005 ssh2Jan 10 22:44:38 rac2 sshd[21611]:  Failed password for root from ::ffff:10.10.10.6 port 1723 ssh2

在出现的日志信息中没有错误(Invalid、refused)提示,如果没有(Invalid、
refused)视为系统正常,出现错误提示,应作出系统告警通知。

5.2 检查用户修改密码

在数据库系统上往往存在很多的用户,如:第三方数据库监控系统,初始安 装数据库时的演示用户,管理员用户等等,这些用户的密码往往是写定的,被很 多人知道,会被别有用心的人利用来攻击系统甚至进行修改数据。需要修改密码 的用户包括:

  • 数据库管理员用户 SYS,SYSTEM;其他用户。
  • 登陆系统后,提示符下输入 cat /etc/passwd,在列出来的用户中查看 是否存在已经不再使用的或是陌生的帐号。若存在,则记录为异常。

修改密码方法:

 Sql>alter user USER_NAME identified  by PASSWORD;

七 其他检查

检查当前 crontab 任务是否正常,检查 Oracle Job 是否有失败等共六个部 分。

7.1 Oracle Job是否有失败

select job,what,last_date,next_date,failures,broken from dba_jobs where schema_user='CAIKE';

如有问题建议重建 job,如: exec sys.dbms_job.remove(1); commit; exec sys.dbms_job.isubmit(1,‘REFRESH_ALL_SNAPSHOT;’,SYSDATE+1/1440,‘SYSDAT E+4/1440’); commit;

7.2 监控数据量的增长情况

SQL> selectA.tablespace_name,(1-(A.total)/B.total)*100 used_percent from (select tablespace_name,sum(bytes) totalfrom dba_free_space group by tablespace_name) A,(select tablespace_name,sum(bytes) totalfrom dba_data_files group by tablespace_name) Bwhere A.tablespace_name=B.tablespace_name;

根据本周每天的检查情况找到空间扩展很快的数据库对象,并采取相应的措 施:

  • 删除历史数据

移动规定数据库中至少保留 6 个月的历史数据,所以以前的历史数据可以考 虑备份然后进行清除以便释放其所占的资源空间。

  • 扩表空间
alter tablespace <tablespace_name> add datafile ‘<file>’ size <size>autoextend off;

注意:在数据库结构发生变化时,如增加了表空间,增加了数据文件或重做 日志文件这些操作,都会造成 Oracle 数据库控制文件的变化,DBA 应及进行控 制文件的备份,备份方法是:

执行 SQL 语句:

alter database backup controlfile  to '/home/backup/control.bak';

或:

alter database backup controlfile  to trace;

这样,会在 USER_DUMP_DEST(初始化参数文件中指定)目录下生成创建控制文 件的 SQL 命令。

7.3 检查失效的索引

Sql>selectindex_name,table_name,tablespace_name,statusFromdba_indexesWhere owner='CTAIS2' And status'VALID';

注:分区表上的索引 status 为 N/A 是正常的,如有失效索引则对该索引做 rebuild , 如 : Sql>alter index INDEX_NAME rebuild tablespace TABLESPACE_NAME;

7.4 检查不起作用的约束

SELECT owner, constraint_name, table_name, constraint_type, status FROM dba_constraintsWHERE status ='DISABLE' and constraint_type='P';

如有失效约束则启用,如:

Sql>alter Table TABLE_NAME Enable Constraints CONSTRAINT_NAME;

7.5 检查无效的trigger

SELECT owner, trigger_name, table_name, status FROM dba_triggers WHERE status = 'DISABLED';

如有失效触发器则启用,如:

Sql>alter Trigger TRIGGER_NAME Enable;

后记

如果本文章有何错误,请您评论中指出,或联系我,我会改正,如果您觉得这篇文章有用,请帮忙一键三连,让更多的人看见,谢谢
作者 yang_z_1 csdn博客地址: https://blog.csdn.net/yang_z_1?type=blog