整理了一些Oracle基础知识,与大家分享。
1、如何对Oracle数据库进行监控检查
sqlplus '/as sysdba'
手动生成一个oracle数据库的快照
execute dbbms_workload_repository.create_snapshot();
执行自动工作负载库的sql脚本
@?/rdbms/admin/awrrpt.sql; @表示在数据库中执行sql脚本,?指$ORACLE_HOME目录
接着输入想要分析的时间数字即可
默认导出的是html格式
生成自动诊断报告
sqlplus / as sysdba
@?/rdbms/admin/addmrpt.sql
然后输入相应的数字
2、Oracle完全之dbf文件出现问题, ORA-01219
alter database datafile '/data/app/oradata/ora237/users01.dbf' offline drop;
强制删除该故障文件
检查数据库日志
数据库最重要的日志为警告日志,alert_sid.log 一般位于$ORACLE_BASE/admin/ORACLE_SID/bdump 目录下
也可以在数据库中执行
show parameter background_dump_dest;
根据上面返回结果使用cat查看,重点关注ORA-或者Errors关键字
检查数据库的数据文件是否为自动扩展
select file_id,file_name,tablespace_name,autoextensible from dba_data_files;
4、Oracle之logminer日志分析
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
select sysdate from dual;
执行增删操作
alter system switch logfile; 切换当前的重做日志已以生成归档日志(相当于将之后的操作重新放到另一个日志中)
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; 修改格式方便查看
select sequence#,first_time from v$log_history order by first-time desc;
归档日志默认放在/u01/app/oracle/flash_recovery_area/ORCL/archivelog
查看分析日志
select t.FIRST_TIME,t.NAME from v$archived_log t order by t.FIRST_TIME desc;
使用logminer分析数据
conn /as sysdba
execute dbma_logmnr.add_logfile(logfilename=>'/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2011-05_04/01_mf_1_12_6w0mmgmd_.arc',options=>dbms_logmnr.new);
启动logminer
execute dbms_logmnr.start_logmnr (options=>dbms_logmnr.dict_from_online_catalog);
把分析数据放入表中,并把表的权限授权给普通用户
create table logminer_20110504 tablespace BANK_TBS as select * from v$logmnr_contents;
grant select on logminer_20110504 to bankuser;
结束logminer分析
execute dbms_logmnr.end_logmnr;
查看分析日志结果
select t.timestamp,t.sql_redo,t.sql_undo from sys.logminer_20110504 t where t.seg_owner='BANKUSER' and t.sql_undo is not null;
5、Oracle审计的激活与取消
审计audit用户见识用户所执行的操作,并且oracle会将审计跟踪结果存放到os文件或数据库中
激活审计
conn /as sysdba
show parameter audit_sys_operations; 查看审计参数
alter system set audit_sys_operations=TRUE scope=spfile; 设置审计参数为true
alter system set audit_trail=db scope=spfile;
startup force; 重启生效
show parameter audit_sys_operations; 查看审计参数
定义需要审计的表
execute dbms_fga.add_policy(object_schema=>'bankuser',object_name=>'emp',policy_name=>'chk_emp',statement_types=>'insert,update,delete');
给普通用户授权查看 审计表
grant select on dba_fga_audit_trail to bankuser;
执行增删操作,查看对表的审计
select t.timestamp,t.sql_text from sys.dba_fga_audit_trail t;
取消审计
execute dbms_fga.drop_policy(object_schema=>'bankuser',object_name=>'emp',policy_name=>'chk_emp');
6、把Oracle数据库恢复到某个时间点或者某个scn
alter session set nls_date_format='yyyymmdd hh24:mi:ss';
select sysdate from dual;
conn dbauser/123456; 随便一个用户,然后删除其中的一张表用来做测试
drop table test;
rman target/
startup mount;
restore database; 还原数据文件
sql 'alter session set nls_date_format="yyyymmdd hh24:mi:ss"'; 因为在rman中执行,所以需要sql ‘’;
recover database until time '20110414 11:33:56'; 恢复到这个时间的数据,执行之后需要重新生成重做日志文件
sql 'alter database open resetlogs';
scn是指系统改变号,oracle数据库使用它来记录数据库的过去时间内的状态和轨迹
conn /as sysdba
select dbms_flashback.get_system_chage_number from dual;
select to_char(scn_to_timestamp(963959),'YYYY-MM-DD HH24:MI:SS') from dual; 将scn转换为时间
select * from (select time_dp,scn from smon_scn_time order by time_dp desc) where rownum<10; 根据用户删除数据时间找出相应的scn号
rman target/
startup mount;
restore database; 还原数据文件
recover database until scn 963915;
sql 'alter database open resetlogs'; 重新生成重做日志文件
7、Oracle重做日志文件硬盘坏掉解决方法
rman target/
list backup;
list backup summary;
删除数据库数据文件夹下的log日志,例如/u01/app/oracle/oradata/ORCL下的所有后缀为log的文件
sqlplus / as sysdba
alter system switch logfile; 因为没有重做日志文件,会一直处于等待装填,如果需要切换日志,数据库将会报错
shutdown immediate;
startup 也会报错
recover database until cancel; 重新设置oracle数据库的重做日志文件(这种恢复属于不完全恢复数据库)
alter database open resetlogs; 重新生成重做文件
archive log list; 查看日志
8、Oracle使用flashback时,没有显示undosql
这是因为oracle11g没有开启这个功能
用管理员用户sys(也就是sysdba)执行以下语句即可
alter databases add supplemental log data;
如果我们想恢复某些数据,执行(查看误操作的sql语句,例如我们不小心删除了test表的某条数据,再从下面的结果中复制insert语句并执行即可)
select undo_sql from flashback_transaction_query where table_name='TEST'; #注意oracle中where后面的表名需为大写,否则会提示找不到表
显示在前面的结果为最新的操作
将scott用户的test表恢复到10分钟前的数据
flashback select * from scott.test to timestamp sysdate-10/1440;
不小心误删某个数据库表,使用flashback恢复
create table test(a int) tablespace USERS; 后面tablespace部分不能缺少,否则删除后无法进入回收站
drop table test;
flashback table test to before drop; 原数据库表里面的数据也恢复了
9、Oracle数据库经常提示27102 out of memory解决方法
网上有很多解决方案,但是我一个也看不懂,不知道写的什么鬼的东西,为什么一句话就能解决的事,非得长篇大论说原理是什么,看得一脸懵逼
我的解决方法入戏
vi /etc/sysctl.conf
修改kernel.shmall(共享内存总量)的值,该值原来为2097152,我把它给为4097152(暂时不知道应该改什么值,但是把这个值变大就对了,我就是随便吧第一位的2改为4,然后问题就自动解决)了,然后sqlplus / as sysdba
执行select status from v$instance;没有再提示out of memory错误,而是正常显示open