在ORACLE中移动数据库文件

在ORACLE中移动数据库文件

a.shutdown immediate关闭数据库
b.在os下拷贝数据文件到新的地点
c.Startup mount 启动到mount下
d.Alter database rename datafile ‘老文件’ to ‘新文件’;
e.Alter database open; 打开数据库
2、利用Rman联机操作

RMAN> sql "alter database datafile ''file name'' offline";
RMAN> run {
2> copy datafile 'old file location'
3> to 'new file location';
4> switch datafile ' old file location'
5> to datafilecopy ' new file location';
6> }
RMAN> sql "alter database datafile ''file name'' online";

说明:利用OS拷贝也可以联机操作,不关闭数据库,与rman的步骤一样,利用rman与利用os拷贝的原理一样,在rman中copy是拷贝数据文件,相当于OS的cp,而switch则相当于alter database rename,用来更新控制文件。

–ORACLE数据库由数据文件,控制文件和联机日志文件三种文件组成。
–由于磁盘空间的变化,或者基于数据库磁盘I/O性能的调整等,
–我們可能会考虑移动数据库文件。
–下面以LUNIX平台为例,分别讨论三种数据库文件的移动方法。

一.移动数据文件:
— 可以用ALTER DATABASE,ALTER TABLESPACE两种方法移动数据文件。

1. ALTER DATABASE方法;
— 用此方法,可以移动任何表空间的数据文件。

STEP 1. 下数据库:

$ sqlplus /nolog
SQL> conn / as sysdba
SQL> SHUTDOWN;
SQL> EXIT;

STEP 2.用操作系统命令移动数据文件:
— 将数据文件 ‘test.ora’ 从/ora/oracle/data1目录移动到/ora/oracle/data2目录下:

$ mv /ora/oracle/data1/test.ora /ora/oracle/data2

STEP 3. Mount数据库,用ALTER DATABASE命令将数据文件改名:

$ sqlplus /nolog
SQL> conn / as sysdba;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE RENAME FILE '/ora/oracle/data1/test.ora' TO '/ora/oracle/data2/test.ora';

STEP 4. 打开数据库:.

SQL> ALTER DATABASE OPEN;
SQL>SELECT NAME,STATUS FROM V$DATAFILE;

2. ALTER TABLESPACE方法:
— 用此方法,要求此数据文件既不属于SYSTEM表空间,也不属于含有ACTIVE回滚段或临时段的表空间。

STEP1. 将此数据文件所在的表空间OFFLINE:

$ sqlplus /nolog
SQL> conn / as sysdba;
SQL> ALTER TABLESPACE test OFFLINE;
SQL> EXIT;

STEP2. 用操作系统命令移动数据文件:
将数据文件 ‘test.ora’ 从/ora/oracle/
data1目录移动到/ora/oracle/data2目录下:

$ mv /ora/oracle/data1/test.ora /ora/oracle/data2

STEP3. 用ALTER TABLESPACE命令改数据文件名:

$ sqlplus /nolog
SQL> conn / as sysdba;
SQL> ALTER TABLESPACE test RENAME DATAFILE '/ora/oracle/data1/test.ora' TO '/ora/oracle/data2/test.ora';

STEP4. 将此数据文件所在的表空间ONLINE:

SQL> ALTER TABLESPACE test ONLINE;
SQL> SELECT NAME,STATUS FROM V$DATAFILE;

二. 移动控制文件:

— 控制文件 在 INIT.ORA文件中指定。移动控制文件相对比较简单,下数据库,
— 编辑INIT.ORA,移动控制文件,重启动数据库。

STEP 1. 下数据库:

$ sqlplus /nolog
SQL> conn / as sysdba;
SQL> SHUTDOWN;
SQL> EXIT;

STEP 2.用操作系统命令 移动控制文件:
–将控制文件’ctl3orcl.ora’ 从/ora/oracle/data1目录移动到/ora/oracle/data2目录下:

$ mv /ora/oracle/data1/ctrlorcl3.ora /ora/oracle/data2

STEP 3. 编辑INIT.ORA文件:
INIT.ORA文件的在$ORACLE_HOME/dbs目录下,
修改参数 “control_files”,其中指定移动后的控制文件:

control_files = (/ora/oracle/data1/ctrlorcl1.ora,/ora/oracle/data1/ctrlorcl2.ora,/ora/oracle/data2/ctrlorcl3.ora)

STEP 4. 重启动数据库:

$ sqlplus /nolog
SQL> conn / as sysdba;
SQL> STARTUP;
SQL>SELECT name FROM V$CONTROLFILE;
SQL> EXIT;

三. 移动联机日志文件:
STEP 1. 停数据库:

$ sqlplus /nolog
SQL> conn / as sysdba;
SQL> SHUTDOWN;
SQL> EXIT;

STEP 2. 用操作系统命令移动联机日志文件:
–将联机日志文件’redolog1.ora’ 从/ora/oracle/data1目录移动到/ora/oracle/data2目录下:

$ mv /ora/oracle/data1/redolog1.ora /ora/oracle/data2

STEP 3. Mount数据库,用ALTER DATABASE 命令改联机日志文件名:.

$ sqlplus /nolog
SQL> conn / as sysdba;
SQL> STARTUP MOUNT ;
SQL> ALTER DATABASE RENAME FILE '/ora/oracle/data1/redolog1.ora' TO '/ora/oracle/data2/redolog1.ora';

STEP 4.重启动数据库: .

SQL> ALTER DATABASE OPEN;
SQL>SELECT MEMBER FROM V$LOGFILE

aix里面怎么查看实际的磁盘空间

查看空间

