- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Oracle表空间数据库文件收缩案例解析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
我们经常会遇到数据库磁盘空间爆满的问题,或由于归档日志突增、或由于数据文件过多、大导致磁盘使用紧俏。这里主要说的场景是磁盘空间本身很大,但表空间对应的数据文件初始化的时候就直接顶满了磁盘空间,导致经常收到磁盘空间满的报警.
1、错误信息 。
告警内容如下:
【发现异常】地产客储系统数据库Oracle_192.168.xx.xx,192.168.xx.xx,数据库customer,连接错误,0 ORA-00257: archiver error. Connect internal only, until freed. 。
【发生时间】2018.07.04 09:12:21 。
2、错误原因 。
上述错误一看大致就知道是由于磁盘空间不足,导致归档无法完成所致,我们只需要清理足够的磁盘空间即可。但在磁盘清理的时候发现磁盘空间本身可清理的不多,被很多很大的数据文件占用,而实际使用的segment大小总共不足400G,磁盘空间本身1T,所以我们可以通过收缩数据文件的方式回收磁盘空间.
数据文件初始化方式:
1.我们创建表空间一般有两种方式初始化其数据文件,即指定初始大小为32G(很大的值)或指定初始大小为100M(很小的值)然后通过自动扩展方式慢慢按需增长.
2.第一种初始数据文件方法坏处就是开始不管你用不用到那么大,都会占用这么大的磁盘空间(这种数据迁移的时候可以使用)。第二种初始化方法按需增长,比较好的监控实际使用磁盘空间,所以推荐初始值很小,使用自动扩展慢慢增长的方式.
3、处理步骤 。
1.查看磁盘空间大小 。
2.查看数据库表空间大小 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
#!/bin/bash
sqlplus -S /nolog <<EOF
conn /
as
sysdba;
set
echo
off
heading
on
underline
on
;
column
inst_num heading
"Inst Num"
new_value inst_num format 99999;
column
inst_name heading
"Instance"
new_value inst_name format a12;
column
db_name heading
"DB Name"
new_value db_name format a12;
column
dbid heading
"DB Id"
new_value dbid format 9999999999 just c;
prompt
prompt
Current
Instance
prompt ~~~~~~~~~~~~~~~~
select
d.dbid dbid
, d.
name
db_name
, i.instance_number inst_num
, i.instance_name inst_name
from
v\$
database
d,
v\$instance i;
set
term
on
feedback
off
lines 130 pagesize 999 tab
off
trims
on
column
MB format 999,999,999 heading
"Total MB"
column
free
format 9,999,999 heading
"Free MB"
column
used format 99,999,999 heading
"Used MB"
column
Largest format 999,999 heading
"LrgstMB"
column
tablespace_name format a20 heading
"Tablespace"
column
status format a3 truncated
column
max_extents format 99999999999 heading
"MaxExt"
col extent_management
for
a1 trunc head
"M"
col allocation_type
for
a1 trunc head
"A"
col Ext_Size
for
a4 trunc head
"Init"
column
pfree format a3 trunc heading
"%Fr"
break
on
report
compute
sum
of
MB
on
report
compute
sum
of
free
on
report
compute
sum
of
used
on
report
select
d.tablespace_name,
decode(d.status,
'ONLINE'
,
'OLN'
,
'READ ONLY'
,
'R/O'
,
d.status) status,
d.extent_management,
decode(d.allocation_type,
'USER'
,
''
,
d.allocation_type) allocation_type,
(
case
when
initial_extent < 1048576
then
lpad(round(initial_extent/1024,0),3)||
'K'
else
lpad(round(initial_extent/1024/1024,0),3)||
'M'
end
) Ext_Size,
NVL (a.bytes / 1024 / 1024, 0) MB,
NVL (f.bytes / 1024 / 1024, 0)
free
,
(NVL (a.bytes / 1024 / 1024, 0) - NVL (f.bytes / 1024 / 1024, 0)) used,
NVL (l.large / 1024 / 1024, 0) largest,
d.MAX_EXTENTS ,
lpad(round((f.bytes/a.bytes)*100,0),3) pfree,
(
case
when
round(f.bytes/a.bytes*100,0) >= 20
then
' '
else
'*'
end
) alrt
FROM
sys.dba_tablespaces d,
(
SELECT
tablespace_name,
SUM
(bytes) bytes
FROM
dba_data_files
GROUP
BY
tablespace_name) a,
(
SELECT
tablespace_name,
SUM
(bytes) bytes
FROM
dba_free_space
GROUP
BY
tablespace_name) f,
(
SELECT
tablespace_name,
MAX
(bytes) large
FROM
dba_free_space
GROUP
BY
tablespace_name) l
WHERE
d.tablespace_name = a.tablespace_name(+)
AND
d.tablespace_name = f.tablespace_name(+)
AND
d.tablespace_name = l.tablespace_name(+)
AND
NOT
(d.extent_management
LIKE
'LOCAL'
AND
d.contents
LIKE
'TEMPORARY'
)
UNION
ALL
select
d.tablespace_name,
decode(d.status,
'ONLINE'
,
'OLN'
,
'READ ONLY'
,
'R/O'
,
d.status) status,
d.extent_management,
decode(d.allocation_type,
'UNIFORM'
,
'U'
,
'SYSTEM'
,
'A'
,
'USER'
,
''
,
d.allocation_type) allocation_type,
(
case
when
initial_extent < 1048576
then
lpad(round(initial_extent/1024,0),3)||
'K'
else
lpad(round(initial_extent/1024/1024,0),3)||
'M'
end
) Ext_Size,
NVL (a.bytes / 1024 / 1024, 0) MB,
(NVL (a.bytes / 1024 / 1024, 0) - NVL (t.bytes / 1024 / 1024, 0))
free
,
NVL (t.bytes / 1024 / 1024, 0) used,
NVL (l.large / 1024 / 1024, 0) largest,
d.MAX_EXTENTS ,
lpad(round(nvl(((a.bytes-t.bytes)/NVL(a.bytes,0))*100,100),0),3) pfree,
(
case
when
nvl(round(((a.bytes-t.bytes)/NVL(a.bytes,0))*100,0),100) >= 20
then
' '
else
'*'
end
) alrt
FROM
sys.dba_tablespaces d,
(
SELECT
tablespace_name,
SUM
(bytes) bytes
FROM
dba_temp_files
GROUP
BY
tablespace_name
order
by
tablespace_name) a,
(
SELECT
tablespace_name,
SUM
(bytes_used ) bytes
FROM
v\$temp_extent_pool
GROUP
BY
tablespace_name) t,
(
SELECT
tablespace_name,
MAX
(bytes_cached) large
FROM
v\$temp_extent_pool
GROUP
BY
tablespace_name
order
by
tablespace_name) l
WHERE
d.tablespace_name = a.tablespace_name(+)
AND
d.tablespace_name = t.tablespace_name(+)
AND
d.tablespace_name = l.tablespace_name(+)
AND
d.extent_management
LIKE
'LOCAL'
AND
d.contents
LIKE
'TEMPORARY'
ORDER
by
1
/
prompt
exit
EOF
|
3.查询可直接收缩表空间数据文件 。
这里查看的是可以直接收缩的数据文件大小,比如最开始初始化的数据文件为32G,在数据文件高水位以下的为20G,那么可直接回收的为12G.
1
2
3
4
5
6
7
8
9
10
11
|
select
a.file#,a.
name
,a.bytes/1024/1024 CurrentMB,
ceil(HWM * a.block_size)/1024/1024 ResizeTo,
(a.bytes - HWM * a.block_size)/1024/1024 ReleaseMB,
'alter database datafile '
''
||a.
name
||
''
' resize '
||
ceil(HWM * a.block_size/1024/1024) ||
'M;'
ResizeCMD
from
v$datafile a,
(
select
file_id,
max
(block_id+blocks-1) HWM
from
dba_extents
group
by
file_id) b
where
a.file# = b.file_id(+)
and
(a.bytes - HWM *block_size)>0;
|
4.直接收缩数据文件 。
1
|
alter
database
datafile
'/oracle/oradata/bi/data01.dbf'
resize 1548M;
|
5.再次查看磁盘空间,已释放很多,可手动完成归档测试.
4、总结 。
针对oracle的数据文件收缩(磁盘空间收缩),我们一般可通过当前磁盘空间查看(df -h)——>执行可直接收缩的查询命令和收缩命令——>执行大表高水位收缩——>执行表空间高水位收缩(降低文件高水位线)——>再次执行直接回收表空间数据文件命令 。
直接收缩数据文件的方式参考本文上述步骤即可完成.
那么如何降低表空间的数据文件高水位,进而完成表空间数据文件回收呢?
1.查看大于10G的数据文件 。
1
|
select
file_name,file_id,tablespace_name,(bytes/1024/1024/1024) file_size_gb
from
dba_data_files
where
(bytes/1024/1024/1024) >10
order
by
file_id;
|
2.查看大于10G的数据文件对应的数据块信息 。
1
2
3
4
5
|
select
file_id,
max
(block_id+blocks-1) HWM,block_id
from
dba_extents
where
file_id =14
group
by
file_id,block_id
order
by
hwm
desc
;
|
3.查看大表对应的数据块信息 。
1
2
3
4
|
##查看大表
select
file_name,file_id,tablespace_name,(bytes/1024/1024/1024) file_size_gb
from
dba_data_files
where
(bytes/1024/1024/1024) >10
order
by
file_id;
##查看大表对应的块
select
owner,segment_name,file_id,block_id,blocks
from
dba_extents
where
segment_name=
'TABLE_NAME'
;
|
4.降低表的高水位 。
1
2
|
alter
table
table_name
move
;
alter
index
idx_name rebuild;
|
5.查看数据文件对应的最大的block_id 。
1
2
3
|
SELECT
MAX
(block_id)
FROM
dba_extents
WHERE
tablespace_name =
'TABLESPACE_NAME'
;
|
6.执行数据文件收缩 。
1
2
|
(block_id+blocks-1)数据文件的HWM
alter
database
datafile
'/oracle/oradata/bi/data01.dbf'
resize xxxM;
|
总结 。
以上所述是小编给大家介绍的Oracle表空间数据库文件收缩案例解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
原文链接:https://www.cnblogs.com/rangle/archive/2018/07/04/9263505.html 。
最后此篇关于Oracle表空间数据库文件收缩案例解析的文章就讲到这里了,如果你想了解更多关于Oracle表空间数据库文件收缩案例解析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Oracle 即时客户端和 Oracle 客户端有什么区别?你能给我解释一下吗?谢谢 最佳答案 Oracle 客户端带有安装程序和许多可执行文件,例如 sqlplus,tnsping,它是完整而庞大的
我正在寻找一个Delphi组件来直接连接到ORACLE数据库服务器,而无需安装oracle客户端。 我知道Oracle Data Access (ODAC)来自DevArt 。还有其他组件具有此功能吗
如何编写 Oracle 存储过程,以表 (X) 作为输入参数,并在过程内部使用表 X 来与另一个表 Y 联接? 表 X 将包含数千条记录。 不希望将表名作为 varchar 传递,然后使用动态 SQL
如何编写 Oracle 存储过程,以表 (X) 作为输入参数,并在过程内部使用表 X 来与另一个表 Y 联接? 表 X 将包含数千条记录。 不希望将表名作为 varchar 传递,然后使用动态 SQL
我要过滤COMMENTS属性为空的记录 我试过了 SELECT TABLE_NAME, COMMENTS FROM (SELECT TABLE_NAME, COMMENTS FROM (sel
我要下载 Oracle Instant Client for Linux x86-64 (64-bit)现在有一段时间了。 现在我注意到该网站在过去几个月中一直遇到技术问题。 要从 Oracle 下载
有什么方法可以将我的 Delphi 应用程序 (FireDac) 直接连接到 Oracle 数据库? 目前可以连接,但需要安装Oracle Client 在 embarcadero 站点 ( http
我有一张表,其中日期列的数据格式如下:“7/25/2014 12:14:27 AM”。我需要通过放入 where 子句来获取此日期。有人可以建议我该怎么做吗? 最佳答案 日期(存储在表中)是 repr
如果两个事务试图同时修改同一行会发生什么?通常,一旦行被修改,另一个事务等待直到第一个事务执行提交或回滚。但是,如果他们恰好在同一时刻发送更新请求怎么办? 最佳答案 答案是否定的。两个事务不能同时修改
我想知道为什么我不能在 Oracle 模式中有两个同名的索引?它抛出一个错误,指出该名称已被使用。我的印象是,由于索引在一个特定的表上,这应该不会导致任何错误,除非我们对同一个表上的两个不同列使用相同
我需要构建一个查询来按成员和到期日期检索信息组,但我需要为每个成员提供一个序列号.. 例如: 如果成员“A”有 3 条记录要过期,“B”只有 1 条,“C”有 2 条,我需要这样的结果: Number
独立程序 create procedure proc1 ( begin end; ) 存储过程 create package pkg1 ( procedure proc2 begin end; ) 最
在 Oracle 9i 中声明 FK 时遇到问题。我在这里查看了许多关于 SO 和一些在线文档(例如 http://www.techonthenet.com/oracle/foreign_keys/f
我和我的同事维护的应用程序在后端有一个 Oracle 数据库。我们正在考虑偶尔以“受限”模式运行应用程序,其中一个数据库表空间设置为只读。我们可以轻松地将必要的表和索引移动到单独的表空间,这些表空间将
我想实现一个自定义的回归聚合函数,类似于现有的 REGR_SLOPE . 我要定义的函数需要获取两列作为参数,例如 select T.EMPLOYEE_ID, CUSTOM_REGR_SL
我已经尝试解决这个问题一段时间了,我认为是时候寻求帮助了。我正在构建一个架构配置脚本,我想添加一些脚本输出和错误处理。这个想法是脚本输出窗口只会向我显示关键消息而没有所有噪音。 Create Temp
在旧的 Oracle 服务器(我被告知是 8i)上使用 JDBC 时,我遇到了一个非常令人困惑和奇怪的问题。我在那里准备了一个表,其中包含大约 10 列、数字、varchars、一个 raw(255)
我有一张 table Customer_Chronics在 Oracle 11g 中。 该表具有三个关键列,如下所示: 分支代码 客户 ID 期 我已按 branch_code 列表按表分区,现在我进
是否有存储用户自定义异常的oracle表? 最佳答案 没有。 与其他变量一样,用户定义的异常在 PL/SQL block 中定义,并且具有 PL/SQL 变量将具有的任何范围。所以,例如 DECLAR
在 oracle 中使用序列并使用 Before insert trigger 自动递增列或使用标识列是否更好,因为它在 Oracle 12 c 中可用? 最佳答案 无论哪种方式,您都将使用序列。 1
我是一名优秀的程序员,十分优秀!