数据库迁移的两种方法 oracle数据库迁移方案对比( 二 )


? 同样提供了如下生成sql的语句,需要在原数据库下执行
-- 此处需要自行指定用户密码select 'create user ' || username ||' identified by **** account unlock default tablespace ' ||spacename || ' ;' as userdsfrom (select username as username, default_tablespace as spacenamefrom dba_userswhere username not in ('ANONYMOUS','CTXSYS','DBSNMP','DIP','DMSYS','EXFSYS','MDDATA','MDSYS','MGMT_VIEW','OLAPSYS','ORDPLUGINS','ORDSYS','OUTLN','SCOTT','SI_INFORMTN_SCHEMA','SYS','SYSMAN','SYSTEM','TSMSYS','WMSYS','XDB')order by username );5、登录新的数据库,执行生成的 tsds 和 user_ds 语句,注意执行顺序,先创建表空间,在创建用户 。
6、使用imp执行导入 。
imp ****/****@**** full=y file=G:\Share\compress_N\****.dmp log=G:\Share\compress_N\imp.log 如果没有提前建立用户,则用户密码与原库相同 。
imp有一个ignore的参数,代表忽略创建错误,默认为N,此处并未开启 。在导入过程中会出现诸多表空间及用户的创建错误,此类错误可忽略 。
其余参数及参数含义可在命令行使用 imp -help自行查阅 。
至此,imp导入就算结束了 。
三、数据库表空间物理文件缩小会有这个小节是因为第一次导出的时候不知道加入 compress = n 的参数,导致只有很少数据量的一个库占用了30多G的磁盘空间,为了减少占用,看了一些跟压缩表空间相关的内容,在此做些记录 。
*1. 总结提前声明有一些概念还没说到,如果你不懂什么意思,可以先了解一下,看完其他的内容以后再回来看第二遍 。并不是物理文件过大就需要将其缩小,我这边进行处理是因为这只是个开发库备份,另外我对这个库也足够清楚,知道这个表空间文件不正常,而且也不会再向这个表空间内写入数据 。在使用EXP 导出时指定 compress参数,可以有效的减小物理文件的大小 。采用默认值导出导入后物理文件是30多G,设置参数后是15G多一些,减少了一半 。至于为什么还有这么多,在我查看段信息后发现了几个异常的表和索引,这几个异常对象初始时分配了最高4G的空间,是主要祸首 。以我自己的操作过程及现在的理解来看,如果没有那几个初始值异常大的表定义和索引定义,导出的结果是符合我的预期的 。以缩小表空间为关键字搜索,很容易就会找到一些文章告诉你要先使用shrink space压缩段,然后通过 resize 命令缩小表空间的物理文件,不过在我实测后发现,这种方法的适用范围很苛刻,它要求你所操作的段数据刚好位于表空间的末尾,即你所操作的数据段刚好占据着已使用的最大块,此时对段进行压缩操作,然后resize,表空间文件才可以缩小 。举例来说,假设一个表空间内有AB两张表,每十万数据占用10M磁盘空间,我们分两种情况来看 。第一种情况,先向A表内写入100W数据,然后删除A表内的40W数据,占用空间少了40M,这时执行shrink space,resize 60M,物理文件确实会按预期缩小 。第二种情况,先向A表写入了100W数据,又向B表写入了10W数据,最后将A表内的数据删除了90W,此时对A段Shrink,对表空间Resize,然后就会触发 ORA-03297:文件包含在请求的RESIZE值以外使用的数据,这里面会涉及到数据块的概念,因为B表内写入的数据占用了表空间内更靠前的数据块,没办法调整物理文件大小,而且实际情况下,数据的写入是无法预期的,所以此方法无用 。Shrink Space做了什么?需要说明一下,这是在Oracle 10g中新增的功能,用来优化数据段的高水位(HWM)问题,高水位会导致查询时扫描的数据块过多,影响查询时的速度,所以需要优化 。关于高水位的内容,可查看 arctic_fox的文章 – oracle 高水位线详解,另外需要注意的是shrink segment的操作会改变数据的rowid,也就是改变了数据的物理位置,该命令会自动重建索引,但是会导致已打开的游标失效,如果要在生产环境使用,必须要慎重 。EXP/IMP,这应该是最简单的方法了,也是我采用的方法 。在对表空间内需要整理的段进行收缩整理后,查询dba_free_space可以看到处于未使用状态的区间编号,如果这个表空间不会再次插入新数据,可以指定当前用户重新导出,再次导入后,可以发现物理文件已经缩小到了自己可接受的程度 。move tablesapce 的方法只是看了看,未进行实操验证,如果您无法或不方便执行数据的导出导入 。建议点击一泽涟漪 – Oracle收缩表空间查看原文了解相关内容,还有这篇菜鸟程序员 – ORACLE修改表空间方法2、一些预备知识oracle内置一些表和视图,以user_开头的可以查询当前用户拥有的所有对象,以all_开头的可以访问当前用户拥有访问权限的对象(可以是其他用户的对象),以dba_开头的需要dba权限,可以访问数据库内的所有对象 。表空间的存储结构在逻辑上的数据结构如下:tablespace(表空间) – segment(段) – extent(区) – block(块)数据存储在Block数据块中,数据块对应在物理磁盘上;一个或多个连续的数据块组成区,区不能跨段,一个区只属于一个段;所以,区也只是一个逻辑上的概念,区与实际存储数据的块关联,段信息的汇总展示会更简单明了 。段是由区组成,段中会存在一个初始区,用于存放数据,空间不够时会自动分配新的区,实际上就是分配了新的数据块存放数据,区号是按顺序排列的,块可以优先使用当前未分配的空间(可以在dba_free_space中查看) 。表空间则是段的容器,一般oracle会为表或索引创建一个段,用于存放表或索引的数据,称为表段或索引段,每个分区表也是一个独立的段,关于段的具体类型,可以在dba_segments中查看 segment_type字段的标注 。另外,在数据库安装时会有一个界面显示系统的块大小,默认为8K,也可以通过 select value from v$parameter where name=’db_block_size’ 自行查询数据块的默认值 。关于表空间结构更详细的描述,请自行查看 oracle 物理结构(表空间,段区块)_tyhawk的博客-CSDN博客几个内置对象dba_data_files 可以在这里查看表空间的一些数据,比如物理文件位置,表空间大小,是否可用,是否自动扩展,扩展大小等信息,file_id可以在这里取(file_id)dba_segments 可以查看段的信息,比如段的所有者,段的类型,段的名字等dba_extents 和上面类似,可以查看所属段的信息,分区ID(extents_id)以及块ID(block_id,区的起始块),另外查询的时候最好指定file_id,不然会很慢 。? v$datafile 可以查看偏向物理文件的一些信息,file_id可以在这里取(file#)


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: