参考本文档内容,你一定能够掌握oracle的备份与恢复
冷备份...................................................................................................................... 1
1、备份步骤:................................................................................................... 1
2、恢复步骤:................................................................................................... 2
热备份...................................................................................................................... 2
1、备份步骤:................................................................................................... 2
2、恢复步骤:................................................................................................... 4
Windows平台的oracle备份(Veritas BE)...................................................................... 5
1、需要的数据:............................................................................................... 5
2、恢复过程:................................................................................................... 5
例子:(网上原资料)............................................................................................... 7
1. 用Oracle的热备份重建数据库..................................................................... 7
2. Oracle9i RMAN 备份及恢复步骤................................................................ 12
冷备份
1、备份步骤:
冷备份具有很多优良特性,快速,方便,以及高效。一次完整的冷备份步骤是:
1,首先关闭数据库(shutdown normal)
2,拷贝相关文件到安全区域(利用操作系统命令拷贝数据库的所有的数据文件、日志文件、控制文件、参数文件、口令文件等(包括路径))
3,重新启动数据库(startup)
以上的步骤可以用一个脚本来完成操作:
su – oracle 文件 备份位置(所有的日志、数据、控制及参数文件);
startup;
exit;
2、恢复步骤:
恢复的时候,相对比较简单了,我停掉数据库,将文件拷贝回相应位置,重启数据库就可以了,当然也可以用脚本来完成。
热备份
1、备份步骤:
当需要做一个精度比较高的备份,而且我们的数据库不可能停掉(少许访问量)时,这个情况下,我们就需要归档方式下的备份,就是下面讨论的热备份。热备份可以非常精确的备份表空间级和用户级的数据,由于它是根据归档日志的时间轴来备份恢复的,理论上可以恢复到前一个操作,甚至就是前一秒的操作。具体步骤如下:
1,通过视图v$database,查看数据库是否在Archive模式下:
SQL> select log_mode from v$database;
如果不是Archive模式
则设定数据库运行于归档模式下:SQL>shutdown immediate
SQL>startup mount
SQL> alter database archivelog;
SQL> alter database open;
如果Automaticarchival显示为“Enabled”,则数据库归档方式为自动归档。否则需要手工归档,或者将归档方式修改为自动归档,如:
正常shutdown数据库,在参数文件中init.ora中加入如下参数
SQL>shutdown immediate
修改init.ora:
LOG_ARCHIVE_START=TRUE
LOG_ARCHIVE_DEST1=ORACLE_HOME/admin/o816/arch(归档日值存放位置可以自己定义)
SQL>startup
然后,重新启动数据库,此时Oracle数据库将以自动归档的方式工作在Archive模式下。其中参数LOG_ARCHIVE_DEST1是指定的归档日志文件的路径,建议与Oracle数据库文件存在不同的硬盘,一方面减少磁盘I/O竞争,另外一方面也可以避免数据库文件所在硬盘毁坏之后的文件丢失。归档路径也可以直接指定为磁带等其它物理存储设备,但可能要考虑读写速度、可写条件和性能等因素。
注意:当数据库处在ARCHIVE模式下时,一定要保证指定的归档路径可写,否则数据库就会挂起,直到能够归档所有归档信息后才可以使用。另外,为创建一个有效的备份,当数据库在创建时,必须履行一个全数据库的冷备份,就是说数据库需要运行在归档方式,然后正常关闭数据库,备份所有的数据库组成文件。这一备份是整个备份的基础,因为该备份提供了一个所有数据库文件的拷贝。(体现了冷备份与热备份的合作关系,以及强大的能力)
2,备份表空间文件:
a,首先,修改表空间文件为备份模式 ALTER TABLESPACE tablespace_name BEGIN BACKUP;
b,然后,拷贝表空间文件到安全区域 !CP tablespace_name D_PATH;
c,最后,将表空间的备份模式关闭 ALTER TABLESPACE tablespace_name END BACKUP;
3,对归档日志文件的备份:
停止归档进程-->备份归档日志文件-->启动归档进程
如果日志文档比较多,我们将它们写入一个文件成为一个恢复的参考:$ files `ls 归档文件路径>/arch*.dbf`;export files
4,备份控制文件:
SQL> alter database backup controlfile to 'controlfile_back_name(一般用2004-11-20的方式)' reuse;
当然,我们也可以将上面的东东写为一个脚本,在需要的时候执行就可以了:
脚本范例:
su – oracle
!CP tablespace_name D_PATH
ALTER TABLESPACE tablespace_name END BACKUP
alter database backup controlfile to 'controlfile_back_name(一般用2004-11-20的方式)' reuse;
!files `ls 归档文件路径>/arch*.dbf`;export files
2、恢复步骤:
热备份的恢复,对于归档方式数据库的恢复要求不但有有效的日志备份还要求有一个在归档方式下作的有效的全库备份。归档备份在理论上可以无数据丢失,但是对于硬件以及操作人员的要求都比较高。在我们使用归档方式备份的时候,全库物理备份也是非常重要的。归档方式下数据库的恢复要求从全备份到失败点所有的日志都要完好无缺。
恢复步骤:LOG_ARCHIVE_DEST_1
shutdown数据库。
将全备份的数据文件放到原来系统的目录中。
将全备份到失败点的所有归档日志放到参数LOG_ARCHIVE_DEST_1所指定的位置。
利用sqlplus登陆到空实例。(connect / as sysdba)
然后 startup mount
set autorecovery on
recover database;
alter database open;
这样,热恢复就算完工。
Windows平台的oracle备份(Veritas BE)
通过Backup Exec实施Oracle灾难恢复很简单。
1、需要的数据:
1、FULL CLOSED备份
shutdown数据库(不要用shutdown abort强行关闭),实施一个文件级备份,备份全部的Oracle相关文件,包括Windows系统文件,系统状态和Oracle程序文件和数据文件等内容。
这个冷备份对于快速恢复Oracle数据库系统非常关键,如果没有它,系统被破坏后只能重新安装再恢复,这要比直接恢复冷备份慢得多,也更复杂。
每当数据库或表单的物理结构或逻辑结构有变化时都应该重新创建这个冷备份。
2. FULL ONLINE备份
这个备份要通过Backup Exec Agent for Oracle Server来完成,要备份全部表空间,归档日志和控制文件,通过这种方式备份,Oracle会将所有缓存内容写入文件,将online redo log做归档,所以数据库备份中包含的是备份时数据库的即时点信息,完整而且有效。以后做恢复时,可以恢复到最后一次FULL ONLINE备份的状态。
2、恢复过程:
1. 重新安装Windows系统和Remote Agent for Windows Server,为恢复Oracle服务器准备环境。
2. 恢复最后一次FULL CLOSED备份,重新启动计算机。
此时Windows系统,Oracle数据库系统都是完整的,只是Oracle数据库中可能不是最新的数据。Backup Exec Agent for Oracle Server也不用重新安装了。
3. 用SQLPlus用SYS以sysdba身份连接到数据库系统,关闭数据库。
shutdown immediate
4. 通过介质服务器恢复最新的FULL ONLINE备份,恢复作业属性的高级选项中,确保选中了“Restore over Existing files(覆盖现存文件)” 选项。
要想成功的恢复数据库,在最后一次FULL CLOSED备份之后的所有redo log必须都已经成功归档并备份。少了哪一个,数据库就无法恢复到最后的FULL ONLI NE备份时的状态。
通过Oracle的alert log可以看到数据库的恢复需要哪些归档日志,以及你应该把它们恢复到什么位置。
5. 恢复完成后,用SYS用户以sysdba身份连接到数据库,将数据库加载到mount阶段:
startup mount
6. 数据库mount完成后,执行recover过程:
recover database using backup controlfile
数据库会提示你需要哪些日志:
ORA-00279: Change 36579 generated at needed for thread 1
ORA-00289: Suggestion : /Oracle_Home/Oradata//%SID%T00036579.ARC
ORA-00280: {=Suggested | filename | AUTO | FROM logsource | CANCEL}
最简单的方法是选自动恢复:
auto
系统会在init.ora文件中定义的位置上查找所有必需的日志并依次应用它们,最后一个要应用的日志是online redo log,实际上它并不包括任何的transaction,只有一个SCN,可以略过,但是自动恢复过程会因为找不到相应的文件而报错:
ORA-00308: cannot open archived log
E:/ORACLE/ORADATA/KIMSTAD/ARCHIVE/KIMSTADT00036949.ARC'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) The system cannot find the file specified.
为此输入以下命令(until cancel参数使我们可以在需要的时候中止恢复过程):
recover database until cancel using backup controlfile
这样在数据库恢复的最后阶段再次提示前面的错误时,我们就可以中止恢复过程:
cancel
这时除了最后一个online redo log以外,所有的commit transaction都已经提交到数据库之中了,完成后会显示:
Media recovery canceled
实际上恢复过程已经正常完成了。
最后是打开数据库并同步日志序列号:
alter database open resetlogs
至此,Oracle数据库被成功恢复到最后一次Full Online备份。
说明:Oracle 8i可以用internal账号完成DBA操作。9i取消了internal账号,SYS账号代替它了。为了以DBA身份登录,启动SQL Plus时应该加nolog参数,进入之后再登录,connect username/password as sysdba。
例子:(网上原资料)
1. 用Oracle的热备份重建数据库
为了检验我为公司开发的Oracle数据库在线自动备份系统,我根据“Oracle数据库在线自动备份系统”产生的备份文件来重建和恢复Oracle数据库。为了让大家共享其方法和步骤(也适合于用其它方式对Oracle做的热备份进行重建数据库)现整理如下。
一、系统环境
本次测试所使用的系统环境如下:
1. 硬件环境
服务器:Dell PowerEdge 1300 (CPU:PⅢ 550MHz 内存:128MB 硬盘:36GB)
2. 软件环境
操作系统:UnixWare 7.1
数据库: Oracle 8.1.6 for Unix 企业版,SID:ora816
Oracle安装路径:/home/oracle
备份文件:所有数据库文件、控制文件、初始化文件、数据库备份以来的所有归档日志文件。
二、恢复步骤
下面根据从用户处带回来的备份数据,在一台新的服务器重建Oracle数据库。其详细步骤如下:
1. 创建数据库恢复使用的环境
在新的Dell服务器上,安装与原来的数据库服务器相同的操作系统UnixWare 7.1;然后安装与原数据库相同版本的Oracle 8.1.6 for Unix 企业版。
2. 删除新服务器上的Oracle实例
启动新数据库服务器上的Oracle,在sqlplus中,查找到数据库文件的路径,并保存在当前路径下的文件file_name.txt中:
$ sqlplus system/manager
SQL> spool file_name.txt
SQL> select file_name from sys.dba_data_files;
SQL> spool end
SQL>exit
关闭新服务器的Oracle,然后根据文件file_name.txt中的路径,删除新装的Oracle实例的所有数据库文件。
注:从本步开始所有操作都是用Oracle用户登录操作系统(Unix)后进行。文中所有的黑色粗体5号字符(标题除外)的语句可以直接执行,黑色倾斜粗体5号字符的语句需要修改后执行。
3. 恢复数据库文件
把备份的所有数据库文件用Ftp上传新的数据库服务器中的相同路径下。如果原来的路径已不存在,可以拷贝到其他路径下,恢复时详细处理方法见步骤7中。
4. 恢复初始化参数文件
把备份的initSID.ora文件用Ftp上传到新数据库服务器中Oracle实例的initSID.ora文件位置,覆盖之。其位置一般在$ORACLE_HOME/dbs目录下。
5. 恢复控制文件
把备份的ControlFile.bak文件用Ftp上传到新数据库服务器中Oracle实例的各个镜像路径下,并按初始化参数文件initSID.ora中的该项的位置和名称命名。
control_files = ("/home/oracle/app/oracle/oradata/ora816/control01.ctl", "/home/oracle/app/oracle/oradata/ora816/control02.ctl","/home/oracle/app/oracle/oradata/ora816/control03.ctl")
其路径如有变动,在初始化参数文件initSID.ora中修改如上内容的路径和名称,使其实际路径与该参数的路径一致。
6. 恢复归档日志文件
把数据库备份后的归档日志用Ftp上传到新数据库服务器的相同路径下。路径如有变动可以根据初始化参数文件initSID.ora中如下位置进行修改,使其实际路径与该参数的路径一致。
log_archive_dest_1 = "location=/home/oracle/app/oracle/admin/ora816/arch"
7. 恢复数据库
经过以上6个步骤,把所有的备份文件已经上传到了新数据库服务器中。下面开始根据这些文件恢复并启动数据库,先在操作系统的提示符下做如下操作:
$svrmgrl
SVRMGR>connect internal
SVRMGR>startup mount
创建口令文件
如果原来的数据库配置了口令文件,并且在mount数据库时报如下错误:
ORA-01990: error opening password file '/home/oracle/app/oracle/product/8.1.6/dbs/orapw'
可以到/home/oracle/app/oracle/product/8.1.6/dbs/路径下,用以下命令创建口令文件:
orapwd
其用法如下:
Usage: orapwd file= password= entries=
where
file - name of password file (mand),(口令文件的命名方式为:orapwSID)
password - password for SYS and INTERNAL (mand),
entries - maximum number of distinct DBA and OPERs (opt),
There are no spaces around the equal-to (=) character.
例如: orapwd file=orapwora816 password=manager
然后重新执行如下语句mount数据库:
SVRMGR>startup mount。
修改数据库文件的路径
如果在上述的步骤3中修改了恢复的数据库文件的路径,可以用如下语句对数据库文件重新命名 :
alter database rename file 'old_file' to 'new_file';
如把原来路径/home/oracle/app/oracle/oradata/ora816下的文件system01.dbf改到了/u21/oracle/app/oracle/oradata/ora816下:
SVRMGR>alter database rename file
'/home/oracle/app/oracle/oradata/ora816/system01.dbf'
to '/u21/oracle/app/oracle/oradata/ora816/system01.dbf';
按照上面的方法把所有修改路径的数据库文件重新命名。
根据控制文件和归档日志文件恢复数据库
下面开始用控制文件和归档日志文件恢复数据库:
SVRMGR>recover database using backup controlfile until cancel;
出现如下提示:
ORA-00279: change 50971 generated at 08/23/2002 09:21:27 needed for thread 1
ORA-00289: suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_399.arc
ORA-00280: change 50971 for thread 1 is in sequence #399
Specify log: {=suggested | filename | AUTO | CANCEL}输入:
auto
如果有如下提示,则表示成功。
ORA-00279: change 51007 generated at 08/23/2002 11:23:13 needed for thread 1
ORA-00289: suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_400.arc
ORA-00280: change 51007 for thread 1 is in sequence #400
ORA-00278: log file '/home/oracle/app/oracle/admin/ora8/arch/arch_1_399.arc' noy
Log applied.
意外处理:如果其它提示可能是需要的日志文件不存在,检查ORA-00289中该文件是否存在。
直到出现如下提示:
ORA-00279: change 51011 generated at 08/23/2002 11:23:45 needed for thread 1
ORA-00289: suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_401.arc
ORA-00280: change 51011 for thread 1 is in sequence #401
ORA-00278: log file '/home/oracle/app/oracle/admin/ora8/arch/arch_1_400.arc' noy
ORA-00308: cannot open archived log '/home/oracle/app/oracle/admin/ora8/arch
/arch_1_401.arc'
ORA-27037: unable to obtain file status
Intel SVR4 UNIX Error: 2: No such file or directory
Additional information: 3
重置日志
SVRMGR>alter database open resetlogs;
意外处理:如果提示创建日志的路径不存在,按提示路径创建目录。然后再重置日志。
重启数据库,完成恢复
SVRMGR>shutdown immediate
SVRMGR>startup
ORACLE instance started.
Total System Global Area 123437040 bytes
Fixed Size 69616 bytes
Variable Size 106418176 bytes
Database Buffers 16777216 bytes
Redo Buffers 172032 bytes
Database mounted.
Database opened.
数据库正常打开,数据库重建恢复成功。
2. Oracle9i RMAN 备份及恢复步骤
在这里没有讨论多么深入的RMAN技术,也没有告诉大家这样去编写备份脚本,这并不是我的初衷,我只想把我会的写出来,和大家一起学习,一起进步,谢谢。
1、切换服务器归档模式,如果已经是归档模式可跳过此步:
%sqlplus /nolog (启动sqlplus)
SQL> conn / as sysdba (以DBA身份连接数据库)
SQL> shutdown immediate; (立即关闭数据库)
SQL> startup mount (启动实例并加载数据库,但不打开)
SQL> alter database archivelog; (更改数据库为归档模式)
SQL> alter database open; (打开数据库)
SQL> alter system archive log start; (启用自动归档)
SQL> exit (退出)
2、连接:
%rman target=rman/rman@mydb (启动恢复管理器)
3、基本设置:
RMAN> configure default device type to disk; (设置默认的备份设备为磁盘)
RMAN> configure device type disk parallelism 2; (设置备份的并行级别,通道数)
RMAN> configure channel 1 device type disk fromat '/backup1/backup_%U'; (设置备份的文件格式,只适用于磁盘设备)
RMAN> configure channel 2 device type disk fromat '/backup2/backup_%U'; (设置备份的文件格式,只适用于磁盘设备)
RMAN> configure controlfile autobackup on; (打开控制文件与服务器参数文件的自动备份)
RMAN> configure controlfile autobackup format for device type disk to '/backup1/ctl_%F'; (设置控制文件与服务器参数文件自动备份的文件格式)
4、查看所有设置:
RMAN> show all
5、查看数据库方案报表:
RMAN> report schema;
6、备份全库:
RMAN> backup database plus archivelog delete input; (备份全库及控制文件、服务器参数文件与所有归档的重做日志,并删除旧的归档日志)
7、备份表空间:
RMAN> backup tablespace system plus archivelog delete input; (备份指定表空间及归档的重做日志,并删除旧的归档日志)
8、备份归档日志:
RMAN> backup archivelog all delete input;
9、复制数据文件:
RMAN> copy datafile 1 to '/oracle/dbs/system.copy';
10、查看备份和文件复本:
RMAN> list backup;
11、验证备份:
RMAN> validate backupset 3;
12、从自动备份中恢复服务器参数文件:
RMAN> shutdown immediate; (立即关闭数据库)
RMAN> startup nomount; (启动实例)
RMAN> restore spfile to pfile '/backup1/mydb.ora' from autobackup; (从自动备份中恢复服务器参数文件)
13、从自动备份中恢复控制文件:
RMAN> shutdown immediate; (立即关闭数据库)
RMAN> startup nomount; (启动实例)
RMAN> restore controlfile to '/backup1' from autobackup; (从自动备份中恢复控制文件)
13、恢复和复原全数据库:
RMAN> shutdown immediate; (立即关闭数据库)
RMAN> exit (退出)
%mv /oracle/dbs/tbs_12.f /oracle/dbs/tbs_12.bak (将数据文件重命名)
%mv /oracle/dbs/tbs_13.f /oracle/dbs/tbs_13.bak (将数据文件重命名)
%mv /oracle/dbs/tbs_14.f /oracle/dbs/tbs_14.bak (将数据文件重命名)
%mv /oracle/dbs/tbs_15.f /oracle/dbs/tbs_15.bak (将数据文件重命名)
%rman target=rman/rman@mydb (启动恢复管理器)
RMAN> startup pfile=/oracle/admin/mydb/pfile/initmydb.ora (指定初始化参数文件启动数据库)
RMAN> restore database; (还原数据库)
RMAN> recover database; (恢复数据库)
RMAN> alter database open; (打开数据库)
14、恢复和复原表空间:
RMAN> sql 'alter tablespace users offline immediate'; (将表空间脱机)
RMAN> exit (退出恢复管理器)
%mv /oracle/dbs/users01.dbf /oracle/dbs/users01.bak (将表空间重命名)
%rman target=rman/rman@mydb (启动恢复管理器)
RMAN> restore tablespace users; (还原表空间)
RMAN> recover tablespace users; (恢复表空间)
RMAN> sql 'alter tablespace users online'; (将表空间联机)
15、增量备份与恢复:
第一天的增量基本备份:
RMAN> backup incremental level=0 database plus archivelog delete input;
第二天的增量差异备份:
RMAN> backup incremental level=2 database plus archivelog delete input;
第三天的增量差异备份:
RMAN> backup incremental level=2 database plus archivelog delete input;
第四天的增量差异备份:
RMAN> backup incremental level=1 database plus archivelog delete input;
第五天的增量差异备份:
RMAN> backup incremental level=2 database plus archivelog delete input;
第六天的增量差异备份:
RMAN> backup incremental level=2 database plus archivelog delete input;
第七天的增量差异备份:
RMAN> backup incremental level=0 database plus archivelog delete input;
增量恢复:
RMAN> shutdown immediate;
RMAN> exit
%mv /oracle/dbs/tbs_12.f /oracle/dbs/tbs_12.bak
%mv /oracle/dbs/tbs_13.f /oracle/dbs/tbs_13.bak
%mv /oracle/dbs/tbs_14.f /oracle/dbs/tbs_14.bak
%mv /oracle/dbs/tbs_15.f /oracle/dbs/tbs_15.bak
%rman target=rman/rman@mydb
RMAN> startup pfile=/oracle/admin/mydb/pfile/initmydb.ora
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open;
第一部分(基础知识及参考命令)
在开始进行备份和恢复工作之关必須先明白一些基础知识,请一定要先认真阅读下面的知识,他是你进行成功操作的先决条件.
1.数据库的启动和关闭
1.1 打开数据库
.未加载(nomount)可以把这一部分看做启动实例.
(1)读取数据库参数文件
(2)启动所需要的后台进程并按参数文件中的定义分配内存
(3)将进展的情况写入告警日志文件.
.加载(mount)在实例启动加载阶段,数据库参数文件中指定的控制文件被读取.记住控制文件将数据库各部分联系在一起.实例从控制文件中找到下列信息,然后写入告警日志文件:
(1)所有数据文件和重做日志文件的名称和位.
(2)数据库名
(3)最新系统更改号(SCN)
.打开(open)包含在数据库中的每个联机数据库文件在数据库打开前必须被同步.在数据库打开阶段:
(1)所有联机数据文件的头与控制文件信息想比较
(2)所有文件同步后,数据库打开
1.2 关闭数据库
.正常(normal)在所有的用户离线后发生的正常关闭.
.事务(transactional)当所有的用户执行完当前的事务后,将用户从数据库上清除.
.立即(immediate)清除当前用户后,回退所有的未完成的操作.
.异常(abort) 导常关闭没有给数据库任何整理的机会.这种方式关才后需要实行崩溃恢复.
注:前滚是读取并应用重做文件中的重做条目来使数据块包含原先改变时的数据.回退是读取回退段的恢复信息使数据块恢复到先前状态.
前三种半闭方式中的任何一种都允许数据库整理所有的任务,把所有的改变的数据块写入到数据文件并以最新的数据库SCM来同步控制文件和所有的数据文件.当数据库重新启动时不需要崩溃恢复.在一个干净的关闭过程中,将回退所有没有执行的数据库更改.
2.内存休系结构
SGA的组成.在实例启动时分配内存区分成以下三个主要部份
(1)共享池(shared pool) 库缓存.字典和行缓存.另外还有两个池,分别是Large pool和Java pool. Large pool用来处理RMAN操作,并行执行等.Java pool被Java代码和数据用.
(2)缓冲存储区(buffer cache) 保存刚使用过的,从磁盘上的数据文件内读取的数据.
(3)重做日志缓冲区(redo log buffer) 当数据块被更新后,对它们所作的修改被保存在重做日工志缓冲区里.
3.数据库的体结构
.表空间(tablespace)
一个表空间是相关对象的逻辑存储区域.每一个数据库对象都保存在表空间里.可以定义一个表空间,在那里建立和索引.也可以在建立表和索引时改变表空间的位.可以使用联机的表空间,但是无法使用离线的表空间.可以把一个表空间设定为只读.一个可迁移的表空间可以在数据库之间迁移.
.段(segment)
一个段可以是数据,索引,临时数据或回退段.一个数据段保存所有的数据,表的一部分.一个段只能放在一个表空间里,但是一个表空间可以存放许多不同的段.
.域(extent)
域是由一定数量的连续的数据块组成,是数据库存储空间分配的逻辑单,一旦一个域装满了数据,oracle则为段安据新的域.一个段包含了最初的域,并且根据要求安排额外的域.
.数据块(data block)数据块是数据库最小的输入输出单元.典型的数据库块的大小有2KB.4KB.8KB.16KB.当创建数据库时就为整个数据库的所有表空间定义数据块的大小.
.行(row)行存储了表和索引数据.一个行被包括在一个或者更多个数据块里.
.行标识(ROWID)用标识来定位数据库内的第一个行.这个行标识标志出一个数据文件内的一个数据块里的一行.
.系统更改号(SCN)每一个数据库事务执时都被分配了一个单独的系统更改号(SCN).这个不断增加的数字在整个数据畗里用来控制并发和一致性,进行重做和恢复.SCN代表一个协调执行着的数据库版本,也可以把数据库想象成一个时钟.
.更改矢量(change vector)当要改变数据库的数据时,这些改变的细节被记录为更改矢量.通过这些记录,数据库处理过程序可以被重现.简而言之,一个更改矢量就是记录了一个数据块从一个状态改变到另一个状态的过程.
3.oracle的数据库的几种文件(只介绍与备分和恢复相关的)
4.1 数据文件
数据库里的所有数据都保存在数据文件里.它包括(表.索引.触发器.序列.PL/SQL代码.视图),即使这些和其他的数据库对象逻辑存储在表空间里,他们事实上是保存在计算机硬盘文件里.数据文件有一个头和一系列数据块.头包括(数据库ID.文件的编码和这的名字.文件类型.创建的SCN和文件状态).oracle使用文件头来确定这个文件是否是它需要的(例如与其它文件同步更新时).一个数据文件只能属于一个表空间.但是一个表空间可以由几个不同的数据文件组成.
4.2 联机重做日志文件
4.2.1
首先讲一下oracle数据库的两种日志操作模式.
(1)NOARCHIVELOG模式
.不能执行联机备份.如果要进行备份必然先关闭数据库
.不能使用归档日工志的任何恢复技术如(完全恢复.DBPITR.TSPITR)
.当某个数据文件出现价质失败时,有两种方法:第一种方法就是删除该数据文件包含的所有对象.然后再删除该数据文件其余的仍正常工作,但损坏的全部丢失.第二种方法是转储最近的完全备份.但备份以来的数据库变化完全丢失.
(2)ARCHIVELOG模式
.需要为归档日志分配专门的空间,并且需要管理已经生成的归档日志
.在数据库打开时可以执行联机备份,不影响数据库的业务操作
.可以选择多种恢复技术(完全恢复.DBPITR.TSPITR)
4.2.2
为什么称为联机,是因为它们正在联机被数据库使用.他可以保存数据库改动的相关信息,以便于以后可以重做.每个数据库至少有两个联机日志重做文件.当一个记录满了,就写到另一个联机日志,当这个又写满时就会切换覆盖原来的.这叫做日志切换.重做日志包含了更改的矢量和他们恢复时所需要的重要信息.
4.3 归档重做日志
如果数据库工作在ARCHIVELOG模式下,一旦一个联机重做日志被填满,oracle将向已有日志文件组里的另一个文件写入.当这种日志发生切换时,oracle把最近写满的重做日志文件的内容持重到另一个地方.这个拷贝到另一个地方的文件叫归档重做日志文件.如果打算保留数据库的历史改动信息,那么就应该保留联机重做日志的拷贝.因为联机重做日志会被重复的使用.这些归档文件是恢复的关键,如果部分数据库丢失或被破坏了,通常需要几个归档日工志来修复.档日志必須按顺序应该用到数据库上.如果其中的一个丢失,其它的日志文件就无法使用.所以应该很好的保存你上次备份以来的所有归档日志文件.
前三种半闭方式中的任何一种都允许数据库整理所有的任务,把所有的改变的数据块写入到数据文件并以最新的数据库SCM来同步控制文件和所有的数据文件.当数据库重新启动时不需要崩溃恢复.在一个干净的关闭过程中,将回退所有没有执行的数据库更改.
2.内存休系结构
SGA的组成.在实例启动时分配内存区分成以下三个主要部份
(1)共享池(shared pool) 库缓存.字典和行缓存.另外还有两个池,分别是Large pool和Java pool. Large pool用来处理RMAN操作,并行执行等.Java pool被Java代码和数据用.
(2)缓冲存储区(buffer cache) 保存刚使用过的,从磁盘上的数据文件内读取的数据.
(3)重做日志缓冲区(redo log buffer) 当数据块被更新后,对它们所作的修改被保存在重做日工志缓冲区里.
3.数据库的体结构
.表空间(tablespace)
一个表空间是相关对象的逻辑存储区域.每一个数据库对象都保存在表空间里.可以定义一个表空间,在那里建立和索引.也可以在建立表和索引时改变表空间的位.可以使用联机的表空间,但是无法使用离线的表空间.可以把一个表空间设定为只读.一个可迁移的表空间可以在数据库之间迁移.
.段(segment)
一个段可以是数据,索引,临时数据或回退段.一个数据段保存所有的数据,表的一部分.一个段只能放在一个表空间里,但是一个表空间可以存放许多不同的段.
.域(extent)
域是由一定数量的连续的数据块组成,是数据库存储空间分配的逻辑单,一旦一个域装满了数据,oracle则为段安据新的域.一个段包含了最初的域,并且根据要求安排额外的域.
.数据块(data block)数据块是数据库最小的输入输出单元.典型的数据库块的大小有2KB.4KB.8KB.16KB.当创建数据库时就为整个数据库的所有表空间定义数据块的大小.
.行(row)行存储了表和索引数据.一个行被包括在一个或者更多个数据块里.
.行标识(ROWID)用标识来定位数据库内的第一个行.这个行标识标志出一个数据文件内的一个数据块里的一行.
.系统更改号(SCN)每一个数据库事务执时都被分配了一个单独的系统更改号(SCN).这个不断增加的数字在整个数据畗里用来控制并发和一致性,进行重做和恢复.SCN代表一个协调执行着的数据库版本,也可以把数据库想象成一个时钟.
.更改矢量(change vector)当要改变数据库的数据时,这些改变的细节被记录为更改矢量.通过这些记录,数据库处理过程序可以被重现.简而言之,一个更改矢量就是记录了一个数据块从一个状态改变到另一个状态的过程.
3.oracle的数据库的几种文件(只介绍与备分和恢复相关的)
4.1 数据文件
数据库里的所有数据都保存在数据文件里.它包括(表.索引.触发器.序列.PL/SQL代码.视图),即使这些和其他的数据库对象逻辑存储在表空间里,他们事实上是保存在计算机硬盘文件里.数据文件有一个头和一系列数据块.头包括(数据库ID.文件的编码和这的名字.文件类型.创建的SCN和文件状态).oracle使用文件头来确定这个文件是否是它需要的(例如与其它文件同步更新时).一个数据文件只能属于一个表空间.但是一个表空间可以由几个不同的数据文件组成.
4.2 联机重做日志文件
4.2.1
首先讲一下oracle数据库的两种日志操作模式.
(1)NOARCHIVELOG模式
.不能执行联机备份.如果要进行备份必然先关闭数据库
.不能使用归档日工志的任何恢复技术如(完全恢复.DBPITR.TSPITR)
.当某个数据文件出现价质失败时,有两种方法:第一种方法就是删除该数据文件包含的所有对象.然后再删除该数据文件其余的仍正常工作,但损坏的全部丢失.第二种方法是转储最近的完全备份.但备份以来的数据库变化完全丢失.
(2)ARCHIVELOG模式
.需要为归档日志分配专门的空间,并且需要管理已经生成的归档日志
.在数据库打开时可以执行联机备份,不影响数据库的业务操作
.可以选择多种恢复技术(完全恢复.DBPITR.TSPITR)
4.2.2
为什么称为联机,是因为它们正在联机被数据库使用.他可以保存数据库改动的相关信息,以便于以后可以重做.每个数据库至少有两个联机日志重做文件.当一个记录满了,就写到另一个联机日志,当这个又写满时就会切换覆盖原来的.这叫做日志切换.重做日志包含了更改的矢量和他们恢复时所需要的重要信息.
4.3 归档重做日志
如果数据库工作在ARCHIVELOG模式下,一旦一个联机重做日志被填满,oracle将向已有日志文件组里的另一个文件写入.当这种日志发生切换时,oracle把最近写满的重做日志文件的内容持重到另一个地方.这个拷贝到另一个地方的文件叫归档重做日志文件.如果打算保留数据库的历史改动信息,那么就应该保留联机重做日志的拷贝.因为联机重做日志会被重复的使用.这些归档文件是恢复的关键,如果部分数据库丢失或被破坏了,通常需要几个归档日工志来修复.档日志必須按顺序应该用到数据库上.如果其中的一个丢失,其它的日志文件就无法使用.所以应该很好的保存你上次备份以来的所有归档日志文件.
4.4 控制文件
控制文件用于记录和维护数据库的物理结构,并且每个oracle数据库到少要包含一个控制文件.一个例程只能访问一个数据库,oracle通过控制文件在例程和数据库之间建立关联.oracle会根据初始化参数control_files来定位控制文件.oracle会根据控制文件所记载的信息打开所有数据文件和重做日志.控制文件对操作数据库非常重要.可以有几个控制文件的拷贝,即便丢失了一个可以通过修改control_files的使用另一个正常启动数据库.
3.5 初始化参数文件
也是数据库参数文件.在数据库实例启动时应用.初始化参数文件包含了数据库控制文件的位置,数据库的名称,归档日志文件信息以及其他内存和函数的参.这个数据库参数文件可以被称为PFILE.初始化文件或者init.ora.
DBA操作参考的命令及操作
在sqlplus下用select * from (动态视图和字典视图,来查看数据库文件的信息)
对我们备份有用的动态视图和字典视图
v$DATABASE,v$SINSTANCE 数据库信息
v$PARAMETER 数据库参数信息
v$TABLESPACE,DBA_TABLESPACES 表空间信息
v$DATAFILE,v$TEMPFILE,DBA_DATA_FILES
v$DATAFILE_HEADER,DBA_TEMP_FILES 数据文件信息
v$LOG,VSLOGFILE,v$LOG_HISTORY 重做日志文件信息
v$CONTROLFILE 控制文件信息
v$REVERY_FILE_STATUS,v$RECOVERY_LOG
v$RECOVERY_PROGRESS,v$RECOVERY_LOG
v$RECOVER_FILE 数据库恢复信息
V$ARCHIVEd_LOG 归档日志详细信息
V$ARCHIVE_DEST 归档日志的位置
V$LOGHIST 日志历使信息
V$ARCHIVE_PROCESSES 归档日志的进程
例如:
sql>select * from v$controlfile;
会列出控制文件的相关信息
创建用户
具体用法 create user username identified by passwd;
例如: create user test identified by test;(创建一个test用户密码是test)
删除用户
具体用法:drop user username;
例如:drop user test;(删除test用户)
更改用户的默认表空间
具体用法:alter user username default tablespace tablespacename;
例如:alter user test default tablespace test;(定义用户的默认表空间为test)
alter user test temporary tablespace temp;(定义用户的临时表空间为temp)
给用户受权
具体用法:grant power to username;
例如:grant connect,resource,unlimited tablespace to test;(给test受于connect,resource,unlimited tablespace权限)
更改用户的密码
具体用法为:alter user username identified by passwd;
例如:alter user sys identified by aaa;(sys用户的密码改为aaa)
创建表空间:
具体用法:create tablespace tablespacename datafile 'path/filename' SIZE size ;
例如:create tablespace test datafile '/database/oracle/oradata/JSWY/test01.dbf' size 100M;(创建test表空间大小为100M)
在表空间中添加数据文件
具体用法:alter tablespace tablespace add datafile 'path/filename' SIZE size;
例如:SQL> alter tablespace test add datafile '/database/oracle/oradata/JSWY/test02.dbf' size 10M;(为test表空间添加一个test02.dbf数据文件,容量大小为10M)
创建表
具体用法:create table tablename tablespace tablespacename;
例如:create table test (a int) tablespace test;(在test表空间创建一个test表)
在表中插入数据
具体用法:insert into talbename values(value);
例如:insert into test values(1);(向test表插入数据1)
改变控制的位置(也可以理解为新增加一个控制文件)
例:sql>alter system set control_files='/database/oracle/oradata/JSWY/control02.ctl','/database/backup/control02.ctl' scope=spfile;(控制文件位置改为/database/backup下,如果是增加刚关闭数据库把原控制文件cp到这个位置改为相应的名字即可,同时还要修改init.ora文件中的control_files选项以确保数据库正常工作)
增加联机日志成员
例: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;(分别为3个日志组多增加了一个成员)
改变数据库日志操作模式为archivelog.
sql>shutdown immediate;
sql>startup mount;
sql>alter database archivelog;
sql>alter database open;
可以用archive log list;查看当前数据库的日志模式.也可修改init.ora文件log_archive_start设置为TURE,重启数据库.
配置归档日志的名称格式
介绍一些匹配符:
%s:日志序列号
%S:日志序列号(带有前导o)
%t:重做线程编号
%T:重做线程编号(带有前导o)
%a:活动ID号
%d:数据库ID号
%r:RESETLOGS的ID值
sql>alter system set log_archive_format='%s_%t_%r.log' scope=spfile;
这个是静态参数所以必須重新启动数据库才生效.(注:oracle 10G开始,默认归档文件放置的位置是快速恢得区对应的目录即init.ora文件中的db_recovery_file_dest,那么不会采用log_archive_format的文件名格式.对些你可以改变归档文件的位置)
改变归档文件的位置
sql>alter system set log_archive_dest_n='[location;service=patch [OPTIONAL;MANDATORY;REOPEN]' scope=spfile;
其中n为的范围是1-10,location表示归档目录在本地,service表示在远程.patch表示归档的路径,OPTIONAL表示无论归档是否成功,都可以覆盖重做日志,MANDATORY表示只有归档成功之后才覆盖重做日志,REOPEN表示用于指定重新归档的时间间隔,默认是300秒,REOPEN属性必须在MANDATORY选项后.log_archive_dest_n不能与log_archive_dest,log_archive_duplex_dest同时使用如果特殊说明,本文所有[]这间的都为可选项.
控制归档位置
如果归档位置磁盘空间不足或损坏,那么归档就会失败,为了解决这类问题,有时需要临时禁用相应的归档位置.
sql>alter system set log_archive_dest_state_n=[DEFER;ENABLE]
其中(n=1,2,....10),DEFER表示禁用,ENABLE表示允许.
建立控制文件的复本
sql>alter database backup controlfile to 'path/filename' reuse;
path/filename是备份的位置和文件名,reuse表示如果存了的相同的将覆盖.
备份控制文件到跟踪文件
sql>alter database backup controlfile to trace;
强制日志切换,并使所有归档
sql>alter system switch logfile;
sql>alter system archive log all;
在mount壮态下改变数据文件位置
sql>host cp /database/oracle/oradata/oracle_sid/system01.dbf /database/oracle/backup/system1.dbf
sql>alter database rename file '/database/oracle/oradta/oracle_sid/system01.dbf' to '/database/oracle/backup/system1.dbf';
察看要恢复的文件的id
sql>col error format a20
sql>select file#,error,change# from v$recover_file;
其中file#标识的为文件的id,change#标识的是SCN值.
完全恢复---多个数据文件的恢复
sql>conn sys/passwd as sysdba
sql>startup force mount
sql>recover database;
注:数据库必须在mount壮态下.
完全恢复---表空间的恢复
sql>conn sys/passwd as sysdba
sql>recover tablespace tablename;
注:数据库必须在open壮态下
完全恢复---数据文件恢复
sql>conn sys/passwd as sysdba
sql>recover datafile 'path/name';
sql>recover datafile id
注:数据库必须在mount壮态下
指定恢复时的归档日志的位置
sql>recover from 'path' datafile id
path为指定的归档日志的位置
自动应用归档日志
sql>recover automatic datafile id
查询恢复要使用的归档日志
sql>select sequence#,archive_name from v$recover_log;
其中sequence#标识日志的序列号,archive_name是要用的归档日志.
使一个数据文件脱机或在线
sql>alter database datafile id [offline;online];
建立数据文件的复本
sql>alter database create datafile 'path/name' as 'patch/name';
不完全恢复命令--------recover database until time
基于时间的不完全恢复,并且在指定时间点时必须要符合日期格式yyyy-mm-dd hh24:mi:ss.当执行基于时间的不完全恢复时,必须确保在特定时间之前的所有重做日志全部存在.配合SQL> select file#,to_char(time,'yyy-mm-dd hh24:mi:ss') from v$recover_file;确定备份文件的时间点.例sql>recover database until time '2005-03-16 16:40:33';当执行了不完全恢复后,重新打开数据库时必須带有resetlogs,当以resetlogs打开数据库后原来的所有重做日志会重新建立,清空原有重做日志的所有内容,并将日志列号复位为1,所以建义在不完全恢复时先备份原数据库文件和重做日志,以免出现错误.并且在不完全恢复成功后应该备份所有的数据文件和控制文件,因为原来的备份已不可再用.
不完全恢复命令--------recover database until change
基于scn的不完全恢复,必須确保在SCN之前的所有归档日志和重做日志存在.
不完全恢复命令--------recover database until cancel
基于取消的不完全恢复,如果发现所需要的归档日志或重做日志不存在,那么指定cancel选项取消恢复
不完全恢复命令--------recover database ... using backup controlfile
基于备份控制文件的不完全恢复,在执行该命令之前,通过查看alert文件可以确定误操作的时间点和scn值,然后可以根据时间点或scn值进行恢复
查询当前的scn
sql>select current_scn from v$database;
当数据库在打开壮态下非活动日志组(INACTIVE)所有日志成员全部出现介质失败时,后台LGWR会处于等待壮态应该清除日志组
sql>alter database clear unarchived logfile group n;
当执行了些命令之后,oracle会重新建立该日志组成员继续正常工作.
在关闭时非活动日志组价质失败,可以增加新的日志组,删除原有日志组,再打开数据库
sql>alter database add logfile ('path/name',/path/name') size 10M
sql>alter database drop logfile group n;
sql>alter database open;
在关闭壮态下当前日志组所有日志成员全部损坏,因为数据文件和控制文件处于完全一致壮态,进行基于取消的不完全恢复再用resetlogs打开数据库即可
sql>recover database until cancel;
sql>alter database open resetlogs;
在打开壮态下当前日志组所有日志成员全部损坏.联接到空闲例程.必須使用数据文件备份/归档日志执行基于取消的不完全恢复
sql>recover database until cancel;
sql>alter database open resetlogs;
当执行了不完全恢复或者用resetlogs选项打开数据库之后,可能会导致过去的临时文件不能用,当介质失败时也可能不能用.这时排序操作可能会失败,这时可以为相应的临时表空间增加一个新的临时文件.
sql>alter tablespace temp add filename
创建口令文件
linux>orapwd file=$ORACLE_HOME/dbs/orapwJSWY passwd=****** entries=n
第二部分(备份和恢复)
我们只做基于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 口令。