温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

一个冷备份的自动执行脚本

发布时间:2020-07-18 21:40:19 来源:网络 阅读:684 作者:misterfzw 栏目:关系型数据库

花了一天多时间,捣鼓出一个SQL 脚本,用于执行ORACLE自动冷备份。记录如下:

set echo off                               --关闭命令回显,但会显示执行后的命令。
set serveroutput on                        --返回结果,如果关闭,将无法把结果传到下一个文件。
set escape on                              --打开转义符功能,否则遇到/无法进行。
set heading off                            --关闭结果标题行显示
set line 300                               --设置返回结果显示宽度,避免遇到结果跨行后sed命令取结果不完整。
ho mkdir $ORACLE_HOME/`date +%Y_%m_%d`     --创建存放备份文件的目录,以当天日期命名。要保证与下面SQL中目录一致。
spool  /tmp/bak1.sql
declare                                    --声明一个变量。用于接收当前日期的值。
v_time varchar2(30);
begin
select to_char(sysdate,'yyyy_mm_dd') into v_time   --获取当天日期。
from dual;
dbms_output.put_line('select ''ho cp ''\|\|name\|\|'' $ORACLE_HOME\/'||v_time||''' from v$controlfile;');
dbms_output.put_line('select ''ho cp ''\|\|name\|\|'' $ORACLE_HOME\/'||v_time||''' from v$datafile;');
dbms_output.put_line('select ''ho cp ''\|\|member\|\|'' $ORACLE_HOME\/'||v_time||''' from v$logfile;');
dbms_output.put_line('select ''ho cp ''\|\|name\|\|'' $ORACLE_HOME\/'||v_time||''' from v$tempfile;');
dbms_output.put_line('create pfile=''$ORACLE_HOME\/'||v_time||'\/init$ORACLE_SID.ora'' from spfile;');
dbms_output.put_line('ho cp $ORACLE_HOME\/dbs\/orapw$ORACLE_SID $ORACLE_HOME\/'||v_time);
end;
/
spool off
 --以上通过获取日期后,得到带有日期值的完整的SQL原始语句和一些结果说明语句。
 --以下获取纯净的用来执行的原始SQL语句。
ho sed -n '/select/p' /tmp/bak1.sql >/tmp/bak2.sql
ho sed -n '/^create/p' /tmp/bak1.sql >>/tmp/bak2.sql
ho sed -n '/^ho cp/p;' /tmp/bak1.sql >>/tmp/bak2.sql
--以下用来将原始SQL语句执行得到SQLPLUS语句,并备份了参数文件和密码文件,以及结果说明语句。
spool /tmp/bak3.sql
start /tmp/bak2.sql
spool off
ho sed -n '/^ho cp/p' /tmp/bak3.sql >$ORACLE_HOME/back.sql     --过滤掉无用的结果说明语句。获取最终有用的SQLPLUS命令。
shutdown immediate                                             --关闭数据库进行冷备。
start $ORACLE_HOME/back.sql
startup
ho rm /tmp/bak*.sql $ORACLE_HOME/back.sql                      --删除临时生成的执行脚本。


说明:1.SQL下获取当前日期值,并应用到SQLPLUS命令的目录中是一个难点,折腾了一天。

          2.sed命令可以用sed -i来简化生成的过渡性sql脚本。

          3.应该可以在SQLPLUS下定义变量并赋予当天日期值,再运用到其他备份命令中,暂时没搞成功,回头有时间再研究。

          4.这是为了学习而搞得一个SQL脚本,或许用系统shell脚本来做,会更简洁有效。下一步再做一个系统shell脚本。


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI