Oracle一次缩小表空间的处理过程


Oracle一次缩小表空间的处理过程

 BLOG文档结构图

wps7D5D.tmp 

 

 

 前言部分

2.1  导读和注意事项

各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~

① 收缩表空间的几种办法

② 表空间大小查询

③ AIX下查询磁盘空间大小的shell脚本

④ 删除数据文件的正确方法

 ORA-03262处理

⑥ 缩小数据文件

⑦ su - grid asmcmd lsdg的使用

⑧ 其他常用命令

  Tips:

① 本文在ITpubhttp://blog.itpub.net/26736162)、博客园(http://www.cnblogs.com/lhrbest)和微信公众号(xiaomaimiaolhr)有同步更新

② 文章中用到的所有代码,相关软件,相关资料请前往小麦苗的云盘下载(http://blog.itpub.net/26736162/viewspace-1624453/

③ 若文章代码格式有错乱,推荐使用搜狗360或QQ浏览器,也可以下载pdf格式的文档来查看,pdf文档下载地址:http://blog.itpub.net/26736162/viewspace-1624453/,另外itpub格式显示有问题,可以去博客园地址阅读

④ 本篇BLOG中命令的输出部分需要特别关注的地方我都用灰色背景和粉红色字体来表示,比如下边的例子中,thread 1的最大归档日志号为33thread 2的最大归档日志号为43是需要特别关注的地方;而命令一般使用黄色背景和红色字体注;对代码或代码输出部分的注释一般采用蓝色字体表示

  List of Archived Logs in backup set 11

  Thrd Seq     Low SCN    Low Time            Next SCN   Next Time

  ---- ------- ---------- ------------------- ---------- ---------

  1    32      1621589    2015-05-29 11:09:52 1625242    2015-05-29 11:15:48

  1    33      1625242    2015-05-29 11:15:48 1625293    2015-05-29 11:15:58

  2    42      1613951    2015-05-29 10:41:18 1625245    2015-05-29 11:15:49

  2    43      1625245    2015-05-29 11:15:49 1625253    2015-05-29 11:15:53

 

[ZHLHRDB1:root]:/>lsvg -o

T_XDESK_APP1_vg

rootvg

[ZHLHRDB1:root]:/>

00:27:22 SQL> alter tablespace idxtbs read write;

 

====》2097152*512/1024/1024/1024=1G 

 

本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力。

 

 环境介绍

 

项目

source db

db 类型

RAC

db version

11.2.0.3.0

db 存储

ASM

OS版本及kernel版本

AIX 64位 7.1.0.0

 

 处理过程

一个同事过来说,表空间不够了,让我帮忙看看,好吧,首先看一下表空间的大小,SQL语句如下:

WITH wt1 AS

 (SELECT ts.TABLESPACE_NAME,

         df.all_bytes,

         decode(df.TYPE,

                'D',

                nvl(fs.FREESIZ, 0),

                'T',

                df.all_bytes - nvl(fs.FREESIZ, 0)) FREESIZ,

         df.MAXSIZ,

         ts.BLOCK_SIZE,

         ts.LOGGING,

         ts.FORCE_LOGGING,

         ts.CONTENTS,

         ts.EXTENT_MANAGEMENT,

         ts.SEGMENT_SPACE_MANAGEMENT,

         ts.RETENTION,

         ts.DEF_TAB_COMPRESSION,

         df.ts_df_count

  FROM   dba_tablespaces ts, 

         (SELECT 'D' TYPE,

                 TABLESPACE_NAME,

                 COUNT(*) ts_df_count,

                 SUM(BYTES) all_bytes,

                 SUM(decode(MAXBYTES, 0, BYTES, MAXBYTES)) MAXSIZ

          FROM   dba_data_files d

          GROUP  BY TABLESPACE_NAME

          UNION ALL 

          SELECT 'T',

                 TABLESPACE_NAME,

                 COUNT(*) ts_df_count,

                 SUM(BYTES) all_bytes,

                 SUM(decode(MAXBYTES, 0, BYTES, MAXBYTES)) 

          FROM   dba_temp_files d

          GROUP  BY TABLESPACE_NAME) df, 

         (SELECT TABLESPACE_NAME,

                 SUM(BYTES) FREESIZ

          FROM   dba_free_space

          GROUP  BY TABLESPACE_NAME

          UNION ALL

          SELECT tablespace_name,

                 SUM(d.BLOCK_SIZE * a.BLOCKS) bytes

          FROM   gv$sort_usage   a,

                 dba_tablespaces d

          WHERE  a.tablespace = d.tablespace_name

          GROUP  BY tablespace_name) fs

  WHERE  ts.TABLESPACE_NAME = df.TABLESPACE_NAME

  AND    ts.TABLESPACE_NAME = fs.TABLESPACE_NAME(+))

SELECT (SELECT A.TS#

        FROM   V$TABLESPACE A

        WHERE  A.NAME = UPPER(t.TABLESPACE_NAME)) TS#,

       t.TABLESPACE_NAME TS_Name,

       round(t.all_bytes / 1024 / 1024) ts_size_M,

       round(t.freesiz / 1024 / 1024) Free_Size_M,

       round((t.all_bytes - t.FREESIZ) / 1024 / 1024) Used_Size_M,

       round((t.all_bytes - t.FREESIZ) * 100 / t.all_bytes, 3) Used_per,

       round(MAXSIZ / 1024 / 1024/1024, 3) MAX_Size_g,

       round(decode(MAXSIZ, 0, to_number(NULL), (t.all_bytes - FREESIZ)) * 100 /

             MAXSIZ,

             3) USED_per_MAX,

       round(t.BLOCK_SIZE) BLOCK_SIZE,

       t.LOGGING,

       t.ts_df_count

FROM   wt1 t

UNION ALL

SELECT to_number('') TS#,

       'ALL TS:' TS_Name,

       round(SUM(t.all_bytes) / 1024 / 1024, 3) ts_size_M,

       round(SUM(t.freesiz) / 1024 / 1024) Free_Size_m,

       round(SUM(t.all_bytes - t.FREESIZ) / 1024 / 1024) Used_Size_M,

       round(SUM(t.all_bytes - t.FREESIZ) * 100 / SUM(t.all_bytes), 3) Used_per,

       round(SUM(MAXSIZ) / 1024 / 1024/1024) MAX_Size,

       to_number('') "USED,% of MAX Size",

       to_number('') BLOCK_SIZE,

       '' LOGGING,

       to_number('') ts_df_count

FROM   wt1 t

order by TS#

;

wps7D7D.tmp 

TPCCIND表空间占用了99%了,剩下378M,不够用了,好吧,看看系统还有剩余的空间没有:

wps7D7E.tmp 

这个截图的shell脚本如下,可以在AIX环境下查看磁盘的使用情况,作者曾花了接近2天的时间写的(主要是不熟悉AWK,汗颜,,,):

[ZFLHRADB1:root]:/>more disk*

if [ 1 = 1 ] ;then

  sum=0;asmnum=0

  awk  'BEGIN {printf "------------------------------------------------------------------------------------------------------------------------------\n"; printf "%-43s %-18s %-14s %-8s %-15s %-14s\n","|                 disk              ","|        PVID      ","|  no_reserve ","| size(G)","|    disktype     ","|  disk_storage  |"; printf "------------------------------------------------------------------------------------------------------------------------------\n";}'

  for diskname in `lspv | grep disk | awk '{print $1}'`;do

    mydiskname=`ls -l /dev/rdiskname|grep?w/dev/rdiskname|grep?w/dev/rdiskname| cut -c 1-12,17-38,59-76`

    mydiskpvid=`lquerypv -H /dev/$diskname | cut -c 1-16`

    if  [ "${mydiskpvid}" = "" ];then mydiskpvid="0000000000000000" ;  fi 2>/dev/null

    mydiskreserve=`lsattr -El $diskname | grep -i reserve_policy | cut -c 17-30`

    mydisksize=`bootinfo -s diskname2>/dev/null‘;let"mydisksize1=diskname2>/dev/null‘;let"mydisksize1=mydisksize/1024" 2>/dev/null

    mydiskvg=`lspv | grep -w diskname | awk '{print3}'`

    mydiskasmgroup=`lquerypv -h /dev/rdiskname|head -n 7|tail -n 1|awk -F ' ' '{printNF}'|sed -e 's/\.//g' -e 's/\|//g' | awk '{ if (1!="")printf"+"1!="")printf"+"1 ; else print "NULL"}'`

    mydiskflag=`lquerypv -h /dev/r$diskname 2>/dev/null|grep -i orcldisk|wc -l`

    if  [ mydisksize?lt1000];thenmydisktype="HeadDisk";elif[mydisksize?lt1000];thenmydisktype="HeadDisk";elif[{mydisksize} -gt 1000 -a mydiskflag?gt0];thenmydisktype="ASM:"mydiskflag?gt0];thenmydisktype="ASM:"mydiskasmgroup; elif  [ mydisksize?gt1000?amydisksize?gt1000?a{mydiskflag} -eq 0 -a mydiskvg!="None"];thenmydisktype=mydiskvg!="None"];thenmydisktype=mydiskvg ; else  mydisktype="Not_Used"; fi 2>/dev/null

    mydiskpath=`lspath -l diskname2>/dev/null|head?1|awk′print$NF′|sed"s/.diskname2>/dev/null|head?1|awk′print$NF′|sed"s/.//"`

    mydiskstring=`odmget -q attribute="unique_id" CuAt|egrep "name|value"|paste - -|tr  '\t' ' '|grep -w ${diskname}|sed 's/\"//g'`

    mydiskstorage=`echo {mydiskstring} 2> /dev/null|awk '{ if(NF ~ /EMC/) {print "EMC"} else if (NF /NETAPP/)print"NETAPP"elseif(NF /NETAPP/)print"NETAPP"elseif(NF ~ /HITACHI/) {print "HDS"}}'`

    mydiskdepth=`lsattr -El {diskname}|grep queue_depth|awk '{print2}'`

    mydiskstorage1=mydiskstorage","mydiskstorage","mydiskpath","$mydiskdepth

    [ mydisksize1?gt1?amydisksize1?gt1?a{mydiskflag} -gt 0 ] && { (( sum=sum+mydisksize1));((asmnum=mydisksize1));((asmnum=asmnum+1 )) ;}

    echo  "mydiskname""mydiskname""mydiskpvid"  "mydiskreserve""mydiskreserve""{mydisksize1%.*}"  "mydisktype""mydisktype""mydiskstorage1" | awk '{printf "| %-10s %-6s %-8s %-14s | %-17s | %-12s | %-8s|  %-15s | %-14s |\n",1,1,2,3,3,4,5,5,6,7,7,8,$9}'

  done   

  awk  'BEGIN {printf "------------------------------------------------------------------------------------------------------------------------------\n";}'

  echo  "ASMDISK_TOTAL:asmnum""TOTALSIZE(GB):asmnum""TOTALSIZE(GB):sum" |awk '{printf "| %-20s %-101s |\n", 1,1,2}'

  awk  'BEGIN {printf "------------------------------------------------------------------------------------------------------------------------------\n";}'

fi

if [ 1 = 1 ] ;then 
  sum=0;asmnum=0 
  awk  'BEGIN {printf "------------------------------------------------------------------------------------------------------------------------------\n"; printf "%-43s %-18s %-14s %-8s %-15s %-14s\n","|                 disk              ","|        PVID      ","|  no_reserve ","| size(G)","|    disktype     ","|  disk_storage  |"; printf "------------------------------------------------------------------------------------------------------------------------------\n";}' 
  for diskname in `lspv | grep disk | awk '{print 1}'`;do           mydiskname=`ls -l /dev/rdiskname |grep -w /dev/rdiskname|cut?c1?12,17?38,59?76‘mydiskpvid=‘lquerypv?H/dev/diskname|cut?c1?12,17?38,59?76‘mydiskpvid=‘lquerypv?H/dev/diskname | cut -c 1-16` 
    if  [ "mydiskpvid"=""];thenmydiskpvid="0000000000000000";fi2>/dev/nullmydiskreserve=‘lsattr?Elmydiskpvid"=""];thenmydiskpvid="0000000000000000";fi2>/dev/nullmydiskreserve=‘lsattr?Eldiskname | grep -i reserve_policy | cut -c 17-30` 
    mydisksize=`bootinfo -s diskname2>/dev/null‘;let"mydisksize1=diskname2>/dev/null‘;let"mydisksize1=mydisksize/1024" 2>/dev/null 
    mydiskvg=`lspv | grep -w diskname|awk′print$3′‘mydiskasmgroup=‘lquerypv?h/dev/rdiskname|awk′print$3′‘mydiskasmgroup=‘lquerypv?h/dev/rdiskname|head -n 7|tail -n 1|awk -F ' ' '{print NF}'|sed -e 's/\.//g' -e 's/\|//g' | awk '{ if ($1 != "") printf "+"$1 ; else print "NULL"}'`           mydiskflag=`lquerypv -h /dev/rdiskname 2>/dev/null|grep -i orcldisk|wc -l` 
    if  [ mydisksize?lt1000];thenmydisktype="HeadDisk";elif[mydisksize?lt1000];thenmydisktype="HeadDisk";elif[{mydisksize} -gt 1000 -a mydiskflag?gt0];thenmydisktype="ASM:"mydiskflag?gt0];thenmydisktype="ASM:"mydiskasmgroup; elif  [ mydisksize?gt1000?amydisksize?gt1000?a{mydiskflag} -eq 0 -a mydiskvg!="None"];thenmydisktype=mydiskvg!="None"];thenmydisktype=mydiskvg ; else  mydisktype="Not_Used"; fi 2>/dev/null 
    mydiskpath=`lspath -l diskname2>/dev/null|head?1|awk′print$NF′|sed"s/.diskname2>/dev/null|head?1|awk′print$NF′|sed"s/.//"` 
    mydiskstring=`odmget -q attribute="unique_id" CuAt|egrep "name|value"|paste - -|tr  '\t' ' '|grep -w diskname|sed′s/\"//g′‘mydiskstorage=‘echodiskname|sed′s/\"//g′‘mydiskstorage=‘echo{mydiskstring} 2> /dev/null|awk '{ if(NF /EMC/)print"EMC"elseif(NF /EMC/)print"EMC"elseif(NF ~ /NETAPP/) {print "NETAPP"} else if(NF ~ /HITACHI/) {print "HDS"}}'`           mydiskdepth=`lsattr -El{diskname}|grep queue_depth|awk '{print 2}'`           mydiskstorage1=mydiskstorage","mydiskpath","mydiskpath","mydiskdepth 
    [ mydisksize1?gt1?amydisksize1?gt1?a{mydiskflag} -gt 0 ] && { (( sum=sum+mydisksize1));((asmnum=mydisksize1));((asmnum=asmnum+1 )) ;} 
    echo  "mydiskname""mydiskname""mydiskpvid"  "mydiskreserve""mydiskreserve""{mydisksize1%.*}"  "mydisktype""mydisktype""mydiskstorage1" | awk '{printf "| %-10s %-6s %-8s %-14s | %-17s | %-12s | %-8s|  %-15s | %-14s |\n",1,1,2,3,3,4,5,5,6,7,7,8,9}'         done       awk  'BEGIN {printf "------------------------------------------------------------------------------------------------------------------------------\n";}'         echo  "ASMDISK_TOTAL:asmnum" "TOTAL_SIZE(GB):sum" |awk '{printf "| %-20s %-101s |\n",1,$2}' 
  awk  'BEGIN {printf "------------------------------------------------------------------------------------------------------------------------------\n";}' 
fi

 

从截图可以看出分配给数据库的一共8块磁盘,看看数据库中有多少:

SELECT * FROM v$asm_disk;

wps7D7F.tmp 

看了8块磁盘分配完了,而系统剩余空间还有769M

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
等待事件系列(1)--User I/O类型(上) 全文可参考: http://www.cnblogs.com/lhrbest/articles/5835420.html   1    BLOG 文档结构图     2    前言部分   2.1    导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识, ~O(∩_∩)O~ : ①  等待事件系列(1)--User I/O类型     Tips: ① 本文在 ITpub ( http://blog.itpu
等待事件系列(1) --User I/O 类型(下) 全文可参考: http://www.cnblogs.com/lhrbest/articles/5835420.html   1    BLOG 文档结构图   6.3      d b file parallel read SELECT   * FROM    v$event_name WHERE    NAME   IN   ( 'db file parallel read' );   在 V$SESSION_WAIT这个视图里面,这个等待事件有三个

mysql存储过程小试牛刀 - 2016-09-03 14:09:13

(1). 格式 MySQL 存储过程创建的格式: CREATE PROCEDURE 过程名 ([ 过程参数 [,...]]) [ 特性 ...] 过程体 这里先举个例子: mysql DELIMITER //   mysql CREATE PROCEDURE proc1(OUT s int)     - BEGIN      - SELECT COUNT(*) INTO s FROM user;       - END      - //   mysql DELIMITER ;    注: ( 1 )这里
【故障处理】队列等待之 enq: TX - row lock contention 1    BLOG 文档结构图   2    前言部分 2.1    导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识, ~O(∩_∩)O~ : ① enq: TX - row lock contention 等待事件的解决 ② 一般等待事件的解决办法 ③ 队列等待的基本知识 ④  ADDM 的使用 ⑤ 如何获取历史执行计划 ⑥ 查询绑定变量的具体值 ⑦ 很多有用的查询性
       ORA-01408:such column list already indexed问题的原因是当新建一个索引时,索引对应的字段和字段顺序和已经存在的索引相同。        最近一个需求,是将主键索引转成HASH分区的主键索引,需要新建一个索引,然后将现有的主键索引去掉。如果直接新建一个字段相同且字段顺序相同的索引,就会报ORA-01408。当然,可以将现有的主键索引先删掉,但这样在新索引建立之前,无法保证数据的唯一性,并且按主键的更新删除操作会因为无索引而变的很慢。        我们可
继续上次分析的一个问题,一个简单的SQL语句执行计划有些奇怪,明明可以走唯一性索引但是却走了另外一个索引。 当然了,最后逐步定位,发现是在直方图的地方有一些差别。取消直方图之后,执行计划立刻恢复了正常。 当然问题来了,这个是为什么呢,收集统计信息中的auto选项是什么含义呢。为什么两个数据类型一样的(varchar2(64))的列,境遇却大大不同。 我们来看看一些统计信息的数据。 为了跟进一步验证数据的分布律和选取代价,我们查询它的直方图信息。 SQL   select to_char(endpoint_v
首先说明_fairness_threshold参数仅在RAC环境下才有意义,让我对这个参数引起关注是在某一次查询v$cr_block_server时,发现该视图有一个名为FAIRNESS_DOWN_CONVERTS的字段,官方文档里将其解释为:Number of times an instance receiving a request has down-converted an X lock on a block because it was not modifying the block 该参数相关性
    今天看到有一个网友提了一个问题,描述很简短     测试DG时,主库不能宕机,如何测试failover?     其实这个需求从业务层面来说是合理的,一个数据量很大的核心数据库,如果需要做灾难演练,就希望在备库上做一下演练工作,而这个演练其实又不想影响到目前的主库,而且又希望能够尽可能模拟真实的情况,我想这样对于运维部门来说是最具有考核力度,而对于开发业务部门来说是最受欢迎的,因为他们什么都不需要改动。 而从技术角度来看,似乎有一些地方需要考量,如果备库Failover为主库,那么这个主库肯定是可以

简单分析percona-zabbix-templates - 2016-09-01 04:09:15

    当Zabbix和Percona两者相遇,会擦出不少的开源火花来,众人拾柴火焰高,最终受益的还是大部分运维人员。     我很早就用过Percona提供的MySQL监控模板,但是却没有刨根问底,只是简单使用而已,自从定制了Orabbix之后,我还是信心满满,MySQL的数据字典相对要少很多,监控起来可能想必Oracle要少很多,不过关于Percona的这个插件,我还是带着好奇之心,内部是否有很多独门秘籍,我想好好学学那些监控项对应的SQL,好好弥补我对于MySQL监控的一些空缺,所以简单分析这个模板就
问题描述 : 近期的 rman 备份中,归档日志的备份没有被删除, rman 的脚本和策略都没变过,归档的备份一直保留,每过一段时间就要物理删除备份,很是奇怪。 rman的 configure 如下 RMAN show all; RMAN configuration parameters for database withdb_unique_name HUBSRAC are: CONFIGURE RETENTION POLICY TO REDUNDANCY 2; CONFIGURE BACKUP OPTI