一个简单的bigfile tablespace无法扩展的案例处理

最近帮助开发的同学处理了一个简单的问题,想通过这个问题来反思一下。
    在一天下午的时候,开发的同事突然找到我说,有一个开发的数据库貌似有些表空间的问题,尽管这个数据库是划分在他们名下,但是对于数据库的操作他们还是没底,想让我帮忙看看,当然对于这类问题,我都脑海里闪现一两分钟搞定问题的成就感了。刚好下午有些事情,就叫了另外一个新同事去练练手,但是过了一会儿,新同事给我打来了电话,说现在好像有些问题,目前他们的库使用的是bigfile tablespace,对于这类表空间,添加数据文件是不行的,然后他尝试了resize竟然也不成功。我脑海里搜索关于bigfile的内容,没有搜索到相关的太多信息,实际工作中这个特性真只是一个特性而已,实践意义应该不大,难得开发的同学这么时髦,竟然用了这个特性。
   于是我叫新同事去看看是不是哪里的操作不对,如果实在不行,看看操作系统级是不是没有空间了,他反馈说开发的同学目前还没有权限登录操作系统,他们目前使用的是客户端工具连接。对于这类问题,看起来情况似乎已经非常明显了,但是好像又好像探不到底。于是我建议他,这类空间的,如果实在resize不了,可以再新建一个表空间,把用户的默认表空间改到这个新的表空间应该就可以了。新同事忙活了一会,看起来还是没有起色。在忙完手头的工作之后,我就到开发的同学那里去看看真伪。
    到了现场之后,发现这位同事已经尝试了不少的方法。简单了解了问题的前因后果,发现这确实是一个使用了bigfile tablespace的库,数据文件目前已经有50G,开发的同学在调用一个存储过程的时候会抛出空间不足的ORA错误。而且新同事已经创建了一个新的表空间,目前先分配了50M的空间,但是执行这个存储过程还是报错。
为了排除各种影响,我们就一个一个来分析。首先是这个bigfile tablespace的问题,既然抛出了空间不足的错误,怎么使用resize的时候会有问题呢,这类表空间里面只对应一个数据文件,文件可以无限膨胀,达到TB级别都是很容易支持的。对于一个只有50G的数据文件而言,是在是太小儿科了。而同事在同一个目录下面创建了一个表空间,足以说明这个目录下面还是有空间的。所以这个现象就比较奇怪,我再次确认,他使用的命令情况,他是使用resize尝试把数据文件调到100G,50G到100G里面还是有太多的变数,于是我就保守了一下,调到了60G,稍等一会之后,从客户端看命令就执行成功了。从这一点来看,就可以反推出来,这个问题应该不是bug导致,而是由于操作系统的空间剩余在50G以内,导致resize 为100G的时候出错。首先这个问题确认了,问题就解决了一大半,开发同学再次尝试这个存储过程,发现就没有任何错误了,可见问题的解决已经告一段落,那么我们来解释另外几个问题。
   问题1:对于bigfile tablespace的表空间,默认都是开启了自动扩展的,为什么这个表空间到了50G就出问题了呢?
   问题2:另外一个问题是对于新增的表空间,为什么运行存储过程依旧报错。
   问题3:最后一个问题是这个问题后续改怎么改进。
对于第一个问题,自己也着实有些纠结,不过查看一些信息就会明白了。首先表空间CYTJ是一个bigfile tablespace,其它的表空间都是smallfile tablespace.
SQL> select tablespace_name,next_extent,bigfile from dba_tablespaces;
TABLESPACE_NAME                NEXT_EXTENT BIG
------------------------------ ----------- ---
CYTJ_DATA                                  YES
TEMP_DATA                          1048576 NO
CYTJ_DATA01                                NO
对于这个表空间而言,可以通过查看数据文件的数据字典来查看maxsize了。可以看到目前是61440M。可见这个表空间在创建开始就是指定了50G的maxsize.
SQL>select tablespace_name,file_name,bytes/1024/1024 size_MB,bytes/1024/1024 max_size_MB from dba_data_files
TABLESPACE_NAME      FILE_NAME                                             SIZE_MB MAX_SIZE_MB
-------------------- -------------------------------------------------- ---------- -----------
USERS                /U01/app/oracle/oradata/cytj/users01.dbf                    5           5
CYTJ_DATA            /home/oracle/tablespace/cytj_data.dbf                   61440       61440
CYTJ_DATA01          /home/oracle/tablespace/cytj_data01.dbf                    50          50
当然要看到更多的信息,还是登陆到数据库端去查看日志了,然后让开发同事继续协调,他们连进了操作系统,使用df -h一下子就可以看出来确实是文件系统的空间不足,目前只剩下5G左右的空间了,而从数据库日志里面,可以赫然发现,这个表空间在很早的时候就创建了。
create bigfile tablespace cytj_data
logging
datafile '/home/oracle/tablespace/cytj_data.dbf'
size 10G
autoextend on
next 200m maxsize 50G
extent management local
Wed Nov 26 11:45:15 2014
Completed: create bigfile tablespace cytj_data
有了这些一切都明了了。
对于问题2:
为什么新增了表空间之后,运行存储过程依旧报错,这个经过排查发现,同事对里面的用户都指定了新的表空间为more表空间,唯独漏了当前用户,这个也算是操作不够谨慎,所以给开发的同事简单创建一个表验证一下,就很清晰了。
第3个问题。这个问题后续的改进。
可以从数据库日志看出。这个问题其实已经发生很久了。
但是直到最近才被开发的同学重视起来,可能有一些功能缺失需要,产生了很大的影响,所以才被重视了起来,如果细细扒开来看,这个问题发生了已经快半年了。
Thu Mar 03 15:43:34 2016
ORA-1653: unable to extend table REPORTS.CLIENTSTATDATA_REAL by 128 in                 tablespace CYTJ_DATA
ORA-1653: unable to extend table REPORTS.CLIENTSTATDATA_REAL by 1024 in                 tablespace CYTJ_DATA
但是明白了问题之后,发现其实都是很简单,从目前他们使用数据的情况来看短期内不会出现问题,但是从长远考虑,目前的硬盘配置有些低了,只剩余5G的空间是有些捉襟见肘了。需要进一步扩容。当然更多的数据库相关的工作我还是乐于支持的。从这个看起来非常不经意的案例中,我们发现很多问题其实早就产生在了萌芽之中,如果不重视,就会逐步扩大影响,如果在这个期间出现了严重的问题,那就很可能是不可恢复的灾难,从这也可以窥探出如果管理不够专业和规范,很容易出现各种奇怪的问题,问题要扼杀在摇篮之中。

时间: 2024-11-01 04:56:49

一个简单的bigfile tablespace无法扩展的案例处理的相关文章

《扩展 jQuery》——2.2 一个简单的插件

2.2 一个简单的插件 jQuery插件简直可以做任何事情,大量的第三方插件就可以证明这一点.从影响单个元素的简单插件,到改变多个元素的外观和行为的复杂插件,比如验证插件,应有尽有. 最为常用的一类jQuery插件是集合插件,它被用来为使用选择器或者遍历DOM得到的一组元素添加功能.开发者可以创建一个水印插件作为这种类型的插件的一个简单示例,它在必要时为字段内部提供一个标签.这会让开发者对如何构建一个插件有一定的感知. 2.2.1 占位文字 为了节省表单所占用的空间,有时开发者会省略字段的标签,

C/C++中一个简单的enum手法(idiom)

今天写程序的时候,又用到这个idiom了,于是顺便贴出来.这个idiom蛮简单的,估计很 多人都用过.今天主要是贴出来给新手参考(老手们就甭费时看此帖了). 为了说明这个手法具体该咋用,咱举一个简单的例子来说事儿.比方说要开发一个网络程 序,其中需要统计各种网络协议的数据包数量. ★版本1 假设一开始只需要处理HTTP和FTP两种协议.有些同学不假思索,立即会声明如下两个整 数用于统计: int nCntHttp = 0; int nCntFtp = 0; 猛一看,似乎没啥问题.但是,如果需求发

一个简单的 CORBA/java 示例

示例 6 月份,我们谈过您为什么要使用 CORBA 和 Java 技术.本月,我要通过一个可用的简单示例,让您开始探索 CORBA 技术的许多领域.不过,别忘了我们的目标是,创建这样一种分布式应用程序:使驻留在一台计算机上的客户机能向运行于另一台计算机上的服务发出请求.我们不想为诸如硬件或操作系统软件等细节问题操心,而只是想让这种服务能响应客户机的请求. IDL 接口 全部 CORBA 结构是从一个接口开始的,理解接口的最佳方法就是想像我的汽车,对,我的汽车.虽然您不熟悉它,但如果我对您说:"开

创建一个简单的 Compute Grid 并行批处理应用程序

简介 批处理是业务系统的一个重要方面,它用在帐单系统或报告生成,以及一天 结束时的结算系统等领域中.随着业务系统在全球被夜以继日的使用,批处理窗口变得越来 越窄,这使高效的批处理系统成为一种切实的需求.WebSphere Extended Deployment Compute Grid(下文简称 Compute Grid)是一个完整的.开箱即用的批处理平台,提供了一 个高效.可靠.可扩展.高度可用和安全的批执行环境. 本文基于 WebSphere Compute Grid V8.我们使用 Rat

ASP.NET MVC Framework体验(1):从一个简单实例开始

概述 12月10日微软发布了ASP.NET 3.5扩展的预览版,在其中包括了ASP.NET MVC Framework.ASP.NET AJAX改进.ASP.NET动态数据支持.ASP.NET SIlverlight支持.以及 ADO.NET Data Services等.我也在第一时间下载下来进行了安装,体验了一下微软的 ASP.NET MVC Framework. 提起MVC,相信大家都不陌生了,这里简单的提两句,将 一个应用的实现分成三部分:模型(Model).视图(View).控制器(C

构建一个简单的CaaS系统_docker

在CaaS系统出现前企业应用架构基本被IaaS/SaaS/PaaS等模式垄断,直到Docker的出现为我们打开了另一个扇大门,废话不说了,我们直奔主题. 我们先了解下一个简单的CaaS系统是如何为用户提供服务的: 企业用户上传它的应用代码或其他代码托管方式,我们生成用户应用的镜像,或者用户直接上传镜像,或者用户直接使用我们提供的基础服务镜像 用户部署他的镜像应用,启动它的镜像容器 用户访问他的应用服务 OK,需求确定了,该搬砖了. 用户镜像制作 既然是一个简单的CaaS系统,我们就不让用户上传代

WCF后续之旅(13): 创建一个简单的WCF SOAP Message拦截、转发工具[上篇]

WCF是.NET平台下实现SOA的一种手段,SOA的一个重要的特征就基于Message的通信方式.从Messaging的角度讲,WCF可以看成是对Message进行发送.传递.接收.基础的工具.对于一个消息交换的过程,很多人只会关注message的最初的发送端和最终的接收端.实际上在很多情况下,在两者之间还存在很多的中间结点(Intermediary),这些中间结点在可能在实际的应用中发挥中重要的作用.比如,我们可以创建路由器(Router)进行消息的转发,甚至是Load Balance:可以创

WCF后续之旅(13):创建一个简单的SOAP Message拦截、转发工具[下篇]

在Part I 中,我们创建了一个InterceptService,并且通过一个特殊的EndpointBehavior,ClientViaBehavior实现了message的拦截.转发功能.在本节中,我们将讨论另外一种不同的实现方式.如何说ClientViaBehavior是基于Client端的实现方式,那么我们今天讨论的是基于Service的实现方式. 在对新的实现方式展开介绍之前,我们先来介绍一下关于逻辑地址和物理地址. 一.逻辑地址和物理地址 我们知道,WCF通过Endpoint进行通信

对象-请问各位,我这样理解访问者模式正确吗,一个简单的例子

问题描述 请问各位,我这样理解访问者模式正确吗,一个简单的例子 package test; public class Client{ //数据对象二 顾客 public static void main(String[] args) { //当顾客进饭店吃饭,他不会直接跟厨师打交道, //1.饭店主要是炒菜,这时,厨师会炒很多菜 但是不知道炒哪个菜, 厨房与顾客 不具备炒菜的功能, //所以炒菜可以是厨师的功能,但是需要一个中间人来告诉厨师炒什么菜,那么我们就定义一个菜单,相当于访问者,访问厨师