m6米乐安卓版下载-米乐app官网下载
暂无图片
12

oracle 11g rac集群诡异的表空间不足 -m6米乐安卓版下载

977

有一套oracle 11gr2数据库集群,表空间大概是400g,每次都是表空间使用到47%左右报错,

ora-12801: error signaled in parallel query server p003, instance : (1)
ora-01658: unable to create initial extent for segment in tablespace xxxx,

非常奇怪,首先是权限肯定没有问题,

alter user username quota unlimited on tablespace1 ;
grant dba to username ;

只能是扩容解决,但这样非常浪费空间,而且没法触发报警,已知开发那边用的是sqlloader工具,还有什么需要关注的吗?

报警信息:

ora-1653: unable to extend table ****** by 8192 in tablespace ******
ora-1691: unable to extend lobsegment ****** by 1024 in tablespace ******
ora-1653: unable to extend table ****** by 128 in tablespace ******

可以看到的是,日志表、lob表、临时表都有涉及其中

经总结可能性有以下几种

1、无效索引占用空间,导致空间浪费,建议删除重建失效索引 

2、用户权限被收回

3、分区表,建议设置隐藏参数 _partition_large_extents参数为false.

4、检查v$asm_disk视图,单个磁盘free_mb过小

5、回收站空间占用的空间清理不及时

6、表空间碎片严重,可以使用shrnk、move、数据泵等方式清理,建议表空间使用统一的extents


1、无效索引

检查无效索引

select owner,
       index_name,
       table_name,
       status
  from dba_indexes
where owner='用户名' and
status = 'unusable';

重建无效索引

alter index student_n1 rebuild online parallel 8;

但我的问题表空间没有无效索引的存在

2、用户权限

查看使用这个表空间的用户

select username,account_status,default_tablespace,temporary_tablespace from dba_users where default_tablespace ='表空间';

查看这个用户权限

select * from dba_sys_privs where grantee ='用户名';   	grantee	             privilege	         admin_option
	用户名           unlimited tablespace        no
select * from dba_role_privs where grantee ='用户名';   	grantee	granted_role	admin_option	default_role
1	用户名     dba	              no	yes
2	用户名     connect	      no	yes
3	用户名     resource	      no	yes

用户权限正常

3、分区表

查询用户是否有分区表

select table_owner,table_name,partition_name from dba_tab_partitions where table_owner='用户名';

oracle 11g有个新特性,在oracle11.2创建分区表,每个分区默认大小为8m,是由_partition_large_extents参数控制,可以算是11.2.0.2开始的一个新特性,为了减少extent数量,提高分区表性能,而设置的一个参数,默认为true,即分区表的每个extent为8m,和oracle10g相比,会导致同样的数据耗费更多的表空间。

alter system set "_partition_large_extents"=false scope=both sid='*';

如果有的话,可以这样关闭这个参数分配

4、磁盘bug

检查下v$asm_disk视图,特定情况下会出现单个磁盘free_mb过小的情况,asm没有触发rebalance特性,手动reblance下问题解决

sql> select os_mb/1024,total_mb/1024,free_mb/1024,name from v$asm_disk where name like 'data%';
os_mb/1024 total_mb/1024 free_mb/1024 name
---------- ------------- ------------ ------------------------------
      1800        1800   781.585938 data_0002
       100         100   43.4150391 data_0000
       100         100   43.4169922 data_0001
select name,state,type,free_mb/1024,total_mb/1024,usable_file_mb/1024 from v$asm_diskgroup;
name                   state       type   free_mb/1024 total_mb/1024 usable_file_mb/1024
------------------------------ ----------- ------ ------------ ------------- -------------------
data                   connected   extern   837.416016        2000          837.416016
fra                    connected   extern   162.623047         200          162.623047
ocr                    mounted     normal   14.0957031          15          4.54785156
redo                   connected   extern   14.2939453          20          14.2939453

也可以将过小的磁盘剔除

5、回收站垃圾

5.1查看回收站是否开启

sql> show parameter recyclebin
name                     type     value
------------------  ----------- ------------------------------
recyclebin              string     off

5.2清理回收站

sql> purge dba_recyclebin;
dba recyclebin purged.

6、检查涉及表的自动扩展大小

select u.table_name,  dbms_metadata.get_ddl('table',  u.table_name) table_ddl
  from user_tables u
where table_name in ('表名')

 其中颜色较重的字体的的意思每次申请空间为1m(单位是 bytes)

pctincrease 0 freelists 1 freelist groups 1
  buffer_pool default flash_cache default cell_flash_cache default)
  tablespace "表空间"  enable
   ) segment creation immediate 
  pctfree 10 pctused 40 initrans 1 maxtrans 255 
 nocompress logging
  storage(initial 65536 next 1048576 minextents 1 maxextents 2147483645
  pctincrease 0 freelists 1 freelist groups 1
  buffer_pool default flash_cache default cell_flash_cache default)
  tablespace "表空间"

也没有类似于分区表很夸张的地步

7、表碎片

检查问题表空间的 fsfi 的值是否小于30%,如果小于30%就需要收集表空间

