第二部分(备份和恢复)
我们只做基于rman的备份,数据库工作在archivelog模式,而且只做热备.
说明:
我的环境
operating_system Redhat advanced server 4AS 192.168.0.200
oracle基本目录 ORACLE_BASE=/database/oracle
oracle软件 ORACLE_HOME=$ORACLE_BASE/product/10.1.0/db_1
oracle数据库文件目录 ORACLE_DATAFILE=$ORACLE_BASE/oradata/$ORACLE_SID
两块儿scsi硬盘,operating_system和oracle安装在sda,sdb用来备份用.由于在写这手稿时机器上只有一块儿盘,所以假定下面脚本中的BACKUP_HOME即/database/backup为sdb上.实际上是一样的,可以把第二块磁盘加载为/database/backup这个没什么区别
另有一pc安装了linux系统,为了oracle更稳定的运行.oracle的其中一个控制文件和每个联机日志组的其中一成员存在与这个计算机的硬盘上,并且这里还有一个归档日志.设这个机器的地址为192.168.0.100,上面配置了smb,oracle机通过mount 192.168.0.100的smbfs到本机使用.192.168.0.100机也通过smb加载了192.168.0.200机的磁盘进行使用.另一机器也同样安装了oracle10G,rman的恢复目录在这台机器上放置.同样192.168.0.200机的上有192.168.0.100的rman数据库备份.
这个配置具体下
*********************************
这是192.168.0.100机的配置工作
编辑/etc/samba/smb.conf
[tmp]段改为
[oraclet]
comment = oraclet
path = /oraclet
read only = No
public = Yes
保存退出
linux>testparm;这个命令可以测试你的smb.conf文件是否配置有语法错语
linux>adduser -d /oraclet/ oraclet
linux>rm -rf /oraclet/.*
linux>smbpasswd -a oraclet
New SMB password:
Retype new SMB password:
Added user oraclet.
linux>/etc/rc.d/init.d/smb start
linux>smbclient -L //192.168.0.100;看看列出来你共享的资源没有
************************************
这是oracle 192.168.0.200机上的配置工作
linux>mkdir /database/backup/oraclett
linux> mount -t smbfs -rw -o username=oraclet,password=passwd //192.168.0.100/oraclet /database/backup/oraclett
至此192.168.0.100共享的oraclet加载到oracle机的/database/backup/oraclett,linux机可以像使用本地磁盘一样使用,并有写权限.
192.168.0.100机上这部分工作不加多说,过程是一样的.
在开始备份和恢复之前应该简单的先做一个部署
1.1创建数据库用dbca工具
在192.168.0.200创建功生产数据库JSWY,在192.168.0.100创建rman的恢复目录数据库catdb,在catdb数据库中建立rman的恢复目录
sql>create tablespace rman_ts datafile '$ORACLE_BASE/oradata/catdb/rman.dbf' size 15M;
建立恢复目录所有者
sql>create user rman identified by rman default tablespace rman_ts;
授恢复目录所有者角色具有recovery_catalog_owner,connect,resource角色.
sql>grant connect,resource,recovery_catalog_owner to rman;
建立恢复目录是使用rman命令的create catalog来完成的.当建立恢复目录时必须以恢复目录所有者身份连接到恢复目录数据库.运行rman时指定catlog选项可以连接到恢复目录
[oracle@linux bin]$ ./rman
Recovery Manager: Release 10.1.0.2.0 - Production
Copyright (c) 1995, 2004, Oracle. All rights reserved.
RMAN> connect catalog rman/rman@catdb
connected to recovery catalog database
recovery catalog is not installed
RMAN> create catalog; -------------创建恢复目录
recovery catalog created
RMAN> exit
[oracle@linux bin]$ ./rman target sys/**********@JSWY catalog rman/rman@catdb
Recovery Manager: Release 10.1.0.2.0 - Production
Copyright (c) 1995, 2004, Oracle. All rights reserved.
connected to target database: JSWY (DBID=3386251553)
connected to recovery catalog database
RMAN> register database; ---------------------注册数据库
database registered in recovery catalog
starting full resync of recovery catalog
full resync complete
在rman下可以用 report schema;查看是否注册成功.注册这里注册数据库时必須同时联接到目标数据库和rman数据库,如果这部分你看不懂那么一直向下看,后面有关于rman的介绍.你会明白为什么要使用rman数据库.
这里为还要以在目标机上也创建一个rman的恢复目录,让他管理备份192.168.100机的catdb数据库,这个步骤不再多写.
1.2先分别更改两个数据库的tnsnames.ora文件,使在各自的机器上都能通过sqlplus连接各个数据库
192.168.0.200机器上tnsnames.ora文件中加入
catdb =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = catdb)
)
)
192.168.0.100机器上tnsnames.ora文件中加入
JSWY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.200)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = JSWY)
)
)
然后分别在各自的机器上测试联接对方的数据库
sql>connect sys/*****@service_name as sysdba
如果联接不上请参数本文最后的关于口令的说明
1.3控制文件
oracle 10G默认有三个控制区文件,这三个控制文件的内容是一样的,所在位置ORACLE_DATAFILE=$ORACLE_BASE/oradata/$ORACLE_SID,默认情况下是在同一介质上的,这种情况如果介质出现问题三个控制文件都坏掉的可能性是有的,即然有第二块硬盘还有我们加载过来的smbfs,那么可以把另外两个控制文件分别放到另两块硬盘上.因为三个硬盘介质同时都出问题的可能性几乎是不可能的.当然如果你的系统已经被别人控制了就另当别论了.
sql>alter system set control_files='/database/oracle/oradata/JSWY/control02.ctl','/database/backup/control02.ctl' scope=spfile;
sql>alter system set control_files='/database/oracle/oradata/JSWY/control03.ctl','/database/backup/oraclett/control03.ctl' scope=spfile;
关闭数据库并复制控制文件到/database/backup/和/database/backup/oraclett下.同时更改参数文件中控制文件的位置.重新启动数据库.同样192.168.0.100机上的这些控制文件也分部在这些不同的地方.
1.4连机日志组
oracle 10G默认有三个联机日志组,所在每个联机日志组有一个日志文件.他所在的位置是ORACLE_DATAFILE=$ORACLE_BASE/oradata/$ORACLE_SID,这样当如果一个日志组中的文件出现介质失败时那么数据库将等待,无法继续工作,所以现在要多元化日志组文件,即便同一组中的一个文件出现了介质失败,那么另一个文件仍可继续使用.为每个日志组多增加2个日志文件,并且分布到不同的碰盘上.
sql>alter database add logfile member '/database/backup/redo011.log' to group 1,'/database/backup/redo022.log' to group 2,'/database/backup/redo033.log' to group 3;
sql>alter database add logfile member '/database/backup/oraclett/redo011.log' to group 1,'/database/backup/oraclett/redo022.log' to group 2,'/database/backup/oraclett/redo033.log' to group 3;
1.4做一份控制文件的跟踪,保存下来以即便将来控制文件全部丢失也可以根所这个做适当修改重建控制文件.
sql>alter database backup controlfile to trace;
找出来这个脚本文件,这个文件内容大志如下:
******************************************************************************
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "JSWY" RESETLOGS ARCHIVELOG
MAXLOGFILES 5
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 454
LOGFILE
GROUP 1 (
'/database/oracle/oradata/JSWY/redo01.log',
'/database/backup/redo011.log'
) SIZE 100M,
GROUP 2 (
'/database/oracle/oradata/JSWY/redo02.log',
'/database/backup/redo022.log'
) SIZE 100M,
GROUP 3 (
'/database/oracle/oradata/JSWY/redo03.log',
'/database/backup/redo033.log'
) SIZE 100M
-- STANDBY LOGFILE
DATAFILE
'/database/oracle/oradata/JSWY/system01.dbf',
'/database/oracle/oradata/JSWY/undotbs01.dbf',
'/database/oracle/oradata/JSWY/sysaux01.dbf',
'/database/oracle/oradata/JSWY/users01.dbf',
'/database/oracle/oradata/JSWY/user02.dbf',
'/database/oracle/oradata/JSWY/wwj01.dbf',
'/database/oracle/oradata/tset01.dbf'
CHARACTER SET WE8ISO8859P1
;
****************************************************************************************
1.5改变数据库日志操作模式为archivelog.
sql>shutdown immediate;
sql>startup mount;
sql>alter database archivelog;
sql>alter database open;
1.6部署归档日志的位置
sql>alter system set log_archive_format='%s_%t_%r.log' scope=spfile;
sql>alter system set log_archive_dest_1='location=/database/oracle/arch MANDATORY' scope=spfile;
sql>alter system set log_archive_dest_2='location=/database/backup/arch MANDATORY' scope=spfile;
sql>alter system set log_archive_dest_2='location=/database/backup/oraclett/arch MANDATORY' scope=spfile;
三个归档地点分别在不同的三个磁盘上.
sql>alter system switch logfile;
用上面的命令进行强制性切换联机日志,到相应的归当地点可以看到同样的归档日志.
开始备份
1.冷备份
不做过多的介绍,做操作系统级的备份,是数据库在关闭的情况下做的备份,因为不能进行完全恢复所以,而且数据库需要停止使用进行备份,所以一般不用此方法.(请看下面脚本)
[oracle@linux backupscr]$ cat coolbackup.sh
#!/bin/sh
###################Local host environment#####################
ORACLE_BASE_HOME=/database/oracle
ORACLE_BIN_PATH=$ORACLE_BASE_HOME/product/10.1.0/db_1/bin
SOURCE_DATA__HOME=$ORACLE_BASE_HOME/oradata/JSWY
BACKUP_HOME=/database/backup
COOL_BACKUP_HOME=$BACKUP_HOME/cool
OLD_CBACKUP_HOME=$COOL_BACKUP_HOME
TARGET_CBACKUP_HOME=$COOL_BACKUP_HOME/new
TMP_HOME=$BACKUP_HOME/tmp
PFILE_HOME=$ORACLE_BASE_HOME/admin/JSWY/pfile
####################Remote host enviroment######################
BACKUP_HOST_ADDR=192.168.0.100
BACKUP_USER=obackup
RBACKUP_HOME=rbackup
RCBACKUP_HOME=$RBACKUP_HOME/cool
TARGET_RCBACKUP_HOME=$RCBACKUP_HOME/new
##################Database down#########################################
echo "#########################Database to shutdown#####################"
$ORACLE_BIN_PATH/sqlplus sys/sys as sysdba <<EOF
shutdown immediate;
exit;
EOF
##################Bgein backup##################################################echo "#########################Backup begin###################"
if [ ! -d $TARGET_CBACKUP_HOME -o ! -d $TMP_HOME ] ; then
/bin/mkdir -p $TARGET_CBACKUP_HOME
/bin/mkdir -p $TMP_HOME
fi
cp $PFILE_HOME $TARGET_CBACKUP_HOME/
if cp $SOURCE_DATA__HOME/* $TMP_HOME/
then
rm -f $OLD_CBACKUP_HOME/*
mv $TARGET_CBACKUP_HOME/* $OLD_CBACKUP_HOME/
mv $TMP_HOME/* $TARGET_CBACKUP_HOME/
echo "ok"
else
echo "Backup error!!!"
exit;
fi
echo "################################Backup end########################"
###################Database start################################################
echo "##############################Database to startup#################"
$ORACLE_BIN_PATH/sqlplus sys/sys as sysdba <<EOF
startup;
exit;
EOF
###################Backup to other host###########################
echo "######################Backup to ftp#########################"
ssh $BACKUP_USER@$BACKUP_HOST_ADDR << SSH
rm -f $RCBACKUP_HOME/*
mv $TARGET_RCBACKUP_HOME/* $RCBACKUP_HOME/
exit
SSH
scp $TARGET_CBACKUP_HOME/* $BACKUP_USER@$BACKUP_HOST_ADDR:$TARGET_RCBACKUP_HOME
echo "#########################END###############################"
些脚本功能冷备份数据文件,控制文件,参数文件到TARGET_CBACKUP_HOME,并且把备份的文件同时备份一份儿到另外的一台主机上(192.168.0.100),相关的环境变量根据自己的实际情况修改.其实这里已经通过smb加载了对方的磁盘进行使用根本不用scp进行,但是为了这个脚本在以后其它地方还能用所以写成了这样.所有的脚本中都有用ssh不需要密码登录到另一台linux机的一段代码,这个具体设置如下:
*********************************************************************************************************
A为本地主机(即用于控制其他主机的机器) ;
B为远程主机(即被控制的机器Server), 假如ip为172.24.253.2 ;
A和B的系统都是Linux
在A上的命令:
# ssh-keygen -t rsa (连续三次回车,即在本地生成了公钥和私钥,不设置密码)
# ssh root@172.24.253.2 "mkdir .ssh;chmod 0700 .ssh" (需要输入密码)
# scp ~/.ssh/id_rsa.pub root@172.24.253.2:.ssh/id_rsa.pub (需要输入密码)
在B上的命令:
# touch /root/.ssh/authorized_keys2 (如果已经存在这个文件, 跳过这条)
# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys2 (将id_rsa.pub的内容追加到 authorized_keys2 中)
回到A机器:
# ssh root@172.24.253.2
***********************************************************************************************************
1.1冷备份的恢复
说句废话,这个根本不用多说.
2.热备份(主要介绍基于rman的备份和恢复)
2.1 介绍需要理解的重要的RMAN组件
1>目标数据库
指要执行备份,转存和恢复的操作的数据库,除非是只读应用的系统,否则建议目 票数据库采用ARCHIVELOG模式
2>服务器进程
使用rman执行备份等操作时,必須先连接到目标数据库.当连接到时会建立两个到目标数据库的进程.
3>通道
RMAN需要在存储设备和目标数据库之间建立联接,这个连接称为通道.
4>RMAN元数据和RMAN资料库
RMAN元数据是指ram在操作中所使用的数据.rman元数据的集合称为rman资料库.(重要:当使用rman进行备份,转存和恢复时,oracle会将rman的元数据放到目标数据库的控制文件中.如果rman是以恢复目录进行的,那么元数据还会被存到恢复目录中.)
5> 恢复目录
恢复目录用于存放rman元数据,是一个可选设置.当使用目标数据库控制文件存放rman元数据时,在rman元数据存放到天数达到初始化参数control_file_record_keep_time的之后,其元数据会被覆盖,导致之前的备份不可用.能过恢复目录可以永久保留需要的rman元数据.(注:如果要使用恢复目录那么恢复目录要放在与目标数据库不同的数据库中)
2.2运行rman
1>得到帮助
linux>$ORACLE_HOME/bin/rman help
2>不使用恢复目录联接到目标数据库
linux>$ORACLE_HOME/bin/rman target sys/passwd@target_database nocatalog
3>使用恢复目录联接到目标数据库
linux>$ORACLE_HOME/bin/rman target sys/passwd@target_database catalog rman_user/passwd@rman_database (注:target是连接到目标数据库,这里可以指定auxiliary联接到辅助数据库,联接到目标数据库和辅助数据库时必须用sysdba或sysoper身份.
2.3rman命令
rman命令分为两种一种是单独执行的命令,一种是作业命令包含在run{}中,如果运行sql命令格式为rman>sql "sql_command";运行脚本格式为rman>run{execute script sl;},运行操作系统命令rman>run {host "command";}.
2.4配置rman环境
1>配置自动通道的并行度
rman>configure device type disk parallelism 3;
将磁盘的并行度配置为3,如果是磁带请将里面的disk改为sbt;
2>配置所有通道的备份文件格式.默认会自动为disk分配一个通道,但没有任何选项,如果不指定通道号将配置所有通道.
rman>configure channel device type disk format '/database/backup/%d_%s_%p.bak';
这里解释一下这些 %参数的意思
%d数据库名称
%n为数据库我增加1个或多个x字母使其长度到8个字符
%s备份集编号,来源于目标控制文件,从1开始每次递增1,如果控制文件重新生成,刚该编号回到1重新开始
%p备份集内备份片的编码,第一个号码是1,在同一备份集中每个新的备分片递增1
%t备份的时间值.是以前某个参考时间点开始到现在的秒数
%u一个8位字符的值,来自于备份集数字和备份的时间
%c备份集中的备份片的拷贝数.除非指定为双份备,否则一直是1
%U生成一个惟一的由%u_%p_%c组成的文件名.如果没有指定备份文件的格式,默认是%U
%e用于指定归档日志的序列号
%N用于指定表空间的名称
%f用于指定绝对文件号
要防止建立备份集错误,%s是必須的,要建立多个备份文件,%p是必须的,要建立多个备份片副本,%c是必须的.
3>配置默认存储设备,默认的为disk,可以改为其它
rman>confgiure default device type to sbt;(改为磁带)
4>配置备份集和备份片最大尺寸
rman>configure maxsetsize to 1G;
可以将一个大的备份集划为几个相对小的备份片文件,并分布到多个设备上,如
rman>configure channel device type disk maxpiecesize 500M;
5>配置备份优化
默认备份优化是关闭的要打开如下
rman>configure backup optimization on;
6>配置多重备份
默认只会生成一个备份片副本,可以生成多个,如三个
rman>configure datafile backup copies for device type disk to 3;
7>配置免除表空间
默认情况下,当执行backup database命令时,除了临时表空间外所有的表空间都会备份,如果某些表只是用于存放测试数据或者表空间很少变化,那么可以在备份数据库时免除该表空间.如user01
rman>configure exclude for tablespace user01;
8>配置备份冗余策略
当用rman执行了多次备份之后,有些陈旧的备份可能不再需要需要删除.用configure命令可以配置备份冗余.
rman>configure retention policy to redundancy 2;
9>配置快照控制文件
当生新同步恢复目录或者备份控制文件时,需要建立快照文件.
rman>configure snapshot controlfile name to 'path/name';
10>显示所有rman配置信息
rman>show all;
11>清除rman配置.如果要将rman配置修改为默认配置则可以用clear选项清除相应的配置.例子清除rman的冗余策略配.
rman>configure retention policy clear;
通过以上的有关rman的介绍我们知道,有一个完整的数据库备份,有关于从备份开始到发生问题时的所有正确的归档日志和联机日志,那么就可以对数据库进行完合恢复.如果rman在nocatalog模式在那么只要保证在控制文件改变时用rman做数据库的备份,那么控制文件中就会一直有这个rman备份的元数据,也就是说这个备份一直可用.
2.5整个数据库的备份和恢复
可通过alter system set control_file_record_keep_time=n改变控制文件的更新时间,系统默认为7天,可以通过show parameter control_file_record_keep_time显示出来.在控制文件更改时做数据库的全部分,使用crontab
*********************************************************
简介
crontab-操作每个用户的守护程序和该执行的时间表。
部分参数说明
crontab file [-u user]-用指定的文件替代目前的crontab。
crontab-[-u user]-用标准输入替代目前的crontab.
crontab-1[user]-列出用户目前的crontab.
crontab-e[user]-编辑用户目前的crontab.
crontab-d[user]-删除用户目前的crontab.
crontab-c dir- 指定crontab的目录。
crontab文件的格式:M H D m d cmd.
M: 分钟(0-59)。
H:小时(0-23)。
D:天(1-31)。
m: 月(1-12)。
d: 一星期内的天(0~6,0为星期天)。
cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环境变量。
下面是一个例子文件:
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
#每天早上6点
106* * * date
#每两个小时
0*/2* * * date
#晚上11点到早上8点之间每两个小时,早上部点
0 23-7/2,8* * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4* mon-wed date
#1月份日早上4点
0 4 1 jan* date
**********************************************************************
编辑oracle 的crontab每星期天执行凌辰2点执行rmanf.sh
linux>crontab -e
* 2 * * *0 "path/rmanf.sh backup"
保存退出,脚本内容如下.
[oracle@linux backupscr]$ cat rmanf.sh
#!/bin/sh
###################Local host environment#####################
ORACLE_BASE_HOME=/database/oracle
ORACLE_BIN_PATH=$ORACLE_BASE_HOME/product/10.1.0/db_1/bin
BACKUP_HOME=/database/backup
RMAN_FBACKUP_HOME=$BACKUP_HOME/rman/full
OLDRMAN_FBACKUP_HOME=$RMAN_FBACKUP_HOME
TARGET_RFBACKUP_HOME=$RMAN_FBACKUP_HOME/new
TMP_HOME=$BACKUP_HOME/tmp
####################Remote host enviroment######################
BACKUP_HOST_ADDR=192.168.0.100
BACKUP_USER=obackup
RBACKUP_HOME=rbackup
RRBACKUP_HOME=$RBACKUP_HOME/rman/full
TARGET_RRBACKUP_HOME=$RRBACKUP_HOME/new
if [ $1 = "restore" ] ; then
##################Restore######################
$ORACLE_BIN_PATH/rman << EOF
connect target sys/*****@JSWY catalog rman/****@rmandb
run{
allocate channel c1 type disk;
restore database;
recover database;
sql 'alter database open';
release channel c1;
}
EOF
fi
if [ $1 = "backup" ] ; then
###########################Rman full backup#########################
rm -f $OLDRMAN_FBACKUP_HOME/*
mv $TARGET_RFBACKUP_HOME/* $OLDRMAN_FBACKUP_HOME
$ORACLE_BIN_PATH/rman msglog=$TARGET_RFBACKUP_HOME/rmanfb.log << EOF
connect target sys/****@JSWY catalog rman/*****@catdb
configure controlfile autobackup format for device type disk to '$TARGET_RFBACKUP_HOME/%F';
run{
sql "alter system switch logfile";
sql "alter system archive log all";
allocate channel c1 type disk;
backup full tag 'dbfull' format '$TARGET_RFBACKUP_HOME/full%u_%s_%p' database
include current controlfile;
sql 'alter system archive log current';
release channel c1;
}
EOF
#######################Backup to Remote host#######################
ssh $BACKUP_USER@$BACKUP_HOST_ADDR << SSH
rm -f $RRBACKUP_HOME/*
mv $TARGET_RRBACKUP_HOME/* $RRBACKUP_HOME/
exit
SSH
scp $TARGET_RFBACKUP_HOME/* $BACKUP_USER@$BACKUP_HOST_ADDR:$TARGET_RRBACKUP_HOME
echo "#########################END###############################"
fi
rman以nocatalog模式工作,备份整个数据库,在恢复时如果要进行完全恢复,则备份后的所有归档日志都必須存在.并且备份一复本到远程机192.16.0.100上.
2.6表空间的备份和恢复
[oracle@linux backupscr]$ cat rmants.sh
###################Local host environment#####################
ORACLE_BASE_HOME=/database/oracle
ORACLE_BIN_PATH=$ORACLE_BASE_HOME/product/10.1.0/db_1/bin
BACKUP_HOME=/database/backup
RMAN_TSBACKUP_HOME=$BACKUP_HOME/rman/ts
OLDRMAN_TSBACKUP_HOME=$RMAN_TSBACKUP_HOME
TARGET_RTSBACKUP_HOME=$RMAN_TSBACKUP_HOME/new
TMP_HOME=$BACKUP_HOME/tmp
####################Remote host enviroment######################
BACKUP_HOST_ADDR=192.168.0.100
BACKUP_USER=obackup
RBACKUP_HOME=rbackup
RRTSBACKUP_HOME=$RBACKUP_HOME/rman/ts
TARGET_RRTSBACKUP_HOME=$RRTSBACKUP_HOME/new
if [ $1 = "restore" ] ; then
##################Restore######################
$ORACLE_BIN_PATH/rman << EOF
connect target sys/****@JSWY catalog rman/****@catdb
run{
sql 'alter database datafile $2 offline drop';
sql 'alter database open';
allocate channel c1 type disk;
restore datafile $2;
recover datafile $2;
sql 'alter database datafile $2 online';
release channel c1;
}
EOF
fi
if [ $1 = "backup" ] ; then
###########################Rman tablespace backup#########################
rm -f $OLDRMAN_TSBACKUP_HOME/*
mv $TARGET_RTSBACKUP_HOME/* $OLDRMAN_TSBACKUP_HOME
$ORACLE_BIN_PATH/rman msglog=$TARGET_RTSBACKUP_HOME/rmants.log << EOF
connect target sys/****@JSWY catalog rman/****@catdb
run{
sql "alter system switch logfile";
sql "alter system archive log all";
allocate channel c1 type disk;
backup tag 'tsuser' format '$TARGET_RTSBACKUP_HOME/ts$2%u_%s_%p'
tablespace $2;
release channel c1;
}
EOF
#######################Backup to Remote host#######################
ssh $BACKUP_USER@$BACKUP_HOST_ADDR << SSH
rm -f $RRTSBACKUP_HOME/*
mv $TARGET_RRTSBACKUP_HOME/* $RRTSBACKUP_HOME/
exit
SSH
scp $TARGET_RTSBACKUP_HOME/* $BACKUP_USER@$BACKUP_HOST_ADDR:$TARGET_RRTSBACKUP_HOME
echo "#########################END###############################"
fi
备份用表空间,并且在远程机192.168.0.100有一相同镜像.注意以上所有脚本中恢复时的参数是要从启动数据库时的错误信息中得到的.如果不知道请参阅前的命令.
以上所有的脚本经过个修改在192.168.0.200机上运行也有,他备份192.168.0.100机上的rman的恢复目录数据库.这个关系是:
192.168.0.200机通过rman的catalog模式进行备份,192.168.0.200的rman备份的信息在192.168.0.100机的catdb数据库中.
192.168.0.100的catdb数据库通过192.168.0.200的rman进行备份,192.168.0.100的rman的数据库的备份信息在192.168.0.100的rman_ts表中,他们是互备的,其最终目的都是为了备份192.168.0.200的数据库.
有关口令的问题
问题:我在 Solaris 系统上运行 Oracle8i 8.1.7 企业版。我创建了两个数据库: SUGAR 和 TestDb 。将两者的 remote_login_passwordfile 都设置为 “独占( exclusive )”。我试图以 SYSDBA 身份连接到 TestDb ,但未能成功。下面是我的做法:
$sqlplus /nolog
SQL> conn sys/change_on_install@testdb
Connected.( 已连接 )
SQL> select * from v$pwfile_users;
username sysdb sysop
-----------------------------------------
internal true true
sys true true
SQL> conn sys/change_on_install@testdb as
sysdba
ERROR (错误)
ORA-01017: invalid username/password; logon
denied (无效的用户名 / 口令,登录被拒绝)
Warning: You are on longer connected to
ORACLE( 警告:你已经与 ORACLE 断开连接 )
我为什么不能以 SYSDBA 身份连接到 TestDb?
答:通常 Oracle 中的 SYS 口令与 INTERNAL 口令是同步的, SYS 口令存储于口令文件中。在上述情况下你建立了包含有一个口令的口令文件,而不是使用缺省的 “ change_on_install, ”这就是问题之所在。
希望下面的方法对你有所帮助。首先,建立一个口令文件,其中包含一个口令,这个口令不要与系统口令匹配:
$ orapwd file=orapw password=foobar entries=40
然后,进入服务器,启动数据库:
$ svrmgr
SVRMGR> connect internal
Connected. (已连接)
SVRMGR> startup
ORACLE instance started. ( ORACLE 实例已启动)
Total System Global Area (系统全局区域大小)
193073136 bytes
Fixed Size (固定大小)
69616 bytes
Variable Size (可变大小)
141639680 bytes
Database Buffers (数据库缓冲区)
45056000 bytes
Redo Buffers (重做缓冲区)
6307840 bytes
Database mounted. (数据库已加载)
Database opened. 数据库已打开。
现在使用 SYS 用户的口令,以 SYS 身份连接:
SVRMGR> connect sys/change_on_install@ora81
Connected. (已连接)
成功了。现在试着以 SYSDBA 身份连接:
SVRMGR> connect sys/change_on_install@ora81
as sysdba;
ORA-01017: invalid username/password; logon
denied (无效的用户名 / 口令;登录被拒绝)
这里出现了你所说的错误。你的 SYS 口令为: change_on_install ,但口令文件中的口令却是 foobar 。 SYS 用户是专用的,以 SYSDBA 身份连接就像是以 INTERNAL 连接,你必须使用口令文件中的口令。试试这样做:
SVRMGR— connect sys/foobar@ora81 as sysdba;
Connected. (已连接)
并不是每个人都需要使用口令文件中的口令;用户需要使用他们自己的口令。通过授权 SYSDBA 给 SCOTT ,你就可以明白这一点:
SVRMGR> grant sysdba to scott;
Statement processed. (已处理)
这个命令将 SCOTT 以 SCOTT 的凭证加入到口令文件中。如果你改变了 SCOTT 的口令,口令文件也会自动同步改变。现在,你可以试试以 SYSDBA 身份连接 SCOTT 了:
SVRMGR> connect scott/tiger@ora81 as sysdba;
Connected. (已连接)
一切正常。现在可以使用 ALTER USER 命令来改变 SYS 用户的口令。
SVRMGR> alter user sys identified by
change_on_install;
Statement processed. (已成功更改)
SVRMGR≫ connect sys/change_on_install@ora81
as sysdba;
Connected. (已连接)
你还可以用 change_on_install ,因为改变 SYS 用户口令将同时改变口令文件中的口令。当你建立了口令文件后, Oracle 数据库在其中放入两个账号: SYS 和 INTERNAL ,并将你在命令行中提供的口令作为这两个账户的口令。当你改变数据库中的 SYS 用户口令时,数据库将冲掉口令文件中的 SYS 和 INTERNAL 口令。
我们只做基于rman的备份,数据库工作在archivelog模式,而且只做热备.
说明:
我的环境
operating_system Redhat advanced server 4AS 192.168.0.200
oracle基本目录 ORACLE_BASE=/database/oracle
oracle软件 ORACLE_HOME=$ORACLE_BASE/product/10.1.0/db_1
oracle数据库文件目录 ORACLE_DATAFILE=$ORACLE_BASE/oradata/$ORACLE_SID
两块儿scsi硬盘,operating_system和oracle安装在sda,sdb用来备份用.由于在写这手稿时机器上只有一块儿盘,所以假定下面脚本中的BACKUP_HOME即/database/backup为sdb上.实际上是一样的,可以把第二块磁盘加载为/database/backup这个没什么区别
另有一pc安装了linux系统,为了oracle更稳定的运行.oracle的其中一个控制文件和每个联机日志组的其中一成员存在与这个计算机的硬盘上,并且这里还有一个归档日志.设这个机器的地址为192.168.0.100,上面配置了smb,oracle机通过mount 192.168.0.100的smbfs到本机使用.192.168.0.100机也通过smb加载了192.168.0.200机的磁盘进行使用.另一机器也同样安装了oracle10G,rman的恢复目录在这台机器上放置.同样192.168.0.200机的上有192.168.0.100的rman数据库备份.
这个配置具体下
*********************************
这是192.168.0.100机的配置工作
编辑/etc/samba/smb.conf
[tmp]段改为
[oraclet]
comment = oraclet
path = /oraclet
read only = No
public = Yes
保存退出
linux>testparm;这个命令可以测试你的smb.conf文件是否配置有语法错语
linux>adduser -d /oraclet/ oraclet
linux>rm -rf /oraclet/.*
linux>smbpasswd -a oraclet
New SMB password:
Retype new SMB password:
Added user oraclet.
linux>/etc/rc.d/init.d/smb start
linux>smbclient -L //192.168.0.100;看看列出来你共享的资源没有
************************************
这是oracle 192.168.0.200机上的配置工作
linux>mkdir /database/backup/oraclett
linux> mount -t smbfs -rw -o username=oraclet,password=passwd //192.168.0.100/oraclet /database/backup/oraclett
至此192.168.0.100共享的oraclet加载到oracle机的/database/backup/oraclett,linux机可以像使用本地磁盘一样使用,并有写权限.
192.168.0.100机上这部分工作不加多说,过程是一样的.
在开始备份和恢复之前应该简单的先做一个部署
1.1创建数据库用dbca工具
在192.168.0.200创建功生产数据库JSWY,在192.168.0.100创建rman的恢复目录数据库catdb,在catdb数据库中建立rman的恢复目录
sql>create tablespace rman_ts datafile '$ORACLE_BASE/oradata/catdb/rman.dbf' size 15M;
建立恢复目录所有者
sql>create user rman identified by rman default tablespace rman_ts;
授恢复目录所有者角色具有recovery_catalog_owner,connect,resource角色.
sql>grant connect,resource,recovery_catalog_owner to rman;
建立恢复目录是使用rman命令的create catalog来完成的.当建立恢复目录时必须以恢复目录所有者身份连接到恢复目录数据库.运行rman时指定catlog选项可以连接到恢复目录
[oracle@linux bin]$ ./rman
Recovery Manager: Release 10.1.0.2.0 - Production
Copyright (c) 1995, 2004, Oracle. All rights reserved.
RMAN> connect catalog rman/rman@catdb
connected to recovery catalog database
recovery catalog is not installed
RMAN> create catalog; -------------创建恢复目录
recovery catalog created
RMAN> exit
[oracle@linux bin]$ ./rman target sys/**********@JSWY catalog rman/rman@catdb
Recovery Manager: Release 10.1.0.2.0 - Production
Copyright (c) 1995, 2004, Oracle. All rights reserved.
connected to target database: JSWY (DBID=3386251553)
connected to recovery catalog database
RMAN> register database; ---------------------注册数据库
database registered in recovery catalog
starting full resync of recovery catalog
full resync complete
在rman下可以用 report schema;查看是否注册成功.注册这里注册数据库时必須同时联接到目标数据库和rman数据库,如果这部分你看不懂那么一直向下看,后面有关于rman的介绍.你会明白为什么要使用rman数据库.
这里为还要以在目标机上也创建一个rman的恢复目录,让他管理备份192.168.100机的catdb数据库,这个步骤不再多写.
1.2先分别更改两个数据库的tnsnames.ora文件,使在各自的机器上都能通过sqlplus连接各个数据库
192.168.0.200机器上tnsnames.ora文件中加入
catdb =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = catdb)
)
)
192.168.0.100机器上tnsnames.ora文件中加入
JSWY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.200)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = JSWY)
)
)
然后分别在各自的机器上测试联接对方的数据库
sql>connect sys/*****@service_name as sysdba
如果联接不上请参数本文最后的关于口令的说明
1.3控制文件
oracle 10G默认有三个控制区文件,这三个控制文件的内容是一样的,所在位置ORACLE_DATAFILE=$ORACLE_BASE/oradata/$ORACLE_SID,默认情况下是在同一介质上的,这种情况如果介质出现问题三个控制文件都坏掉的可能性是有的,即然有第二块硬盘还有我们加载过来的smbfs,那么可以把另外两个控制文件分别放到另两块硬盘上.因为三个硬盘介质同时都出问题的可能性几乎是不可能的.当然如果你的系统已经被别人控制了就另当别论了.
sql>alter system set control_files='/database/oracle/oradata/JSWY/control02.ctl','/database/backup/control02.ctl' scope=spfile;
sql>alter system set control_files='/database/oracle/oradata/JSWY/control03.ctl','/database/backup/oraclett/control03.ctl' scope=spfile;
关闭数据库并复制控制文件到/database/backup/和/database/backup/oraclett下.同时更改参数文件中控制文件的位置.重新启动数据库.同样192.168.0.100机上的这些控制文件也分部在这些不同的地方.
1.4连机日志组
oracle 10G默认有三个联机日志组,所在每个联机日志组有一个日志文件.他所在的位置是ORACLE_DATAFILE=$ORACLE_BASE/oradata/$ORACLE_SID,这样当如果一个日志组中的文件出现介质失败时那么数据库将等待,无法继续工作,所以现在要多元化日志组文件,即便同一组中的一个文件出现了介质失败,那么另一个文件仍可继续使用.为每个日志组多增加2个日志文件,并且分布到不同的碰盘上.
sql>alter database add logfile member '/database/backup/redo011.log' to group 1,'/database/backup/redo022.log' to group 2,'/database/backup/redo033.log' to group 3;
sql>alter database add logfile member '/database/backup/oraclett/redo011.log' to group 1,'/database/backup/oraclett/redo022.log' to group 2,'/database/backup/oraclett/redo033.log' to group 3;
1.4做一份控制文件的跟踪,保存下来以即便将来控制文件全部丢失也可以根所这个做适当修改重建控制文件.
sql>alter database backup controlfile to trace;
找出来这个脚本文件,这个文件内容大志如下:
******************************************************************************
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "JSWY" RESETLOGS ARCHIVELOG
MAXLOGFILES 5
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 454
LOGFILE
GROUP 1 (
'/database/oracle/oradata/JSWY/redo01.log',
'/database/backup/redo011.log'
) SIZE 100M,
GROUP 2 (
'/database/oracle/oradata/JSWY/redo02.log',
'/database/backup/redo022.log'
) SIZE 100M,
GROUP 3 (
'/database/oracle/oradata/JSWY/redo03.log',
'/database/backup/redo033.log'
) SIZE 100M
-- STANDBY LOGFILE
DATAFILE
'/database/oracle/oradata/JSWY/system01.dbf',
'/database/oracle/oradata/JSWY/undotbs01.dbf',
'/database/oracle/oradata/JSWY/sysaux01.dbf',
'/database/oracle/oradata/JSWY/users01.dbf',
'/database/oracle/oradata/JSWY/user02.dbf',
'/database/oracle/oradata/JSWY/wwj01.dbf',
'/database/oracle/oradata/tset01.dbf'
CHARACTER SET WE8ISO8859P1
;
****************************************************************************************
1.5改变数据库日志操作模式为archivelog.
sql>shutdown immediate;
sql>startup mount;
sql>alter database archivelog;
sql>alter database open;
1.6部署归档日志的位置
sql>alter system set log_archive_format='%s_%t_%r.log' scope=spfile;
sql>alter system set log_archive_dest_1='location=/database/oracle/arch MANDATORY' scope=spfile;
sql>alter system set log_archive_dest_2='location=/database/backup/arch MANDATORY' scope=spfile;
sql>alter system set log_archive_dest_2='location=/database/backup/oraclett/arch MANDATORY' scope=spfile;
三个归档地点分别在不同的三个磁盘上.
sql>alter system switch logfile;
用上面的命令进行强制性切换联机日志,到相应的归当地点可以看到同样的归档日志.
开始备份
1.冷备份
不做过多的介绍,做操作系统级的备份,是数据库在关闭的情况下做的备份,因为不能进行完全恢复所以,而且数据库需要停止使用进行备份,所以一般不用此方法.(请看下面脚本)
[oracle@linux backupscr]$ cat coolbackup.sh
#!/bin/sh
###################Local host environment#####################
ORACLE_BASE_HOME=/database/oracle
ORACLE_BIN_PATH=$ORACLE_BASE_HOME/product/10.1.0/db_1/bin
SOURCE_DATA__HOME=$ORACLE_BASE_HOME/oradata/JSWY
BACKUP_HOME=/database/backup
COOL_BACKUP_HOME=$BACKUP_HOME/cool
OLD_CBACKUP_HOME=$COOL_BACKUP_HOME
TARGET_CBACKUP_HOME=$COOL_BACKUP_HOME/new
TMP_HOME=$BACKUP_HOME/tmp
PFILE_HOME=$ORACLE_BASE_HOME/admin/JSWY/pfile
####################Remote host enviroment######################
BACKUP_HOST_ADDR=192.168.0.100
BACKUP_USER=obackup
RBACKUP_HOME=rbackup
RCBACKUP_HOME=$RBACKUP_HOME/cool
TARGET_RCBACKUP_HOME=$RCBACKUP_HOME/new
##################Database down#########################################
echo "#########################Database to shutdown#####################"
$ORACLE_BIN_PATH/sqlplus sys/sys as sysdba <<EOF
shutdown immediate;
exit;
EOF
##################Bgein backup##################################################echo "#########################Backup begin###################"
if [ ! -d $TARGET_CBACKUP_HOME -o ! -d $TMP_HOME ] ; then
/bin/mkdir -p $TARGET_CBACKUP_HOME
/bin/mkdir -p $TMP_HOME
fi
cp $PFILE_HOME $TARGET_CBACKUP_HOME/
if cp $SOURCE_DATA__HOME/* $TMP_HOME/
then
rm -f $OLD_CBACKUP_HOME/*
mv $TARGET_CBACKUP_HOME/* $OLD_CBACKUP_HOME/
mv $TMP_HOME/* $TARGET_CBACKUP_HOME/
echo "ok"
else
echo "Backup error!!!"
exit;
fi
echo "################################Backup end########################"
###################Database start################################################
echo "##############################Database to startup#################"
$ORACLE_BIN_PATH/sqlplus sys/sys as sysdba <<EOF
startup;
exit;
EOF
###################Backup to other host###########################
echo "######################Backup to ftp#########################"
ssh $BACKUP_USER@$BACKUP_HOST_ADDR << SSH
rm -f $RCBACKUP_HOME/*
mv $TARGET_RCBACKUP_HOME/* $RCBACKUP_HOME/
exit
SSH
scp $TARGET_CBACKUP_HOME/* $BACKUP_USER@$BACKUP_HOST_ADDR:$TARGET_RCBACKUP_HOME
echo "#########################END###############################"
些脚本功能冷备份数据文件,控制文件,参数文件到TARGET_CBACKUP_HOME,并且把备份的文件同时备份一份儿到另外的一台主机上(192.168.0.100),相关的环境变量根据自己的实际情况修改.其实这里已经通过smb加载了对方的磁盘进行使用根本不用scp进行,但是为了这个脚本在以后其它地方还能用所以写成了这样.所有的脚本中都有用ssh不需要密码登录到另一台linux机的一段代码,这个具体设置如下:
*********************************************************************************************************
A为本地主机(即用于控制其他主机的机器) ;
B为远程主机(即被控制的机器Server), 假如ip为172.24.253.2 ;
A和B的系统都是Linux
在A上的命令:
# ssh-keygen -t rsa (连续三次回车,即在本地生成了公钥和私钥,不设置密码)
# ssh root@172.24.253.2 "mkdir .ssh;chmod 0700 .ssh" (需要输入密码)
# scp ~/.ssh/id_rsa.pub root@172.24.253.2:.ssh/id_rsa.pub (需要输入密码)
在B上的命令:
# touch /root/.ssh/authorized_keys2 (如果已经存在这个文件, 跳过这条)
# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys2 (将id_rsa.pub的内容追加到 authorized_keys2 中)
回到A机器:
# ssh root@172.24.253.2
***********************************************************************************************************
1.1冷备份的恢复
说句废话,这个根本不用多说.
2.热备份(主要介绍基于rman的备份和恢复)
2.1 介绍需要理解的重要的RMAN组件
1>目标数据库
指要执行备份,转存和恢复的操作的数据库,除非是只读应用的系统,否则建议目 票数据库采用ARCHIVELOG模式
2>服务器进程
使用rman执行备份等操作时,必須先连接到目标数据库.当连接到时会建立两个到目标数据库的进程.
3>通道
RMAN需要在存储设备和目标数据库之间建立联接,这个连接称为通道.
4>RMAN元数据和RMAN资料库
RMAN元数据是指ram在操作中所使用的数据.rman元数据的集合称为rman资料库.(重要:当使用rman进行备份,转存和恢复时,oracle会将rman的元数据放到目标数据库的控制文件中.如果rman是以恢复目录进行的,那么元数据还会被存到恢复目录中.)
5> 恢复目录
恢复目录用于存放rman元数据,是一个可选设置.当使用目标数据库控制文件存放rman元数据时,在rman元数据存放到天数达到初始化参数control_file_record_keep_time的之后,其元数据会被覆盖,导致之前的备份不可用.能过恢复目录可以永久保留需要的rman元数据.(注:如果要使用恢复目录那么恢复目录要放在与目标数据库不同的数据库中)
2.2运行rman
1>得到帮助
linux>$ORACLE_HOME/bin/rman help
2>不使用恢复目录联接到目标数据库
linux>$ORACLE_HOME/bin/rman target sys/passwd@target_database nocatalog
3>使用恢复目录联接到目标数据库
linux>$ORACLE_HOME/bin/rman target sys/passwd@target_database catalog rman_user/passwd@rman_database (注:target是连接到目标数据库,这里可以指定auxiliary联接到辅助数据库,联接到目标数据库和辅助数据库时必须用sysdba或sysoper身份.
2.3rman命令
rman命令分为两种一种是单独执行的命令,一种是作业命令包含在run{}中,如果运行sql命令格式为rman>sql "sql_command";运行脚本格式为rman>run{execute script sl;},运行操作系统命令rman>run {host "command";}.
2.4配置rman环境
1>配置自动通道的并行度
rman>configure device type disk parallelism 3;
将磁盘的并行度配置为3,如果是磁带请将里面的disk改为sbt;
2>配置所有通道的备份文件格式.默认会自动为disk分配一个通道,但没有任何选项,如果不指定通道号将配置所有通道.
rman>configure channel device type disk format '/database/backup/%d_%s_%p.bak';
这里解释一下这些 %参数的意思
%d数据库名称
%n为数据库我增加1个或多个x字母使其长度到8个字符
%s备份集编号,来源于目标控制文件,从1开始每次递增1,如果控制文件重新生成,刚该编号回到1重新开始
%p备份集内备份片的编码,第一个号码是1,在同一备份集中每个新的备分片递增1
%t备份的时间值.是以前某个参考时间点开始到现在的秒数
%u一个8位字符的值,来自于备份集数字和备份的时间
%c备份集中的备份片的拷贝数.除非指定为双份备,否则一直是1
%U生成一个惟一的由%u_%p_%c组成的文件名.如果没有指定备份文件的格式,默认是%U
%e用于指定归档日志的序列号
%N用于指定表空间的名称
%f用于指定绝对文件号
要防止建立备份集错误,%s是必須的,要建立多个备份文件,%p是必须的,要建立多个备份片副本,%c是必须的.
3>配置默认存储设备,默认的为disk,可以改为其它
rman>confgiure default device type to sbt;(改为磁带)
4>配置备份集和备份片最大尺寸
rman>configure maxsetsize to 1G;
可以将一个大的备份集划为几个相对小的备份片文件,并分布到多个设备上,如
rman>configure channel device type disk maxpiecesize 500M;
5>配置备份优化
默认备份优化是关闭的要打开如下
rman>configure backup optimization on;
6>配置多重备份
默认只会生成一个备份片副本,可以生成多个,如三个
rman>configure datafile backup copies for device type disk to 3;
7>配置免除表空间
默认情况下,当执行backup database命令时,除了临时表空间外所有的表空间都会备份,如果某些表只是用于存放测试数据或者表空间很少变化,那么可以在备份数据库时免除该表空间.如user01
rman>configure exclude for tablespace user01;
8>配置备份冗余策略
当用rman执行了多次备份之后,有些陈旧的备份可能不再需要需要删除.用configure命令可以配置备份冗余.
rman>configure retention policy to redundancy 2;
9>配置快照控制文件
当生新同步恢复目录或者备份控制文件时,需要建立快照文件.
rman>configure snapshot controlfile name to 'path/name';
10>显示所有rman配置信息
rman>show all;
11>清除rman配置.如果要将rman配置修改为默认配置则可以用clear选项清除相应的配置.例子清除rman的冗余策略配.
rman>configure retention policy clear;
通过以上的有关rman的介绍我们知道,有一个完整的数据库备份,有关于从备份开始到发生问题时的所有正确的归档日志和联机日志,那么就可以对数据库进行完合恢复.如果rman在nocatalog模式在那么只要保证在控制文件改变时用rman做数据库的备份,那么控制文件中就会一直有这个rman备份的元数据,也就是说这个备份一直可用.
2.5整个数据库的备份和恢复
可通过alter system set control_file_record_keep_time=n改变控制文件的更新时间,系统默认为7天,可以通过show parameter control_file_record_keep_time显示出来.在控制文件更改时做数据库的全部分,使用crontab
*********************************************************
简介
crontab-操作每个用户的守护程序和该执行的时间表。
部分参数说明
crontab file [-u user]-用指定的文件替代目前的crontab。
crontab-[-u user]-用标准输入替代目前的crontab.
crontab-1[user]-列出用户目前的crontab.
crontab-e[user]-编辑用户目前的crontab.
crontab-d[user]-删除用户目前的crontab.
crontab-c dir- 指定crontab的目录。
crontab文件的格式:M H D m d cmd.
M: 分钟(0-59)。
H:小时(0-23)。
D:天(1-31)。
m: 月(1-12)。
d: 一星期内的天(0~6,0为星期天)。
cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环境变量。
下面是一个例子文件:
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
#每天早上6点
106* * * date
#每两个小时
0*/2* * * date
#晚上11点到早上8点之间每两个小时,早上部点
0 23-7/2,8* * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4* mon-wed date
#1月份日早上4点
0 4 1 jan* date
**********************************************************************
编辑oracle 的crontab每星期天执行凌辰2点执行rmanf.sh
linux>crontab -e
* 2 * * *0 "path/rmanf.sh backup"
保存退出,脚本内容如下.
[oracle@linux backupscr]$ cat rmanf.sh
#!/bin/sh
###################Local host environment#####################
ORACLE_BASE_HOME=/database/oracle
ORACLE_BIN_PATH=$ORACLE_BASE_HOME/product/10.1.0/db_1/bin
BACKUP_HOME=/database/backup
RMAN_FBACKUP_HOME=$BACKUP_HOME/rman/full
OLDRMAN_FBACKUP_HOME=$RMAN_FBACKUP_HOME
TARGET_RFBACKUP_HOME=$RMAN_FBACKUP_HOME/new
TMP_HOME=$BACKUP_HOME/tmp
####################Remote host enviroment######################
BACKUP_HOST_ADDR=192.168.0.100
BACKUP_USER=obackup
RBACKUP_HOME=rbackup
RRBACKUP_HOME=$RBACKUP_HOME/rman/full
TARGET_RRBACKUP_HOME=$RRBACKUP_HOME/new
if [ $1 = "restore" ] ; then
##################Restore######################
$ORACLE_BIN_PATH/rman << EOF
connect target sys/*****@JSWY catalog rman/****@rmandb
run{
allocate channel c1 type disk;
restore database;
recover database;
sql 'alter database open';
release channel c1;
}
EOF
fi
if [ $1 = "backup" ] ; then
###########################Rman full backup#########################
rm -f $OLDRMAN_FBACKUP_HOME/*
mv $TARGET_RFBACKUP_HOME/* $OLDRMAN_FBACKUP_HOME
$ORACLE_BIN_PATH/rman msglog=$TARGET_RFBACKUP_HOME/rmanfb.log << EOF
connect target sys/****@JSWY catalog rman/*****@catdb
configure controlfile autobackup format for device type disk to '$TARGET_RFBACKUP_HOME/%F';
run{
sql "alter system switch logfile";
sql "alter system archive log all";
allocate channel c1 type disk;
backup full tag 'dbfull' format '$TARGET_RFBACKUP_HOME/full%u_%s_%p' database
include current controlfile;
sql 'alter system archive log current';
release channel c1;
}
EOF
#######################Backup to Remote host#######################
ssh $BACKUP_USER@$BACKUP_HOST_ADDR << SSH
rm -f $RRBACKUP_HOME/*
mv $TARGET_RRBACKUP_HOME/* $RRBACKUP_HOME/
exit
SSH
scp $TARGET_RFBACKUP_HOME/* $BACKUP_USER@$BACKUP_HOST_ADDR:$TARGET_RRBACKUP_HOME
echo "#########################END###############################"
fi
rman以nocatalog模式工作,备份整个数据库,在恢复时如果要进行完全恢复,则备份后的所有归档日志都必須存在.并且备份一复本到远程机192.16.0.100上.
2.6表空间的备份和恢复
[oracle@linux backupscr]$ cat rmants.sh
###################Local host environment#####################
ORACLE_BASE_HOME=/database/oracle
ORACLE_BIN_PATH=$ORACLE_BASE_HOME/product/10.1.0/db_1/bin
BACKUP_HOME=/database/backup
RMAN_TSBACKUP_HOME=$BACKUP_HOME/rman/ts
OLDRMAN_TSBACKUP_HOME=$RMAN_TSBACKUP_HOME
TARGET_RTSBACKUP_HOME=$RMAN_TSBACKUP_HOME/new
TMP_HOME=$BACKUP_HOME/tmp
####################Remote host enviroment######################
BACKUP_HOST_ADDR=192.168.0.100
BACKUP_USER=obackup
RBACKUP_HOME=rbackup
RRTSBACKUP_HOME=$RBACKUP_HOME/rman/ts
TARGET_RRTSBACKUP_HOME=$RRTSBACKUP_HOME/new
if [ $1 = "restore" ] ; then
##################Restore######################
$ORACLE_BIN_PATH/rman << EOF
connect target sys/****@JSWY catalog rman/****@catdb
run{
sql 'alter database datafile $2 offline drop';
sql 'alter database open';
allocate channel c1 type disk;
restore datafile $2;
recover datafile $2;
sql 'alter database datafile $2 online';
release channel c1;
}
EOF
fi
if [ $1 = "backup" ] ; then
###########################Rman tablespace backup#########################
rm -f $OLDRMAN_TSBACKUP_HOME/*
mv $TARGET_RTSBACKUP_HOME/* $OLDRMAN_TSBACKUP_HOME
$ORACLE_BIN_PATH/rman msglog=$TARGET_RTSBACKUP_HOME/rmants.log << EOF
connect target sys/****@JSWY catalog rman/****@catdb
run{
sql "alter system switch logfile";
sql "alter system archive log all";
allocate channel c1 type disk;
backup tag 'tsuser' format '$TARGET_RTSBACKUP_HOME/ts$2%u_%s_%p'
tablespace $2;
release channel c1;
}
EOF
#######################Backup to Remote host#######################
ssh $BACKUP_USER@$BACKUP_HOST_ADDR << SSH
rm -f $RRTSBACKUP_HOME/*
mv $TARGET_RRTSBACKUP_HOME/* $RRTSBACKUP_HOME/
exit
SSH
scp $TARGET_RTSBACKUP_HOME/* $BACKUP_USER@$BACKUP_HOST_ADDR:$TARGET_RRTSBACKUP_HOME
echo "#########################END###############################"
fi
备份用表空间,并且在远程机192.168.0.100有一相同镜像.注意以上所有脚本中恢复时的参数是要从启动数据库时的错误信息中得到的.如果不知道请参阅前的命令.
以上所有的脚本经过个修改在192.168.0.200机上运行也有,他备份192.168.0.100机上的rman的恢复目录数据库.这个关系是:
192.168.0.200机通过rman的catalog模式进行备份,192.168.0.200的rman备份的信息在192.168.0.100机的catdb数据库中.
192.168.0.100的catdb数据库通过192.168.0.200的rman进行备份,192.168.0.100的rman的数据库的备份信息在192.168.0.100的rman_ts表中,他们是互备的,其最终目的都是为了备份192.168.0.200的数据库.
有关口令的问题
问题:我在 Solaris 系统上运行 Oracle8i 8.1.7 企业版。我创建了两个数据库: SUGAR 和 TestDb 。将两者的 remote_login_passwordfile 都设置为 “独占( exclusive )”。我试图以 SYSDBA 身份连接到 TestDb ,但未能成功。下面是我的做法:
$sqlplus /nolog
SQL> conn sys/change_on_install@testdb
Connected.( 已连接 )
SQL> select * from v$pwfile_users;
username sysdb sysop
-----------------------------------------
internal true true
sys true true
SQL> conn sys/change_on_install@testdb as
sysdba
ERROR (错误)
ORA-01017: invalid username/password; logon
denied (无效的用户名 / 口令,登录被拒绝)
Warning: You are on longer connected to
ORACLE( 警告:你已经与 ORACLE 断开连接 )
我为什么不能以 SYSDBA 身份连接到 TestDb?
答:通常 Oracle 中的 SYS 口令与 INTERNAL 口令是同步的, SYS 口令存储于口令文件中。在上述情况下你建立了包含有一个口令的口令文件,而不是使用缺省的 “ change_on_install, ”这就是问题之所在。
希望下面的方法对你有所帮助。首先,建立一个口令文件,其中包含一个口令,这个口令不要与系统口令匹配:
$ orapwd file=orapw password=foobar entries=40
然后,进入服务器,启动数据库:
$ svrmgr
SVRMGR> connect internal
Connected. (已连接)
SVRMGR> startup
ORACLE instance started. ( ORACLE 实例已启动)
Total System Global Area (系统全局区域大小)
193073136 bytes
Fixed Size (固定大小)
69616 bytes
Variable Size (可变大小)
141639680 bytes
Database Buffers (数据库缓冲区)
45056000 bytes
Redo Buffers (重做缓冲区)
6307840 bytes
Database mounted. (数据库已加载)
Database opened. 数据库已打开。
现在使用 SYS 用户的口令,以 SYS 身份连接:
SVRMGR> connect sys/change_on_install@ora81
Connected. (已连接)
成功了。现在试着以 SYSDBA 身份连接:
SVRMGR> connect sys/change_on_install@ora81
as sysdba;
ORA-01017: invalid username/password; logon
denied (无效的用户名 / 口令;登录被拒绝)
这里出现了你所说的错误。你的 SYS 口令为: change_on_install ,但口令文件中的口令却是 foobar 。 SYS 用户是专用的,以 SYSDBA 身份连接就像是以 INTERNAL 连接,你必须使用口令文件中的口令。试试这样做:
SVRMGR— connect sys/foobar@ora81 as sysdba;
Connected. (已连接)
并不是每个人都需要使用口令文件中的口令;用户需要使用他们自己的口令。通过授权 SYSDBA 给 SCOTT ,你就可以明白这一点:
SVRMGR> grant sysdba to scott;
Statement processed. (已处理)
这个命令将 SCOTT 以 SCOTT 的凭证加入到口令文件中。如果你改变了 SCOTT 的口令,口令文件也会自动同步改变。现在,你可以试试以 SYSDBA 身份连接 SCOTT 了:
SVRMGR> connect scott/tiger@ora81 as sysdba;
Connected. (已连接)
一切正常。现在可以使用 ALTER USER 命令来改变 SYS 用户的口令。
SVRMGR> alter user sys identified by
change_on_install;
Statement processed. (已成功更改)
SVRMGR≫ connect sys/change_on_install@ora81
as sysdba;
Connected. (已连接)
你还可以用 change_on_install ,因为改变 SYS 用户口令将同时改变口令文件中的口令。当你建立了口令文件后, Oracle 数据库在其中放入两个账号: SYS 和 INTERNAL ,并将你在命令行中提供的口令作为这两个账户的口令。当你改变数据库中的 SYS 用户口令时,数据库将冲掉口令文件中的 SYS 和 INTERNAL 口令。
1456

被折叠的 条评论
为什么被折叠?



