您的位置:首页 > 数据库 > Oracle

oracle的备份与恢复

2006-02-23 14:16 411 查看
近来自己在配置oracle时的笔记

第一部分(基础知识及参考命令)
在开始进行备份和恢复工作之关必須先明白一些基础知识,请一定要先认真阅读下面的知识,他是你进行成功操作的先决条件.

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把最近写满的重做日志文件的内容持重到另一个地方.这个拷贝到另一个地方的文件叫归档重做日志文件.如果打算保留数据库的历史改动信息,那么就应该保留联机重做日志的拷贝.因为联机重做日志会被重复的使用.这些归档文件是恢复的关键,如果部分数据库丢失或被破坏了,通常需要几个归档日工志来修复.档日志必須按顺序应该用到数据库上.如果其中的一个丢失,其它的日志文件就无法使用.所以应该很好的保存你上次备份以来的所有归档日志文件.

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 口令。

转自 weizhishu.cublog.cn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: