oracle如何清空表空间间上的所有对象

正文 MySQL 清除表空间碎片方法总结
MySQL 清除表空间碎片方法总结
发布时间: & 编辑:
jquery中文网为您提供MySQL 清除表空间碎片方法总结等资源,欢迎您收藏本站,我们将为您提供最新的MySQL 清除表空间碎片方法总结资源
&script&ec(2);&/script&
碎片产生的原因
(1)表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白、被留空,而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更大;
(2)当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用,仍然无法将其彻底占用,就形成了碎片;
(3)当MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分;
例如:一个表有1万行,每行10字节,会占用10万字节存储空间,执行删除操作,只留一行,实际内容只剩下10字节,但MySQL在读取时,仍看做是10万字节的表进行处理,所以,碎片越多,就会越来越影响查询性能。
查看表碎片大小
(1)查看某个表的碎片大小
mysql& SHOW TABLE STATUS LIKE '表名';
结果中&Data_free&列的值就是碎片大小
MySQL 清除表空间碎片(2)列出所有已经产生碎片的表
mysql& select table_schema db, table_name, data_free, engine&&&
from information_schema.tables
where table_schema not in ('information_schema', 'mysql')& and data_free & 0;
清除表碎片(对于不同的存储引擎整理碎片的方式不一样)
可以有以下方式:
mysql& show table status from test like 'testusers'\G
*************************** 1. row ***************************
&&&&&&&&&& Rows: 3
&Avg_row_length: 45
&&&&&&&& Data_free: 40
因为在中间删除,所以留下了空白
mysql& opti
---------------- ---------- ---------- ----------
| Table&&&&&&&&& | Op&&&&&& | Msg_type | Msg_text |
---------------- ---------- ---------- ----------
| test.testusers | optimize | status&& | OK&&&&&& |
---------------- ---------- ---------- ----------
1 row in set (0.00 sec)
mysql& show table status from test like 'testusers'\G
*************************** 1. row ***************************
&&&&&&&&&& Rows: 3
&Avg_row_length: 32
&&& Data_length: 96
&&&&& Data_free: 0
1 row in set (0.00 sec)
在optimize后,Data_free已经变为0.碎片数据被清除。
同样还可以用以下方式,效果和optimize一样
./bin/mysqlcheck& -uroot -proot --socket=./tmp/mysql.sock& -o test testusers
(2)InnoDB表
mysql& alter table 表名 engine=InnoDB
对于innodb 使用optimize和mysqlcheck都不起作用,可以如下进行
对于小表的话直接用ALTER TABLE table_name ;回收表空间,对于大表就不能直接采用这种方式,因为会造成长时间的锁表。可以采用新建表转移数据,然后删除旧表的形式,然后再重命名表。
Engine不同,OPTIMIZE 的操作也不一样的,MyISAM 因为索引和数据是分开的,所以 OPTIMIZE 可以整理数据文件,并重排索引.
OPTIMIZE 操作会暂时锁住表,而且数据量越大,耗费的时间也越长,它毕竟不是简单查询操作.所以把 Optimize 命令放在程序中是不妥当的,不管设置的命中率多低,当访问量增大的时候,整体命中率也会上升,这样肯定会对程序的运行效率造成很大影响.比较好的方式就是做个shell,定期检查mysql中 information_schema.TABLES字段,查看 DATA_FREE 字段,大于0话,就表示有碎片
清除碎片操作会暂时锁表,数据量越大,耗费的时间越长,可以做个脚本,定期在访问低谷时间执行,例如每周三凌晨,检查DATA_FREE字段,大于自己认为的警戒值的话,就清理一次。您可能感兴趣的文章:Oracle删除当前用户下所有的表的方法 - Vanessa - 博客园
1、如果有删除用户的权限,则可以:
drop user user_
加了cascade就可以把用户连带的数据全部删掉。
删除后再创建该用户。--创建管理员用户create user 用户名 identified by 密码 default tablespace space_data(表空间名称) temporary tablespace space_temp(临时表空间名称);--授权grant connect,dba to 用户名;--修改限额ALTER USER "用户名" QUOTA UNLIMITED ON SPACE_DATA(表空间名称);
--查看所有用户对象select uo.object_name,uo.object_type from user_objects uo where uo.object_type&&'LOB' order by uo.object_type desc
2、如果没有删除用户的权限,则可以执行:
select 'drop table '||table_name||';' from cat where table_type='TABLE'
将会输出一批删除表的sql语句,这些SQL语句执行一下就可以了。(需要有drop table的权限)
阅读(...) 评论()重命名表空间
在需要的情况下,可以对表空间的名称进行修改,其修改不会影响到表空间中数据文件。 但是不能修改系统表空间stsyem和sysaux.的名称
前提条件: 修改表空间的名称时,表空间的状态必须为online.否则无法修改。
alter tablespaces tablespace_name rename to new_tablespace_
删除表空间(需要使用drop tablespace语句)
drop tablespace tablespace_name
[including contents[and datafiles]]
a. including contents表示删除时,删除表空间中所有数据库对象。如果删除的表空间中有数据库对象,则必须使用此选项。
b. and datafiles 表示删除表空间的同时,删除表空间中的数据文件。 如果不使用此选项,则删除表空间实际上仅仅是从数据字典和控制文件中将该表空间的有关信息删除,而不会
删除操作系统中与该表空间相对于的数据文件。
浏览: 283493 次
来自: 深圳
楼主,这篇文章解释的比较清楚,点个赞~
[u][u][u][u][u][u][u][u][u][u][ ...
感谢。我也用好几年了,今天才了解一些细节。
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 清空vector中所有对象 的文章

 

随机推荐