巧用shell脚本生成快捷脚本

在升级的过程中,可能需要准备一些额外的脚本,比如说做数据迁移的时候为了考虑性能,需要做如下的额外工作:
1.将部分表置为nologging
2.将部分index置为nologging
3.将部分foreign key constraint置为disable
4.将部分trigger 置为disable
在完成数据升级后,再置为logging,enable状态。
但是在准备脚本的过程中,总是为这些小脚本而头疼,可能在升级前临时增加了一些表或者取消了部分表。或者有了其他的变更,维护这些脚本就显得有些体力工作了。
最后下决心改变这种状态,直接根据规则生成新的脚本。在不同的环境中脚本内容可能略有不同,但是功能不打折。
首先需要准备一个文件tablst,里面是文件的列表
比如:
table1
table2
table3
...

然后使用如下的脚本,就能生成完整的脚本,在升级前nologging,disable的工作就生成脚本到pre目录下,logging,enable的工作就生成脚本到post目录下
脚本内容也没有了冗余。

logging_flag=logging
nologging_flag=nologging
disable_flag=disable
enable_flag=enable
awk '{print "'\''" $1 "'\''" ","}' ../parfile/tablst |sed -e '/^$/d' -e '$s/.$//' > tablst.temp
table_list=`cat tablst.temp`

function pre_act
{
logging_ind=$1
enable_ind=$2
act_type=$3
     sqlplus -s $4
     set feedback off
     set pages 0
     set linesize 200
     spool $act_type/tab_$logging_ind.sql
     prompt -- table $logging_ind
     select 'alter table '||table_name||' $logging_ind;' from user_tables where  table_name in ($table_list);
     spool off;
     spool $act_type/index_$logging_ind.sql
     prompt -- index $logging_ind
     select 'alter index '||index_name||' $logging_ind;' from user_indexes where table_name in ($table_list);
     spool off;
     spool $act_type/fk_constraint_$disable_flag.sql
     prompt --FK constraint $enable_ind
     SELECT
           'ALTER TABLE '||TABLE_NAME||' $enable_ind  CONSTRAINT '|| CONSTRAINT_NAME||';' FROM USER_CONSTRAINTS WHERE
            CONSTRAINT_TYPE='R' UNION SELECT 'ALTER TABLE '||UCA.TABLE_NAME||' DISABLE  CONSTRAINT '|| UCA.CONSTRAINT_NAME||';'
     FROM
            USER_CONSTRAINTS UCA , 
            (SELECT  CONSTRAINT_NAME
               FROM  USER_CONSTRAINTS
               WHERE CONSTRAINT_TYPE IN ('P','U')
     ) tmp
     WHERE UCA.CONSTRAINT_TYPE = 'R' 
       AND tmp.constraint_name = UCA.R_CONSTRAINT_NAME
       and UCA.table_name in ($table_list) ;
     spool off;
     spool $act_type/trigger_disable.sql
     prompt trigger disable
     SELECT
           'ALTER TRIGGER ' ||TRIGGER_NAME||' $enable_ind ;'
     FROM
            USER_TRIGGERS;
     spool off;
EOS
}

pre_act  $nologging_flag $disable_flag pre $1
pre_act  $logging_flag   $enable_flag  post $1

脚本生成的sql脚本如下:
pre > 
total 83
-rw-r--r-- 1 xxxx dba 11280 Jun 23 21:00 fk_constraint_disable.sql
-rw-r--r-- 1 xxxx dba 42631 Jun 23 21:00 index_nologging.sql
-rw-r--r-- 1 xxxx dba 13888 Jun 23 21:00 tab_nologging.sql
-rw-r--r-- 1 xxxx dba   621 Jun 23 21:00 trigger_disable.sql

post > ls -lrt
total 69
-rw-r--r-- 1 xxxx dba 13886 Jun 23 21:00 tab_logging.sql
-rw-r--r-- 1 xxxx dba 42629 Jun 23 21:00 index_logging.sql
-rw-r--r-- 1 xxxx dba 11279 Jun 23 21:00 fk_constraint_disable.sql
-rw-r--r-- 1 xxxx dba   621 Jun 23 21:00 trigger_disable.sql

时间: 2024-09-16 17:09:11

巧用shell脚本生成快捷脚本的相关文章

巧用shell生成数据库检查脚本

在生产环境中需要部署大量的数据变更.对于新增的表,需要注意权限和同义词等.但是手动去检查这些变更是否生效就很麻烦.而且也不易维护,比如写好了一个脚本,可能在过一段时间,有一些紧急变更,需要把这些变更加进来,可能就忘了更新检查脚本. 考虑到检查的性能,不想查询数据,只需要保证能够正常访问表即可.所以写了如下的sql.目标就是通过shell来生成这样的sql脚本. 比如对于表TEST,检查是否可以访问,如果可以访问,就显示表TEST is accessible... SELECT decode (c

如何通过shell脚本生成服务器密码

写了一个可以生成随机密码的脚本,如果想要纯数字或才字母或者大小写,都可以自定,我这里写了全元素. #!/bin/bash # author: honway.liu # date: 2013-07-19 # concate: gm100861@gmail.com len=90 str=(a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1 2

SQL Server 动态生成分区脚本

一.前言 前段时间使用表分区比较多,虽然已经写了SQL Server 合并(删除)分区解惑.SQL Server 2005 分区模板与实例,但是在实践中一直感觉修改SQL脚本的时间比较多,一直想抽个时间来把分区脚本进行动态化,今天终于付之于行动了.需要说明的一点,下面的脚本并不能满足所有情况,用户可以根据自己的需要进行相应的调整,应该可以满足你的需求的. 在SQL Server 2005中只能通过SQL脚本来创建表分区,而在SQL Server 2008的SSMS中已经提供了操作界面进行表分区,

Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例_node.js

每种语言都有自己的优势,互相结合起来各取所长程序执行起来效率更高或者说哪种实现方式较简单就用哪个,nodejs是利用子进程来调用系统命令或者文件,文档见http://nodejs.org/api/child_process.html,NodeJS子进程提供了与系统交互的重要接口,其主要API有: 标准输入.标准输出及标准错误输出的接口.   NodeJS 子进程提供了与系统交互的重要接口,其主要 API 有:   标准输入.标准输出及标准错误输出的接口 child.stdin 获取标准输入 ch

将表数据生成Insert脚本 比较好用的生成插入语句的SQL脚本

复制代码 代码如下:set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go -- ============================================= -- Author: 华岭 -- Create date: 2008-10-28 -- Description: 将表数据生成Insert脚本 -- Demo : exec pCreateInsertScript 'BexmCodeType','dictypeid = 61' -- ===

将表数据生成SQL脚本的存储过程

存储过程|脚本|数据 作者:zlt982001 将表数据生成SQL脚本的存储过程: CREATE PROCEDURE dbo.UspOutputData @tablename sysname AS declare @column varchar(1000) declare @columndata varchar(1000) declare @sql varchar(4000) declare @xtype tinyint declare @name sysname declare @object

使用Template模板生成了脚本后怎么把这个脚本的内容写入到一个txt文件中呢?求大神解答

问题描述 使用Template模板生成了脚本后怎么把这个脚本的内容写入到一个txt文件中呢?求大神解答 public static void main(String[] args) throws Exception { Map map = new HashMap(); Configuration cfg = new Configuration(); Template t = cfg.getTemplate("src/main/webapp/model/sqoop_header.ftl"

MS SQL批量生成作业脚本方法介绍总结

在迁移或升级SQL Server数据库服务器时,很多场景下我们不能还原msdb,所以我们必须手工迁移SQL Server相关作业.如果手工生成每一个作业的脚本话,费时又费力,其实SQL Server中有好几种方法可以批量生成作业脚本的方法, 下面介绍一下.   1:SSMS客户端工具批量生成创建作业脚本   1:在SSMS->SQL Server Agent下,单击Jobs.   2: 按快捷键F7,在Object Explorer Details里面,你会看到所有的作业   3: 全选所有作业

shell-linux sh脚本生成txt文件

问题描述 linux sh脚本生成txt文件 执行sh生成数据文件,然后后面要求在执行成功后生产一个日志文件,日志文件中并不需要什么内容. 解决方案 Linux下通过sh脚本执行jar文件简单的Linux sh脚本文件linux下sh脚本定时删除文件 解决方案二: #!/bin/sh DE1="_" DE2="." for fl in `ls * | grep data` do part1=`echo $fl | cut -d$DE1 -f 1` part2=`ec