OracleMove命令总结

   Oracle Move命令总结

  从8i开始,oracle开始提供Move的命令。我们通常使用这个命令,将一个table segment从一个tablespace移动到另一个tablespace。Move实际上是在block之间物理的copy数据,那么,我们可以通过这种方式来降低table的HWM。我们先通过一个实验来看看move是如何移动数据的。

  1.建表并插入数据:

  SQL> create table sjh.test1(id int) tablespaceusers;

  表已创建。

  SQL> insert into sjh.test1 values(1);

  已创建 1 行。

  SQL> insert into sjh.test1 values(2);

  已创建 1 行。

  SQL> insert into sjh.test1 values(3);

  已创建 1 行。

  SQL> insert into sjh.test1 values(4);

  已创建 1 行。

  SQL> insert into sjh.test1 values(5);

  已创建 1 行。

  SQL> insert into sjh.test1 values(6);

  已创建 1 行。

  SQL> insert into sjh.test1 values(7);

  已创建 1 行。

  SQL> insert into sjh.test1 values(8);

  已创建 1 行。

  S QL> commit;

  提交完成。

  SQL> select * from sjh.test1;

  已选择8行。

  2.查看表的rowid信息和block id信息:

  SQL> select rowid,id from sjh.test1;

  已选择8行。

  SQL> select EXTENT_ID,FILE_ID,RELATIVE_FNO,BLOCK_ID,BLOCKS

  --8条记录都在一个块上(AAAABH)

  这里简单介绍一下ROWID的知识:ROWID在磁盘上需要10个字节的存储空间并使用18个字符来显示它包含下列组件:

  数据对象编号:每个数据对象如表或索引在创建时都分配有此编号,并且此编号在数据库中是唯一的;

  相关文件编号:此编号对于一个表空间中的每个文件是唯一的;

  块编号:表示包含此行的块在文件中的位置;

  行编号:标识块头中行目录位置的位置;

  在内部数据对象编号需要32 位,相关文件编号需要10 位,块编号需要22,位行编号需要16 位,加起来总共是80 位或10 个字节,ROWID使用以64 为基数的编码方案来显示该方案将六个位置用于数据对象,编号三个位置用于相关文件编号六个位置用于块编号三个位置用于行编号以64 为基数的编码方案使用字符A-Z a-z 0-9 + 和/共64 个字符,

  如下例所示:AAAMlQAAE AAAABH AAA

  3.做一些DML操作,再观察ROWID有没有发生变化:

  SQL> delete from sjh.test1 where id=1;

  已删除 1 行。

  SQL> delete from sjh.test1 where id=3;

  已删除 1 行。

  SQL> delete from sjh.test1 where id=5;

  已删除 1 行。

  SQL> commit;

  提交完成。

  SQL> select rowid,id from sjh.test1;

  --我们看到ROWID保持不变。

  4.做MOVE操作,然后观察ROWID的情况:

  SQL> alter table sjh.test1 move;

  表已更改。

  SQL> select rowid,id from sjh.test1;

  --ROWID发生变化BLOCK_ID由原来的65变为73,BLOCK的编号由原来的AAAABH变为AAAABM

  5.move对HWM的影响:

  这里引用网友yjz0065的一个例子:

  SQL> create table my_objects tablespace HWM

  SQL> delete from my_objects where rownum<10000;

  9999 rows deleted

  SQL> select count(*) from my_objects;

  COUNT(*)

  ----------

  SQL> exec show_space(p_segname =>'MY_OBJECTS',p_owner => 'DLINGER',p_type => 'TABLE');

  Total Blocks............................425

  Total Bytes.............................3481600

  Unused Blocks...........................3

  Unused Bytes............................24576

  Last Used Ext FileId....................11

  Last Used Ext BlockId...................1294

  Last Used Block.........................2

  这里HWM=425- 3 + 1 = 423

  然后对tableMY_OBJECTS进行move操作:

  SQL> alter table MY_OBJECTS move;

  表已更改。

  SQL> exec show_space(p_segname =>'MY_OBJECTS',p_owner => 'DLINGER',p_type => 'TABLE');

  Total Blocks............................290

  Total Bytes.............................2375680

  Unused Blocks...........................1

  Unused Bytes............................8192

  Last Used Ext FileId....................11

  Last Used Ext BlockId...................1584

  Last Used Block.........................4

  我们可以看到,tableMY_OBJECTS的HWM从423移动到290,table的HWM降低了!(show_space是自定义的一个过程)。

  Move的一些用法:

  以下是altertable 中move子句的完整语法,我们介绍其中的几点:

  MOVE [ONLINE]

  [segment_attributes_clause]

  [data_segment_compression]

  [index_org_table_clause]

  [ { LOB_storage_clause | varray_col_properties }

  ?0?2?0?2?0?2 [ { LOB_storage_clause | varray_col_properties } ]...

  ]

  [parallel_clause]

  a. 我们可以使用move将一个table从当前的tablespace上移动到另一个tablespace上,如:

  alter table t move tablespace tablespace_name;

  b. 我们还可以用move来改变table已有的block的存储参数,如:

  alter table t move storage (initial 30k next 50k);

  c.另外,move操作也可以用来解决table中的行迁移的问题。

  使用move的一些注意事项:

  a. table上的index需要rebuild:

  在前面我们讨论过,move操作后,数据的rowid发生了改变,我们知道,index是通过rowid来fetch数据行的,所以,table上的index是必须要rebuild的。

  SQL> create index i_my_objects on my_objects (object_id);

  Index created

  SQL> alter table my_objects move;

  Table altered

  SQL> select index_name,status from user_indexeswhere index_name='I_MY_OBJECTS';

  从这里可以看到,当tableMY_OBJECTS进行move操作后,该table上的inedx的状态为UNUSABLE,这时,我们可以使用alterindex I_MY_OBJECTS rebuild online的命令,对index I_MY_OBJECTS进行在线rebuild。

  b. move时对table的锁定

  当我们对tableMY_OBJECTS进行move操作时,查询v$locked_objects视图可以发现,tableMY_OBJECTS上加了exclusivelock:

  SQL>select OBJECT_ID, SESSION_ID,ORACLE_USERNAME,LOCKED_MODE from v$locked_objects;

  SQL> select object_id from user_objects whereobject_name = 'MY_OBJECTS';

  OBJECT_ID

  ----------

  这就意味着,table在进行move操作时,我们只能对它进行select的操作。反过来说,当我们的一个session对table进行DML操作且没有commit时,在另一个session中是不能对这个table进行move操作的,否则oracle会返回这样的错误信息:ORA-00054: 资源正忙,要求指定 NOWAIT。

  c. 关于move时空间使用的问题:

  当我们使用altertable move来降低table的HWM时,有一点是需要注意的,这时,当前的tablespace中需要有1倍于table的空闲空间以供使用:

  SQL> CREATE TABLESPACE TEST1 DATAFILE 'D:ORACLEORADATAORACLE9ITEST1.dbf' SIZE 5M UNIFORMSIZE 128K ;

  SQL> create table my_objects tablespace test1 asselect * from all_objects;

  表已创建。

  SQL> select bytes/1024/1024 from user_segmentswhere segment_name='MY_OBJECTS';

  BYTES/1024/1024

  ---------------

  SQL> alter table MY_OBJECTS move;

  alter table MY_OBJECTS move

  ERROR 位于第 1 行:

  ORA-01652: 无法通过16(在表空间TEST1中)扩展 temp 段

  SQL> ALTER DATABASE DATAFILE 'D:ORACLEORADATAORACLE9ITEST1.DBF' RESIZE7M;

  数据库已更改。

  SQL> alter table MY_OBJECTS move;

  表已更改。

时间: 2024-11-16 16:39:23

OracleMove命令总结的相关文章

Windows8应用中的新建、刷新和其他命令

  新建.刷新和播放等命令在使用应用时非常重要.这些属于操作命令,例如在邮件中添加附件并将文本变为粗体,在听音乐时暂停和跳过曲目.虽然这些命令非常重要,但只是偶尔需要用到,并且会占大量空间.为了使你能够在全屏模式下做一些事情(如阅读网页或观看视频),应用命令会在你不需要时隐藏起来. 当你准备使用这些命令时,它们会显示在屏幕的顶部或底部,或作为选定项的菜单.例如,在"开始"屏幕上,你可以向上轻扫或右键单击来查看所有应用命令,也可以向下轻扫或右键单击某个磁贴以将其选定,并查看更改该磁贴的方

检查电脑是否被挂马的常用命令

一些基本的命令往往可以在保护网络安全上起到很大的作用,下面几条命令的作用就非常突出. 一.检测网络连接 如果你怀疑自己的计算机上被别人安装了木马,或者是中了病毒,但是手里没有完善的工具来检测是不是真有这样的事情发生,那可以使用 Windows自带的网络命令来看看谁在连接你的计算机. 具体的命令格式是:netstat -an这个命令能看到所有和本地计算机建立连接的IP,它包含四个部分--proto(连接方式).local address(本地连接地址).foreign address(和本地建立连

转 Win8系统108个运行命令 你能记住多少?

Win8运行命令:程序和功能        取消了开始菜单的Win8让人感觉很不习惯,这才发现原来开始菜单可以做这么多事.不过Win8中的一些快捷键还沿用了Windows一直以来的习惯,比如按下Windows + R打开"运行"对话框.在这里我们可以通过命令来打开各种应用程序或系统设置,不过这需要你有超强的记忆力,能把Win8中所有的运行命令都记住.       以下这108条运行命令都是大家经常会用到的,看看你能记住多少? Win8系统108个运行命令 你能记住多少? 1.appwi

JS实现浏览器菜单命令

js|菜单|浏览器 每当我们看到别人网页上的打开.打印.前进.另存为.后退.关闭本窗口.禁用右键等实现浏览器命令的链接,而自己苦于不能实现时,是不是感到很遗憾?是不是也想实现?如果能在网页上能实现浏览器的命令,将是多么有意思的事啊!下面我们就来看看如何用javascript代码实现浏览器菜单命令(以下代码在Windows XP下的浏览器中调试通过). 一.[文件(F)]菜单中的命令的实现 1.[打开]命令的实现 [格式]:document.execCommand("open") [说明

Linux cut命令用法

cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对"行"来进行分析的,并不是整篇信息分析的. (1)其语法格式为: cut  [-bn] [file] 或 cut [-c] [file]  或  cut [-df] [file] 使用说明 cut 命令从文件的每一行剪切字节.字符和字段并将这些字节.字符和字段写至标准输出. 如果不指定 File 参数,cut 命令将读取标准输入.必须指定 -b.-c 或 -f 标志之一. 主要参数 -b :以字节

学习Linux命令之最基本的文件操作

  cd cd 是打开某个路径的命令,也就是打开某个文件夹,并跳转到该处. 代码如下: $ cd path ### path 为你要打开的路径. 其中 path 有绝对路径和相对路径之分,绝对路径强调从 / 起,一直到所在路径.相对路径则相对于当前路径来说,假设当前家目录有etc 文件夹(绝对路径应为 /home/username/etc),如果直接 cd etc 则进入此文件夹,但若是 cd /etc/ 则是进入系统 etc ,多琢磨一下就可以理解了.另外在 Linux 中, . 代表当前目录

文件/目录权限设置命令chmod的详细用法

chmod是文件/目录权限设置的命令,在Linux中经常遇到,本博文以下总结chmod的详细用法.  Linux/Unix的档案调用权限分为三级,即档案拥有者user.群组group.其他other.u表示该档案的拥有者,g表示与该档案的拥有者属于同一个群体(group)者,o表示其他以外的人,a表示这三者皆是. + 表示增加权限.- 表示取消权限.= 表示唯一设定权限. r表示可读取,w表示可写入,x表示可执行.   举例说明: (1).将档案file1.txt 设为所有人皆可读取: chmo

win7操作系统怎么用DIR命令?

  win7操作系统怎么用DIR命令? 具体方法如下: 1.点击"开始"按钮,然后点击"运行"命令; 2.在文本框中输入"cmd"命令,然后点击"确定"按钮; 3.输入"DIR"后按"enter"键或输入"DIR F:OS"后按"enter"键,查看F盘分区中OS文件夹中的未隐藏文件; 4.如果电脑是系统的,还有输入"DIR F:OS /

彻底删除IE9浏览器命令栏不需要的图标方法

  解决方法: 第一步.在命令栏上单击右键,在移动鼠标至"自定义",单击"添加或删除命令". 第二步.在弹出对话框的"当前工具栏按钮"列表中找到你想要删除的按钮图标,在单击"删除"按钮,所有图标删除完成后关闭对话框即可. 彻底删除图标请继续下面的方法: 第一步.单击"Windows"按钮,在搜索框中输入 Regedit ,在按下回车键打开注册表,在弹出的询问窗口中单击是. 第二步.然后在注册表中定位到如下位