oracle可传输表空间(transportable tablespace)-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 3976675
  • 博文数量: 536
  • 博客积分: 10470
  • 博客等级: 上将
  • 技术积分: 4825
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-26 14:08
文章分类

全部博文(536)

文章存档

2024年(3)

2021年(1)

2019年(1)

2017年(1)

2016年(2)

2013年(2)

2012年(10)

2011年(43)

2010年(10)

2009年(17)

2008年(121)

2007年(252)

2006年(73)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: oracle

2016-04-08 17:18:23

ref: http://blog.itpub.net/17203031/viewspace-749513/

我们在oracle环境中,有很多进行数据备份和移植手段,如exp/impexpdp/impdprman等。在这些方法中,可传输表空间(transportable tablespace)一直是传统意义上最快数据移植的技术手段。理想情况下,transportable tablespace可以实现近似网络直传的速率特点。本篇中,我们来介绍一下传输表空间技术的一些使用细节。

 

1transportable tablespace概述

 

其他传统意义上的备份迁移手段,大都是遵循“抽取-传输-还原”的模式。以expdp为例,oracle使用专门的内部调度作业,将需要导出的数据(used block)转化为dmp格式文件进行存储保存。之后,通过网络进行传输到target envionment,最后再还原到新环境上。这种模式的加速优化,主要体现在抽取和还原上,如使用并行等手段。

 

transportable tablespace完全不是这样的概念。如果比喻的话,它类似一种portable/plugin的理念。相同平台、字符集的表空间,完全可以将数据文件直接拷贝到target environmentoracle层面只需要让数据字典知道这些数据的metadata就可以了。

 

相对于其他手段,transportable tablespace最大的好处就在于不需要进行繁复的抽取和还原过程,而且对中间环境的空间要求很小。下面通过一系列的实验来进行演示。

 

2、环境准备和前提条件

 

oracle transportable tablespace(以下简称为tts)出现的很早。传统的tts有三个层面基础限制,分别为:

 

ü  表空间内容self contained。我们一次性导出的表空间(一个或者多个),不能在其他表空间中存在依赖对象。比如,我们常常将一个数据表数据和索引分布在不同的表空间上,这样如果我们使用transportable tablespace,就要求必须将这些表空间一次性全部导出;

ü  sourcetarget dbcharacter setnational character set必须完全相同;

ü  操作系统source target db要求兼容。注意:在10g以上版本,这个限制已经取消;

 

我们会在下面更加直观的介绍这些约束和检查方法。由于笔者环境的限制,一些实验只能在一台服务器上进行。具体实验选择oracle 11gr2

 

 

sql> select * from v$version;

banner

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

oracle database 11g enterprise edition release 11.2.0.1.0 - production

pl/sql release 11.2.0.1.0 - production

core        11.2.0.1.0         production

 

--构造两个实验表空间

sql> create tablespace ttstbl datafile size 10m autoextend on

  2  extent management local uniform. size 1m

  3  segment space management auto;

tablespace created

 

sql> create tablespace ttsind datafile size 10m autoextend on

  2  extent management local uniform. size 1m

  3  segment space management auto;

tablespace created

 

--测试用户

sql> create user test identified by test default tablespace ttstbl;

user created

 

sql> grant resource, connect to test;

grant succeeded

 

sql> grant select_catalog_role to test;

grant succeeded

 

 

使用test用户在表空间中创建一些对象。

 

 

sql> conn test/test@ora11gp;

connected to oracle database 11g enterprise edition release 11.2.0.1.0

connected as test

 

sql> create table t tablespace ttstbl as select * from dba_objects;

table created

 

sql> create index idx_t_id on t(object_id) tablespace ttsind;

index created

 

 

3pre-condition check

 

作为先决条件,首选确定source数据库的字符集信息。

 

 

sql> select value from nls_database_parameters where parameter='nls_characterset';

value

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

al32utf8

 

sql> select value from nls_database_parameters where parameter='nls_nchar_characterset';

value

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

al16utf16

 

 

希望导出新创建的表空间ttsindttstbl

 

 

sql> select file_name, tablespace_name from dba_data_files where tablespace_name like 'tts%';

 

file_name                                                                        tablespace_name

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

/u01/app/oradata/ora11g/datafile/o1_mf_ttstbl_8bmyjf3w_.dbf                      ttstbl

/u01/app/oradata/ora11g/datafile/o1_mf_ttsind_8bmyjz69_.dbf                      ttsind

 

 

[oracle@bsplinux datafile]$ ls -l

total 2095500

(篇幅原因,省略部分内容)

-rw-r----- 1 oracle oinstall  10493952 nov 19 18:04 o1_mf_ttsind_8bmyjz69_.dbf

-rw-r----- 1 oracle oinstall  20979712 nov 19 17:59 o1_mf_ttstbl_8bmyjf3w_.dbf

-rw-r----- 1 oracle oinstall 267395072 nov 19 18:13 o1_mf_undotbs1_7vpyc2py_.dbf

