oracle 增量备份脚本

oracle 增量备份脚本
OS :RHEL AS 4 oracle 10g
0备份脚本
#!/bin/bash
# incremental level 0 backup script
source /home/oracle/.bash_profile
current_day=`date +%Y%m%d`
mkdir /home/oracle/RMANBACKUP/$current_day
rman target / <
run
{
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/home/oracle/RMANBACKUP/$current_day/PID-%F';
allocate channel dev1 type disk;
allocate channel dev2 type disk;
allocate channel dev3 type disk;
backup incremental level 0 tag='db0'
format '/home/oracle/RMANBACKUP/$current_day/%n_%T_%U' database;
sql 'alter system archive log current';
backup archivelog all format '/home/oracle/RMANBACKUP/$current_day/arc_%n_%T_%U' delete all input;
release channel dev1;
release channel dev2;
release channel dev3;
}
EOF
1级累积增量脚本
#!/bin/bash
# incremental level 1 backup script
source /home/oracle/.bash_profile
current_day=`date +%Y%m%d`
incr_day=incr$current_day
mkdir /home/oracle/RMANBACKUP/$incr_day
rman target / <
run
{
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/home/oracle/RMANBACKUP/$incr_day/PID-%F';
allocate channel dev1 type disk;
allocate channel dev2 type disk;
allocate channel dev3 type disk;
backup incremental level 1 cumulative tag='db1'
format '/home/oracle/RMANBACKUP/$incr_day/%n_%T_%U' database;
sql 'alter system archive log current';
backup archivelog all format '/home/oracle/RMANBACKUP/$incr_day/arc_%n_%T_%U' delete all input;
release channel dev1;
release channel dev2;
release channel dev3;
}
EOF
  每天RMAN出来的backup set集合到一个文件夹下面

文章介绍了DBA每天在监控Oracle数据库方面的职责,讲述了如何通过shell脚本来完成这些重复的监控工作。本文首先回顾了一些DBA常用的Unix命令,以及解释了如何通过Unix Cron来定时执行DBA脚本。同时文章还介绍了8个重要的脚本来监控Oracle数据库:

   检查实例的可用性

   检查监听器的可用性

   检查alert日志文件中的错误信息

   在存放log文件的地方满以前清空旧的log文件

   分析tableindex以获得更好的性能

   检查表空间的使用情况

   找出无效的对象

   监控用户和事务

DBA需要的Unix基本知识

  基本的UNIX命令

  以下是一些常用的Unix命令:

ps--显示进程

grep--搜索文件中的某种文本模式

mailx--读取或者发送mail

cat--连接文件或者显示它们

cut--选择显示的列

awk--模式匹配语言

df--显示剩余的磁盘空间

  以下是DBA如何使用这些命令的一些例子:

  显示服务器上的可用实例:

$ ps -ef | grep smon

oracle 21832 1 0 Feb 24 ? 19:05 ora_smon_oradb1

oracle 898 1 0 Feb 15 ? 0:00 ora_smon_oradb2

dliu 25199 19038 0 10:48:57 pts/6 0:00 grep smon

oracle 27798 1 0 05:43:54 ? 0:00 ora_smon_oradb3

oracle 28781 1 0 Mar 03 ? 0:01 ora_smon_oradb4

  显示服务器上的可用监听器:

$ ps -ef | grep listener | grep -v grep

(译者注:grep命令应该加上-i参数,即grep -i listener,该参数的作用是忽略大小写,因为有些时候listener是大写的,这时就会看不到结果)

oracle 23879 1 0 Feb 24 ? 33:36 /8.1.7/bin/tnslsnr listener_db1 -inherit

oracle 27939 1 0 05:44:02 ? 0:00 /8.1.7/bin/tnslsnr listener_db2 -inherit

oracle 23536 1 0 Feb 12 ? 4:19 /8.1.7/bin/tnslsnr listener_db3 -inherit

oracle 28891 1 0 Mar 03 ? 0:01 /8.1.7/bin/tnslsnr listener_db4 -inherit

  查看Oracle存档目录的文件系统使用情况

$ df -k | grep oraarch

/dev/vx/dsk/proddg/oraarch 71123968 4754872 65850768 7% /u09/oraarch

  统计alter.log文件中的行数:

$ cat alert.log | wc -l

2984

  列出alert.log文件中的全部Oracle错误信息:

$ grep ORA- alert.log

ORA-00600: internal error code, arguments: [kcrrrfswda.1], [], [], [], [], []

ORA-00600: internal error code, arguments: [1881], [25860496], [25857716], []

CRONTAB基本

  一个crontab文件中包含有六个字段:

  分钟 0-59

  小时 0-23

  月中的第几天 1-31

  月份 1 - 12

  星期几 0 - 6, with 0 = Sunday

Unix命令或者Shell脚本

  要编辑一个crontab文件,输入:

Crontab -e

  要查看一个crontab文件,输入:

Crontab -l

0 4 * * 5 /dba/admin/analyze_table.ksh

30 3 * * 3,6 /dba/admin/hotbackup.ksh /dev/null 2>&1

  在上面的例子中,第一行显示了一个分析表的脚本在每个星期5400am运行。第二行显示了一个执行热备份的脚本在每个周三和周六的300a.m.运行。

  监控数据库的常用Shell脚本

  以下提供的8shell脚本覆盖了DBA每日监控工作的90%,你可能还需要修改UNIX的环境变量。

  检查Oracle实例的可用性

oratab文件中列出了服务器上的所有数据库

$ cat /var/opt/oracle/oratab

####################################

## /var/opt/oracle/oratab ##

####################################

oradb1:/u01/app/oracle/product/8.1.7:Y

oradb2:/u01/app/oracle/product/8.1.7:Y

oradb3:/u01/app/oracle/product/8.1.7:N

oradb4:/u01/app/oracle/product/8.1.7:Y

  以下的脚本检查oratab文件中列出的所有数据库,并且找出该数据库的状态(启动还是关闭)

###########################################

## ckinstance.ksh ## ##########################################

ORATAB=/var/opt/oracle/oratab

echo "`date` "

echo "Oracle Database(s) Status `hostname` :\n"

 

db=`egrep -i ":Y|:N" $ORATAB | cut -d":" -f1 | grep -v "\#" | grep -v "\*"`

pslist="`ps -ef | grep pmon`"

for i in $db ; do

echo "$pslist" | grep "ora_pmon_$i" > /dev/null 2>$1

if (( $? )); then

echo "Oracle Instance - $i: Down"

else

echo "Oracle Instance - $i: Up"

fi

done

  使用以下的命令来确认该脚本是可以执行的:

$ chmod 744 ckinstance.ksh

$ ls -l ckinstance.ksh

-rwxr--r-- 1 oracle dba 657 Mar 5 22:59 ckinstance.ksh*

  以下是实例可用性的报表:

$ ckinstance.ksh

Mon Mar 4 10:44:12 PST 2002

Oracle Database(s) Status for DBHOST server:

Oracle Instance - oradb1: Up

Oracle Instance - oradb2: Up

Oracle Instance - oradb3: Down

Oracle Instance - oradb4: Up

  检查Oracle监听器的可用性

  以下有一个类似的脚本检查Oracle监听器。如果监听器停了,该脚本将会重新启动监听器:

 

