• 辞旧迎新:2018年的分区你们建了吗?


    0?wx_fmt=gif&wxfrom=5&wx_lazy=1

    2018年的分区你们建了吗?2018年的年表月表你们建了吗?要还没有,要抓紧啦!

    0?wx_fmt=jpeg

    各位同学,大家好!

    转眼2017年就要结束了,在这过去的一年,我们有遇到困难解决不了的苦恼,亦有处理了棘手问题的快乐,还有在云和恩墨大讲堂里得到云和恩墨舵主以及群友帮助的感激。

    在这里,我们有收获,有成长,2018年就要来了,下面分享一下我们云和恩墨DBA同学在新年到来之前,最最重要的工作,供大家参考!

    那什么工作是最最重要的呢?年底和新年活动保障?月结保障?no, no, no, 这些当然重要,但这不是最最重要的,如果出现性能问题,大部分时候是系统慢一点,是的不会出错。

    最最重要的是,要[red]提前帮用户检查2018年的分区,或年表月表,是否创建[/red]。

    这为什么重要?

    • 因为如果没有采用分区表,采用年表月表的形式,如果2018年的表不存在,相关数据操作会立刻报错!0?wx_fmt=gif

    • 而如果情况是2018年的分区没有创建,那么假如在11g以上的环境中,使用了interval分区技术,那么也不用过度担心。但如果没有采用interval分区,那么当2018年数据插入的时候,也会立刻报错!0?wx_fmt=gif

    那么,我们如何帮用户检查呢?

    检查步骤

    1、首先确定要检查哪些用户下的表

    在一些生产环境上,会存一些做测试的用户,这些用户下的对象,我们其实并不需要关注。

    所以,我们需要先确定要排查的用户是谁。

    2、检查分区表


    一般分区表命名都是规范的,可以从分区命名上来判断:

    例如,分区名为  表名_YYYYMM

    with a as (select table_owner, table_name, partition_name from dba_tab_partitions where table_owner in [red](....)[/red] and substr(partition_name, -6) like '2017__') 

    b as (select table_owner, table_name, partition_name from dba_tab_partitions where table_owner in [red](....)[/red] and substr(partition_name, -6) like '2018__')

    select a.table_owner, a.table_name, min(a.partition_name) min_pname ,max(a.partition_name) max_pname from a left join b 

    on a.table_owner=b.table_owner and a.table_name=b.table_name and a.partition_name=replace(b.partition_name,'2018','2017') where b.table_name is null

    group by a.table_owner, a.table_name;


    上面这个SQL会将指定用户下的表的分区做比对,并会给出缺失的月份里,最小和最大的对应的2017年的月份。

    如下为示例,在Scott用户下有两个测试表,PA和PB,他们的分区情况如图

    0?wx_fmt=png

    用上述SQL查出的结果如图:

    0?wx_fmt=png

    对于有些应用来说,分区名上只有月份,没有年份,这种情况一般是循环使用的分区,只要12个分区都存在,就不会有问题。

    3、检查2018年的年表、月表是否已创建

    如果没有使用分区表,而是使用了年表或月表,则如果命名是很规范的,那么判断思路是一样的,所不同的只是将查询的视图和SQL换了一下

    同样,我们假定命名格式为:基表名_YYYYMM

    with a as (select owner, table_name from dba_tables where owner in [red](....)[/red] and substr(table_name, -6) like '2017__')

    ,b as (select owner, table_name from dba_tables where owner in [red](....)[/red] and substr(table_name, -6) like '2018__')

    select a.owner, substr(a.table_name,1,length(a.table_name)-6) base_tname, min(a.table_name) min_tname ,max(a.table_name) max_tname from a left join b 

    on a.owner=b.owner and a.table_name=replace(b.table_name,'2018','2017')

    where b.table_name is null

    group by a.owner, substr(a.table_name,1,length(a.table_name)-6) ;


    如下为示例,在Scott用户下有9个测试用的月表,他们的命名情况如图

    0?wx_fmt=png

    用上述SQL查出的结果如图:

    0?wx_fmt=png

    由上可见,SQL并不会关心表命名的中间是否有缺漏月份。但通常情况不会出现上面这样,有1/5/6三个月份却没有其他月份,这里只是测试数据,目的也是为了加深大家对此SQL查询结果的理解(对分区表也如是)。


    年表的情况类似,就不赘述了。

    结语


    看到这里,大家赶紧去检查下自己的库吧!

    这时候你会不会想到,会写SQL的DBA是多么的幸福,自己动动手就能搞定一些需要DIY的问题呢?

    如果你碰到的情况是,分区表命名不规范又不是interval分区,那么就会比较麻烦啦,因为分区值存放是long类型的,这个数据类型Oracle已经不建议使用了,处理起来比较麻烦……在这迎接新年的大好时光,我们就不烧脑啦!希望你不要碰到这种情况 :)

    再次祝愿大家新年快乐!

    年度经典文章回顾:

    盘点2017最受欢迎的原创文章

    超越-2017上半年精华文章

    资源下载

    关注公众号:数据和云(OraNews)回复关键字获取

    ‘2017DTC’,2017DTC大会PPT

    ‘DBALIFE’,“DBA的一天”海报

    ‘RACV1’,RAC系列经典视频课程

    ‘INTERNALS’,Oracle RAC PPT

    ‘122ARCH’,Oracle 12.2体系结构图

    ‘2017OOW’,Oracle OpenWorld资料

    ‘PRELECTION’,大讲堂讲师课程资料

    640?wx_fmt=png

  • 相关阅读:
    C#简单操作XML文件的增、删、改、查
    一个感觉还算可以的验证码生成程序
    安装aclocal1报错问题
    php中soap 的使用实例无需手写WSDL文件,提供自动生成WSDL文件类
    ofstream和ifstream详细用法[转]
    [原]C++ Soap客户端实例
    PHP中文件读、写、删的操作
    C++ Boost Thread 编程指南
    (转)虚函数和纯虚函数区别
    strcpy和memcpy的区别
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13312471.html
Copyright © 2020-2023  润新知