ITPub博客

首页 > 数据库 > Oracle > oracle 增量备份脚本

oracle 增量备份脚本

Oracle 作者:zhongshanyang 时间:2015-03-04 12:03:24 0 删除 编辑

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文件

   分析table和index以获得更好的性能

   检查表空间的使用情况

   找出无效的对象

   监控用户和事务

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

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

  监控数据库的常用Shell脚本

  以下提供的8个shell脚本覆盖了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_program与create_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过程不会自动激活这个程序.


关于权限:
缺省情况下只有program的owner才能修改创建的程序,如果用户被授予了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_date和end_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值)一旦建立了某个对象,它的INITIAL和MINEXTENTS参数不能修改(Oracle 816中可修改MINEXTENTS参数)对于NEXT和PCTINCREASE的任何修改都只影响后来分配的那些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,第一个Extent是100K,因INITIAL=100K;第二个Extent是100K,因NEXT=100K;如果因表内数据增长,需要分配第三个Extent,因PCTINCREASE是100,则第三个Extent是200K=100K+100K;第四个Extent是400K=200K+200K。可通过数据字典表DBA_TABLES、ALL_TABLES、USER_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 
如果exp1为null则返回exp2,否则返回exp1.
例子:select nvl(null,'a') from dual; select nvl ('dd','a') from dual;
3,rollup:
汇总函数:把汇总出来的数据再汇总,如果两个值
4,cube:
把各个子项汇总
5,trunc: 
用来取整数,如果是时间的话就取时间的整点
例1:SQL> 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: 
返回exp2在exp3中的位置
例: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" 列,x 代表无效,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 
:检查无效的归档日志。

8,delete 命令
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,那么你再次执行ran对archived_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)

配置 oracle的web管理方式

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

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/14293828/viewspace-1447785/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-01-18

  • 博文量
    132
  • 访问量
    461663