lspv :查看系统硬盘
lspv hdisk# :查看硬盘hdisk#的空间分配情况
lsvg :查看系统VG
lsvg vg_name : 查看VG的空间分配情况
lsvg -l vg_name: 查看VG中LV分配情况以及对应的文件系统
df -k :查看文件系统使用情况。
综合这些,可以大致算出系统硬盘已分配了多少空间,实际已经使用了多少空间。
增加空间分区
AIX使用smit chfs,就会出现相应的图形界面。选择Change / Show Characteristics of an Enhanced Journaled File System,在启动选择你所需要增加的空间分区即可进行操作即可。
aix df如何查看磁盘空间 —————————-
使用df命令可以显示文件系统的大小和现在可以使用的空间大小
#df
Filesystem 512-blocks Free %Used Iused %Iused Mounted   on
//dev/hd1 540672 523240 4% 42 1% /home
/dev/SOSDBlv 35454976 7932224 78% 7608 1% /dbback
显示所有被mount上的文件系统的名称和在系统中的连接目录,文件系统的大小以512字节为单位显示在512-blocks列中,文件系统的剩余空间显示在free列中,%Used表示文件系统的当前利用率,如果接近100%系统管理员应该考虑是否增大其的空间或删除某些不需要的文件.Iuse表示文件系统索引节点的使用数量,%Iused表示索引节点的使用率,如果该值到达100%表示该文件系统没有剩余的索引节点,这时系统不能在该文件系统中再创建任何文件了.
我们可以使用
df -I命令显示文件系统已使用空间大小,
df -K可以在显示时以1024字节(K)为单位显示文件系统的大小.
df -M可以在显示时以M为单位显示文件系统的大小.
df -G可以在显示时以G为单位显示文件系统的大小.
SSYLDB.CHD.HN:/#df -g
Filesystem    GB blocks      Free %Used    Iused %Iused Mounted on
/dev/hd4           5.00      4.38   13%     5778     1% /
/dev/hd2           3.00      1.13   63%    39353    13% /usr
/dev/hd9var        5.00      4.78    5%     4455     1% /var
/dev/hd3           5.00      4.48   11%      363     1% /tmp
/dev/hd1           2.00      2.00    1%        5     1% /home
/proc                 –         –    –         –     –  /proc
/dev/hd10opt       5.00      4.89    3%     3218     1% /opt
/dev/oraclelv     20.00      9.68   52%    71346     4% /oracle
/dev/data01lv    200.00     72.98   64%       28     1% /data01
/dev/data02lv    200.00     68.81   66%       28     1% /data02
/dev/data03lv    200.00    117.80   42%       24     1% /data03
/dev/data04lv    198.00    122.00   39%       15     1% /data04
/dev/backlv      277.50     28.22   90%       25     1% /back
/dev/redolv      121.50     58.96   52%       29     1% /redo
———数据恢复 oracle数据库恢复专家 13352468096 QQ:9417901 网站:http://www.sosdb.com—–
在unix/linux下查看磁盘空间
rx6600-1:[/]#bdf
Filesystem          kbytes    used   avail %used Mounted on
/dev/vg00/lvol3     983040  300264  677848   31% /
/dev/vg00/lvol1    1835008  128520 1693256    7% /stand
/dev/vg00/lvol8    8912896 7241592 1658304   81% /var
/dev/vg00/lvol7    7962624 2848000 5074688   36% /usr
/dev/vg00/lvol4     524288  114280  407072   22% /tmp
/dev/vg00/tmplv    2064384   94121 1847371    5% /oratmp
/dev/vg00/orasoft  8192000 1325345 6437546   17% /orasoft
/dev/vg00/oracle   20480000 10857345 9021286   55% /oracle
/dev/vg00/lvol6    9076736 5783528 3267552   64% /opt
/dev/vg00/lvol5     131072  106280   24632   81% /home
/dev/datavg1/datavg1lv
                   1024000000 477848087 512017566   48% /u01
/dev/datavg2/datavg2lv
                   307200000 292627160 13662092   96% /u02
rx6600-1:[/]#
du 查看目录大小
   -m 以兆为单位显示各级目录的大小
   -s 只显示第一级目录的大小
   –max-depth=n 显示目录的深度 n为数字 du -s 和du –max-depth=0 效果是一样的
df -h 统计磁盘的使用率
fdisk -l 查看分区情况
free 查看内存和交换分区的使用情况

Oracle中like效率正则表达式浅析

Oracle 中like常用但是其效率不是高。

特别是使用%a%—–》全局扫描,没有利用到任何索引。
情况可以的条件尽量下使用a%——》可以利用正序的索引。
%a——》可以利用反序的索引(当然得已有反序的索引)。
使用instr函数取代like查询,可提高效率,在海量数据中效果尤其明显。

1.%a%方式:

select * from pub_yh_bm t
where instr(t.chr_bmdm,'2')>0

等份于:

select * from pub_yh_bm t
where t.chr_bmdm like '%2%'

2.%a方式:

select * from pub_yh_bm t
where instr(t.chr_bmdm,'110101')=length(t.chr_bmdm)-length('110101')+1

等份于:

select * from pub_yh_bm t
where t.chr_bmdm like '%110101'

3.a%方式:

select * from pub_yh_bm t
where instr(t.chr_bmdm,'11010101')=1

等份于:

select * from pub_yh_bm t
where t.chr_bmdm like '11010101%'

ORACLE中的支持正则表达式的函数主要有下面四个:
1,REGEXP_LIKE :与LIKE的功能相似
2,REGEXP_INSTR :与INSTR的功能相似
3,REGEXP_SUBSTR :与SUBSTR的功能相似
4,REGEXP_REPLACE :与REPLACE的功能相似
它们在用法上与Oracle SQL 函数LIKE、INSTR、SUBSTR 和REPLACE 用法相同,
但是它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符。
POSIX 正则表达式由标准的元字符(metacharacters)所构成:
‘^’ 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。
‘$’ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹
配 ‘\n’ 或 ‘\r’。
‘.’ 匹配除换行符之外的任何单字符。
‘?’ 匹配前面的子表达式零次或一次。
‘+’ 匹配前面的子表达式一次或多次。
‘*’ 匹配前面的子表达式零次或多次。
‘|’ 指明两项之间的一个选择。例子’^([a-z]+|[0-9]+)$’表示所有小写字母或数字组合成的
字符串。
‘( )’ 标记一个子表达式的开始和结束位置。
‘[]’ 标记一个中括号表达式。
‘{m,n}’ 一个精确地出现次数范围,m=< 出现次数<=n,'{m}'表示出现m次,'{m,}'表示至少 出现m次。 \num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。 字符簇: [[:alpha:]] 任何字母。 [[:digit:]] 任何数字。 [[:alnum:]] 任何字母和数字。 [[:space:]] 任何白字符。 [[:upper:]] 任何大写字母。 [[:lower:]] 任何小写字母。 [[:punct:]] 任何标点符号。 [[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]。 各种操作符的运算优先级 \转义符 (), (?:), (?=), [] 圆括号和方括号 *, +, ?, {n}, {n,}, {n,m} 限定符 ^, $, anymetacharacter 位置和顺序 范例:

–regexp_like
–查询value中以1开头60结束的记录并且长度是7位
select * from fzq where value like ‘1____60′;
select * from fzq where regexp_like(value,’1….60′);
–查询value中以1开头60结束的记录并且长度是7位并且全部是数字的记录。
–使用like就不是很好实现了。
select * from fzq where regexp_like(value,’1[0-9]{4}60′);
— 也可以这样实现,使用字符集。
select * from fzq where regexp_like(value,’1[[:digit:]]{4}60′);
— 查询value中不是纯数字的记录
select * from fzq where not regexp_like(value,’^[[:digit:]]+$’);
— 查询value中不包含任何数字的记录。
select * from fzq where regexp_like(value,’^[^[:digit:]]+$’);
–查询以12或者1b开头的记录.不区分大小写。
select * from fzq where regexp_like(value,’^1[2b]’,’i’);
–查询以12或者1b开头的记录.区分大小写。
select * from fzq where regexp_like(value,’^1[2B]’);
— 查询数据中包含空白的记录。
select * from fzq where regexp_like(value,'[[:space:]]’);
–查询所有包含小写字母或者数字的记录。
select * from fzq where regexp_like(value,’^([a-z]+|[0-9]+)$’);
–查询任何包含标点符号的记录。
select * from fzq where regexp_like(value,'[[:punct:]]’);

select * from Dba_Tables b where regexp_like(b.table_name,’^[[A-Z]]$’) And b.owner=’SSCP2′

处理表的行迁移的问题

检测迁移和链接

使用ANALYZE 命令检测迁移和链接:

SQL> ANALYZE TABLE oe.orders COMPUTE STATISTICS;
Table Analyzed.
SQL> SELECT num_rows, avg_row_len, chain_cnt
2 FROM DBA_TABLES
3 WHERE table_name='ORDERS';
NUM_ROWS   AVG_ROW_LEN   CHAIN_CNT
---------- ----------- ----------
1171         67          83
使用Statspack/AWR 检测迁移和链接:
Statistic                                      Total       per Second    per Trans
table fetch continued row                      34,964            0.7          0.2

先执行utlchain.sql脚本来创建CHAINED_ROWS表

SQL> @D:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\utlchain.sql
选择已迁移的行
SQL> ANALYZE TABLE oe.orders LIST CHAINED ROWS;
Table analyzed.
SQL> SELECT owner_name, table_name, head_rowid
2 FROM chained_rows
3 WHERE table_name = 'ORDERS';
OWNER_NAME TABLE_NAME HEAD_ROWID
---------- ---------- ------------------
SALES ORDER_HIST AAAAluAAHAAAAA1AAA
SALES ORDER_HIST AAAAluAAHAAAAA1AAB

消除已迁移的行
导出/导入:
– 导出表
– 删除或截断表
– 导入表
MOVE 表命令:

– ALTER TABLE EMPLOYEES MOVE

重新定义联机表
复制已迁移的行:
– 使用ANALYZE 查找迁移的行
– 将迁移的行复制到新表
– 从原始表删除迁移行
– 将行从新表复制到原始表
下面是采用MOVE表命令的方式

-- Created on 2012-5-24 by ADMINISTRATOR
declare
 cursor lj is SELECT table_name, num_rows, avg_row_len, chain_cnt FROM DBA_TABLES a where a.owner='SSCP2'
 and a.chain_cnt>0;
 cursor sy(p_tablename in varchar2) is
 select * from dba_indexes a where a.owner='SSCP2' and a.table_name=''||''||p_tablename||''||'';
 sql_c varchar2(200):=null;
 cl_flag number(2):=1;
begin
   for r in lj loop
     sql_c:=null;
     sql_c:='alter table sscp2.'||r.table_name||' move';
     begin
     execute immediate ''||sql_c;
     exception
       when others then
       dbms_output.put_line('执行表移动出错的表'||r.table_name);
       cl_flag:=0;
     end ;
     if cl_flag=1 then
         for l in sy(r.table_name) loop
           dbms_output.put_line(l.index_name);
           sql_c:=null;
           sql_c:='alter index sscp2.'||l.index_name||' rebuild';
           begin
           execute immediate ''||sql_c;
           exception
           when others then
           dbms_output.put_line('重建出错的索引'||l.index_name);
           end ;
         end loop;
         sql_c:='analyze table sscp2.'||r.table_name||' compute statistics';
         begin
          execute immediate ''||sql_c;
         exception
           when others then
           dbms_output.put_line('分析表出错'||r.table_name);
         end ;
      end if;
   end loop;
end;
SQL> SELECT table_name, num_rows, avg_row_len, chain_cnt FROM DBA_TABLES a where a.owner='SSCP2'
  2   and a.chain_cnt>0;

TABLE_NAME                       NUM_ROWS AVG_ROW_LEN  CHAIN_CNT
------------------------------ ---------- ----------- ----------
ABSB                              2479525         114       3041
ABS8                             29230869         149     195428
IDS2                               453402          60        132
ICSW                                78087          37         37
ICS1                               759167          49       5521
IC12                               729809         111          9
IC10                               256770         170         62
ADS3                             17472005         186       2221
ADS1                               544695         130         53
ACSN                                39821          90          4
ACS6                              1940197          82        162

丢失所有重做日志文件的恢复例子丢失所有重做日志文件的恢复例子

SQL> conn / as sysdba

已连接。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

删除所有重做日志文件

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             100666244 bytes
Database Buffers          503316480 bytes
Redo Buffers                7135232 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员
ORA-00312: 联机日志 1 线程 1: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\OCP\REDO01.LOG'

SQL> shutdown immediate
ORA-01507: ??????


ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             100666244 bytes
Database Buffers          503316480 bytes
Redo Buffers                7135232 bytes
数据库装载完毕。
SQL> select group#,sequence#,members,bytes,status,archived from v$log;

    GROUP#  SEQUENCE#    MEMBERS      BYTES STATUS           ARC
---------- ---------- ---------- ---------- ---------------- ---
         1        104          1   52428800 INACTIVE         YES
         3        106          1   52428800 CURRENT          NO
         2        105          1   52428800 INACTIVE         YES

SQL> select * from v$logfile;

 GROUP#    STATUS  TYPE      MEMBER                                           IS_RECOVERY_DEST_FILE
---------- ------- -------  ------------------------------------------------  --------------------------------

         3         ONLINE   D:\ORACLE\PRODUCT\10.2.0\ORADATA\OCP\REDO03.LOG   NO

         2 STALE   ONLINE   D:\ORACLE\PRODUCT\10.2.0\ORADATA\OCP\REDO02.LOG   NO

         1         ONLINE   D:\ORACLE\PRODUCT\10.2.0\ORADATA\OCP\REDO01.LOG   NO

增加一个新的重做日志组

SQL> ALTER DATABASE ADD LOGFILE GROUP 4
  2  ('D:\oracle\product\10.2.0\oradata\ocp\redo04a.log','D:\oracle\product\10.2
.0\oradata\ocp\redo04b.log')
  3  SIZE 512 M;

数据库已更改。

删除不是当前重做日志组的日志文件

SQL> alter database drop logfile group 1;

数据库已更改。

SQL> alter database drop logfile group 2;

数据库已更改。

SQL> select group#,sequence#,members,bytes,status,archived from v$log;

    GROUP#  SEQUENCE#    MEMBERS      BYTES STATUS           ARC
---------- ---------- ---------- ---------- ---------------- ---
         4          0          2  536870912 UNUSED           YES
         3        106          1   52428800 CURRENT          NO

然后从新创建的redo04a.log复制一份修改为丢失的redo03.log
然后再做介质恢复

SQL> recover database until cancel;
完成介质恢复。
SQL> alter database open resetlogs;

数据库已更改。

SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             104860548 bytes
Database Buffers          499122176 bytes
Redo Buffers                7135232 bytes
数据库装载完毕。
数据库已经打开。

然后再做完全备份

在linux下安装oracle bbed

[oracle@localhost lib]$ cd $ORACLE_HOME/rdbms/lib

  [oracle@localhost lib]$ls ins_rdbms.mk
  ins_rdbms.mk
  [oracle@localhost lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

  Linking BBED utility (bbed)
  rm -f /opt/oracle/product/9.2.0/rdbms/lib/bbed
  gcc -o /opt/oracle/product/9.2.0/rdbms/lib/bbed -L/opt/oracle/product/9.2.0/rdbms/lib/ -L/opt/oracle/product/9.2.0/lib/ -L/opt/oracle/product/9.2.0/lib/stubs/ /opt/oracle/product/9.2.0/lib/s0main.o /opt/oracle/product/9.2.0/rdbms/lib/ssbbded.o /opt/oracle/product/9.2.0/rdbms/lib/sbbdpt.o `cat /opt/oracle/product/9.2.0/lib/ldflags` -lnsslb9 -lncrypt9 -lnsgr9 -lnzjs9 -ln9 -lnl9 /opt/oracle/product/9.2.0/rdbms/lib/defopt.o -ldbtools9 -lclntsh `cat /opt/oracle/product/9.2.0/lib/ldflags` -lnsslb9 -lncrypt9 -lnsgr9 -lnzjs9 -ln9 -lnl9 -lnro9 `cat /opt/oracle/product/9.2.0/lib/ldflags` -lnsslb9 -lncrypt9 -lnsgr9 -lnzjs9 -ln9 -lnl9 -lclient9 -lvsn9 -lwtc9 -lcommon9 -lgeneric9 -lwtc9 -lmm -lnls9 -lcore9 -lnls9 -lcore9 -lnls9 -lxml9 -lcore9 -lunls9 -lnls9 `cat /opt/oracle/product/9.2.0/lib/ldflags` -lnsslb9 -lncrypt9 -lnsgr9 -lnzjs9 -ln9 -lnl9 -lnro9 `cat /opt/oracle/product/9.2.0/lib/ldflags` -lnsslb9 -lncrypt9 -lnsgr9 -lnzjs9 -ln9 -lnl9 -lclient9 -lvsn9 -lwtc9 -lcommon9 -lgeneric9 -ltrace9 -lnls9 -lcore9 -lnls9 -lcore9 -lnls9 -lxml9 -lcore9 -lunls9 -lnls9 -lclient9 -lvsn9 -lwtc9 -lcommon9 -lgeneric9 -lnls9 -lcore9 -lnls9 -lcore9 -lnls9 -lxml9 -lcore9 -lunls9 -lnls9 `cat /opt/oracle/product/9.2.0/lib/sysliblist` -Wl,-rpath,/opt/oracle/product/9.2.0/lib:/lib:/usr/lib -lm `cat /opt/oracle/product/9.2.0/lib/sysliblist` -ldl -lm
  [oracle@localhost lib]$ ll bbed
  -rwxr-xr-x 1 oracle dba 301140 11月 17 15:18 bbed
  [oracle@localhost lib]$ bbed
  -bash: bbed: command not found
  [oracle@localhost lib]$ ./bbed
  Password:
   密码是blockedit
  BBED: Release 2.0.0.0.0 - Limited Production on Tue Nov 17 15:23:14 2009

  Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

  ************* !!! For Oracle Internal Use only !!! ***************

  BBED> help
  HELP [ | ALL ]

  BBED> help all
  SET DBA [ dba | file#, block# ]
  SET FILENAME 'filename'
  SET FILE file#
  SET BLOCK [+/-]block#
  SET OFFSET [ [+/-]byte offset | symbol | *symbol ]
  SET BLOCKSIZE bytes
  SET LIST[FILE] 'filename'
  SET WIDTH character_count
  SET COUNT bytes_to_display
  SET IBASE [ HEX | OCT | DEC ]
  SET OBASE [ HEX | OCT | DEC ]
  SET MODE [ BROWSE | EDIT ]
  SET SPOOL [ Y | N ]
  SHOW [ | ALL ]
  INFO
  MAP[/v] [ DBA | FILENAME | FILE | BLOCK ]
  DUMP[/v] [ DBA | FILENAME | FILE | BLOCK | OFFSET | COUNT ]
  PRINT[/x|d|u|o|c] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
  EXAMINE[/Nuf] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
  :
  N - a number which specifies a repeat count.
  u - a letter which specifies a unit size:
   b - b1, ub1 (byte)
   h - b2, ub2 (half-word)
   w - b4, ub4(word)
   r - Oracle table/index row
  f - a letter which specifies a display format:
   x - hexadecimal
   d - decimal
   u - unsigned decimal
   o - octal
   c - character (native)
   n - Oracle number
   t - Oracle date
   i - Oracle rowid
  FIND[/x|d|u|o|c] numeric/character string [ TOP | CURR ]
  COPY [ DBA | FILE | FILENAME | BLOCK ] TO [ DBA | FILE | FILENAME | BLOCK ]
  MODIFY[/x|d|u|o|c] numeric/character string
   [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
  ASSIGN[/x|d|u|o] =
   : [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
   : [ value | ]
  SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]
  PUSH [ DBA | FILE | FILENAME | BLOCK | OFFSET ]
  POP [ALL]
  REVERT [ DBA | FILE | FILENAME | BLOCK ]
  UNDO
  HELP [ | ALL ]
  VERIFY [ DBA | FILE | FILENAME | BLOCK ]
  CORRUPT [ DBA | FILE | FILENAME | BLOCK ]

  BBED>

传输表空间特性复制数据

移动表空间

概念:可跨平台移动的表空间:
简化数据仓库和数据集市之间的数据分发
允许从一个平台向另一个平台移植数据库
受支持的平台:
Solaris[tm] OE(32 位) HP-UX(64 位) Microsoft Windows IA(64 位)
Solaris[tm] OE(64 位) HP Tru64 UNIX 基于IBM zSeries 的Linux
Microsoft Windows IA(32 位) HP-UX IA(64 位)适用于AMD 的64 位Linux
Linux IA(32 位) Linux IA(64 位) Apple Mac OS
基于AIX 的系统(64 位) HP Open VMS Microsoft Windows for AMD(64 位)
Solaris 操作系统(x86)

移动表空间
可以使用可移动表空间功能跨平台移动数据。此功能简化了从数据仓库环境向数据集市
(数据集市通常在较小的平台上运行)分发数据的过程。此功能还允许通过重建字典并
移动用户表空间的方式,将数据库从一个平台移植到另一个平台。
为了能够将数据文件从一个平台移动到另一个平台,必须确保源系统和目标系统都在支持
的平台上运行。
注:可跨平台移动的表空间功能要求两个平台使用相同的字符集。

概念:最低兼容级别
源数据库和目标数据库都必须将COMPATIBLE
设置为10.0.0 或更高。
数据文件头可以识别平台。
在移动前,请确保所有只读文件和脱机文件可以
识别平台

概念:最低兼容级别
源数据库和目标数据库都需要先将其数据库COMPATIBLE 初始化参数提高到10.0.0 或
更高,才能使用可跨平台移动的表空间功能。
数据文件第一次在COMPATIBLE 设置为10.0.0(或更高)的Oracle Database 10g 中打
开时,这些文件将设置为可识别平台。这一点由图表中的对勾标记表示。每个文件都可以
确定其所属的平台。这些文件在磁盘上有相同的文件头块格式,这些格式用于文件标识
和验证。只读文件和脱机文件只有在变为读/写状态或变为联机之后才能提高其兼容性。
这意味着在Oracle Database 10g 版本之前的数据库中处于只读状态的表空间必须至少变为
读/写状态一次才能使用可跨平台移动的功能。

可移动表空间过程
将表空间置于只读状态。
使用数据泵提取元数据。

目标是否使用相同的endian 格式是
传送数据文件并将文件转储到目标。
使用数据泵导入元数据。
将表空间置于读/写状态。

目标是否使用相同的endian 格式否
使用RMAN
转换数据文件。

传送数据文件并将文件转储到目标。
使用数据泵导入元数据。
将表空间置于读/写状态。

可移动表空间过程
要将表空间从一个平台移动到另一个平台(源到目标),必须将表空间集内的数据文件转
换为目标数据库可以理解的格式。虽然使用Oracle Database 10g,磁盘结构符合通用格式,
但源平台和目标平台还是可能使用不同的endian 格式(字节顺序)。转至不同的endian
平台时,必须使用RMAN 实用程序的CONVERT 命令来转换字节顺序。可以在源平台或
目标平台上执行此操作。对于endian 格式相同的平台,则不需要转换。
幻灯片中的图形描述了从源平台向目标平台移动表空间可能用到的步骤。但是,也可以在
将文件传送到目标平台后执行转换。必须在目标平台上执行最后两步。
一般情况下,此过程与使用Oracle 数据库的旧发行版时相同,除非两个平台使用不同的
endian 格式。此处假定两个平台都支持跨平台移动。
注:读写数据时,字节顺序会影响结果。例如,2 个字节的整数值1 在big-endian 系统
(如Sun SPARC Solaris)上写为0x0001,而在little-endian 系统(如兼容Intel 的PC)
上写为0x0100。

确定平台的Endian 格式

SELECT tp.endian_format
FROM v$transportable_platform. tp,
v$database d
WHERE tp.platform_name = d.platform_name;

确定平台的Endian 格式
可以查询V$TRANSPORTABLE_PLATFORM. 来确定两个平台上的endian 顺序是否相同。
V$DATABASE 有两个列可以用于确定您自己的平台名称和平台标识符。
在两个平台上使用幻灯片中的查询,然后比较结果。在Sun SPARC Solaris 系统上,
SELECT 语句生成以下输出:
ENDIAN_FORMAT
————-
Big
在Microsoft Windows 基于Intel 的平台上,SELECT 语句生成以下输出:
ENDIAN_FORMAT
————-
Little

移动数据库
概述可移动表空间功能。
可以轻松地从数据仓库环境向数据集市(数据集市通常
在较小的平台上运行)分发数据。
数据库可以非常迅速地从一个平台移植到另一个平台。

移动数据库
在不同平台之间移动数据时,使用可移动表空间功能可以将移动速度加快许多。但仍然
需要卸载元数据,因为无法移动系统表空间。
数据库移动功能的目的是在endian 格式相同的不同平台之间轻松快捷地移动数据库。
但是,源平台和目标平台的磁盘对齐可以不同。例如,HP-UX 和Solaris 都是big endian
格式,但HP-UX 上的磁盘对齐为八,而在Solaris 上为四。
要从一个平台向另一个平台移动数据库,必须确保源系统和目标系统都运行于
V$TRANSPORTABLE_PLATFORM. 中列出的一个平台上,并且具有相同的endian 格式。
例如,可以将在Linux IA(32 位)上运行的数据库移动到一个Windows 平台上。
如果两个数据库中至少有一个使用自动存储管理(ASM),则可能需要使用
DBMS_FILE_TRANSFER 程序包来将文件上传到FTP。
此功能与可移动表空间不同,可移动表空间有一个可以插入数据的目标数据库,而此功能
将在目标平台上创建新的数据库。新创建的数据库中包含的数据与源数据库中相同。除了
数据库名、实例名和文件位置等,新数据库与源数据库的设置也相同。
注:移动数据库比使用“数据泵”移动数据更快。

数据库移动过程:源系统转换
在只读模式下打开数据库
并且COMPATIBLE=10.0.0

数据库移动过程:源系统转换
必须先在只读模式下打开数据库,才能移动该数据库。然后使用RMAN 转换数据库的必
要数据文件。
在源平台上执行转换时,新的RMAN 命令CONVERT DATABASE 将生成一个包含正确的
CREATE CONTROLFILE RESETLOGS 命令的脚本,此命令用于在目标系统上创建新数
据库。然后CONVERT DATABASE 命令将转换识别出的所有数据文件,以便这些文件可
以在目标系统上使用。接着,您需要将已转换的数据文件和生成的脚本传送到目标平台。
通过在目标平台上执行生成的脚本,可以创建数据库的新副本。
注:源数据库必须在COMPATIBLE 初始化参数设为10.0.0 或更高的条件下运行。
自COMPATIBLE 设置为10.0.0 或更高以来,识别出的所有表空间必须至少被读写一次。

数据库移动过程:目标系统转换
在只读模式下打开数据库
并且COMPATIBLE=10.0.0

数据库移动过程:目标系统转换
必须先在只读模式下打开数据库,才能移动该数据库。然后使用RMAN 转换数据库的必
要数据文件。
在目标平台上执行转换时,(在源系统上执行的)CONVERT DATABASE 命令只生成两个
脚本,用于在目标系统上转换数据文件以及重新创建新数据库的控制文件。然后,请将识
别出的数据文件和两个脚本都传送到目标平台。完成后,请按正确的顺序执行这两个脚本。
第一个脚本使用现有的CONVERT DATAFILE RMAN 命令来进行转换,第二个脚本随已
转换的数据文件一起发出CREATE CONTROLFILE RESETLOGS SQL 命令来创建新数
据库。
注:源数据库必须在COMPATIBLE 初始化参数设为10.0.0 或更高的条件下运行。
自COMPATIBLE 设置为10.0.0 或更高以来,识别出的所有表空间必须至少被读写一次。

数据库移动:注意事项
在目标平台上创建口令文件。
移动在源数据库中使用的BFILE。
生成的pfile 和移动脚本使用OMF。
使用DBNEWID 来更改DBID。

数据库移动:注意事项
不会移动重做日志、控制文件和临时文件。将在目标平台上为新数据库重新创建这些
文件。因此,目标平台上的新数据库必须用RESETLOGS 选项打开。
使用口令文件时,不会移动该文件,需要您在目标平台上创建该文件。这是因为口令
文件支持的文件名类型是特定于操作系统的。但是,CONVERT DATABASE 命令的输出
将列出所有用户名及其系统权限,并且建议在目标平台上重新创建口令文件并为这些
用户添加条目。
CONVERT DATABASE 命令列出源数据库中的所有目录对象以及使用BFILE 数据类型
或外部表的对象。可能需要用新的目录名和文件名来更新这些对象。如果在数据库中
使用了BFILE,则必须移动BFILE。
生成的pfile 和移动脚本将Oracle Managed Files (OMF) 用于数据库文件。如果不想使用
OMF,则必须修改pfile 和移动脚本。
移动的数据库与源数据库具有相同的DBID。可以使用DBNEWID 实用程序来更改DBID。
在移动脚本以及CONVERT DATABASE 命令的输出中,系统将提示您使用DBNEWID
实用程序来更改数据库ID。

下面的使用参数说明来自网络
http://tech.it168.com/db/2007-12-19/200712191131170.shtml
对于oracle10g的可传输表空间特性而言,我觉着最另人兴奋的就是跨平台的传输了(尽管仍非所有平台都支持)。这意味着一旦数据库涉及到操作系统平台的变更,再不用像之前那样通过exp/imp这类慢的要死的应用来操作了。更加值的庆幸的是,转换这个操作并不复杂,归根结底,它只是一个命令(挠头,难道真的只有一个吗,不像oracle风格啊,oracle一向是喜欢出选择题的),是的,只有一个--CONVERT。
CONVERT是RMAN中提供的一个命令,专门用于进行字节顺序转换的解决方案,其语法如图所示:

由上图可见,CONVERT命令可以转换数据文件、表空间甚至整个数据库的字节顺序,
l CONVERT TABLESPACE:用于在源库转换指定表空间的数据文件(第3步执行)。
l CONVERT DATAFILE:用于在目标库转换数据文件到目标平台(第4步执行)。
l CONVERT DATABASE:用于从源平台转换及传输整个数据库到目标平台,并确保创建需要的数据文件,视你的需求即可以在源库执行也可以在目标库执行。

CONVERT DATAFILE和CONVERT TABLESPACE还可用于操作ASM(Automatic Storage Management自动存储管理)文件的移入移出,这项功能用处极大,因为众所周知通常操作系统的命令例如Unix系统的cp或Windows系统的copy等命令是不能直接读写ASM中文件。要想操作ASM中文件,只有RMAN,这可是真正的华山一条路,舍它其谁。

没有CONVERT是不行的,但是CONVERT也不是万能的。
1、对于CONVERT DATAFILE, CONVERT TABLESPACE以及CONVERT DATABASE的所有应用,需要注意:
l CONVERT操作并不会改变源文件,转换操作也并不是在本地完成,而是直接写入目的地。
l 源库和目标库的初始化参数中COMPATIBLE参数至少被设置为10.0
l 在10g之前,CLOB字段做为变长字符集创建,CONVERT命令并不会转换这些列,而直接将其传输到目标库。直到后续有读取操作时,自动将其转换为目标字节顺序格式并保存。10g之后CLOB列的字符集被设置为AL16UTF16,完全平台无关,所以就更加不用考虑了。
l CONVERT命令并不会转换用户自定义的数据类型。如果你希望在数据库之间传输平台指定格式的映射对象,应该调用Data Pump。
l 在传输到其它平台之前,要传输的表空间至少要被置为read-write状态一次(为什么因为数据文件的文件头必须能够识别其所属的原平台是什么)。因此对于那些read-only的待传输表空间,你必须先将其置为read-write,然后再置为read-only。

2、对于CONVERT DATAFILE和CONVERT TABLESPACE操作的一些注意事项:
l 如果在源库平台操作,必须使用CONVERT TABLESPACE… TO PLATFORM,不能使用CONVERT DATAFILE转换个别数据文件。而如果是在目标库平台操作,则必须使用CONVERT DATAFILE… FROM PLATFORM… TO PLATFORM而不能用CONVERT TABLESPACE。因为目标库还没有表空间的信息,自然也找到其对应的数据文件。
l FORMAT和DB_FILE_NAME_CONVERT参数可以同时使用,也可以都不使用,如果两个参数都不使用的话,目标平台中的文件路径会默认引用源平台中的路径。
l 并非所有的平台都支持CONVERT,通过查询V$TRANSPORTABLE_PLATFORM视图确认所操作的平台是否支持CONVERT命令。要跨平台的传输表空间必须源和目标平台都在视图中的平台列表才可以。
l 由于操作系统命令不支持直接操作文件到ASM,你可以通过CONVERT TABLESPACE或CONVERT DATAFILE移动文件到ASM中即使不涉及endian format的转换。使用CONVERT命令可以提供与操作系统的copy操作等同的功能,所不同的是CONVERT操作的是ASM。

3、对于CONVERT DATABASE的操作,除了上述第1条中的限制外,还有些其它的注意事项:
对于传输整个数据库而言最主要的一个限制是源平台和目标平台必须拥有相同的endian format(只能有限跨平台了)。例如,你可以从Windows系统传输数据库到Linux x86系统,或者从HP-UX到AIX,但是如果你想从Solaris传输整个数据库到Linux x86的话就不能应用这项特性了。当然如果必须在这种情况下传输的话,可以选择手工建库,然后通过CONVERT TABLESPACE或CONVERT DATAFILE命令传输。

提示:事实上,即使源平台和目标平台的endian formats完全相同,对于CONVERT DATABASE命令而言也仍然需要转换的过程。这主要是为了保证各种类型,比如回滚段等都被重新格式以确保与目标平台的兼容性。

下面是些其它方面不支持直接使用的限制:
l 控制文件和Redo log文件不会被传输。目标平台的控制文件和redo logs会在传输过程中自动创建,并且目标库建立后以open resetlogs方式打开新数据库。
提示:由于目标库的控制文件是在传输过程中创建,源库中的RMAN备份信息并不会被生成到新库中(即使有)。
l BFILE类型对应的文件不会被传输。不过RMAN在执行CONVERT DATABASE时会将引用BFILE类型的对象输出一个列表,用户可以根据列表手工操作BFILE的文件到目标平台。
l 本地管理的临时表空间数据文件不会被传输,而在传输过程中自动重建。
l 外部表以及Directories不会被传输。与BFILE一样,RMAN也会提供一个列表供你手工操作时参考。
l 密码文件不会被传输。不过RMAN也会在执行CONVERT DATABASE命令时输出用户以及其对应的权限,你可以对照输出手工创建新的密码文件。

CONVERT命令的参数并不多,而且也都比较容易理解,不再一一详细介绍,后面我们通过具体示例演示来辅助理解。
一、使用CONVERT TABLESPACE
前面提到,CONVERT TABLESPACE必须在源平台执行,用于转换表空间的endian format到目标平台,通常的调用形式是:

RMAN> CONVERT TABLESPACE ts_1, ts_2...
TO PLATFORM. 'platform_name';

并且可以在命令中指定FORMAT或DB_FILE_NAME_CONVERT参数来设置转换后数据文件的命名规则,PARALLELISM参数指定转换的并行度(用于提高转换效率的,有点类似rman备份恢复中的通道数概念)。例如:

RMAN> CONVERT TABLESPACE jssweb
TO PLATFORM. 'Linux IA (32-bit)'
db_file_name_convert 'E:\ora10g\oradata\jssweb','e:\oratmp\oradata'
PARALLELISM 3;

注意示例中的PARALLELISM参数,如果该参数值设置的不合理,有可能适得其反,花费的时间反而更长,一般而言,推荐并行度大小不要超过要转换的数据文件的数量。

另外对于FORMAT和DB_FILE_NAME_CONVERT参数前面介绍中也提到了,两个参数可以同时指定,如果同时指定了两个参数,则rman会以FORMAT参数的设定为准。如果两个参数都未指定的话,rman就会按照它自己的规则生成文件。具体规则呢这里就不描述了,总之就是数字和字母组合,如果你决定按照它的规则命令文件,那么我至少能确认一件事—单看文件名,你已经不能分辩这个文件是干嘛的了。

二、使用CONVERT DATAFILE
CONVERT DATAFILE则是必须在目标平台执行,用于转换指定数据文件到指定的endian format.通常的调用形式如下:

RMAN> CONVERT DATAFILE datafile_1, datafile_2...
FROM PLATFORM. 'platform_name';

可以通过指定TO PLATFORM参数设定转换到的字节顺序,如果不指定该参数,默认转换到当前平台。不过FROM PLATFORM参数的值必须是与其对应的源平台,不然convert可能会出错。同样CONVERT DATAFILE也可以指定FORMAT,DB_FILE_NAME_CONVERT,PARALLELISM等参数,如例:

RMAN> CONVERT DATAFILE
2> 'E:\ora10g\oradata\jssweb\jssweb1.dbf',
3> 'E:\ora10g\oradata\jssweb\jssweb2.dbf'
5> TO PLATFORM="Linux IA (32-bit)"
6> FROM PLATFORM="Microsoft Windows IA (32-bit)"
7> DB_FILE_NAME_CONVERT=
8> "E:\ora10g\oradata", "/opt/oar10g/oradata";

这些参数的功能的格式与CONVERT TABLESPACE中介绍的完全一致,这里就不多废话了。

三、使用CONVERT DATABASE
假设源平台与目标平台拥有相同的字节顺序,RMAN能够自动处理大多数在目标平台创建新库的操作。CONVERT DATABASE 传输数据库到新平台需要一个较长的过程,主要包含下面一些部分:

1、准备工作:使用DBMS_TDB包。
DMBS_TDB包提供了两个非常有用的函数:
提示:建议将SERVEROUTPUT设置为ON,以便能够查看到函数执行过程的输出。
l DBMS_TDB.CHECK_DB检查数据库状态
此函数检查数据库是否能被传输到目标平台以及数据库当前状态是否能够进行传输操作。拥有下列几个可选参数:
target_platform_name:目标平台的名称,可以通过V$DB_TRANSPORTABLE_PLATFORM视图查询获得。此参数并非必选,但如果你指定了skip_option参数,则本参数也必须指定。忽略此参数,则默认目标平台与源平台相同,
skip_option:非必选参数,指定待传输的数据库要跳过检查的选项(如果有)。支持字符或数值调用。
DBMS_TDB.SKIP_NONE或0:检查所有表空间
DBMS_TDB.SKIP_OFFLINE或2:跳过offline表空间的数据文件
DBMS_TDB.SKIP_READONLY或3:跳过read-only表空间的数据文件
例如:
提示:执行前先将数据库置为read-only模式。

SQL> set serveroutput on
SQL> declare
2 db_ready boolean;
3 begin
4 db_ready := dbms_tdb.check_db('Microsoft Windows IA (32-bit)', 2);
5 if (db_ready) then
6 dbms_output.put_line('True');
7 else
8 dbms_output.put_line('False');
9 end if;
10 end;
11 /
Database is not open in READ-ONLY mode. Open the database in READ-ONLY mode and retry.
False

如果数据库可被传输,DBMS_TDB.CHECK_DB会返回true,否则返回false,如果执行结果返回false,会自动输出数据库不能够传输的原因(如果SERVEROUTPUT被置为on的话),下表是一些可能遇到的问题以及解决方案:

提示信息
解决方案
Unrecognized target platform. name.
不能识别目标平台的名称
检查V$DB_TRANSPORTABLE_PLATFORM视图,确实目标平台在视图列表中,或者,你没敲错字母。
Target platform. has a different endian format.
目标平台拥有不同的字节顺序,不能被CONVERT DATABASE所支持,死了这条心吧。
Database is not open read-only.
源库未被以read only模式打开,shutdown了重开一遍再试试。
There are active or in-doubt transactions in the database.
源库存在活动事务,回滚或解决该事务然后打开数据库到read-only模式再重试。
Deferred transaction rollback needs to be done.
源库有未完成的延期事务,以正常模式打开数据库完成它,然后再read only模式打开数据库重试
Database compatibility version is below 10.
源库初始化参数中COMPATIBLE参数低于10,修改该参数,重启数据库到read only后重试
Some tablespaces have not been open read-write with compatibility version is 10 or higher.
源库初始化参数中COMPATIBLE参数修改后,表空间尚未被置为read-write过,还记得我们前面说过的吗表空间至少要被置为read-write一次。

在serveroutput被置为on的情况下,如果DBMS_TDB.CHECK_DB执行后除了pl/sql成功执行外没有其它输出信息,说明数据库状态正常,支持传输操作。

l DBMS_TDB.CHECK_EXTERNAL确认外部对象
必须使用DBMS_TDB.CHECK_EXTERNAL函数来检查是否存在外部表,directories或Bfiles,因为RMAN的CONVERT命令不能自动传输这些对象。DBMS_TDB.CHECK_EXTERNAL函数没有参数,直接执行即可。例如:

SQL> set serveroutput on
SQL> declare
2 external boolean;
3 begin
4 external := dbms_tdb.check_external;
5 end;
6 /
The following directories exist in the database:
SYS.DATA_PUMP_DIR

如果没有任何外部的对象,除了pl/sql成功执行外不会有其它输出信息,但一旦有输出信息,如上例中所示的你就需要注意,最好记录下来,当传输完成之后,根据需要手工创建这些对象到目标数据库中。听明白了吧,本函数成功执行与否并不会影响传输操作,这个函数说白了就是给你列个单儿,然后告诉你单子上有的这些它都不负责传送,如果确实需要那你就得自个干。

2、转换数据库
前面就已经提到过,转换操作即可以在源平台执行也可以在目标平台执行,并且我们推荐转换操作在目标平台执行,对于CONVERT DATABASE而言,源平台执行和目标平台执行还是有些区别,具体操作的时候还得根据实据情况做选择,下面分别说明:
对于在源平台执行转换操作而言,通常步骤如下:
启动数据库到read only模式。
DBMS_TDB.CHECK_DB检查数据库是否可被传输
DBMS_TDB.CHECK_EXTERNAL检查外部对象
执行CONVERT DATABASE命令,例如:

RMAN> convert database new database 'jsstts'
2> transport script. 'e:\oratmp\script\ts.sql'
3> to platform. 'Linux IA (32-bit)'
4> db_file_name_convert 'E:\ora10g\oradata\jssweb' 'e:\oratmp\oradata';

得到下列文件:
转换后的数据文件:已转换的待传输文件,本例中保存至:e:\oratmp\oradata’,文件名与源库中相同。
transport script:在目标平台执行的创建数据库的脚本,本例中名为ts.sql,该文件内容仅供参考,你需要再根据实际情况修改其中的参数值。
客户端初始化参数文件:文件名及路径包含在CONVERT DATABASE的输出内容中,在输出结果的最后。文件中的参数值多继承自源库,你可以根据需要进行适当修改。
转换完成(此时可将源库置为read-write了),然后将文件复制到目标数据库,在目标平台执行transport script,创建数据库即可。注意,如果前一步操作生成的文件复制到目标平台后路径发生修改,务必修改transport script文件中对应的参数值。

对于在目标平台执行转换操作:
前面的准备工作与在源平台进行转换操作是一样的,所不同的仅仅只是执行CONVERT DATABASE命令时调用的参数,如例:

RMAN> convert database on target platform
2> convert script. 'e:\oratmp\script\cs.rman'
3> transport script. 'e:\oratmp\script\ts.sql'
4> new database 'jsstts'
5> db_file_name_convert 'E:\ora10g\oradata\jssweb' 'e:\oratmp\oradata';

得到下列文件:
convert script:在目标平台执行的转换数据文件的脚本(实际内容就是前面讲到的convert datafile命令,不过这个是convert database命令自动生成的)。
transport script:在目标平台执行的创建数据库的脚本,本例中名为ts.sql,该文件内容仅供参考,你需要再根据实际情况修改其中的参数值。
客户端初始化参数文件:文件名及路径包含在CONVERT DATABASE的输出内容中,在输出结果的最后。文件中的参数值多继承自源库,你可以根据需要进行适当修改。

你大概也注意到了,此时并未生成数据文件,这是因为转换操作将在目标平台执行,所以你直接将源平台中的数据文件复制到目标平台即可。然后即可将源库置为read-write状态了。

远程客户端连接数据库时提示TNS-12541: TNS: 无监听程序

在windows环境下监听程序和本地服务文件配置如下

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
  )

ocp =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST =localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ocp)
    )
  )

当在远程机器上使用tnsping ocp是会报TNS-12541: TNS: 无监听程序

D:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora

已使用 TNSNAMES 适配器来解析别名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = 10.138.135.114)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = ocp)))
TNS-12541: TNS: 无监听程序
原因在于当host=localhost或127.0.0.1时在远程客户端使用tnsping ocp时会解释成
ip加服务名比如:10.138.135.114:1521/ocp但当在监听程序中配置为localhost或
127.0.0.1时当远程连接时解释服务名时就不能映射到真正的ip所以远程连接时就会报
TNS-12541: TNS: 无监听程序 所以配置监听程序和本地服务文件时host这个参数最好使用真实的ip或机器名

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.138.135.114)(PORT = 1521))
    )
  )

ocp =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST =10.138.135.114)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ocp)
    )
  )
  

使用exp/imp来移动表空间到另一个数据库中的例子

exp/imp还有一个TRANSPORT_TABLESPACE的功能,可以传输整个表空间的数据,就是把一个数据库上的数据文件加到另外一个数据库中,而不是把数据导出成Dmp文件。用这个传输还有一定的限制:

关于传输表空间有一些规则,即:
·源数据库和目标数据库必须运行在相同的硬件平台上。
·源数据库与目标数据库必须使用相同的字符集。
·源数据库与目标数据库一定要有相同大小的数据块
·目标数据库不能有与迁移表空间同名的表空间
·SYS的对象不能迁移
·必须传输自包含的对象集
·有一些对象,如物化视图,基于函数的索引等不能被传输

可以用以下的方法来检测一个表空间或一套表空间是否符合传输标准:

exec sys.dbms_tts.transport_set_check('tablespace_name',true);
select * from sys.transport_set_violation;

如果没有行选择,表示该表空间只包含表数据,可以传输。

其步骤:
1. 源数据库表空间设为只读:

alter tablespace hygeia read only;

2. 发出exp命令,用户必须是sysdba:

C:\Documents and Settings\Administrator>exp 'sys/ocp as sysdba' transport_tables
pace=y tablespaces=hygeia file=d:\oracle\hygeia.dmp log=d:\oracle\hygeia.log

3.将导出文件hygeia.dmp和表空间hygeia的数据文件hygeia01.dbf和hygeia02.dbf拷贝到目标机器上
4. 源数据库表空间设为可读写:

alter tablespace hygeia read write;

如果在修改表空间为读写后再复制数据文件和导出的dmp文件到目标数据库那么在执行imp导入时会报

IMP-00003:遇到ORACLE错误19722
ORA-19722:数据文件D:\oracle\hygeia版本错误
ORA-06512:在"SYS.DBMS_PLUGTS", line 2065
ORA-06512:在line 1
IMP-00000:未成功终止导入

5.在目数据库中创建一个hygeia用户不用指定缺省表空间

Create User insur_changde Identified By "changde"

6. 目标数据库imp文件:

C:\Documents and Settings\Administrator>imp 'sys/ocp as sysdba' file=d:\hygeia.d
mp  transport_tablespace=y tablespaces=hygeia datafiles=('D:\oracle\product\10.2
.0\oradata\ocp\HYGEIA01.DBF','D:\oracle\product\10.2.0\oradata\ocp\HYGEIA02.DBF'
)

7.修改目标数据库中insur_changde用户的缺省表空间为hygeia

Alter User insur_changde Default Tablespace hygeia

8. 目标数据库表hygeia空间设为可读写:

alter tablespace users read write;