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<
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
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 |
10 |
11 |
12 |
13 |
|
|
14 |
15 |
16 |
17 |
18 |
19 |
20 |
|
21 |
22 |
23 |
24 |
25 |
26 |
27 |
|
28 |
29 |
30 |
|
|
|
|
文章归档
最新发表
关于db_file_multiblock_read_count参数的详细讲解
网站链接
oracle 数据库技术
资源
Powered by pLog
模板制作 : oldwain
![]()