Oracle数据库循环重建多个物化视图shell脚本

#!/bin/bash
LOG_FILE="script_output_$(date +'%Y%m%d_%H%M%S').log"

exec >"$LOG_FILE" 2>&1
# 设置数据库连接信息 DB_HOST
="LOCALHOST" DB_PORT="1521" DB_SID="pdb" DB_USER="mics" DB_PASS="123456" TNS_SERVICE="${DB_SID}" START_TIME=$(date +"%Y-%m-%d %H:%M:%S") echo "脚本开始时间: $START_TIME" # 定义物化视图的名称列表 MV_NAMES=("mv_entity_device_data" "ATS_PLATFORM_MV") # 修改为您的物化视图名称 # 循环处理每个物化视图 for MV_NAME in "${MV_NAMES[@]}"; do LOOP_START_TIME=$(date +%s) echo "正在检查物化视图: $MV_NAME" # 使用 here document 执行 SQL 查询,确保格式正确 RESULT=$(sqlplus -s "$DB_USER/$DB_PASS@//${DB_HOST}:${DB_PORT}/${TNS_SERVICE}" <<EOF SET HEADING OFF SET FEEDBACK OFF SET VERIFY OFF SET ECHO OFF SELECT COUNT(*) FROM all_mviews WHERE mview_name = UPPER('$MV_NAME'); EXIT; EOF ) # 去除空格、换行等不必要的字符 RESULT=$(echo "$RESULT" | tr -d '[:space:]') # 检查 RESULT 是否为有效的数字 if [[ "$RESULT" =~ ^[0-9]+$ ]]; then if [ "$RESULT" -gt 0 ]; then # 获取创建物化视图的SQL CREATE_MV_SQL=$(sqlplus -s "$DB_USER/$DB_PASS@//${DB_HOST}:${DB_PORT}/${TNS_SERVICE}" <<EOF SET HEADING OFF SET FEEDBACK OFF SET VERIFY OFF SET ECHO OFF SET LONG 10000 SET LONGCHUNKSIZE 10000 SELECT DBMS_METADATA.GET_DDL('MATERIALIZED_VIEW',UPPER('$MV_NAME'), 'MICS') FROM dual; EXIT; EOF ) # 去除多余的换行和空格 CREATE_MV_SQL=$(echo "$CREATE_MV_SQL" | tr -d '\n' | tr -s ' ') CREATE_MV_SQL="${CREATE_MV_SQL};" echo $CREATE_MV_SQL > create_mv_view.sql echo "commit;" >> create_mv_view.sql echo "exit;" >> create_mv_view.sql echo "物化视图 $MV_NAME 存在,正在删除旧的物化视图..." # 删除已有的物化视图 DELETE_MV_SQL="DROP MATERIALIZED VIEW $MV_NAME;" # 执行删除物化视图的 SQL echo "$DELETE_MV_SQL" | sqlplus -s "$DB_USER/$DB_PASS@//${DB_HOST}:${DB_PORT}/${TNS_SERVICE}" echo "物化视图 $MV_NAME 已删除,正在重新创建..." # 执行创建物化视图的 SQL sqlplus -s "$DB_USER/$DB_PASS@//${DB_HOST}:${DB_PORT}/${TNS_SERVICE}" @create_mv_view.sql > create_mview.log 2>&1 echo "物化视图 $MV_NAME 已重新创建。" else echo "物化视图 $MV_NAME 不存在,请先手动创建视图" fi else # 如果 RESULT 不是有效数字 echo "查询结果无效或为空,跳过物化视图 $MV_NAME" fi # 记录结束时间和计算耗时 LOOP_END_TIME=$(date +%s) DURATION=$((LOOP_END_TIME - LOOP_START_TIME)) if [ "$DURATION" -ge 60 ]; then echo "物化视图 $MV_NAME 处理完成,耗时: $((DURATION / 60)) 分钟" else echo "物化视图 $MV_NAME 处理完成,耗时: $DURATION 秒" fi echo "------" done END_TIME=$(date +"%Y-%m-%d %H:%M:%S") echo "脚本结束时间: $END_TIME"

 

posted @ 2024-12-16 09:39  一只竹节虫  阅读(9)  评论(0编辑  收藏  举报