#########################################

## cklsnr.sh ##

#########################################

#!/bin/ksh

DBALIST="primary.dba@company.com,another.dba@company.com";export DBALIST

cd /var/opt/oracle

rm -f lsnr.exist

ps -ef | grep mylsnr | grep -v grep > lsnr.exist

if [ -s lsnr.exist ]

then

echo

else

echo "Alert" | mailx -s "Listener 'mylsnr' on `hostname` is down" $DBALIST 

TNS_ADMIN=/var/opt/oracle; export TNS_ADMIN

ORACLE_SID=db1; export ORACLE_SID

ORAENV_ASK=NO; export ORAENV_ASK

PATH=$PATH:/bin:/usr/local/bin; export PATH

. oraenv

LD_LIBRARY_PATH=${ORACLE_HOME}/lib;export LD_LIBRARY_PATH

lsnrctl start mylsnr

fi

  检查Alert日志(ORA-XXXXX

  每个脚本所使用的一些环境变量可以放到一个profile中:

 

############################################

## oracle.profile ##

##########################################

EDITOR=vi;export EDITOR ORACLE_BASE=/u01/app/oracle; export

ORACLE_BASE ORACLE_HOME=$ORACLE_BASE/product/8.1.7; export

ORACLE_HOME LD_LIBRARY_PATH=$ORACLE_HOME/lib; export

LD_LIBRARY_PATH TNS_ADMIN=/var/opt/oracle;export

TNS_ADMIN NLS_LANG=american; export

NLS_LANG NLS_DATE_FORMAT='Mon DD YYYY HH24:MI:SS'; export

NLS_DATE_FORMAT ORATAB=/var/opt/oracle/oratab;export

ORATAB PATH=$PATH:$ORACLE_HOME:$ORACLE_HOME/bin:/usr/ccs/bin:/bin:/usr

/bin:/usr/sbin:/

sbin:/usr/openwin/bin:/opt/bin:.; export

PATH DBALIST="primary.dba@company.com,another.dba@company.com";export

DBALIST

 

  以下的脚本首先调用oracle.profile来设置全部的环境变量。如果发现任何的Oracle错误,该脚本还会给DBA发送一个警告的email

 

########################################

## ckalertlog.sh ##

########################################

#!/bin/ksh

.. /etc/oracle.profile

for SID in `cat $ORACLE_HOME/sidlist`

do

cd $ORACLE_BASE/admin/$SID/bdump

if [ -f alert_${SID}.log ]

then

mv alert_${SID}.log alert_work.log

touch alert_${SID}.log

cat alert_work.log >> alert_${SID}.hist

grep ORA- alert_work.log > alert.err

fi

if [ `cat alert.err|wc -l` -gt 0 ]

then

mailx -s "${SID} ORACLE ALERT ERRORS" $DBALIST < alert.err

fi

rm -f alert.err

rm -f alert_work.log

done

 

  清除旧的归档文件

  以下的脚本将会在log文件达到90%容量的时候清空旧的归档文件:

 

$ df -k | grep arch

Filesystem kbytes used avail capacity Mounted on

/dev/vx/dsk/proddg/archive 71123968 30210248 40594232 43% /u08/archive

 

#############################################

## clean_arch.ksh ##

#################################################

#!/bin/ksh

df -k | grep arch > dfk.result

archive_filesystem=`awk -F" " '{ print $6 }' dfk.result`

archive_capacity=`awk -F" " '{ print $5 }' dfk.result`

 

if [[ $archive_capacity > 90% ]]

then

echo "Filesystem ${archive_filesystem} is ${archive_capacity} filled"

# try one of the following option depend on your need

find $archive_filesystem -type f -mtime +2 -exec rm -r {} \;

tar

rman

fi

 

  分析表和索引(以得到更好的性能)

  以下我将展示如果传送参数到一个脚本中:

 

##############################################

## analyze_table.sh ##

###############################################

#!/bin/ksh

# input parameter: 1: password # 2: SID

if (($#<1)) then echo "Please enter 'oracle' user password as the first parameter !" exit 0

fi

if (($#<2)) then echo "Please enter instance name as the second parameter!" exit 0

fi

 

 

  要传入参数以执行该脚本,输入:

$ analyze_table.sh manager oradb1

  脚本的第一部分产生了一个analyze.sql文件,里面包含了分析表用的语句。脚本的第二部分分析全部的表:

 

################################################

## analyze_table.sh ##

###############################################

sqlplus -s < oracle/$1@$2

set heading off

set feed off

set pagesize 200

set linesize 100

spool analyze_table.sql

select 'ANALYZE TABLE ' || owner || '.' || segment_name ||

' ESTIMATE STATISTICS SAMPLE 10 PERCENT;'

from dba_segments

where segment_type = 'TABLE'

and owner not in ('SYS', 'SYSTEM');

spool off

exit

!

sqlplus -s < oracle/$1@$2

@./analyze_table.sql

exit

!

  以下是analyze.sql的一个例子:

 

$ cat analyze.sql

ANALYZE TABLE HIRWIN.JANUSAGE_SUMMARY ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE HIRWIN.JANUSER_PROFILE ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE APPSSYS.HIST_SYSTEM_ACTIVITY ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE HTOMEH.QUEST_IM_VERSION ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE JSTENZEL.HIST_SYS_ACT_0615 ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE JSTENZEL.HISTORY_SYSTEM_0614 ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE JSTENZEL.CALC_SUMMARY3 ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE IMON.QUEST_IM_LOCK_TREE ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE APPSSYS.HIST_USAGE_SUMMARY ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE PATROL.P$LOCKCONFLICTTX ESTIMATE STATISTICS SAMPLE 10 PERCENT;

 

 

  检查表空间的使用

  以下的脚本检测表空间的使用。如果表空间只剩下10%,它将会发送一个警告email

 

####################################################

## ck_tbsp.sh ##

####################################################

#!/bin/ksh

sqlplus -s < oracle/$1@$2

set feed off

set linesize 100

set pagesize 200

spool tablespace.alert

SELECT F.TABLESPACE_NAME,

TO_CHAR ((T.TOTAL_SPACE - F.FREE_SPACE),'999,999') "USED (MB)",

TO_CHAR (F.FREE_SPACE, '999,999') "FREE (MB)",

TO_CHAR (T.TOTAL_SPACE, '999,999') "TOTAL (MB)",

TO_CHAR ((ROUND ((F.FREE_SPACE/T.TOTAL_SPACE)*100)),'999')||' %' PER_FREE

FROM (

SELECT TABLESPACE_NAME,

ROUND (SUM (BLOCKS*(SELECT VALUE/1024

FROM V\$PARAMETER

WHERE NAME = 'db_block_size')/1024)

) FREE_SPACE

FROM DBA_FREE_SPACE

GROUP BY TABLESPACE_NAME

) F,

(

SELECT TABLESPACE_NAME,

ROUND (SUM (BYTES/1048576)) TOTAL_SPACE

FROM DBA_DATA_FILES

GROUP BY TABLESPACE_NAME

) T

WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME

AND (ROUND ((F.FREE_SPACE/T.TOTAL_SPACE)*100)) < 10;

spool off

exit

!

if [ `cat tablespace.alert|wc -l` -gt 0 ]

then

cat tablespace.alert -l tablespace.alert > tablespace.tmp

mailx -s "TABLESPACE ALERT for ${2}" $DBALIST < tablespace.tmp

fi

 

  警告email输出的例子如下:

 

TABLESPACE_NAME USED (MB) FREE (MB) TOTAL (MB) PER_FREE

------------------- --------- ----------- ------------------- ------------------

SYSTEM 2,047 203 2,250 9 %

STBS01 302 25 327 8 %

STBS02 241 11 252 4 %

STBS03 233 19 252 8 %

 

  查找出无效的数据库对象

  以下查找出无效的数据库对象:

 

###################################### ## invalid_object_alert.sh ## ###################################### #!/bin/ksh . /etc/oracle.profile

sqlplus -s < oracle/$1@$2

set feed off

set heading off column object_name format a30

spool invalid_object.alert

SELECT OWNER, OBJECT_NAME, OBJECT_TYPE, STATUS FROM DBA_OBJECTS WHERE STATUS = 'INVALID' ORDER BY OWNER, OBJECT_TYPE, OBJECT_NAME;

spool off

exit ! if [ `cat invalid_object.alert|wc -l` -gt 0 ] then

mailx -s "INVALID OBJECTS for ${2}" $DBALIST < invalid_object.alert

fi$ cat invalid_object.alert

OWNER OBJECT_NAME OBJECT_TYPE STATUS

----------------------------------------------------------------------

HTOMEH DBMS_SHARED_POOL PACKAGE BODY INVALID

HTOMEH X_$KCBFWAIT VIEW INVALID

IMON IW_MON PACKAGE INVALID

IMON IW_MON PACKAGE BODY INVALID

IMON IW_ARCHIVED_LOG VIEW INVALID

IMON IW_FILESTAT VIEW INVALID

IMON IW_SQL_FULL_TEXT VIEW INVALID

IMON IW_SYSTEM_EVENT1 VIEW INVALID

IMON IW_SYSTEM_EVENT_CAT VIEW INVALIDLBAILEY CHECK_TABLESPACE_USAGE PROCEDURE INVALID

PATROL P$AUTO_EXTEND_TBSP VIEW INVALID

SYS DBMS_CRYPTO_TOOLKIT PACKAGE INVALID

SYS DBMS_CRYPTO_TOOLKIT PACKAGE BODY INVALID

SYS UPGRADE_SYSTEM_TYPES_TO_816 PROCEDURE INVALID

SYS AQ$_DEQUEUE_HISTORY_T TYPE INVALID

SYS HS_CLASS_CAPS VIEW INVALID SYS HS_CLASS_DD VIEW INVALID

 

  监视用户和事务(死锁等)

  以下的脚本在死锁发生的时候发送一个警告e-mail

 

#######################################

## deadlock_alert.sh ##

##########################################

#!/bin/ksh

.. /etc/oracle.profile

sqlplus -s < oracle/$1@$2

set feed off

set heading off

spool deadlock.alert

SELECT SID, DECODE(BLOCK, 0, 'NO', 'YES' ) BLOCKER,

DECODE(REQUEST, 0, 'NO','YES' ) WAITER

FROM V$LOCK

WHERE REQUEST > 0 OR BLOCK > 0

ORDER BY block DESC;

spool off

exit

!

if [ `cat deadlock.alert|wc -l` -gt 0 ]

then

mailx -s "DEADLOCK ALERT for ${2}" $DBALIST < deadlock.alert

fi

  结论

 

0,20,40 7-17 * * 1-5 /dba/scripts/ckinstance.sh > /dev/null 2>&1

0,20,40 7-17 * * 1-5 /dba/scripts/cklsnr.sh > /dev/null 2>&1

0,20,40 7-17 * * 1-5 /dba/scripts/ckalertlog.sh > /dev/null 2>&1

30 * * * 0-6 /dba/scripts/clean_arch.sh > /dev/null 2>&1

* 5 * * 1,3 /dba/scripts/analyze_table.sh > /dev/null 2>&1

* 5 * * 0-6 /dba/scripts/ck_tbsp.sh > /dev/null 2>&1

* 5 * * 0-6 /dba/scripts/invalid_object_alert.sh > /dev/null 2>&1

0,20,40 7-17 * * 1-5 /dba/scripts/deadlock_alert.sh > /dev/null 2>&1

通过以上的脚本,可大大减轻你的工作。你可以使用这些是来做更重要的工作,例如性能调整。

 

我的oracle监控脚本

----检查磁盘空间------------------

bin/sh
d1=`df -h | grep /home | awk '{print $5}' | awk -F% '{print $1}'`
if [ $d1 -ge 80 ]
then
echo "`date +%F" "%H:%M:%S` The disk is not enough ,the message from ip " | mail -s "primary_ipdisk alert
jie.du@mail
fi

------------检查oracle standby服务器的状态---------------------------

#!/bin/bash
primary_log=`ls -t /home/oracle/archive_log | head -n 1 | awk -F_ '{print $2}'`
standby_log=`ssh -p65508 
oracle@192.168.10.13 "ls -t /home/oracle/archive_log | head -n 1 " |awk -F_ '{print $2}'`
apply_log=`ssh -p65508 
oracle@192.168.10.13 'grep "Media Recovery Log" /home/oracle/admin/sfgame/bdump/alert_sfgame.log| tail -n 1'
| awk -F/ '{print $5}' | awk -F_ '{print $2}'`

d1=`expr $primary_log - $standby_log `
d2=`expr $standby_log - $apply_log `

echo $primary_log
echo $standby_log
echo $apply_log

if [ $d1 -ge 2 ]
then
echo ------ `date +%F" "%H:%M:%S` >>check_stantdby_status.log
echo "The archive_log was not sended" >> check_stantdby_status.log

echo "The archive_log was not sended " | mail -s "standby_ip" jie.du@email


if [ $d2 -ge 2 ]
then
echo ------ `date +%F" "%H:%M:%S` >>check_stantdby_status.log
echo "The archived_log was not applied" >>check_stantdby_status.log

echo "The archive_log was not applied " | mail -s "standby_ipalert" jie.du@email

--------数据库备份脚本---------

rman target / << EOF
run {
allocate channel c1 type disk;
allocate channel c2 type disk;
backup
filesperset 5
full
format "/home/oracle/dbbackup/sfgame_full_p%p_s%s_t%t_%T.bak"
(database include current controlfile);
}
exit
EOF

if [ $? -ge 0 ]
then
echo `date +"%F %H:%M:%S"` backup failed >> dbbackup.log
fi

------日志备份脚本-------------

primary_log=`ls -t /home/oracle/archive_log | head -n 1 | awk -F_ '{print $2}'`
standby_log=`ssh -p65508 
oracle@192.168.10.13 "ls -t /home/oracle/archive_log | head -n 1 " |awk -F_ '{print $2}'`

d1=`expr $primary_log - $standby_log `
time=`date +%H`


if [ $d1 -le 2 ]
then

#-------delete data of 5 days ago if standby log can normal archived

if [ $time = 00 ]
then

cd /home/oracle/oracle_maintenance
$ORACLE_HOME/bin/sqlplus /nolog< conn / as sysdba
set feed off
set heading off
set head off
set echo off
spool removeArch1.sh
select 'rm '||name From v$archived_log where dest_id=1 and deleted='NO' and completion_time>trunc(sysdate-3) and comple
tion_time spool off
EOF
cat removeArch1.sh | sed '1d' | sed '$d' > /home/oracle/oracle_maintenance/removeArch2.sh
sh /home/oracle/oracle_maintenance/removeArch2.sh

#-------delete data which deleted use system cmd rm in rman 
rman target / << EOF
run {
crosscheck archivelog all;
delete noprompt expired archivelog all;
}
exit
EOF
fi


fi


rman target / << EOF
run {
allocate channel c1 type disk;
backup
format "/home/oracle/archive_log_backup/arch_p%p_s%s_t%t_%T.arc"
filesperset 20
archivelog all;
}
exit
EOF

 

duiego发表于:2007.11.30 18:08 ::分类: ( oracle数据库管理 ) ::阅读:(40) :: 评论 (0) :: 引用 (0)

2007  09  13星期四

DBMS_SCHEDULER的使用方法详解

介绍:
DBMS_SCHEDULER
Oracle 10G中新增的一个包,与老版本的dbms_job包相比,dbms_scheduler有很多新特性,我将通过一系列的文章来介绍一下如何使用这个包.

参考资料:
1. Oracle PLSQL Packages and Types Reference 10G Release1 
编号: B10802-01)
2. Oracle 10G Top 20 DBA Features

说明本文版权属于作者所有,禁止任何人,媒体未经作者许可而转载或用于商业用途.如果你对本文有任何建议或意见.请发到作者的邮箱krislee2005@gmail.com.


part 1

1. 创建job

job是什么呢简单的说就是计划(schedule)加上任务说明另外还有一些必须的参数.

这里提到的"任务"可以是数据库内部的存储过程,匿名的PL/SQL,也可以是操作系统级别的脚本.

可以有两种方式来定义"计划":
1) 
使用DBMS_SCHDULER.CREATE_SCHEDULE 定义一个计划;
2) 
调用DBMS_SCHDULER.CREATE_JOBE过程直接指定 (下面会详细说明)

在创建一个计划时,你至少需要指定下面的属性,它们是job运行所必须的:

开始时间 (start_time);

重复频率 (repeat_interval);

结束时间 (end_time)


另外,对于一个job而言,还有很多的附加参数:

job_class
job_priority
auto_drop
restartable
max_runs
max_failures
schedule_limit
logging_level


下面,我以问答的形式来具体解释.


Q1:
怎么从数据库中查询job的属性 ?

A1: 有两种方法:

1) 查询(DBA|ALL|USER)_SCHEDULER_JOBS 视图
(
提示根据用户权限的不同,选择性的查询 DBA|ALL|USER视图)

2) 调用DBMS_SCHEDULER包中的GET_ATTRIBUTE 过程


Q2: 
怎么设置这些属性呢?

A2: 也是有两种方法

1) 在创建job时直接指定

2) 调用DBMS_SCHEDULER包中的SET_ATTRIBUTE 过程


Q3: "
我需要什么权限才能创建job" ?

A3: 你至少需要create_job这个系统权限。如果用户拥有create any job这个权限,
它可以创建属主为任何用户(SYS用户除外)job.

缺省情况下,job会被创建在当前的schema下,并且是没有激活的如果要使job一创建
就自动激活,需要显式的设置enabled 属性为true, 来看一个例子:

begin
dbms_scheduler.create_job
(
job_name => 'ARC_MOVE',
schedule_name => 'EVERY_60_MINS',
job_type => 'EXECUTABLE',
job_action => '/home/dbtools/move_arcs.sh',
enabled => true,
comments => 'Move Archived Logs to a Different Directory'
);
end;
/


Q4: 
能不能详细地讲述一下上面这个过程用到的各个参数?

A4:
job_name: 
顾名思义,每个job都必须有一个的名称
schedule_name: 
如果定义了计划,在这里指定计划的名称
job_type: 
目前支持三种类型:

PL/SQL: PLSQL_BLOCK,
存储过程: STORED_PROCEDURE
外部程序: EXECUTABLE (外部程序可以是一个shell脚本,也可以是操作系统级别的指令).

