ORACLE热备份

热备份

对表空间进行备份

1.alter tablespace tbs_test begin backup;
2.对表空间下面的文件进行拷贝
3.alter tablespace tbs_test end backup;
要在线备份数据库,数据库的模式必须是archive 模式

archive log list;(查看)

把noarchive 转换到archive 模式

startup mount

alert database noarchivelog ;
alert database open;

aler database archivelog;

热备份脚本:

set feedback off pagesize 0 heading off verify off linesize 32767 trimspool on termout off serveroutput on remark 备份目录先要建好,并赋予ORACLE用户所有。确保有足够的空间

define dir='/hotbak/colnedb'
define fil='&dir/open_backup_commands.sql'
define spo='&dir/open_backup_output.lst'
spool &fil
prompt connect sys/oracle@clonedb as sysdba;;
prompt alter system switch logfile;;
declare
      cursor cur_tablespace is
             select tablespace_name from dba_tablespaces where status<>'READ ONLY' and contents<> 'TEMPORARY';

      cursor cur_datafile(tn varchar) is
              select file_name from dba_data_files where tablespace_name=tn;


begin
     for ct in cur_tablespace loop
             dbms_output.put_line('alter tablespace' ||ct.tablespace_name || begin backup;');

       for cd in cur_datafile (ct.tablespace_name) loop
                 dbms_output.put_line('!cp' || cd.file_name ||' &dir');
                end loop;
             dbms_output.put_line('alter tablespace' || ct.tablespace_name || end backup;');
      end loop;
end;

prompt alter system switch logfile;
prompt alter database backup controlfile to '&dir/backup.ctl' reuse;;
prompt alter database backup controlfile to trace;
spool off;;

remark 写好脚本先别加@&fil执行,看看输出是否正常,确认正常再加上@&fil执行,控制文件的REUSE表示如果目标文件存在则覆盖
spool &spo
@&fil
spool off
remark 备完之后得归档日志,怎么知道要备哪些归档日志的?查看V$backup 找出数据在备份的时候的SCN,再对比v$archived_log 的first_change#.例如 select max(sequence#) from v$archived_log where FIRST_CHANGE# <(select min(CHANGE#) FROM V$backup); 并且确保所有的数据文件都备了。

 

磁盘添加:

pvcreate -v /dev/sdf
vgcreate -h
vgcreate -v orabak /dev/sdf
lvcreate -h
lvcreate -L 7800m -n lv_orabak orabak
mkfs.ext2 -h
mkfs.ext2 /dev/oradbak/lv_orabak

mkdir /orabak
mount /dev/orabak/lv_orabak /orabak
chown -R oracle:dba /orabak
vi /etc/fstab
/dev/orabak/lv_orabak    /orabak   ext2   defaults 0 , 0 (自动挂载磁盘)

磁盘添加结束

rm -rf /hotbak/
ln -s /orabak/  /hotbak  把/orabak目录链接到/hotbak目录下面(hotbak是个虚拟目录)

 


用一个备份的文件来创建一个数据库

1.建文件夹 、密码文件、参数文件
2.备份控制文件到脚本
3.执行脚本生成控制文件
4.打开数据库
5.新建temp文件


1.先备份数据,不移动数据文件。做一个软连接
 ln -s /orabak/clonedb/ /oradata/digoal   /orabak/clonedb/是备份的数据文件所在的目录,而/oradata/digoal是新数据库数据文件存放的地方

2. cp initclonedb.ora initdigoal.ora 把参数文件从复制的数据库拷贝过来

3、vi initdigoal.ora 把该文件中的clonedb替换为digoal 替换命令:
%s/clonedb/digoal

4、常见目录:
   mkdir -p $ORACLE_BASE/admin/digoal/adump
   mkdir -p $ORACLE_BASE/admin/digoal/bdump
   mkdir -p $ORACLE_BASE/admin/digoal/cdump
   mkdir -p $ORACLE_BASE/admin/digoal/udump

在/oradata/digoal/目录下面创建archive目录

5.创建密码文件,密码文件的名称是orapwd+sid

 查看orapwd帮助是  orapwd -h

 useage: orapwd file=<fname> password=<password> entries=<users> force=<y/n>

 entries=maximum number of distinct DBA 最多有多少个DBA

orapwd file=$ORACLE_HOME/dbs/orapwdigoal password= oracle entries=10

export ORACLE_SID=digoal


7.进入数据库

conn / as sysdba

startup mount


控制文件脚本
 
shutdown abort

vi ctlsql.sql这个文件 ,把这个文件中创建数据文件的地方用新的SID进行替换(ctlsql.sql)是在以前的视频教程中创建的

uniread sqlplus / as sysdba (连接到数据库)


startup nomount

@$Home/ctlsql.sql(创建控制文件脚本)

出现一个错误,

CREATE CONTRALFILE REUSE DATABASE 'DIGOAL' RESETLOGS ARCHIVELOG
*
database name COLONEDB in file header does not match given name of DIGOAL

说明数据文件/oradata/digoal/system01.dbf的头部记录了 SID的值

只要在/ctlsql.sql中加入一个set 就能够解决这个文件

vi @$Home/ctlsql.sql
CREATE CONTRALFILE SET REUSE DATABASE 'DIGOAL' RESETLOGS ARCHIVELOG

 

8.恢复数据库

recove database using backup controlfile until cancel;


如果出现错误,按照数据库的提示

/oradata/clonedb/archive/1_8_652237584.dbf
引用归档日志


(
/oradata/clonedb/redo_g1_m1.ora

recove database using backup controlfile until cancel;
/oradata/clonedb/redo_g2_m1.ora


recove database using backup controlfile until cancel;
/oradata/clonedb/redo_g3_m1.ora


到archive目录下面:


recove database using backup controlfile until cancel;

/oradata/clonedb/archive/1_8_652237584.dbf


)

alter database open resetlogs;

SQL> !ipcs (启动了两个实例)

你可能感兴趣的:(oracle,sql,脚本)