oracle数据库常见问题处理
1 归档⽇志⽂件系统满
现象:
1、服务器⽂件系统使⽤率到达100%;
2、应⽤程序连接数据库时出现ORA-00257: archiver error. Connect internal only, untilfreed 报错,数据库挂起⽆法访问。
分析:
1、执⾏sqlplus / as sysdba 命令连接数据库;
2、执⾏archive log list 命令确认oracle 的归档⽇志⽬录;
3、使⽤操作系统命令df –g,查看归档⽇志⽬录使⽤率是否已满。
处理:
因数据库归档⽇志信息记录在数据库控制⽂件中,直接删除归档⽇志虽能释放存储空间,但操作系统不会⾃动更新数据库控制⽂件中的相关信息,并且在查询相关动态视图(如v$archived_log)时,该部分已被删除的⽇志仍会标注为存在,这种情况将导致数据库在使⽤已被删除的归档⽇志进⾏恢复时出现错误。因此,即便归档⽇志⽬录已满,也不推荐直接从⽬录中删除归档⽇志。
可使⽤以下⽅法清理归档⽇志⽬录:
1、使⽤SYSDBA ⾓⾊(通常为oracle ⽤户)执⾏rman target/ 命令进⼊rman ⼯具操作界⾯;
2 、在rman ⼯具界⾯执⾏DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';命令删除7 天以前的归档⽇志。具体需要删除多少天的⽇志,应根据归档⽇志⽬录使⽤率酌情确定,确定保留天数后,修改'SYSDATE-7'参数中的数字即可。
3 、为稳妥起见, 删除归档⽇志前, 可执⾏backup format '/backup/arch_%T_%s_%U' archivelog all delete input;命令将归档⽇志备份到其他⽂件系统中。
4、若在之前已直接将归档⽇志⽬录中的部分归档⽇志⽂件删除,可执⾏crosscheck archivelog all; 和delete expired archivelog all;命令清理掉已经删除的归档⽇志记录,并更新数据库控制⽂件。
2 数据库表空间使⽤率满
现象:
1、数据库表空间使⽤率到达100%;
2、应⽤程序连接数据库时出现ORA-01658: unable to create INITIAL extent for segment in tablespace **报错,数据库⽆法处理事务。
分析:
1、执⾏sqlplus / as sysdba 命令连接数据库;
2、执⾏如下SQL 语句,查看表空间使⽤率:
prompt ⾃扩展表空间使⽤率
select total.tablespace_name as 表空间名,
round(total.MB, 2) as 总空间量,
round(now.MB, 2) as 已分配量,
round(now.MB - free.MB, 2) as 已使⽤配量,
round(((now.MB - free.MB) / now.MB) * 100, 2) as 已分配使⽤率, round(((now.MB - free.MB) / total.MB) * 100, 2) as 总使⽤率
from (select tablespace_name, sum(bytes) / 1024 / 1024 as MB from dba_free_space
group by tablespace_name) free,
(select tablespace_name, sum(bytes) / 1024 / 1024 as MB
from dba_data_files
group by tablespace_name) now,
(select tablespace_name, sum(maxbytes) / 1024 / 1024 as MB from dba_data_files
where maxbytes > 0
and autoextensible = 'YES'
group by tablespace_name) total
where free.tablespace_name = total.tablespace_name
and now.tablespace_name = total.tablespace_name
order by 总使⽤率 desc;
prompt 固定表空间使⽤率
select now.tablespace_name as 表空间名,
round(now.MB, 2) as 总空间量,
round(now.MB - free.MB, 2) as 已使⽤配量,
round(((now.MB - free.MB) / now.MB) * 100, 2) as 总使⽤率
from (select tablespace_name, sum(bytes) / 1024 / 1024 as MB from dba_free_space
group by tablespace_name) free,
(select tablespace_name, sum(bytes) / 1024 / 1024 as MB
from dba_data_files
where autoextensible = 'NO'
group by tablespace_name) now
where free.tablespace_name = now.tablespace_name
order by 总使⽤率 desc;
3、输出结果类似如下界⾯:
表空间名总空间量已分配量已使⽤配量已分配使⽤率总使⽤率
--------------------------- ---------- ---------- ------------ ----------
PPPP 259071.94 218964 218959.44 100 84.52
PPPP_IDX 163071.94 43248 43146.81 99.77 26.46
PATROL_DATA 300 200 6.63 3.31 2.21
SYSAUX 131071.94 700 667.31 95.33 .51
SYSTEM 131071.94 570 567.38 99.54 .43
UNDOTBS1 131071.94 14550 323.63 2.22 .25
USERS 131071.94 5 .13 2.5 0
7 rows selected.
4、由输出结果可知,PPPP表空间使⽤率已超过阀值,需要进⾏扩容。
5、使⽤操作系统命令df –g,查看数据库数据⽂件所在⽂件系统名(通常为/ora_data⽂件系统);使⽤操作系统命令ps –ef|grep smon,查看数据库实例名(本例中数据库实例为pppp),由以上信息可确定待扩容数据⽂件存放的位置为/ora_data/pppp。
处理:
1、执⾏sqlplus / as sysdba 命令连接数据库;
2、执⾏ALTER TABLESPACE "PPPP" ADD ATAFILE '/ora_data/pppp/pppp03.dbf' SIZE 1024M AUTOEXTEND ON NEXT
100M;为PPPP 表空间增加⼀个名为pppp03.dbf 数据⽂件,初始⼤⼩SIZE 为1024M,⾃动扩展属性AUTOEXTEND 打开,每次⾃动扩展100M。
3、若扩展表空间之前发现数据⽂件所在⽂件系统空间不⾜,则需要先对⽂件系统进⾏扩容,使⽤root ⽤户执⾏chfs –a size=+30G
/ora_data 可为/ora_data ⽂件系统增加30G 存储空间,然后再增加数据⽂件。
4、若该数据库是使⽤裸设备存储数据⽂件,则需要先使⽤root ⽤户执⾏mklv -y'pppp03dbf' sharedbvg 10 创建⼀个裸设备,然后执⾏ALTER TABLESPACE "PPPP" ADD ATAFILE '/dev/pppp03dbf' SIZE 10240M;为PPPP 表空间增加⼀个10G 的裸设备存储。
3 数据库数据被误删除
现象:
数据库中某个表的数据被误删除或者被错误更新,需要恢复。
分析:
1、与操作⼈员确认误删除数据的准确时间点及内容;
2、与操作⼈员确认误操作的类型是DML 操作(insert、delete、update)还是DDL 操作(drop)。
处理:
1、DML 误操作(insert、delete、update)
前提条件:重做⽇志信息(undo)信息没有被复写;误操作发⽣的时间点确定;数据库⽆需开启闪回(flash back)功能。
恢复操作如下:
创建⼀个新表,通过基于时间点的查询将数据恢复到新表上:
SQL> create table 表名_new as select (*) from 表名 as of timestamp to _timestamp('时间点','yyyy-mm-dd hh24:mi:ss');
将原表重命名为备份表:
SQL> alter table rename 表名 to 表名_bak;
将恢复后的新表重命名为原表:
SQL> alter table rename 表名_new to 表名;
检查重命名后的新表数据是否正确:oracle登录命令
SQL> select count(*) from 表名_new;
2、DDL 操作(drop)
前提条件:重做⽇志信息(undo)信息没有被复写;误操作发⽣的时间点确定;未使⽤drop table purge 命令清空回收站;数据库⽆需开启闪回(flash back)功能。
恢复操作如下:
查询事发时间点对应的回收站记录:
SQL> select * from user_recyclebin;
通过记录在段中的回收站信息将drop 掉的表闪回:
SQL> flashback table "BIN$*******************" to before drop rename to 表名;
检查表中的数据是否正确:
SQL> select count(*) from 表名;
4 数据库监听程序宕
现象:
数据库监听出现异常,应⽤⽆法连接数据库。
分析:
使⽤oracle ⽤户执⾏lsnrctl status 命令查看监听的状态,若监听程序不存在或⽆法连接,则表明不能连接数据库的原因是数据库监听程序宕。
处理:
使⽤oracle ⽤户执⾏lsnrctl start 命令⼿⼯启动数据库监听。
5 数据库响应速度慢
现象:
1、数据库响应慢,部分或者全部业务响应时间超时;
2、数据库服务器资源消耗较⼤,内存、IO 或CPU 资源使⽤率⾼。
分析:
1、使⽤oracle ⽤户连接数据库,执⾏如下SQL 语句查看数据库中的等待事件:
set lines 200
col username format a8
col osuser format a8
col machine format a15
col sid format 99999
col event format a30
select /*+ rule */
a.sid, a.serial#, a.osuser, a.username, a.machine, a.SQL_ID,
b.event
from v$session a, v$session_wait b
where b.event not like 'SQL%'
and b.event not like '%mon%'
and b.event not like 'rdbms%'
and b.wait_class != 'Idle'
and b.sid = a.sid
order by machine, event, SQL_ID;
2、通过等待事件的SQL_ID,执⾏如下SQL 语句可以定位到具体的应⽤程序SQL ⽂本,并查看该SQL 的执⾏计划:
set linesize 132
select * from TABLE(dbms_xplan.display_cursor('&SQL_ID'));
3、通过分析现有执⾏计划,以及该SQL 所涉及表的索引信息,可判断当前执⾏计划是否最优。若不为最优,则需要使⽤重建索引、新建索引、更新统计信息或重新编写SQL 语句等⽅法进⾏优化。
处理:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论