job_action: 根据job_type的不同,job_action有不同的含义.
如果job_type指定的是存储过程,就需要指定存储过程的名字;
如果job_type指定的是PL/SQL块,就需要输入完整的PL/SQL代码;
如果job_type指定的外部程序,就需要输入script的名称或者操作系统的指令名

enabled: 上面已经说过了,指定job创建完毕是否自动激活
comments: 
对于job的简单说明

2. 指定job的执行频率

如果我们创建了一个job,并且希望它按照我们指定的日期和时间来运行,就需要定义
job
的重复频度了例如每天运行,每周日的22:00运行每周一,,五运行,每年的
最后一个星期天运行等等.
(
说明:10G以前的版本,与操作系统的交互方面,实现的不是很好。例如要实现一个
定期的rman备份任务,就需要结合OS的命令来实现,UNIX下可以用crontab实现,
windows下用AT命令来实现)

10G 在这方面有了很大的增强,因为创建job时可以直接指定操作系统的命令或者
脚本,再合理的定义job的执行频率,可以很轻松地完成复杂的调度任务.

10G 支持两种模式的repeat_interval,一种是PL/SQL表达式,这也是dbms_job
中所使用的,例如SYSDATE+1, SYSDATE + 30/24*60; 另一种就是日历表达式。
例如MON表示星期一,SUN表示星期天,DAY表示每天,WEEK表示每周等等下面来
看几个使用日历表达式的例子:

repeat_interval => 'FREQ=HOURLY; INTERVAL=2'
每隔2小时运行一次job

repeat_interval => 'FREQ=DAILY'
每天运行一次job

repeat_interval => 'FREQ=WEEKLY; BYDAY=MON,WED,FRI"
每周的1,3,5运行job

repeat_interval => 'FREQ=YEARLY; BYMONTH=MAR,JUN,SEP,DEC; BYMONTHDAY=30'
每年的3,6,9,12月的30号运行job

用过crontab的人应该都有种似曾相识的感觉吧,呵呵


下面再说说使用日历表达式的规则:

日历表达式基本分为三部分第一部分是频率,也就是"FREQ"这个关键字,
它是必须指定的第二部分是时间间隔,也就是"INTERVAL"这个关键字,
取值范围是1-999. 它是可选的参数最后一部分是附加的参数,可用于
精确地指定日期和时间,它也是可选的参数,例如下面这些值都是合法的:
BYMONTH,BYWEEKNO,BYYEARDAY,BYMONTHDAY,BYDAY
BYHOUR,BYMINUTE,BYSECOND

详细的参数说明请参考 dbms_scheduler的使用说明.

既然说到了repeat_interval,你可能要问:"有没有一种简便的方法来得出,
或者说是评估出job的每次运行时间,以及下一次的运行时间呢?"

dbms_scheduler包提供了一个过程evaluate_calendar_string,可以很
方便地完成这个需求来看下面的例子:

SQL> set serveroutput on size 999999

SQL> declare
L_start_date TIMESTAMP;
l_next_date TIMESTAMP;
l_return_date TIMESTAMP;

begin
l_start_date := trunc(SYSTIMESTAMP);
l_return_date := l_start_date;
for ctr in 1..10 loop
dbms_scheduler.evaluate_calendar_string(
'FREQ=DAILY; BYDAY=MON,TUE,WED,THU,FRI; BYHOUR=7,15',
l_start_date, l_return_date, l_next_date
);

dbms_output.put_line('Next Run on: ' ||
to_char(l_next_date,'mm/dd/yyyy hh24:mi:ss')
);

l_return_date := l_next_date;

end loop;
end;
/


输出结果如下:

Next Run on: 03/22/2004 07:00:00
Next Run on: 03/22/2004 15:00:00
Next Run on: 03/23/2004 07:00:00
Next Run on: 03/23/2004 15:00:00
Next Run on: 03/24/2004 07:00:00
Next Run on: 03/24/2004 15:00:00
Next Run on: 03/25/2004 07:00:00
Next Run on: 03/25/2004 15:00:00
Next Run on: 03/26/2004 07:00:00
Next Run on: 03/26/2004 15:00:00


下一部分我将总结一下如何用dbms_scheduler包来创建和管理
程序(Program),计划(Schedule).


3. 
创建程序 (program)

什么是程序我的理解就是准备计划需要的元数据(metadata),
包括以下部分:

程序名;

程序中用到的参数例如程序的类型,以及具体操作的描述

来看一个例子
begin
dbms_scheduler.create_program(
program_name=> 'DAILY_BACKUP_SH',
program_type=> 'EXECUTABLE',
program_action=> '/home/oracle/script/daily_backup.sh');
end;
/

这个例子将会创建一个名为"DAILY_BACKUP_SH"的程序,类型是可执行的shell脚本,脚本的名称是“/home/oracle/script/daily_backup.sh”


Q1: 
程序和作业相比,有什么区别呢?

A1: 程序其实是可以与作业分离的,因此不同的用户可以在不同的时间段去重用它.而一个作业是属于特定的用户的;

另外,将程序与作业分离,也就激活了一个新的程序库(Program Library),利用程序库,用户可以很自由地选择特定的程序在特定的时间段运行,以及自由的配置程序执行时的参数.


Q2: 
能否解释一下 create_programcreate_job的关系?

A2: 首先,你应该知道创建程序并不是一个计划的必须组成部分,一个计划可以没有程序,但是必须有一个已经定义好的作业;
另外,program_action这个参数也是可选的,假如程序的类型是pl/sql ,你完全可以在创建作业时来指定它.

上面已经提到了,程序和作业可以是分离的,这样一个程序的具体执行(ACTION) 就可以灵活地确定。它既可以只运行一次,也可以在多个不同的作业中来重用这个执行这样一来,在修改针对一个作业的计划时就非常灵活,你不需要重新创建pl/sql.


Q3: 
运行 create_program需要什么权限 ?

A3: 要保证create_program能够顺利执行,你同样需要CREATE JOB这个系统权限如果一个用户拥有了create any job这个权限,它就可以创建属主为任何用户的程序(SYS用户除外)

与创建作业一样,一个程序建立完毕,缺省的状态也是非激活的,当然你可以在创建程序时,显式的设置enabled参数为true
激活它.


Q4: 
能否介绍一下create_program这个过程的各个参数
更多的例子?

A4:
program_name: 
指定程序的名称;

program_type: 目前只支持下面三种:
STORED_PROCEDURE
PLSQL_BLOCK
EXECUTABLE

program_action: (有长度限制,因为类型是varchar2)

存储过程的名称;
具体的pl/sql代码
操作系统脚本名称


来看一个使用pl/sql块的例子
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name => 'LEO.UPDATE_STATS',
program_type => 'PLSQL_BLOCK',

program_action => 'DECLARE
sUsername varchar2(30);

cursor cur is select username from dba_users
where username not in ('SYS','SYSTEM','SYSMAN','DBSNMP')
and account_status='OPEN' and substr(username,1,5)<>'MGMT_' ;

BEGIN

OPEN cur;
FETCH cur into sUsername;

WHILE cur%Found
LOOP
DBMS_STATS.GATHER_SCHEMA_STATS (sUsername);

FETCH cur into sUsername;
END LOOP;

close cur;

END;');

END;
/

上面这个例子创建一个名为"UPDATE_STATS"的程序,它的类型是PL/SQL 块,完成更新非系统用户的统计信息的工作。在这个基础上你可以定制一个合理的计划,来定期执行这个程序.

4. 配置程序的参数

先来看一个例子

begin
dbms_scheduler.create_program(
program_name=> 'LEO.UPDATE_STATS_2',
program_action=> 'LEO.UPDATE_SCHEMA_STATUS');
program_type=> 'STORED_PROCEDURE',
number_of_arguments => 1,
enabled => TRUE);

dbms_scheduler.define_program_argument(
program_name=> 'UPDATE_STATS_2',
argument_name => 'SCHEMA_NAME',
argument_position => 1,
argument_type => 'varchar2',
default_value => 'HR');
end;
/

这个例程是不是很像上面的那个例子呢,它们的区别只是
在这个例子中,程序的类型是存储过程,而不是pl/sql.

解释:
使用define_program_argument这个过程来定义一个程序所需要的参数有两点说明一下:

1) 程序如果使用了参数,就必须事先指定,这样才能在程序被job使用时生效;

2) 定义程序的参数不会改变程序的激活属性。也就是说,如果一个程序是没有激活的状态,运行了define_program_argument过程不会自动激活这个程序.


关于权限:
缺省情况下只有programowner才能修改创建的程序,如果用户被授予了alter 权限或者 create any job权限,就可以修改属主为另一个用户的程序.

5. 创建计划(Schedule)

其实,如果你已经了解了怎样创建作业和程序,就等于已经掌握怎样创建计划了。你需要做的附加工作只是指定计划的开始时间,结束时间,重复频率等等.

来看一个例子

begin
dbms_scheduler.create_job(
job_name=> 'leo.UPDATE_STATS_JOB',
program_name=> 'leo.UPDATE_STATS_2',
start_date=>'2005-06-20 11:00.00.000000 PM +8:00',
repeat_interval=>'FREQ=MONTHLY;INTERVAL=1',
end_date=>'2006-06-20 11:00.00.000000 PM +8:00',
comments=>'Monthly statistics collection job');
end;
/

start_dateend_date这两个参数需要说明一下它们的数据类型
timestamp,因此需要精确的指定时间和时区时间格式继承的是NLS_DATE_FORMAT这个初始化参数的值.

下一部分介绍
1) 
配置作业的参数;
2) 
创建/使用/管理作业,程序,计划所需要的系统权限.

一些补充

1.10G R2 如果用dbms_scheduler创建的job的类型为executable, 需要create external job 权限。

2. 在使用create_job或者create_schedule前,请先检查
NLS_DATE_LANGUAGE, NLS_DATE_FORMAT, 
NLS_TIMESTAMP_FORMAT, NLS_TIMESTAMP_TZ_FORMAT
等参数的值通过alter session 命令来修改

例如
SQL> select * from nls_session_parameters;

alter session set NLS_DATE_LANGUAGE='AMERICAN';
alter session set NLS_DATE_FORMAT='dd-mm-yyyy hh24:mi:ss';
alter session set NLS_TIMESTAMP_TZ_FORMAT='dd-mm-yyyy HH:MI:SS.FF AM TZR'

begin
dbms_scheduler.create_job(
job_name=> 'zip_emlog',
job_type=> 'EXECUTABLE',
job_action =>'/home/leo/zip_log.sh',
enabled=>true,
start_date=>'03-07-2005 9:30:00 PM + 8:00',
repeat_interval=>'FREQ=MINUTELY;INTERVAL=30',
end_date=>'31-07-2005 9:30:00 PM + 8:00',
comments=>'Get a latest em log copy and compress it every 30 minutes');
end;
/

 

duiego发表于:2007.09.13 19:06 ::分类: ( oracle数据库管理 ) ::阅读:(104) :: 评论 (0) :: 引用 (0)

2007  08  30星期四

oracle 高级复制配置步骤

测试环境 linux as 4 + oracle 10.2.0.3

master : sfgame
replication_server: rep

******注意:如果有的存储过程不知道怎么写,那就用企业管理器来做 --这个东西超级好用,建议用这个


1,
首先设置初始化参数
--at sfgame
db_domain=sfgame.com
global_names=true
job_queue_processes=10 # 
缺省值
open_links=4 # 
缺省值
--at rep
db_domain=rep.com
global_names=true
job_queue_processes=10 # 
缺省值
open_links=4 # 
缺省值
2,
配置tns使其能够相互访问
3
,用system登录数据库
--at sfgame
alter database rename global_name to sfgame.com
--at rep
alter database rename global_name to to rep.com

--at sfgame 
create public database link rep.com using 'rep'; --
创建一个公用的数据库链接
select * from 
global_name@rep.com; --验证是否正确

--at rep
create public database link sfgame.com using 'sfgame';
select * from 
global_name@sfgame.com;

4,system登录,创建管理复制的用户repadmin
--both site

create user repadmin identified by repadmin123 default tablespace sfusers temporary tablespace temp; 
execute dbms_defer_sys.register_propagator('repadmin');
grant execute any procedure to repadmin;
execute dbms_repcat_admin.grant_admin_any_repgroup('repadmin');
execute dbms_repcat_admin.grant_admin_any_schema(username => '"REPADMIN"');
grant comment any table to repadmin;
grant lock any table to repadmin;
grant select any dictionary to repadmin;


5
,用repadmin登录,在两个站点创建数据库的私有链接
--at sfgame
conn repadmin/repadmin123
create database link rep.com connect to repadmin identified by repadmin123;
select * from 
global_name@rep.com; -- 验证数据库连接

--at rep
conn repadmin/repadmin123
create database link sfgame.com connect to repadmin identified by repadmin123;
select * from 
global_name@sfgame.com; -- 验证数据库连接

6,目前我们的数据库中有相应的用户和表,所以就不用建立测试用户了,目前我们的数据库中的用户叫sfuser

--at sfgame
grant connect, resource to sfuser;
grant execute on sys.dbms_defer to sfuser;
create table tablename .... ----
在两边的数据库都建立相同的表
--at rep
grant connect, resource to sfuser; ****
注意必须有相同的表
grant execute on sys.dbms_defer to sfuser;
create table tablename ... ----
在两边的数据库都建立相同的表


--
注意如果数据库中有序列存在则要把序列分开存放


7
,建立要复制的组,加入数据库对象,并产生数据库对象支持

--at sfgame
conn repadmin/repadmin123 --
repadmin身份登录
-----
创建复制组 sfuser_mg (最好规范一下:username_mg,这个意思就是这个复制组都是sfuser用户的对象)
execute dbms_repcat.create_master_repgroup('sfuser_mg');

-----在复制组sfuser_mg中加入复制对象
execute dbms_repcat.create_master_repobject(sname=>'sfuser',oname=>'city', type=>'table',use_existing_object=>true,gname=>'sfuser_mg'); 
*******sname: 
要复制的用户名称, oname:要复制的对象名称 type:要复制的对象类型, use_existing_object 复制已经存在的数据库对象,gname:表示要加入到哪个复

制组中去

--对复制对象产生复制支持
execute dbms_repcat.generate_replication_support('sfuser','city','table');


--
确认组和对象已经加入到数据库中

select gname, master, status from dba_repgroup; 
select * from dba_repobject;

8,创建主复制节点

execute dbms_repcat.add_master_database (gname=>'sfuser_mg',master=>'rep.com',use_existing_objects=>true, copy_rows=>false, propagation_mode =>

'asynchronous');

***gname: 主复制组的名字
***master
:加入主复制节点的另一个数据库
***use_existing_object true
表示用主复制节点已经存在的数据库对象;
***copy_rows false
:表示第一次开始复制时不用和主复制节点保持一致;
***propagation_mode 
异步地执行;
--
确认已经加入到复制队列中
select * from user_jobs;

9,使同步组的状态由停顿(quiesced )改为正常(normal)
execute dbms_repcat.resume_master_activity('sfuser_mg',true);

10,创建数据库的时间表 1分钟一次

----at sfgame
conn repadmin/repadmin123 -
repadmin的身份登录数据库

------推的时间
begin 
dbms_defer_sys.schedule_push (destination=>'rep.com', interval=>'sysdate + 1/1440', next_date=>sysdate); 
end; 

-----
清除队列中的顺序的时间
begin 
dbms_defer_sys.schedule_purge (next_date => sysdate, interval => 'sysdate + 1/1440',delay_seconds => 0, rollback_segment => ''); 
end;


--at rep ******************
如果复制是双向的那么就进行如下步骤


conn repadmin/repadmin123 -
repadmin的身份登录数据库

------推的时间
begin 
dbms_defer_sys.schedule_push (destination=>'sfgame.com', interval=>'sysdate + 1/1440', next_date=>sysdate); 
end; 

-----
清除队列中的顺序的时间
begin 
dbms_defer_sys.schedule_purge (next_date => sysdate, interval => 'sysdate + 1/1440',delay_seconds => 0, rollback_segment => ''); 
end;


11
,如果你想立刻看到添加或修改后数据库的记录的变化,可以在两边 repadmin 用户下找到 push  job_number,然后运行:
exec dbms_job.run(job_number);


##################
异常处理##################################################################################

1. 检查复制工作正常否,可以在 repadmin 用户下查询user_jobs 
select job,this_date,next_date,what, broken from user_jobs;

正常的状态有两种:
任务闲 —— this_date为空,next_date为当前时间后的一个时间值
任务忙 —— this_date不为空,next_date为当前时间后的一个时间值

异常状态也有两种:
任务死锁 —— next_date为当前时间前的一个时间值
任务死锁 —— next_date为非常大的一个时间值,例如:4001-01-01

这可能因为网络中断照成的死锁

解除死锁的办法:
$ps –ef|grep orale 
找到死锁的刷新快照的进程号ora_snp*,用kill –9 命令删除此进程
然后进入 repadmin 用户运行命令:
exec dbms_job.run(job_number);

说明:job_number 为用 select job,this_date,next_date,what from user_jobs; 命令查出的job编号。

2,增加或是减少复制组的对象

1,停止主数据库节点的复制操作,使同步组的状态由正常(normal)改为停顿(quiesced ) 
conn repadmin/repadmin123 
repadmin身份登录数据库

execute dbms_repcat.suspend_master_activity (gname => 'sfuser_mg');


2,
在复制组中加入数据库对象
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT(
gname => '"SFUSER_MG"',
type => 'TABLE',
oname => '"CITY2"',
sname => '"SFUSER"',
copy_rows => TRUE,
use_existing_object => TRUE);
END;
/


3,
产生复制支持
execute dbms_repcat.generate_replication_support('sfuser','city2','table');

4, 执行ddl语句时需要注意不要直接在sqlplus中执行,要通过如下语句进行

BEGIN
DBMS_REPCAT.ALTER_MASTER_REPOBJECT(
sname => '"SFUSER"',
oname => '"CITY"',
type => 'TABLE',
ddl_text => 'ALTER TABLE SFUSER.CITY
MODIFY(ID NUMBER(10))');
END;
/


5
,重新使同步组的状态由停顿(quiesced )改为正常(normal)
execute dbms_repcat.resume_master_activity('scott_mg',false); --
这一步可能会报错让你重新生成复制支持,你只要重新生成复制支持就ok

 

duiego发表于:2007.08.30 14:46 ::分类: ( oracle数据库管理 ) ::阅读:(121) :: 评论 (0) :: 引用 (0)

2007  08  20星期一

oracle 创建表时的storage的参数的含义

本文通过图表和实例的阐述在Oracle数据库创建新表时Storage的参数具体含义。图表阐述

可用于:表空间、回滚段、表、索引、分区、快照、快照日志

建议PCTINCREASE参数设置为0,可使碎片最小化,使每一个Extent都相同(等于NEXT值)一旦建立了某个对象,它的INITIALMINEXTENTS参数不能修改(Oracle 816中可修改MINEXTENTS参数)对于NEXTPCTINCREASE的任何修改都只影响后来分配的那些Extent 在分配一个新Extent时,系统直接按NEXT的值分配一个Extent然后用公式:前一NEXT*(1+PCTINCREASE/100) 计算出下一个应该分配的Extent的大小,并把计算结果保存到相关数据字典的NEXT_EXTENT列上,做为下一个应该分配的Extent的大小。

CREATE TABLE test(a number) STORAGE( INITIAL 100K NEXT 100K MINEXTENTS 2 MAXEXTENTS 100 PCTINCREASE 100);

解释:初始给test表分配两个Extent第一个Extent100K,因INITIAL=100K第二个Extent100K,因NEXT=100K如果因表内数据增长,需要分配第三个Extent,因PCTINCREASE100,则第三个Extent200K=100K+100K第四个Extent400K=200K+200K可通过数据字典表DBA_TABLESALL_TABLESUSER_TABLES查看参数设置情况,如:

select table_name,initial_extent,next_extent, min_extents,max_extents,pct_increase from user_tables; TABLE_NAME INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE ---------- -------------- ----------- ----------- ----------- ------------ TEST 106496 212992 2 100 100

 

duiego发表于:2007.08.20 22:42 ::分类: ( oracle数据库管理 ) ::阅读:(60) :: 评论 (0) :: 引用 (0)

2007  07  17星期二

oracle常用函数

1,decode: 其实是一个if函数
: select decode(6-5,1,'a','b') from dual; --如果6-5=1那么返回a,否则返回b.
2,nvl 
如果exp1null则返回exp2,否则返回exp1.
例子:select nvl(null,'a') from dual; select nvl ('dd','a') from dual;
3,rollup:
汇总函数:把汇总出来的数据再汇总,如果两个值
4,cube:
把各个子项汇总
5,trunc: 
用来取整数,如果是时间的话就取时间的整点
1SQL> select trunc(sysdate) from dual;

TRUNC(SYSDATE)
-------------------
2007-04-11 00:00:00
2 SQL> select trunc(22.33333) from dual;

TRUNC(22.33333)
---------------
22

6,define :oracle中用来给需要输入值的地方赋值,比如如果想自动执行statspack.snap,那么执行过程中需要
输入三个变量 end_snap,begin_snap,report_name 这个时候就可以用 define begin_snap=$BEGIN_SNAP;
define end_snap=$END_SNAP;define report_name=$REPORT_NAME; 
来对其进行赋值,这可以适用于很多需要手工输入才能完成,而又想让其
自动执行的操作。
7,instr: 
返回exp2exp3中的位置
例:select instr('aa,aa',',') from dual 结果: 3
8,sign(): select sign(a-b) from dual 
;如果a-b >1 则返回1,如果 a-b<1则返回-1 如果a-b=b 则返回0
9,to_bin :
十进制转换为二进制
10
 select bin_to_num(1,1,1,0,1) from dual; 二进制转换为十进制。
11,sys_connect_by_path() --
用在树形查询上
select sys_connect_by_path(city_name,'|') as citys ,city_id
from dz.city
where level=3 
start with city_id>0
connect by prior city_id=parent_id

 

duiego发表于:2007.07.17 15:22 ::分类: ( oracle数据库开发 ) ::阅读:(120) :: 评论 (0) :: 引用 (0)

显示数据库属性的函数

select
SYS_CONTEXT('USERENV','TERMINAL') terminal,
SYS_CONTEXT('USERENV','LANGUAGE') language,
SYS_CONTEXT('USERENV','SESSIONID') sessionid,
SYS_CONTEXT('USERENV','INSTANCE') instance,
SYS_CONTEXT('USERENV','ENTRYID') entryid,
SYS_CONTEXT('USERENV','ISDBA') isdba,
SYS_CONTEXT('USERENV','NLS_TERRITORY') nls_territory,
SYS_CONTEXT('USERENV','NLS_CURRENCY') nls_currency,
SYS_CONTEXT('USERENV','NLS_CALENDAR') nls_calendar,
SYS_CONTEXT('USERENV','NLS_DATE_FORMAT') nls_date_format,
SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') nls_date_language,
SYS_CONTEXT('USERENV','NLS_SORT') nls_sort,
SYS_CONTEXT('USERENV','CURRENT_USER') current_user,
SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid,
SYS_CONTEXT('USERENV','SESSION_USER') session_user,
SYS_CONTEXT('USERENV','SESSION_USERID') session_userid,
SYS_CONTEXT('USERENV','PROXY_USER') proxy_user,
SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid,
SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain,
SYS_CONTEXT('USERENV','DB_NAME') db_name,
SYS_CONTEXT('USERENV','HOST') host,
SYS_CONTEXT('USERENV','OS_USER') os_user,
SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name,
SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address,
SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') network_protocol,
SYS_CONTEXT('USERENV','BG_JOB_ID') bg_job_id,
SYS_CONTEXT('USERENV','FG_JOB_ID') fg_job_id,
SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE') authentication_type,
SYS_CONTEXT('USERENV','AUTHENTICATION_DATA') authentication_data
from dual

duiego发表于:2007.07.17 15:21 ::分类: ( oracle数据库开发 ) ::阅读:(1138) :: 评论 (0) :: 引用 (0)

rman 自己的总结

1,设置channel的个数,或说是并行度
CONFIGURE DEVICE TYPE DISK PARALLELISM 2 BACKUP TYPE TO BACKUPSET
2
,进行备份的时候记录日志

3,设置备份策略是按天还是按照冗余备份的数量。(一般我选择按照天)
4
,使用clear命令来将修改过的值设置为默认
比如原来的:CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS
使用clear来改回默认值: CONFIGURE RETENTION POLICY CLEAR --注意这个clear的位置是在 "TO" 的前面
5
list命令:
(1), list backup of database:
列出所有的数据库备份.
(2),list backup of tablespace users; 
列出包含users表空间的备份
(3),list backup of datafile '/home/oracle/oradata/sales/users01.dbf': 
列出包含数据文件的备份
(4),list copy of archivelog all :
列出所有的归档日志,其实就是查询v$archived_log视图。--看其中的 "S" 列,代表无效,a代表可用。
(5),list expired archivelog all; 
列出所有的无效日志
(6),list expired backup:
列出所有无效的备份。
6
report 命令
(1), report need backup days 3[database,tablespace tablespacename,datafile 'datafilename'];
报告超过3天没有进行过备份的。
(2),report need backup redundancy 2 [database,tablespace tablespacename,datafile 'datafilename'] 
:报告冗余少于两个的。
(3),
7,crosschek 
命令
crosscheck backup of database : 
检查无效的备份
crosscheck archivelog all 
检查无效的归档日志。

8delete 命令
delete backupset 102 
删除指定的备份集。
delete expired archivelog all
删除所有无效的归档日志,
delete copy of archivelog from sequence XXXX until squence XXX 
删除一个归档日志范围,用于清理磁盘的空间。
delete copy of archivelog sequence xxx : 
删除指定的归档日志
9,CONFIGURE BACKUP OPTIMIZATION ON : 
如果设置为on  backup archivelog all 不会再备份已经备份过的归档日志。

10,再进行rman增量备份的时候要指定变化跟踪文件来监控数据块的改变,如果不指定则会进行全文件扫描以确定scn的改变。
如果数据库运行在归档模式,在数据库OPEN状态我们可以进行增量备份;如果数据库处于非归档方式,在数据库CLOSE状态我们也可以进行增量备份。
增量备份只备份上次备份以来变化过的数据块。
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING;
alter database enable block change tracking using file '/home/oracle/block_change_tracking/sales_block_tracking.log'; --
这个log文件会自动创建。
ALTER DATABASE DISABLE BLOCK CHANGE TRACKING --
禁用

---如果有一天你在系统下rm了一个archived_log,那么你再次执行ranarchived_log进行备份的时候就会报错-------
解决方法 1,首先 crosscheck archivelog all --检查所有的无效日志
2
list copy of archivelog all
3,delete expired archivelog all
4,
然后在进行备份

-----------------rman --自己做一个实际的备份 --------------------------------------------------------------------------------------------------------
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS ---
窗口时间为7
CONFIGURE CONTROLFILE AUTOBACKUP ON ---
控制文件自动备
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/home/oracle/control_file_backup/sales_%F' --
设置为自动备份的控制文件的路径
CONFIGURE DEVICE TYPE DISK PARALLELISM 2 BACKUP TYPE TO BACKUPSET --
设置分配几个通道进行备份
CONFIGURE BACKUP OPTIMIZATION ON --
不会备份已经备份过的日志
configure exclude for tablespace sflog; -- 
备份时不备份这个表空间


backup filesperset 5 format '/home/oracle/db_backup/sales_all_%p_%s_%T' database
backup format '/home/oracle/log_backup/saleslog_%p_%s_%T' filesperset 20 archivelog --all delete input

crosscheck backup;
crosscheck backup of archivelog all;
delete noprompt obsolete;

计划进行rman增量备份
1
,在数据库中进行优化
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING;
alter database enable block change tracking using file '/home/oracle/block_change_tracking/sales_block_tracking.log'; --
启用跟踪文件,提高性能


星期天 -- backup incremental level=0 database format '/home/oracle/db_backup/sales_%s_%p';
星期一,二,四,五,六 -- backup incremental level=2 database format '/home/oracle/db_backup/sales_level2_%s_%p';
星期三 -- backup incremental level=1 database format '/home/oracle/db_backup/sales_level1_%s_%p';


---
数据库的备份
rman target / << EOF
run {
allocate channel c1 type disk;
allocate channel c2 type disk;
backup
filesperset 5
full
format "/home/oracle/dbbackup/sfgame_full_p%p_s%s_t%t_%T.bak"
(database include current controlfile);
}
exit
EOF

if [ $? -ge 0 ]
then
echo `date +"%F %H:%M:%S"` backup failed >> dbbackup.log
fi

---归档日志的备份


run {
crosscheck archivelog all; ----
检查手动删除的日志
delete noprompt expired archivelog all;
}


run {
allocate channel c1 type disk;
allocate channel c2 type disk;
backup
format "/home/oracle/archive_log_backup/arch_p%p_s%s_t%t_%T.arc" ----
对归档日志进行备份
filesperset 20
archivelog all ;
}

exit

 

duiego发表于:2007.07.17 15:16 ::分类: ( oracle数据库管理 ) ::阅读:(243) :: 评论 (6) :: 引用 (0)

配置 oracleweb管理方式

1,直接运行 emca -repos create 
如果数据库中没有sysman用户,那么就会自动创建一个出来

2,初始化参数中的
job_queue_processes 
要大于 1

-----如果你不知道该用什么路径访问就用 emctl status dbconsole命令来查看
-----------------------------------------------

emca -repos create -- 创建一个EM资料库
emca -repos recreate -- 
重建一个EM资料库
emca -repos drop -- 
删除一个EM资料库


emca -config dbcontrol db -- 
配置数据库的 Database Control
emca -deconfig dbcontrol db -- 
删除数据库的 Database Control配置


重新配置db control的端口,默认端口在1158
emca -reconfig ports
emca -reconfig ports -dbcontrol_http_port 1160
emca -reconf

emctl status/stop/start dbconsole -- 查看状态/停止/启动 vdbconsole

 

duiego发表于:2007.07.17 15:10 ::分类: ( oracle数据库管理 ) ::阅读:(87) :: 评论 (0) :: 引用 (0)

最新信息

 

搜索

 

窗体顶端


窗体底端

博客日历

?

四月 2008

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30





文章归档

四月 2008

三月 2008

十二月 2007

十一月 2007

九月 2007

八月 2007

七月 2007

最新发表

ORACLE 锁机制

关于db_file_multiblock_read_count参数的详细讲解

sqlserver2005 ssis变量的使用方法

我的oracle监控脚本

DBMS_SCHEDULER的使用方法详解

oracle 高级复制配置步骤

oracle 创建表时的storage的参数的含义

oracle常用函数

显示数据库属性的函数

rman 自己的总结

网站链接

oracle 数据库技术

  1. oracle database documentation library
  2. oracle 中文技术网

资源

Powered by pLog
模板制作 : oldwain

 

请使用浏览器的分享功能分享到微信等