oracle--20数据库恢复与备份1

具体代码如下所示:
#!/bin/sh
#******************************************************************
# File: oraclebak.sh
# Creation Date: 2014/1/22 17:57:32
# Last Modified: 2014/1/22 17:57:34
# 脚本功能:oracle备份脚本
# 执行方法:1、第一次执行需要root用户执行,脚本会以询问的方式创建备份目录和相关参数
# 2、脚本会自动写入crontab调度里面定时执行,crontab设置是在第一次执行的时候自动添加的
#******************************************************************
echo $USER
if [ $USER != root ]
then
echo "检测到安装用户不是root用户,请用root用户登录再执行安装文件"
exit 1
fi
echo "开始安装oracle数据库备份工具.........................."
echo "请输入备份程序的安装目录:"
read installdir
mkdir -p $installdir
result=$?
while [ $result -ne 0 ]
do
echo "无法创建目录,请重新输入或退出安装。输入y重新输入,输入n退出安装。"
read redo
if [ $redo != y ]
then
echo "用户退出安装。"
exit 0
fi
echo "请输入备份程序的安装目录:"
read installdir
mkdir $installdir
result=$?
done
echo "安装目录创建完成。"
echo "请输入执行备份用户(一般为oracle用户):"
read execuser
id $execuser
result=$?
while [ $result -ne 0 ]
do
echo "不存在该用户,是否更换其它用户或者退出安装新建用户,输入y更换用户,输入n退出安装"
read redo
if [ $redo != y ]
then
echo "用户退出安装"
exit 0
fi
echo "请输入执行备份的用户(一般为tnmsdb2用户)"
read execuser
id $execuser
result=$?
done
echo "你希望建立备份的数据库数量(一般为1)"
read backnum
if [ $backnum -eq 0 ]
then
echo "无备份数据库,退出安装"
exit 0
fi
scount=0
while [ $scount -lt $backnum ]
do
echo "请输入第"$(($scount+1))"个备份登录登录oracle数据库的用户名和密码,以及本地服务名"
echo "用户名"
read username[$scount]
echo "密码"
read password[$scount]
echo "服务名"
read sname[$scount]
su -l -c"sqlplus /nolog" $execuser<<insert
whenever sqlerror exit sql.sqlcode;
connect ${username[$scount]}/${password[$scount]}@${sname[$scount]}
exit
insert
result=$?
if [ $result -ne 0 ]
then
echo "输入数据库信息无法被连接,是否重新输入?输入y重新输入,输入n退出安装。"
read redo
if [ $redo != y ]
then
echo "用户退出安装"
exit 0
fi
else
scount=$(($scount+1))
fi
done
echo "输入值守时间,值守时间的格式为 mm hh dd MM E 。"
echo "m代表分钟,h代表小时,d代表日期,M代表月份,E代表星期"
echo "不输入则为任意时间"
scount=0
iscontinue=y
while [ $iscontinue == y ]
do
echo "输入第$(($scount+1))个值守时间"
echo "分钟"
read min
echo "小时"
read hour
echo "日期"
read day
if [ ! $day ]
then
day="*"
fi
echo "月份"
read mouth
if [ ! $mouth ]
then
mouth="*"
fi
week="*"
backtime[$scount]="$min $hour $day $mouth $week"
echo -e "${backtime[$scount]}"
echo "是否输入更多值守时间?输入y继续,输入n进入下一步。"
read iscontinue
scount=$(($scount+1))
done
echo "是否要进行远程备份?输入y为进行远程备份,输入n进入下一步"
scount=0
read iscontinue
while [ $iscontinue == y ]
do
echo "请选择远程备份类型,输入s为sftp备份类型,否则为ftp备份类型"
read iss
if [ $iss == s ]
then
rtype[$scount]="sftp"
else
rtype[$scount]="ftp"
fi
echo "请输入远程备份地址,可以为域名,计算机名或者ip地址"
read rurl[$scount]
echo "请输入远程备份登录名"
read rname[$scount]
echo "请输入远程备份登录密码"
read rpass[$scount]
echo "是否输入更多远程备份地址?输入y重新输入,n进入下一步"
read iscontinue
scount=$(($scount+1))
done
# installdir
# execuser
# username password sname
# backtime
# rtype rurl rname rpass
echo "您所作的备份配置如下:"
sresult=$(echo -n "$installdir" | grep '^/')
if [ ! $sresult ]
then
installdir="$PWD/$installdir"
else
installdir=$installdir
fi
echo "本地备份目录为$installdir"
echo "执行备份系统用户为$execuser"
echo "系统备份数据库:"
allcount=${#username[@]}
scount=0
while [ $scount -lt $allcount ]
do
echo "${username[$scount]}/${password[$scount]}@${sname[$scount]}"
scount=$(($scount+1))
done
echo "执行备份的值守时间表,*代表任意"
scount=0
backnum=${#backtime[@]}
while [ $scount -lt $backnum ]
do
echo "${backtime[$scount]}"
scount=$(($scount+1))
done
rnum=${#rtype[@]}
if [ $rnum -ne 0 ]
then
echo "远程备份的服务地址为:"
scount=0
while [ $scount -lt $rnum ]
do
echo "连接方式:${rtype[$scount]},连接地址:${rurl[$scount]},用户名:${rname[$scount]},密码:${rpass[$scount]}"
scount=$(($scount+1))
done
fi
echo "是否确认安装?输入y继续,输入n退出安装"
read isgoon
if [ $isgoon != y ]
then
exit 0;
fi
echo "正在生产目录结构................................";
mkdir -p $installdir/logs
mkdir -p $installdir/temp
mkdir -p $installdir/zip
chown -Rvf $execuser $installdir
echo "目录结构生成完成................................"
echo "生成备份执行文件................................"
echo "#!/bin/bash">$installdir/runback.sh
echo "source ~/.bash_profile">>$installdir/runback.sh
echo "nowdate=\$(date +%Y-%m-%d_%k.%M.%S)">>$installdir/runback.sh
echo "nowmouth=\$(date +%Y-%m)">>$installdir/runback.sh
echo "echo \"\$nowdate开始备份.......................................\">>$installdir/logs/\$nowmouth.log">>$installdir/runback.sh
scount=0
snum=${#username[@]}
while [ $scount -lt $snum ]
do
echo "exp ${username[$scount]}/${password[$scount]}@${sname[$scount]} file=$installdir/temp/${username[$scount]}_${sname[$scount]}\$nowdate.dmp compress=N>>$installdir/logs/\$nowmouth.log 2>&1">>$installdir/runback.sh
scount=$(($scount+1))
done
echo "echo \"\$(date +%Y-%m-%d_%k.%M.%S)完成备份.......................................\">>$installdir/logs/\$nowmouth.log">>$installdir/runback.sh
echo "echo \"\$(date +%Y-%m-%d_%k.%M.%S)开始打包.......................................\">>$installdir/logs/\$nowmouth.log">>$installdir/runback.sh
echo "gzip $installdir/zip/\$nowdate.zip $installdir/temp/>>$installdir/logs/\$nowmouth.log 2>&1">>$installdir/runback.sh
echo "rm -Rvf $installdir/temp/*>>$installdir/logs/\$nowmouth.log 2>&1">>$installdir/runback.sh
echo "echo \"\$(date +%Y-%m-%d_%k.%M.%S)打包完成.......................................\">>$installdir/logs/\$nowmouth.log">>$installdir/runback.sh
scount=0
if [ ${#rtype[@]} -ne 0 ]
then
echo "echo \"\$(date +%Y-%m-%d_%k.%M.%S)进行远程备份.......................................\">>$installdir/logs/\$nowmouth.log">>$installdir/runback.sh
snum=${#rtype[@]}
while [ $scount -lt $snum ]
do
echo "lftp -u ${rname[$scount]},${rpass[$scount]} ${rtype[$scount]}://${rurl[$scount]}<<remote">>$installdir/runback.sh
echo "mkdir remotedbback">>$installdir/runback.sh
echo "cd remotedbback">>$installdir/runback.sh
echo "mput $installdir/zip/\$nowdate.zip">>$installdir/runback.sh
echo "exit">>$installdir/runback.sh
echo "remote">>$installdir/runback.sh
scount=$(($scount+1))
done
echo "echo \"\$(date +%Y-%m-%d_%k.%M.%S)完成远程备份.......................................\">>$installdir/logs/\$nowmouth.log">>$installdir/runback.sh
fi
echo "exit 0">>$installdir/runback.sh
chmod 775 $installdir/runback.sh
chown $execuser $installdir/runback.sh
echo "生成备份执行文件完成............................"
echo "开始定制值守时间................................"
scount=0
snum=${#backtime[@]}
while [ $scount -lt $snum ]
do
echo "${backtime[$scount]} $installdir/runback.sh">>$installdir/planlist
scount=$(($scount+1))
done
su -l -c"crontab $installdir/planlist" oracle
echo "完成值守时间定制................................"
exit 0
接下来给大家介绍linux oracle自动备份脚本
1、备份脚本:
#!/bin/sh
export ORACLE_BASE=/home/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORACLE_SID=orcl
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
export DATA_DIR=/home/bakup/data
export LOGS_DIR=/home/bakup/logs
export DELTIME=`date -d "7 days ago" +%Y%m%d`
export BAKUPTIME=`date +%Y%m%d%H%M%S`
mkdir -p $DATA_DIR
mkdir -p $LOGS_DIR
echo "Starting bakup..."
echo "Bakup file path $DATA_DIR/$BAKUPTIME.dmp"
exp shop/lyisABC0987@orcl file=$DATA_DIR/$BAKUPTIME.dmp log=$LOGS_DIR/$BAKUPTIME.log
echo "Delete the file bakup before 7 days..."
rm -rf $DATA_DIR/$DELTIME*.dmp
rm -rf $LOGS_DIR/$DELTIME*.log
echo "Delete the file bakup successfully. "
echo "Bakup completed."
2、添加到任务调度
crontab -u oracle -e
* 3 * * * /home/bakup/bakup.sh
即每天凌晨3点进行备份
如需每天备份多次,可设置不同时间段备份:
例如:* 3,13,18 * * * /home/bakup/bakup.sh,即每天3点、13点、18点进行备份。
说明:文件备份目录,用户oracle必须有更改权限,否则无法备份。

我们计划让数据库在晚上23点做export导出备份,在凌晨2点将备份文件拷贝到磁带上,在凌晨4点将备份文件拷贝到另一台UNIX机器上,为此我们可进行如下操作:
一、导出数据库
export命令将数据库中的数据备份成一个二进制文件,它通常有三种模式:用户模式、表模式和整个数据库模式。本文拟采用用户模式,备份之前,应先建立一个备份目录,以容纳备份文件,比如可建一个/backup目录。接着我们可在UNIX的Oracle目录下(也可以是其它目录)分别建立两个文件ora—backup,tar—backup。需要说明的是,前一个文件需要对Oracle的参数进行初始化,为了方便起见,我们不妨将初始化命令放到一个文件中(文件名姑且定为ora—env),再由第一个文件调用它。
1. ora—env文件对Oracle的参数进行初始化,其内容如下:
ORACLE—HOME=$ORACLE—HOME;export ORACLE—HOME
ORACLE—SID=ora73;export ORACLE—SID
ORACLE—TERM=sun;export ORACLE—TERM
LD—LIBRARY—PATH=$ORACLE—HOME/lib;export LD—LIBRARY—PATH
ORA—NLS32=$ORACLE—HOME/ocommon/nls/admin/data;export ORA—NLS
PATH=.:/usr/ccs/bin:/usr/ucb:$ORACLE—HOME/bin:$PATH;export PATH
DISPLAY=host1:0;export DISPLAY
NLS—LANG=american—america.zhs16cgb231280;export NLS—LANG
2. ora—backup文件对数据库做export导出,导出的文件名可以任意定,本文定为字母“xx”加当天日期,即假如当天日期是12月10号,则导出的文件名为“xx1210.dmp”,以区别于其它日期的备份文件。
ora—backup文件内容:
./oracle/ora—env
#初始化Oracle数据库
rq=′date +″%m%d″ ′
#把当天日期赋予变量rq
rm /backup/
# 清空 /backup目录
exp test/test file=/backup/xx$rq.dmp log=/backup/xx$rq.log
本命令用于在$提示符下,导出test用户的数据(其口令亦为test),导出文件及日志均放在/backup目录下。
二、磁带备份
tar—backup文件将用export命令导出的数据文件拷贝到磁带上。
tar—backup文件内容:
tar rvf /dev/rmt/0n/backup/
本命令可将/backup目录下当天产生的文件备份到磁带上。本文件中,tar命令使用了三个参数,其中r选项表示向磁带上拷入文件而不破坏磁带原来内容,v选项表示在拷贝过程中显示文件信息,f选项后面加上磁带设备名,指定文件向何处拷贝,n选项表示磁带机不倒带。/dev/rmt/0表示UNIX主机第一个磁带驱动器,同理,/dev/rmt/1则表示UNIX主机第二个磁带驱动器,依此类推。
ora—env、ora—backup、tar—backup文件编写完成后,分别使用下述命令:
chmod 755 ora—env
chmod 755 ora—backup
chmod 755 tar—backup
这样,三个文件就都变成了可执行文件。
三、异地备份
我们知道,通常可用FTP命令在两台主机间传输数据,但一般是通过交互方式实现的,即需要手工输入目标主机的IP地址、用户名、口令等。显然,这不符合自动备份的要求。所幸的是,我们可以通过编写一个.netrc的文件来达到目标。这一文件必须命名为.netrc,且必须存放在启动FTP命令的机器上的用户注册目录中,该文件的权限应禁止组内或其它用户进行读访问。这样,当用户使用FTP命令的时候,系统将会在该用户的注册目录中寻找.netrc文件,如果能够寻找到,将会首先执行该文件,否则,会交互式地提示用户输入用户名、口令等。
在使用FTP命令之前,应先在另一台作备份用的UNIX机器上建一目录,以容纳备份文件,本文建的目录是/pub 。需要指出的是,为了加快备份速度,两台主机之间的传输速率应尽可能的高,最好位于同一局域网上。
.netrc文件内容如下:
machine host2
# host2为作备份用的主机名
login oracle
#oracle为备份主机上的一个用户
password oracle
#oracle用户的口令为oracle
macdef init
#定义一个名为init的宏,它将在自动注册进程的最后被执行
bin
#文件的传输方式设为二进制
lcd /backup
# 进入本地工作目录/backup
cd /pub
# 进入备份主机目录/pub
mput 
# 将/backup目录下的所有文件传输至备份主机
bye
#退出FTP会话进程
.netrc文件编写完成后,使用下述命令:
chmod 600 .netrc
这样,.netrc文件就只能被该用户所访问。
四、启动备份进程
Cron是一个永久进程,它由/etc/rc.local启动执行。Cron检查/var/spool/cron/crontabs/目录中的文件,找到所要执行的任务和执行任务的时间。
Crontab文件的每一行由六个域(minutes、hours、day of month、month、day of week、 command)组成,域之间用空格或Tab分开,其中:
minutes:分钟域,值的范围是0到59
hours:小时域,值的范围是0到23
day of month:日期,值的范围是1到31
month:月份,值的范围是1到12
day of week:星期,值的范围是0到6,星期日值为0
command:所要运行的命令
如果一个域是,表明命令可以在该域所有可能的取值范围内执行。
如果一个域是由连字符隔开的两个数字,表明命令可以在两个数字之间的范围内执行(包括两个数字本身)。
如果一个域是由逗号隔开的一系列值组成的,表明命令可以在这些值组成的范围内执行。
如果日期域和星期域都有值,则这两个域都有效。
现在,我们编写一个文件,用以启动自动备份进程。值得注意的是,该文件只能在Oracle用户名下用crontab -e 命令来编辑,否则将不会被定时执行,文件名定为Oracle,文件将放在/var/spool/cron/crontabs 目录下。编辑完成后,可以在Oracle的$提示符下,用crontab -l命令来查看。
Oracle文件内容:
0 23    /oracle/ora—backup
# 每天23点对数据库执行备份
0 2    /oracle/tar—backup
# 每天2点将文件备份到磁带上
[1] [2] 下一页
正在看的ORACLE教程是:自动备份Oracle数据库。
0 4    ftp -i host2
# 每天4点将文件备份到另一台主机上
经过以上的操作后,系统每天晚上将自动产生一个备份,并且自动将备份文件分别拷贝到磁带上和另一台主机上。系统管理员需要做的是,隔几天换一盘磁带(更换磁带的周期取决于备份文件的大小和磁带的容量)和清理备份目录。这样,他们就可以从备份数据的繁琐中解脱出来,去做其它更有意义的工作。而数据库既实现了磁带备份,又实现了异地备份,相应的安全性也大大提高了。

执行环境:  可以在SQLPLUS.EXE或者DOS(命令行)中执行,  DOS中可以执行时由于 在oracle 8i 中  安装目录/ora81/BIN被设置为全局路径,  该目录下有EXP.EXE与IMP.EXE文件被用来执行导入导出。
 oracle用java编写,我想SQLPLUS.EXE、EXP.EXE、IMP.EXE这俩个文件是被包装后的类文件。  SQLPLUS.EXE调用EXP.EXE、IMP.EXE他们所包裹的类,完成导入导出功能。
用IMP和EXP处理的:     EXP   userid=<username>/<password>@<service_name>   file=<dmpname>         IMP   userid==<username>/<password>@<service_name>   file=<dmpname>   fromuser=<fromuser>   touser=<touser>
实例: 数据的导出
exp qhmis/qhmis@qhmis  file='d:/backup/qhmis/qhmis20060526.dmp'  grants=y  full=n  
1 将数据库TEST完全导出,用户名system 密码manager 导出到D:/daochu.dmp中   
exp system/manager@TEST file=d:/daochu.dmp full=y  
2 将数据库中system用户与sys用户的表导出   
exp system/manager@TEST file=d:/daochu.dmp owner=(system,sys)  
3 将数据库中的表table1 、table2导出   
exp system/manager@TEST file=d:/daochu.dmp tables=(table1,table2)  
4 将数据库中的表table1中的字段filed1以"00"打头的数据导出    
exp system/manager@TEST file=d:/daochu.dmp tables=(table1) query=/" where filed1 like '00%'/"       
上面是常用的导出,对于压缩我不太在意,用winzip把dmp文件可以很好的压缩。
不过在上面命令后面 加上 compress=y  就可以了。
数据的导入  
1 将D:/daochu.dmp 中的数据导入 TEST数据库中。   
imp system/manager@TEST  file=d:/daochu.dmp    上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。    在后面加上 ignore=y 就可以了。  
2 将d:/daochu.dmp中的表table1 导入  
imp system/manager@TEST  file=d:/daochu.dmp  tables=(table1) 下面这句是执行将c盘的oracle的备份的用户qhmis导入到用户qhmis的数据库
imp qhmis/qhmis@qhmis  file='c:qhmis20060224.dmp'  ignore=n  grants=y  full=y
远程备份的时候只要将mailto:“@%3Cservice_name>”@后的部分改成连接数据库的方式就可以了,如:LSD_192.168.1.33 这是我在../ora92/network/admin/tnsnames.ora中自己设置的,代码如下: LSD_192.168.1.32 =   (DESCRIPTION =     (ADDRESS_LIST =       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.32)(PORT = 1521))     )     (CONNECT_DATA =       (SID = ora9i)       (SERVER = DEDICATED)     )   ) 注:其中红色部分是要自己改写的 ******************************************************************
进阶:
将一个数据库的某用户的所有表导到另外数据库的一个用户下面的例子  
exp userid=system/manager owner=username1 file=expfile.dmp imp userid=system/manager fromuser=username1 touser=username2 ignore=y file=expfile.dmp
ORACLE数据库有两类备份方法。第一类为物理备份,该方法实现数据库的完整恢复,但数据库必须运行在归挡模式下(业务数据库在非归挡模式下运行),且需要极大的外部存储设备,例如磁带库;第二类备份方式为逻辑备份,业务数据库采用此种方式,此方法不需要数据库运行在归挡模式下,不但备份简单,而且可以不需要外部存储设备。
数据库逻辑备份方法 ORACLE数据库的逻辑备份分为三种模式:表备份、用户备份和完全备份。
表模式
备份某个用户模式下指定的对象(表)。业务数据库通常采用这种备份方式。 若备份到本地文件,使用如下命令:
exp icdmain/icd rows=y indexes=n compress=n buffer=65536 feedback=100000 volsize=0 file=exp_icdmain_csd_yyyymmdd.dmp log=exp_icdmain_csd_yyyymmdd.log tables=icdmain.commoninformation,icdmain.serviceinfo,icdmain.dealinfo
若直接备份到磁带设备,使用如下命令:
exp icdmain/icd rows=y indexes=n compress=n buffer=65536 feedback=100000 volsize=0 file=/dev/rmt0 log=exp_icdmain_csd_yyyymmdd.log tables=icdmain.commoninformation,icdmain.serviceinfo,icdmain.dealinfo
注:在磁盘空间允许的情况下,应先备份到本地服务器,然后再拷贝到磁带。出于速度方面的考虑,尽量不要直接备份到磁带设备。
用户模式
备份某个用户模式下的所有对象。业务数据库通常采用这种备份方式。 若备份到本地文件,使用如下命令: exp icdmain/icd owner=icdmain rows=y indexes=n compress=n buffer=65536 feedback=100000 volsize=0 file=exp_icdmain_yyyymmdd.dmp log=exp_icdmain_yyyymmdd.log
若直接备份到磁带设备,使用如下命令:
exp icdmain/icd owner=icdmain rows=y indexes=n compress=n buffer=65536 feedback=100000 volsize=0 file=/dev/rmt0 log=exp_icdmain_yyyymmdd.log
注:如果磁盘有空间,建议备份到磁盘,然后再拷贝到磁带。如果数据库数据量较小,可采用这种办法备份。
完全模式
备份完整的数据库。业务数据库不采用这种备份方式。备份命令为:
exp icdmain/icd rows=y indexes=n compress=n buffer=65536 feedback=100000 volsize=0 full=y file=exp_fulldb_yyyymmdd.dmp(磁带设备则为/dev/rmt0) log=exp_fulldb_yyyymmdd.log
对于数据库备份,建议采用增量备份,即只备份上一次备份以来更改的数据。增量备份 命令:
exp icdmain/icd rows=y indexes=n compress=n buffer=65536 feedback=100000 volsize=0 full=y inctype=incremental file=exp_fulldb_yyyymmdd.dmp(磁带设备则为/dev/rmt0) log=exp_fulldb_yyyymmdd.log 注:关于增量备份必须满足下列条件:
1. 只对完整数据库备份有效,且第一次需要full=y参数,以后需要inctype=incremental参数。
2. 用户必须有EXP_FULL_DATABASE的系统角色。
3. 话务量较小时方可采用数据库备份。
4. 如果磁盘有空间,建议备份到磁盘,然后再备份到磁带。 业务数据库备份方法及周期 用EXP进行备份前,先在SYS用户下运行CATEXP.SQL文件(如果以前已运行该文件,则不要执行这个脚本)。 没有特殊说明,不允许在客户端执行备份命令。
备份命令参照表模式下的备份命令。
从磁盘文件备份到磁带 如果首先备份到本地磁盘文件,则需要转储到磁带设备上。
1. 若需查看主机上配置的磁带设备,使用如下命令: lsdev -Cc tape 显示的结果如下例所示: rmt0 Available 30-58-00-2,0 SCSI 4mm Tape Drive rmt1 Defined  30-58-00-0,0 SCSI 4mm Tape Drive 标明Available的设备是可用的磁带设备。
2. 若需查看磁带存储的内容,使用如下命令: tar -tvf /dev/rmt0 显示的结果如下例所示: -rw-r--r-- 300 400 8089600 Jan 11 14:33:57 2001 exp_icdmain_20010111.dmp 如果显示类似如下内容,则表示该磁带存储的备份数据是从数据库直接备份到磁带上,而非从本地磁盘转储到磁带的备份文件,因此操作系统无法识别。 tar: 0511-193 An error occurred while reading from the media. There is an input or output error. 或 tar: 0511-169 A directory checksum error on media; -267331077 not equal to 25626.
3. 对于新磁带或无需保留现存数据的磁带,使用如下命令: tar -cvf /dev/rmt0 exp_icdmain_yyyymmdd.dmp 注:A. 该命令将无条件覆盖磁带上的现存数据。  
B. 文件名不允许包含路径信息,如:/backup/exp_icdmain_yyyymmdd.dmp。
4. 对于需要保留现存数据的磁带,使用如下命令: tar -rvf /dev/rmt0 exp_icdmain_yyyymmdd.dmp 注:该命令将文件exp_icdmain_yyyymmdd.dmp追加到磁带的末端,不会覆盖现存的数据。 特别强调:如果备份时是从数据库直接备份到磁带上,则不可再向该磁带上追加复制任何其他文件,否则该备份数据失效。 
5. 若需将转储到磁带上的备份文件复制到本地硬盘,使用如下命令:
A. 将磁带上的全部文件复制到本地硬盘的当前目录 tar -xvf /dev/rmt0
B. 将磁带上的指定文件复制到本地硬盘的当前目录 tar -xvf /dev/rmt0 exp_icdmain_yyyymmdd.dmp 备份时间安排 由于备份时对系统I/O有较大影响,所以,建议在晚上11点以后进行备份工作。 业务数据库Oracle版本的恢复,恢复方案需根据备份方案确定。由于业务数据库采用表备份和用户备份相结合的方案,所以业务数据库的恢复需根据实际情况采用表恢复和用户恢复相结合的方案。
恢复方案 数据库的逻辑恢复分为表恢复、用户恢复、完全恢复三种模式。
表模式
此方式将根据按照表模式备份的数据进行恢复。
A. 恢复备份数据的全部内容 若从本地文件恢复,使用如下命令:
imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=exp_icdmain_cs d_yyyymmdd.dmp log=imp_icdmain_csd_yyyymmdd.log
若从磁带设备恢复,使用如下命令:
imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0 log=imp_icdmain_csd_yyyymmdd.log
B. 恢复备份数据中的指定表 若从本地文件恢复,使用如下命令:
imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=exp_icdmain_cs d_yyyymmdd.dmp log=imp_icdmain_csd_yyyymmdd.log tables=commoninformation,serviceinfo
若从磁带设备恢复,使用如下命令:
imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0 log=imp_icdmain_csd_yyyymmdd.log tables=commoninformation,serviceinfo
用户模式 此方式将根据按照用户模式备份的数据进行恢复。
A. 恢复备份数据的全部内容 若从本地文件恢复,使用如下命令:
imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=exp_icdmain_yy yymmdd.dmp log=imp_icdmain_yyyymmdd.log 若从磁带设备恢复,使用如下命令: imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0 log=imp_icdmain_yyyymmdd.log
B. 恢复备份数据中的指定表 若从本地文件恢复,使用如下命令:
imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=exp_icdmain_yy yymmdd.dmp log=imp_icdmain_yyyymmdd.log tables=commoninformation,serviceinfo
若从磁带设备恢复,使用如下命令:
imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0 log=imp_icdmain_yyyymmdd.log tables=commoninformation,serviceinfo
完全模式 如果备份方式为完全模式,采用下列恢复方法: 若从本地文件恢复,使用如下命令:
imp system/manager rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=y volsize=0 full=y file=exp_icdmain_yyyymmdd.dmp log=imp_icdmain_yyyymmdd.log
若从磁带设备恢复,使用如下命令:
imp system/manager rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=y volsize=0 full=y file=/dev/rmt0 log=imp_icdmain_yyyymmdd.log
参数说明
1. ignore参数 Oracle在恢复数据的过程中,当恢复某个表时,该表已经存在,就要根据ignore参数的设置来决定如何操作。 若ignore=y,Oracle不执行CREATE TABLE语句,直接将数据插入到表中,如果插入的记录违背了约束条件,比如主键约束,则出错的记录不会插入,但合法的记录会添加到表中。 若ignore=n,Oracle不执行CREATE TABLE语句,同时也不会将数据插入到表中,而是忽略该表的错误,继续恢复下一个表。
2. indexes参数 在恢复数据的过程中,若indexes=n,则表上的索引不会被恢复,但是主键对应的唯一索引将无条件恢复,这是为了保证数据的完整性。
字符集转换 对于单字节字符集(例如US7ASCII),恢复时,数据库自动转换为该会话的字符集(NLS_LANG参数);对于多字节字符集(例如ZHS16CGB231280),恢复时,应尽量使字符集相同(避免转换),如果要转换,目标数据库的字符集应是输出数 据库字符集的超集。
恢复方法 业务数据库采用表恢复方案。在用IMP进行恢复前,先在SYS用户下运行CATEXP.SQL文件(如果以前已运行该文件,则不要执行这个脚本),然后执行下列命令: IMP ICDMAIN/ICD FILE=文件名 LOG=LOG文件名 ROWS=Y COMMIT=Y BUFFER=Y IGNORE=Y TABLES=表名 注:要恢复的表名参照备份的表名   。恢复是在原表基础上累加数据   。没有特殊说明,不允许在客户端执行恢复命令
 
附录一:  给用户增加导入数据权限的操作  第一,启动sql*puls  第二,以system/manager登陆  第三,create user 用户名 IDENTIFIED BY 密码 (如果已经创建过用户,这步可以省略)  第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,    DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,       DBA,CONNECT,RESOURCE,CREATE SESSION  TO 用户名字  第五, 运行-cmd-进入dmp文件所在的目录,       imp userid=system/manager full=y file=*.dmp       或者 imp userid=system/manager full=y file=filename.dmp
 执行示例:  F:/Work/Oracle_Data/backup>imp userid=test/test full=y file=inner_notify.dmp
屏幕显示 Import: Release 8.1.7.0.0 - Production on 星期四 2月 16 16:50:05 2006 (c) Copyright 2000 Oracle Corporation.  All rights reserved.
连接到: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production With the Partitioning option JServer Release 8.1.7.0.0 - Production
经由常规路径导出由EXPORT:V08.01.07创建的文件已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导入导出服务器使用UTF8 NCHAR 字符集 (可能的ncharset转换) . 正在将AICHANNEL的对象导入到 AICHANNEL . . 正在导入表                  "INNER_NOTIFY"          4行被导入准备启用约束条件... 成功终止导入,但出现警告。
附录二:  Oracle 不允许直接改变表的拥有者, 利用Export/Import可以达到这一目的.   先建立import9.par,   然后,使用时命令如下:imp parfile=/filepath/import9.par   例 import9.par 内容如下:         FROMUSER=TGPMS                TOUSER=TGPMS2     (注:把表的拥有者由FROMUSER改为TOUSER,FROMUSER和TOUSER的用户可以不同)                   ROWS=Y         INDEXES=Y         GRANTS=Y         CONSTRAINTS=Y         BUFFER=409600         file==/backup/ctgpc_20030623.dmp         log==/backup/import_20030623.log windows环境下的oracle服务注:SID - 数据库标识     HOME_NAME - Oracle Home名称,如OraHome92、OraHome81 (1)OracleServiceSID                        数据库服务,这个服务会自动地启动和停止数据库。如果安装了一个数据库,它的缺省启动类型为自动。服务进程为ORACLE.EXE,参数文件initSID.ora,日志文件SIDALRT.log,控制台SVRMGRL.EXE、SQLPLUS.EXE。
(2)OracleHOME_NAMETNSListener 监听器服务,服务只有在数据库需要远程访问时才需要(无论是通过另外一台主机还是在本地通过 SQL*Net 网络协议都属于远程访问),不用这个服务就可以访问本地数据库,它的缺省启动类型为自动。服务进程为TNSLSNR.EXE,参数文件Listener.ora,日志文件listener.log,控制台LSNRCTL.EXE,默认端口1521、1526。
(3)OracleHOME_NAMEAgent OEM代理服务,接收和响应来自OEM控制台的任务和事件请求,只有使用OEM管理数据库时才需要,它的缺省启动类型为自动。服务进程为DBSNMP.EXE,参数文件snmp_rw.ora,日志文件nmi.log,控制台LSNRCTL.EXE,默认端口1748。
(4)OracleHOME_NAMEClientCache        名字缓存服务,服务缓存用于连接远程数据库的Oracle Names 数据。它的缺省启动类型是手动。然而,除非有一台Oracle Names 服务器,否则没有必要运行这个服务。服务进程为ONRSD.EXE,参数文件NAMES.ORA,日志文件ONRSD.LOG,控制台NAMESCTL.EXE。
(5)OracleHOME_NAMECMAdmin                        连接管理服务,是构建Connection Manager服务器所用,只有服务器作为Connection Manager才需要,它的缺省启动类型是手动。服务进程为CMADMIN.EXE,参数文件CMAN.ORA,日志文件CMADM_PID.TRC,控制台CMCTL.EXE,默认端口1830。
(6)OracleHOME_NAMECMan                        连接网关服务,是构建Connection Manager服务器所用,只有服务器作为Connection Manager才需要,它的缺省启动类型是手动。服务进程为CMGW.EXE,参数文件CMAN.ORA,日志文件CMAN_PID.TRC,控制台CMCTL.EXE,默认端口1630。
(7)OracleHOME_NAMEDataGatherer 性能包数据采集服务,除非使用Oracle Capacity Planner 和 Oracle Performance Manager,否则不需要启动,它的缺省启动类型是手动。服务进程为VPPDC.EXE,日志文件alert_dg.log,控制台vppcntl.exe。
(8)OracleHOME_NAMEHTTPServer Oracle提供的WEB服务器,一般情况下我们只用它来访问Oracle Apache 目录下的Web 页面,比如说JSP 或者modplsql 页面。除非你使用它作为你的HTTP服务,否则不需要启动(若启动它会接管IIS的服务),它的缺省启动类型是手动。服务进程为APACHE.EXE,参数文件httpd.conf,默认端口80。
(9)OracleHOME_NAMEPagingServer 通过一个使用调制解调器的数字传呼机或者电子邮件发出警告(没试过),它的缺省启动类型是手动。服务进程PAGNTSRV.EXE,日志文件paging.log。
(10)OracleHOME_NAMENames Oracle Names服务,只有服务器作为Names Server才需要,它的缺省启动类型是手动。服务进程NAMES.EXE,参数文件NAMES.ORA,日志文件NAMES.LOG,控制台NAMESCTL.EXE,默认端口1575。
(11)OracleSNMPPeerMasterAgent SNMP服务代理,用于支持SNMP的网管软件对服务器的管理,除非你使用网管工具监控数据库的情况,否则不需要启动,它的缺省启动类型是手动。服务进程为AGNTSVC.EXE,参数文件MASTER.CFG,默认端口161。
(12)OracleSNMPPeerEncapsulater SNMP协议封装服务,用于SNMP协议转换,除非你使用一个不兼容的SNMP代理服务,否则不需要启动,它的缺省启动类型是手动。服务进程为ENCSVC.EXE,参数文件ENCAPS.CFG,默认端口1161。
(13)OracleHOME_NAMEManagementServer OEM管理服务,使用OEM时需要,它的缺省启动类型是手动。服务进程为OMSNTSVR.EXE,日志文件oms.nohup。

数据是应用的核心部分,程序坏了换台机器重新发布就可以,但数据一旦丢失,造成的损失将不可挽回,程序发布到生产后,数据的备份便显得尤为重要,由于不一定所有的服务均有资金完成高级的备份如RAC和DG,在我们只有一台数据库服务器的,暂时采取最简单的备份策略,export出dmp进行保存。
一、备份脚本
1、初始化变量,记录开始日志
#变量
sysname=填写自己的系统名称
syspath=/home/oracle/databak/$sysname
v_date=$(date '+%Y%m%d%H%M%S')
#日志目录
logfile=${syspath}/backup.${v_date}.log
#打印开始时间
echo backup_time>>${logfile}
date '+%Y-%m-%d %H:%M:%S' >> ${logfile}
echo "backup jcd">>${logfile}
echo "start_time">>${logfile}
date '+%Y-%m-%d %H:%M:%S' >> ${logfile}
2、进入oracle目录,设置oracle的参数
#进入oracle目录,设置oracle变量
cd /home/11g/app/oracle/product/11.2.0
export ORACLE_HOME=/home/11g/app/oracle/product/11.2.0/db_1
export PATH=$PATH:/home/11g/app/oracle/product/11.2.0/db_1/bin
export ORACLE_SID=SID名称

3、导出数据
echo $syspath
v_date=$(date '+%Y%m%d%H%M%S')
filename=$syspath/jcd${v_date}.dmp
#导出命令
exp username/password file=${filename} compress=n >> ${logfile}
echo "end_time">>${logfile}
date '+%Y-%m-%d %H:%M:%S'>>${logfile}
4、压缩dump包
gzip ${filename}
5、使用scp,将压缩后的包传递到备份服务器,注意备份服务器上目录需要预先创建
scp ${filename}.gz remot_name@remot_ip:/home/weblogic/databak/备份目录
二、设定脚本执行时间
我们设定规则为每天凌晨2点执行一次,采用crontab来进行处理
执行crontab -e,设定如下规则
0 2 * * * sh /home/oracle/db.sh
三、关于scp命令密码处理
执行scp命令时候,会提示输入远程主机的密码
scp ${filename}.gz remot_name@remot_ip:/home/weblogic/databak/备份目录
此时有两种处理办法进行解决:
1、使用加密文件进行认证
1)进入本地主机的~/.ssh目录下
2)运行ssh-keygen -t [rsa|dsa],将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub,此处我们使用rsa方式进行
3)将生成的id_rsa和id_rsa.pub权限修改为700
4)将.pub文件复制到远程主机的~/.ssh目录,执行cat id_rsa.pub >> ~/.ssh/authorized_keys,将内容拷入authorized_keys文件
5)修改authorized权限为700
  完成以上修改之后,从本地主机scp到远程主机便无须密码,简单理解应该是通讯时候,本地主机发送scp指令时,采用本地私钥进行签名,远程主机使用公钥验签后,判断问主机可以信赖,开放通讯服务。
2、使用expect命令完成密码交互
  expect命令主要用于脚本中出现必须人工干预的情况下,预先输入指令,模拟的场景为使用expect命令捕捉到提示输入指令的文字,一旦文字出现,自动使用send命令输入需要交互的命令。
  此处使用为:
  expect "*password:"#此处填写系统提示文字
  send "your password\r"#此处填写我们输入的交互命令
  expect eof
下面给大家介绍Oracle 自动备份详细步骤
背景:Oracle 10g 服务器,Oracle 10g 客户端,windowsXP 操作平台
要求:Oracle 数据库服务器对数据库 ytcn 每天自动备份一次。
解决方案:利用任务计划、批处理文件和 Oracle 的 exp 导出功能,根据日期自动生成 Oracle 备份文件。详细步骤:
1 创建批处理文件 ytcn.bat
ytcn.bat中详细内容如下:
@echo off
echo 正在备份银通网 Oracle 数据库,请稍等......
exp userid='ytcn/ytcn@ytcn as sysdba' file=e:/bak/ytcn/oracle/ytcn/ytcn%date:~0,4%%date:~5,2%%date:~8,2%.dmp log=e:/bak/ytcn/oracle/ytcn/ytcn%date:~0,4%%date:~5,2%%date:~8,2%.log full=y
echo 任务完成!
其中红色部分是根据需要进行变动的地方,例如作者的项目名“银通网”,数据库 ytcn 用户名 ytcn,密码 ytcn,要在目录 "e:/bak/ytcn/oracle/ytcn" 下生成形如 "ytcn20090711.dmp" 和 "ytcn20090711.log" 的备份和日志文件,全表导出。
另外:%date%的值在不同的系统、语言版本下可能是不一样的,控制面板里面区域选项的设定也会改变%date%的值。请先在命令行中测试 echo %date% 的返回值。%date:~4,10% 是返回日期函数,~后的第一个参数是要截取的起始位置(从0开始),第二个参数是要截取的长度,如没有则是截取到最后,参数可酌情修改。 如需要准确的时间做为文件名,请用%time%函数,参数同上。
2 添加一个任务计划 ytcn
开始 > 所有程序 > 附件 > 系统工具 > 任务计划 > 添加任务计划 > 下一步 > 在 浏览 中查找刚刚写好的 ytcn.bat 文件 > 任务名输入ytcn,执行这个任务选择每天,下一步 > 起始时间下午12:00,起始日期2009-7-11,下一步 > 输入用户名及密码,用户名要求是管理员权限用户名,下一步 > 完成
点击"完成"之后,会在任务计划栏目下新增一个名为"ytcn"的任务计划,表明已经配置完毕。
备注:有时点击"完成" 之后,系统警告
"已创建新任务,但可能不能运行,因为无法设置账户信息。
指定的错误是:
Ox80041315:任务计划程序服务没有运行"
这是因为电脑的任务计划程序服务没有启动起来。开始 > 所有程序 > 管理工具 > 服务,找到"Task Scheduler"服务,发现启动类型为"已禁用",右键单击更改为"自动",并把它启动起来,然后重新添加一次任务计划 ytcn 就可以了。

猜你喜欢

转载自zhyp29.iteye.com/blog/2303133