Chinaunix首页 | 论坛 | 博客
  • 博客访问: 69646
  • 博文数量: 24
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 245
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-25 18:16
文章分类

全部博文(24)

文章存档

2008年(21)

2007年(3)

我的朋友
最近访客

分类: Oracle

2008-07-10 14:25:35

4、热备份方案的实施
4.1 热备份数据库的前提条件:数据库运行在归档模式
Oracle数据库的redo日志记录在数据库上进行的所有活动。LGWR后台进程以一种循环方式写这些日志文件,从第一个redo日志到下一个,直到该组的最后一个,然后由从第一个日志写起。
在非归档模式下,当循环写到最后一个日志文件后,就重写第一个日志。因此,非归档模式下唯一的数据库恢复办法就是使用冷备份。
在归档模式下,当redo日志满时,一个ARCH后台进程就读取全部redo日志,然后将其写到归档日志。因此,可以使用热备份和点恢复。在归档日志模式下,如果归档日志目的空间已满,数据库活动将暂时停止,只有释放一些空间后,数据库才能继续运行。通常,background_dump_destination将产生一个跟踪文件来显示归档方面的问题。
Oracle数据库安装默认运行在非归档模式,通过以下步骤可以从非归档模式转换为归档模式:
(1)编辑参数文件init.ora,设置以下参数
# 设置数据库自动归档
log_archive_start = true
# 设置归档日志文件的目录,该目录必须事先已建立,并有大量可利用的空间
log_archive_dest_1="location=%oracle_base%\ oradata\%oracle_sid%\archive"
# 设置归档日志文件名的格式。%s表示顺序号,%t表示线程号。
log_archive_format = "%oracle_sid%%T%S.ARC"
(2)在svrmgrl上运行以下命令
svrmgrl>connect internal/YOUR_PASSWORD
svrmgrl>shutdown immediate;
svrmgrl>startup mount exclusive;
svrmgrl>alter database archivelog;
svrmgrl>alter database open;
svrmgrl>shutdown immediate;
(3)执行数据库冷备份
当数据库运行在归档模式下,数据库恢复过程要求使用冷备份时,归档日志是必需的。
(4)正常启动数据库,并确认数据库运行在归档模式
svrmgrl > startup;
svrmgrl > select * from v$database; 其log_mode会显示数据库是否归档模式
svrmgrl > archive log list; 也会显示数据库是否归档模式
如果Oracle数据库运行在归档模式,当进行数据库维护时,可能需要暂停数据库的归档,在完成维护后,再重新启动归档模式。通过以下步骤可以从归档模式转换为非归档模式:
svrmgrl>connect internal/YOUR_PASSWORD
svrmgrl>shutdown immediate;
svrmgrl>startup mount exclusive;
svrmgrl>alter database noarchivelog;
svrmgrl>alter database open;
svrmgrl > select * from v$database; 其log_mode会显示数据库是否归档模式
svrmgrl > archive log list; 也会显示数据库是否归档模式
4.2 热备份数据库的步骤
(1)拷贝init.ora文件到备份目录(参数文件在数据库启动后处于关闭状态)。
(2)将需要备份的某个表空间置于开始备份模式。
(3)使用ocopy.exe拷贝表空间,然后将该表空间置于结束备份模式中(ocopy.exe不能用于直接拷贝联机的数据库文件)。
(4)对数据库中的每个表空间执行步骤2和3(可以通过视图dba_tablespaces和v$datafile查看数据库中有哪些表空间和数据文件)。
(5)通过在svrmgrl上执行archive log list命令获取当前的日志顺序号,从oldest online log sequence开始到current log sequence的联机redo日志应该是热备份的一部分。
(6)在svrmgrl上执行alter system switch logfile;命令来强迫日志切换,以便所有的日志都被归档。
(7)使用alter database backup controlfile to trace;命令获得控制文件的一个备份,可以到%oracle_base%\admin\%oracle_sid%\udump目录中寻找最新的跟踪文件,其中有重建控制文件的全部命令。
(8)使用windows nt的命令从%log_archive_dest%中拷贝归档的日志文件到备份目录。
4.3 热备份数据库的脚本文件hotbak.cmd
rem Oracle数据库热备份脚本文件名hotbak.cmd
rem 用于Windows NT/2000 平台,已经过严密的测试,大家可以试验!!!
rem 该脚本执行后,在c:\temp目录中产生minlog.sql、minlog.cmd、
rem tblspc01.sql、tblspc02.sql、control01.sql、control02.sql、
rem maxlog.sql、maxlog.cmd、archive.sql、archive.cmd等10个脚本文件。
rem 设置SID
set oracle_sid=tmq
rem 设置初始化参数文件
set my_pfile=e:\oracle\ora81\database\inittmq.ora
set my_ifile=E:\Oracle\ADMIN\tmq\pfile\init.ora
rem 设置归档日志目录
set my_archive_dir=E:\Oracle\ORADATA\tmq\archive
rem 设置internal帐户的密码
set my_password=oracle
rem 建立临时目录
mkdir c:\temp
set my_temp=c:\temp
rem 建立备份目录,该目录必须有足够大的空间用于存放数据库的备份文件
mkdir e:\backup
set my_bakdir=e:\backup
rem ===== (1) 开始备份参数文件 =======
echo Backing up the init.ora file
copy %my_pfile% %my_bakdir%
copy %my_ifile% %my_bakdir%
rem ===== (2) 创建minlog.sql脚本获取最小的online redo日志顺序号 =====
echo set heading off; >%my_temp%\minlog.sql
echo set feedback off; >>%my_temp%\minlog.sql
echo spool %my_temp%\minlog.cmd; >>%my_temp%\minlog.sql
echo select 'set minlog_value=' ^|^| min(sequence#) from v$log where upper(status)=upper('INACTIVE'); >>%my_temp%\minlog.sql
echo spool off; >>%my_temp%\minlog.sql
echo select 'exit;' from dual; >>%my_temp%\minlog.sql
echo exit; >>%my_temp%\minlog.sql
rem ===== (3) run minlog.sql to genrate minlog.cmd ========
sqlplus internal/%my_password% @%my_temp%\minlog.sql
rem ===== (4) run minlog.cmd to set minlog_value ========
call %my_temp%\minlog.cmd
rem === (5) 创建tblspc01.sql脚本用于生成备份数据文件的脚本文件tblspc02.sql ===
echo set heading off; >%my_temp%\tblspc01.sql
echo set feedback off; >>%my_temp%\tblspc01.sql
echo spool %my_temp%\tblspc02.sql; >>%my_temp%\tblspc01.sql
echo select 'connect internal/%my_password%;' from dual; >>%my_temp%\tblspc01.sql
echo select 'alter tablespace ' ^|^| tablespace_name ^|^| ' begin backup;' from dba_tablespaces; >>%my_temp%\tblspc01.sql
echo select 'host start/wait ocopy ' ^|^| file_name ^|^| ' %my_bakdir%;' from dba_data_files; >>%my_temp%\tblspc01.sql
echo select 'alter tablespace ' ^|^| tablespace_name ^|^| ' end backup;' from dba_tablespaces; >>%my_temp%\tblspc01.sql
echo spool off; >>%my_temp%\tblspc01.sql
echo select 'exit;' from dual; >>%my_temp%\tblspc01.sql
echo exit; >>%my_temp%\tblspc01.sql
rem ===== (6) run tblspc01.sql to genrate tblspc02.sql ========
sqlplus internal/%my_password% @%my_temp%\tblspc01.sql
rem ===== (7) on svrmgrl run tblspc02.sql to backup the datafiles ========
svrmgrl @%my_temp%\tblspc02.sql
rem ===== (8) 创建maxlog.sql脚本获取最大的online redo日志顺序号 =====
echo set heading off; >%my_temp%\maxlog.sql
echo set feedback off; >>%my_temp%\maxlog.sql
echo spool %my_temp%\maxlog.cmd; >>%my_temp%\maxlog.sql
echo select 'set maxlog_value=' ^|^| max(sequence#) from v$log where upper(status)=upper('CURRENT'); >>%my_temp%\maxlog.sql
echo spool off; >>%my_temp%\maxlog.sql
echo select 'alter system switch logfile;' from dual; >> %my_temp%\maxlog.sql
echo select 'exit;' from dual; >>%my_temp%\maxlog.sql
echo exit; >>%my_temp%\maxlog.sql
rem ===== (9) run maxlog.sql to genrate maxlog.cmd ========
sqlplus internal/%my_password% @%my_temp%\maxlog.sql
rem ===== (10) run maxlog.cmd to set maxlog_value ========
call %my_temp%\maxlog.cmd
rem == (11) 创建control01.sql脚本用于生成备份控制文件的脚本文件control02.sql ===
echo set heading off; >%my_temp%\control01.sql
echo set feedback off; >>%my_temp%\control01.sql
echo spool %my_temp%\control02.sql; >>%my_temp%\control01.sql
echo select 'connect internal/%my_password%;' from dual; >>%my_temp%\control01.sql
echo select 'alter database backup controlfile to trace;' from dual; >>%my_temp%\control01.sql
echo spool off; >>%my_temp%\control01.sql
echo select 'exit;' from dual; >>%my_temp%\control01.sql
echo exit; >>%my_temp%\control01.sql
rem ===== (12) run control01.sql to genrate control02.sql ========
sqlplus internal/%my_password% @%my_temp%\control01.sql
rem ===== (13) on svrmgrl run control02.sql to backup the datafiles ========
svrmgrl @%my_temp%\control02.sql
rem ===== (14) 创建archive.sql脚本用于生成备份归档日志文件的脚本文件archive.cmd =====
echo set heading off; >%my_temp%\archive.sql
echo set feedback off; >>%my_temp%\archive.sql
echo spool %my_temp%\archive.cmd; >>%my_temp%\archive.sql
rem 仅备份与本次热备份相关的日志文件
echo select 'copy ' ^|^| name ^|^| ' %my_bakdir%' from V_$ARCHIVED_LOG where sequence# between %minlog_value% and %maxlog_value%+1; >>%my_temp%\archive.sql
echo spool off; >>%my_temp%\archive.sql
echo select 'exit;' from dual; >>%my_temp%\archive.sql
echo exit; >>%my_temp%\archive.sql
rem ===== (15) run archive.sql to genrate archive.cmd ========
sqlplus internal/%my_password% @%my_temp%\archive.sql
rem ===== (16) run archive.cmd to backup the archive log files ========
call %my_temp%\archive.cmd
rem ===== the end ======
echo ===== the hot backup is completed!!! ======
4、热备份方案的实施
4.1 热备份数据库的前提条件:数据库运行在归档模式
Oracle数据库的redo日志记录在数据库上进行的所有活动。LGWR后台进程以一种循环方式写这些日志文件,从第一个redo日志到下一个,直到该组的最后一个,然后由从第一个日志写起。
在非归档模式下,当循环写到最后一个日志文件后,就重写第一个日志。因此,非归档模式下唯一的数据库恢复办法就是使用冷备份。
在归档模式下,当redo日志满时,一个ARCH后台进程就读取全部redo日志,然后将其写到归档日志。因此,可以使用热备份和点恢复。在归档日志模式下,如果归档日志目的空间已满,数据库活动将暂时停止,只有释放一些空间后,数据库才能继续运行。通常,background_dump_destination将产生一个跟踪文件来显示归档方面的问题。
Oracle数据库安装默认运行在非归档模式,通过以下步骤可以从非归档模式转换为归档模式:
(1)编辑参数文件init.ora,设置以下参数
# 设置数据库自动归档
log_archive_start = true
# 设置归档日志文件的目录,该目录必须事先已建立,并有大量可利用的空间
log_archive_dest_1="location=%oracle_base%\ oradata\%oracle_sid%\archive"
# 设置归档日志文件名的格式。%s表示顺序号,%t表示线程号。
log_archive_format = "%oracle_sid%%T%S.ARC"
(2)在svrmgrl上运行以下命令
svrmgrl>connect internal/YOUR_PASSWORD
svrmgrl>shutdown immediate;
svrmgrl>startup mount exclusive;
svrmgrl>alter database archivelog;
svrmgrl>alter database open;
svrmgrl>shutdown immediate;
(3)执行数据库冷备份
当数据库运行在归档模式下,数据库恢复过程要求使用冷备份时,归档日志是必需的。
(4)正常启动数据库,并确认数据库运行在归档模式
svrmgrl > startup;
svrmgrl > select * from v$database; 其log_mode会显示数据库是否归档模式
svrmgrl > archive log list; 也会显示数据库是否归档模式
如果Oracle数据库运行在归档模式,当进行数据库维护时,可能需要暂停数据库的归档,在完成维护后,再重新启动归档模式。通过以下步骤可以从归档模式转换为非归档模式:
svrmgrl>connect internal/YOUR_PASSWORD
svrmgrl>shutdown immediate;
svrmgrl>startup mount exclusive;
svrmgrl>alter database noarchivelog;
svrmgrl>alter database open;
svrmgrl > select * from v$database; 其log_mode会显示数据库是否归档模式
svrmgrl > archive log list; 也会显示数据库是否归档模式
4.2 热备份数据库的步骤
(1)拷贝init.ora文件到备份目录(参数文件在数据库启动后处于关闭状态)。
(2)将需要备份的某个表空间置于开始备份模式。
(3)使用ocopy.exe拷贝表空间,然后将该表空间置于结束备份模式中(ocopy.exe不能用于直接拷贝联机的数据库文件)。
(4)对数据库中的每个表空间执行步骤2和3(可以通过视图dba_tablespaces和v$datafile查看数据库中有哪些表空间和数据文件)。
(5)通过在svrmgrl上执行archive log list命令获取当前的日志顺序号,从oldest online log sequence开始到current log sequence的联机redo日志应该是热备份的一部分。
(6)在svrmgrl上执行alter system switch logfile;命令来强迫日志切换,以便所有的日志都被归档。
(7)使用alter database backup controlfile to trace;命令获得控制文件的一个备份,可以到%oracle_base%\admin\%oracle_sid%\udump目录中寻找最新的跟踪文件,其中有重建控制文件的全部命令。
(8)使用windows nt的命令从%log_archive_dest%中拷贝归档的日志文件到备份目录。
4.3 热备份数据库的脚本文件hotbak.cmd
rem Oracle数据库热备份脚本文件名hotbak.cmd
rem 用于Windows NT/2000 平台,已经过严密的测试,大家可以试验!!!
rem 该脚本执行后,在c:\temp目录中产生minlog.sql、minlog.cmd、
rem tblspc01.sql、tblspc02.sql、control01.sql、control02.sql、
rem maxlog.sql、maxlog.cmd、archive.sql、archive.cmd等10个脚本文件。
rem 设置SID
set oracle_sid=tmq
rem 设置初始化参数文件
set my_pfile=e:\oracle\ora81\database\inittmq.ora
set my_ifile=E:\Oracle\ADMIN\tmq\pfile\init.ora
rem 设置归档日志目录
set my_archive_dir=E:\Oracle\ORADATA\tmq\archive
rem 设置internal帐户的密码
set my_password=oracle
rem 建立临时目录
mkdir c:\temp
set my_temp=c:\temp
rem 建立备份目录,该目录必须有足够大的空间用于存放数据库的备份文件
mkdir e:\backup
set my_bakdir=e:\backup
rem ===== (1) 开始备份参数文件 =======
echo Backing up the init.ora file
copy %my_pfile% %my_bakdir%
copy %my_ifile% %my_bakdir%
rem ===== (2) 创建minlog.sql脚本获取最小的online redo日志顺序号 =====
echo set heading off; >%my_temp%\minlog.sql
echo set feedback off; >>%my_temp%\minlog.sql
echo spool %my_temp%\minlog.cmd; >>%my_temp%\minlog.sql
echo select 'set minlog_value=' ^|^| min(sequence#) from v$log where upper(status)=upper('INACTIVE'); >>%my_temp%\minlog.sql
echo spool off; >>%my_temp%\minlog.sql
echo select 'exit;' from dual; >>%my_temp%\minlog.sql
echo exit; >>%my_temp%\minlog.sql
rem ===== (3) run minlog.sql to genrate minlog.cmd ========
sqlplus internal/%my_password% @%my_temp%\minlog.sql
rem ===== (4) run minlog.cmd to set minlog_value ========
call %my_temp%\minlog.cmd
rem === (5) 创建tblspc01.sql脚本用于生成备份数据文件的脚本文件tblspc02.sql ===
echo set heading off; >%my_temp%\tblspc01.sql
echo set feedback off; >>%my_temp%\tblspc01.sql
echo spool %my_temp%\tblspc02.sql; >>%my_temp%\tblspc01.sql
echo select 'connect internal/%my_password%;' from dual; >>%my_temp%\tblspc01.sql
echo select 'alter tablespace ' ^|^| tablespace_name ^|^| ' begin backup;' from dba_tablespaces; >>%my_temp%\tblspc01.sql
echo select 'host start/wait ocopy ' ^|^| file_name ^|^| ' %my_bakdir%;' from dba_data_files; >>%my_temp%\tblspc01.sql
echo select 'alter tablespace ' ^|^| tablespace_name ^|^| ' end backup;' from dba_tablespaces; >>%my_temp%\tblspc01.sql
echo spool off; >>%my_temp%\tblspc01.sql
echo select 'exit;' from dual; >>%my_temp%\tblspc01.sql
echo exit; >>%my_temp%\tblspc01.sql
rem ===== (6) run tblspc01.sql to genrate tblspc02.sql ========
sqlplus internal/%my_password% @%my_temp%\tblspc01.sql
rem ===== (7) on svrmgrl run tblspc02.sql to backup the datafiles ========
svrmgrl @%my_temp%\tblspc02.sql
rem ===== (8) 创建maxlog.sql脚本获取最大的online redo日志顺序号 =====
echo set heading off; >%my_temp%\maxlog.sql
echo set feedback off; >>%my_temp%\maxlog.sql
echo spool %my_temp%\maxlog.cmd; >>%my_temp%\maxlog.sql
echo select 'set maxlog_value=' ^|^| max(sequence#) from v$log where upper(status)=upper('CURRENT'); >>%my_temp%\maxlog.sql
echo spool off; >>%my_temp%\maxlog.sql
echo select 'alter system switch logfile;' from dual; >> %my_temp%\maxlog.sql
echo select 'exit;' from dual; >>%my_temp%\maxlog.sql
echo exit; >>%my_temp%\maxlog.sql
rem ===== (9) run maxlog.sql to genrate maxlog.cmd ========
sqlplus internal/%my_password% @%my_temp%\maxlog.sql
rem ===== (10) run maxlog.cmd to set maxlog_value ========
call %my_temp%\maxlog.cmd
rem == (11) 创建control01.sql脚本用于生成备份控制文件的脚本文件control02.sql ===
echo set heading off; >%my_temp%\control01.sql
echo set feedback off; >>%my_temp%\control01.sql
echo spool %my_temp%\control02.sql; >>%my_temp%\control01.sql
echo select 'connect internal/%my_password%;' from dual; >>%my_temp%\control01.sql
echo select 'alter database backup controlfile to trace;' from dual; >>%my_temp%\control01.sql
echo spool off; >>%my_temp%\control01.sql
echo select 'exit;' from dual; >>%my_temp%\control01.sql
echo exit; >>%my_temp%\control01.sql
rem ===== (12) run control01.sql to genrate control02.sql ========
sqlplus internal/%my_password% @%my_temp%\control01.sql
rem ===== (13) on svrmgrl run control02.sql to backup the datafiles ========
svrmgrl @%my_temp%\control02.sql
rem ===== (14) 创建archive.sql脚本用于生成备份归档日志文件的脚本文件archive.cmd =====
echo set heading off; >%my_temp%\archive.sql
echo set feedback off; >>%my_temp%\archive.sql
echo spool %my_temp%\archive.cmd; >>%my_temp%\archive.sql
rem 仅备份与本次热备份相关的日志文件
echo select 'copy ' ^|^| name ^|^| ' %my_bakdir%' from V_$ARCHIVED_LOG where sequence# between %minlog_value% and %maxlog_value%+1; >>%my_temp%\archive.sql
echo spool off; >>%my_temp%\archive.sql
echo select 'exit;' from dual; >>%my_temp%\archive.sql
echo exit; >>%my_temp%\archive.sql
rem ===== (15) run archive.sql to genrate archive.cmd ========
sqlplus internal/%my_password% @%my_temp%\archive.sql
rem ===== (16) run archive.cmd to backup the archive log files ========
call %my_temp%\archive.cmd
rem ===== the end ======
echo ===== the hot backup is completed!!! ======
阅读(642) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~