select a.tablespace_name,
       round(sqrt(max(a.blocks) / sum(a.blocks)) * (100 / sqrt(sqrt(count(a.blocks)))),2) "fsfi(碎片率)"
  from dba_free_space  a,
       dba_tablespaces b
where a.tablespace_name = b.tablespace_name
   and b.contents not in ('temporary',
                          'undo')
group by a.tablespace_name
order by 2;

检查数据文件是否还有剩余大于1m的区,主要看 bytes 这列

select file_id,bytes/1024/1024,count(1) from dba_free_space where tablespace_name='cwdata1' group by file_id,bytes/1024/1024 order by 3 asc;

检查问题表空间里的表的碎片率,可以稍微调整下,这条语句总的来说就是要找使用空间最大里实际大小最小的表,就可以收缩了

select table_name,
       round((blocks * 8192 / 1024 / 1024),2) "使用大小m",
       round((num_rows * avg_row_len / 1024 / 1024 / 0.9),2) "实际大小m",
       round((num_rows * avg_row_len / 1024 / 1024 / 0.9) / (blocks * 8192 / 1024 / 1024),3) * 100 || '%' "实际使用率%"
  from user_tables
where blocks > 100
and tablespace_name='表空间'
   and (num_rows * avg_row_len / 1024 / 1024 / 0.9) /
       (blocks * 8192 / 1024 / 1024) < 0.3
order by 2 desc;

多嘴说两句

blocks         the number of used blocks in the table              表中已使用的块的数量
num_rows       the number of rows in the table                     表中的行数
avg_row_len    the average row length, including row overhead      平均行长度,包括行开销
(blocks * 8192 / 1024 / 1024)  = 块数量 * 块大小(bytes) / 1024(kb)/ 1024(mb)= 使用大小
(num_rows * avg_row_len / 1024 / 1024 / 0.9) = 行数 * 平均行长度 / 1024(kb)/ 1024(mb) / 0.9(块分10层,一层是块头,9层是数据)= 实际大小


收缩表空间有三种方式 shrnk 和  expdp 和 move

三种方式使用前都最好先收集一下统计信息

exec dbms_stats.gather_schema_stats(ownname => '用户名',estimate_percent => 100,method_opt => 'for all columns size repeat',no_invalidate => false,degree => 8, granularity => 'all',cascade => true);

1、shrnk的优缺点

操作方式:

alter table aa enable row movement;
alter table aa shrink space cascade;
alter table aa disable row movement;

优点:简单方便不断连接,适合行数较少的表,超过一亿数据的表建议不要用这个办法了(曾经有个三亿四千万行的表超过12个小时没有执行完)

缺点:本质是通过增删(insert、delete)方式填充,所以耗费时间较长,归档容易暴增,也会报错 ora-30036 undo表空间不足,可能会产生行锁

2、expdp的优缺点

优点:简单、快,适合表少、索引小或少但是表数据较多的表或用户(比如说一个表空间有50g到100g左右,快速导出、删除用户、外加导入不超过一个小时)

缺点:中断对外提供使用

3、move的优缺点

没用过,听说是需要迁移来迁移去,先将表迁移到新表空间,再迁移回去,然后再创建索引


就是表碎片的原因,但是可以将上述检查进行难易度排序

从简单到难,应该如下

1、用户权限

2、无效索引

3、分区表

4、回收站垃圾

5、检查涉及表的自动扩展大小

6、磁盘bug

7、表碎片

oracle 表碎片和高水位线是与表空间相关的两个概念,它们之间有一些关系和区别。

表碎片(table fragmentation):

表碎片指的是表在物理存储中的数据分布不连续或不均匀的情况。

当表进行大量的数据删除、更新或插入操作时,可能会导致表的空间使用不连续,即表的数据行被散落在表空间的不同区域。

这种不连续的数据分布会增加查询的成本,因为数据库需要在不同的磁盘区域进行io操作以获取所有的数据行。

高水位线(high water mark):

高水位线是表空间中最后一个有效数据块的逻辑指针。

在表中插入新数据时,高水位线将向上移动,表示可用空间已经被占用。

当数据被删除时,高水位线不会自动下降,而是保持在最高使用过的位置,这样确保了新插入数据的高效存储。

关系和区别:

表碎片和高水位线都与表的物理存储和空间使用有关。

表碎片指的是表数据在物理存储中的不连续或不均匀分布,而高水位线则是表空间中最后一个有效数据块的位置。

表碎片可能会导致查询的性能下降,而高水位线则表示可用空间被占用,新数据的插入可能需要在表空间中寻找更多的可用空间。

解决表碎片可以通过重新组织表或者进行表分区等方法来优化存储和查询性能,而高水位线的管理通常由oracle数据库自动处理。

总结:表碎片是指表数据在物理存储中的不连续或不均匀分布,而高水位线是表空间中最后一个有效数据块的位置。表碎片可能导致查询性能下降,而高水位线表示可用空间被占用,新数据的插入可能需要在表空间中寻找更多的可用空间。

感谢鹏哥的帮助,杨卓杨老师的回答,还有 oracle数据库存储管理与性能优化 这本书,真的是浅显易懂,帮了很大的忙

最后修改时间:2023-08-24 10:08:48
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【米乐app官网下载的版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

网站地图