-rw-r----- 1 oracle oinstall  11804672 nov 19 17:29 o1_mf_users_7vpyc2xd_.dbf

 

 

传统的约束条件中,操作系统平台os是使用tts不能回避的因素。oracle将支持平台划分为两个大类型biglittle,同平台之间可以进行自由表空间移植,异平台之间不允许进行移植。注意:这个限制在oracle 10g之后被打破。具体我们后面详细介绍。

 

我们可以通过查询v$transportable_platform来确定系统之间是否兼容。

 

 

sql> col platform_name for a30;

sql> select platform_name, endian_format from v$transportable_platform;

 

platform_name                  endian_format

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

solaris[tm] oe (32-bit)        big

solaris[tm] oe (64-bit)        big

microsoft windows ia (32-bit)  little

linux ia (32-bit)              little

aix-based systems (64-bit)     big

hp-ux (64-bit)                 big

hp tru64 unix                  little

hp-ux ia (64-bit)              big

linux ia (64-bit)              little

hp open vms                    little

microsoft windows ia (64-bit)  little

ibm zseries based linux        big

linux x86 64-bit               little

apple mac os                   big

microsoft windows x86 64-bit   little

solaris operating system (x86) little

ibm power based linux          big

hp ia open vms                 little

solaris operating system (x86- little

64)                            

apple mac os (x86-64)          little

 

20 rows selected

 

 

对于自己的数据库,v$database视图中可以查询自己的平台情况信息。

 

 

sql> select platform_id , platform_name from v$database;

 

platform_id platform_name

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

         10 linux ia (32-bit)

 

 

确定平台兼容之后,我们需要确定一次移植的表空间之间是否“self contained”。oracle提供的dbms_tts包方法来进行验证。

 

 

sql> exec dbms_tts.transport_set_check('ttstbl, ttsind',true);

pl/sql procedure successfully completed

 

sql> select * from transport_set_violations;

 

violations

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

 

 

如果验证出现错误,我们可以在transport_set_violations中查询到提示信息。只有解决了self contained问题,才能继续下面的步骤。

 

4、环境数据导出

 

为了控制变化,我们需要将表空间设置为只读。具体语句为:alter tablespace xxx read only

 

 

sql> select tablespace_name, status from dba_tablespaces where tablespace_name like 'tts%';

 

tablespace_name                status

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

ttsind                         read only

ttstbl                         read only

 

 

oracle tts需要使用exp/expdp将表空间的元数据metadata信息导出为dmp文件,用于描述表空间信息。注意,这个过程时间很短,而且生成的dmp文件通常很小。

 

 

[root@bsplinux ~]# cd /

[root@bsplinux /]# mkdir transtts

[root@bsplinux /]# chown -r oracle:oinstall transtts/

[root@bsplinux /]# ls -l | grep transtts

drwxr-xr-x   2 oracle   oinstall  4096 nov 19 18:19 transtts

[root@bsplinux /]#

 

 

exp支持了tts工作方法。

 

 

[oracle@bsplinux transtts]$ exp userid=\"/ as sysdba\" transport_tablespace=y tablespaces=ttstbl,ttsind file=ttsdmp.dmp log=res.log statistics=none

 

export: release 11.2.0.1.0 - production on mon nov 19 19:32:14 2012

凯发app官方网站 copyright (c) 1982, 2009, oracle and/or its affiliates.  all rights reserved.

 

connected to: oracle database 11g enterprise edition release 11.2.0.1.0 - production

with the partitioning, olap, data mining and real application testing options

export done in al32utf8 character set and al16utf16 nchar character set

note: table data (rows) will not be exported

about to export transportable tablespace metadata...

for tablespace ttstbl ...

. exporting cluster definitions

. exporting table definitions

. . exporting table                              t

for tablespace ttsind ...

. exporting cluster definitions

. exporting table definitions

. exporting referential integrity constraints

. exporting triggers

. end transportable tablespace metadata export

export terminated successfully without warnings.

 

 

之后,我们只需要直接将数据文件拷贝出来。

 

 

sql> select 'cp '||file_name ||' /transtts' from dba_data_files where tablespace_name like 'tts%';

 

'cp'||file_name||'/transtts'

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

cp /u01/app/oradata/ora11g/datafile/o1_mf_ttstbl_8bmyjf3w_.dbf /transtts

cp /u01/app/oradata/ora11g/datafile/o1_mf_ttsind_8bmyjz69_.dbf /transtts

 

 

[oracle@bsplinux transtts]$ cp /u01/app/oradata/ora11g/datafile/o1_mf_ttstbl_8bmyjf3w_.dbf /transtts

cp /u01/app/oradata/ora11g/datafile/o1_mf_ttsind_8bmyjz69_.dbf /transtts

[oracle@bsplinux transtts]$ cp /u01/app/oradata/ora11g/datafile/o1_mf_ttsind_8bmyjz69_.dbf /transtts

[oracle@bsplinux transtts]$

 

 

 

[oracle@bsplinux transtts]$ ls -l

total 30796

-rw-r----- 1 oracle oinstall 10493952 nov 19 19:35 o1_mf_ttsind_8bmyjz69_.dbf

-rw-r----- 1 oracle oinstall 20979712 nov 19 19:35 o1_mf_ttstbl_8bmyjf3w_.dbf

-rw-r--r-- 1 oracle oinstall      724 nov 19 19:33 res.log

-rw-r--r-- 1 oracle oinstall    16384 nov 19 19:33 ttsdmp.dmp

 

 

/transtts目录中,保存了所有需要还原数据库的信息。

 

5、数据环境恢复

 

我们需要将数据文件通过ftp/sftp传输到目标数据库服务器上。笔者先将数据环境还原,因为使用的是相同的数据库。

 

 

sql> drop tablespace ttstbl including contents and datafiles;

tablespace dropped

 

sql> drop tablespace ttsind including contents and datafiles;

tablespace dropped

 

sql> select file_name from dba_data_files where tablespace_name like 'tts%';

file_name

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

 

 

source数据库已经没有tts表空间了。下面,我们将数据文件拷贝到新位置,并且导入metadata信息。

 

 

[oracle@bsplinux transtts]$ cp o1_mf_ttstbl_8bmyjf3w_.dbf /u01/app/oradata/ora11g/datafile/

[oracle@bsplinux transtts]$ cp o1_mf_ttsind_8bmyjz69_.dbf /u01/app/oradata/ora11g/datafile/

 

[oracle@bsplinux datafile]$ ls -l

total 2095500

-rw-r----- 1 oracle oinstall  10493952 jul  3 03:48 mytesttbl01.dbf

-rw-r----- 1 oracle oinstall  10493952 jul  3 03:48 mytesttbl02.dbf

-rw-r----- 1 oracle oinstall 104865792 nov 19 17:29 o1_mf_rman_ts_87bx5kcg_.dbf

-rw-r----- 1 oracle oinstall 838868992 nov 19 19:46 o1_mf_sysaux_7vpyc2hb_.dbf

-rw-r----- 1 oracle oinstall 807411712 nov 19 19:43 o1_mf_system_7vpyc1x7_.dbf

-rw-r----- 1 oracle oinstall  60825600 nov 19 18:02 o1_mf_temp_7vpz05do_.tmp

-rw-r----- 1 oracle oinstall  10493952 nov 19 19:47 o1_mf_ttsind_8bmyjz69_.dbf

-rw-r----- 1 oracle oinstall  20979712 nov 19 19:46 o1_mf_ttstbl_8bmyjf3w_.dbf

-rw-r----- 1 oracle oinstall 267395072 nov 19 19:47 o1_mf_undotbs1_7vpyc2py_.dbf

-rw-r----- 1 oracle oinstall  11804672 nov 19 17:29 o1_mf_users_7vpyc2xd_.dbf

 

 

imp命令导入。

 

 

[oracle@bsplinux transtts]$ imp userid=\'/ as sysdba\' file=ttsdmp.dmp transport_tablespace=y tablespaces=ttsind,ttstbl datafiles=/u01/app/oradata/ora11g/datafile/o1_mf_ttstbl_8bmyjf3w_.dbf,/u01/app/oradata/ora11g/datafile/o1_mf_ttsind_8bmyjz69_.dbf

 

import: release 11.2.0.1.0 - production on mon nov 19 19:51:25 2012

 

凯发app官方网站 copyright (c) 1982, 2009, oracle and/or its affiliates.  all rights reserved.

 

connected to: oracle database 11g enterprise edition release 11.2.0.1.0 - production

with the partitioning, olap, data mining and real application testing options

 

export file created by export:v11.02.00 via conventional path

about to import transportable tablespace(s) metadata...

import done in al32utf8 character set and al16utf16 nchar character set

. importing sys's objects into sys

. importing sys's objects into sys

. importing test's objects into test

. . importing table                            "t"

. importing sys's objects into sys

import terminated successfully without warnings.

[oracle@bsplinux transtts]$

 

 

导入元数据后,oracle中可以确定导入的表空间了。

 

 

sql> select file_name,tablespace_name from dba_data_files where tablespace_name like 'tts%';

 

file_name                                                                        tablespace_name

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

/u01/app/oradata/ora11g/datafile/o1_mf_ttsind_8bmyjz69_.dbf                      ttsind

/u01/app/oradata/ora11g/datafile/o1_mf_ttstbl_8bmyjf3w_.dbf                      ttstbl

 

sql> conn test/test@ora11gp

connected to oracle database 11g enterprise edition release 11.2.0.1.0

connected as test

 

sql> select count(*) from t;

 

  count(*)

----------

     72348

 

 

注意,导入后的表空间还是read only状态,需要开启。

 

 

sql> alter tablespace ttsind read write;

tablespace altered

 

sql> alter tablespace ttstbl read write;

tablespace altered

 

 

上面我们给出了一个简单的tts例子。对tts来说,还有很多细节和复杂应用场景,留待后面继续。

 

 

阅读(875) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图