暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

Oracle之数据文件和临时文件管理

原创 周波 2023-03-12
1511

一、数据文件管理指南

1.数据文件介绍

  数据文件是操作系统的物理文件,用于存储数据库中所有逻辑结构的数据。
  oracle数据库为每个数据文件分配两个相关的文件号,一个绝对文件号和一个相对文件号,用于唯一地标识它。

  • 绝对文件号:
    唯一标识数据库中的数据文件。这个文件号可以在许多引用数据文件的SQL语句中使用,用于替代文件名。绝对文件号可以在VDATAFILE或VTEMPFILE视图的file#列中找到,或者在DBA_DATA_FILES或DBA_TEMP_FILES视图的FILE_ID列中找到。

  • 相对文件号:
    唯一标识表空间内的数据文件。对于中小型数据库,相对文件号通常与绝对文件号具有相同的值。但是,当数据库中的数据文件数量超过阈值(通常为1023)时,相对文件号与绝对文件号不同。在大文件表空间中,相对文件号总是1024(在OS/390平台上是4096)。

2.确定数据文件的数量

(1)关于如何确认数据文件的数量

  数据库的SYSTEM和SYSAUX表空间至少需要一个数据文件。您的数据库应该包含几个其他表空间及其相关的数据文件或临时文件。
  请注意,您的操作系统可能会限制Oracle数据库中包含的数据文件的数量。

(2)确定DB_FILES初始化参数的值

  当启动Oracle数据库实例时,DB_FILES初始化参数表示为数据文件信息保留的SGA空间量,因此,可以为该实例创建的数据文件的最大数量。
  此限制适用于实例的生命周期。您可以更改DB_FILES的值(通过更改初始化参数设置),但是在关闭并重新启动实例之前,新值不会生效。

在确定DB_FILES的值时,需要考虑以下因素:

  • 如果DB_FILES值过低,在不关闭数据库的情况下,不能添加超出DB_FILES限制的数据文件。
  • 如果DB_FILES的值过高,会造成不必要的内存消耗。
(3)当向表空间添加数据文件时,考虑可能的限制

您可以向传统的小文件表空间中添加数据文件,但有以下限制:

  • 操作系统通常对进程可以同时打开的文件数量施加限制。当达到操作系统打开文件数限制时,无法创建更多数据文件。
  • 操作系统对数据文件的数量和大小有限制。
  • 数据库对任意实例打开的任何Oracle数据库的数据文件数量施加最大限制。这个限制是特定于操作系统的。
  • 不能超过DB_FILES初始化参数指定的数据文件数量。
  • 当您发出CREATE DATABASE或CREATE CONTROLFILE语句时,MAXDATAFILES参数指定控制文件的数据文件部分的初始大小。但是,如果您试图添加一个新文件,其数量大于MAXDATAFILES,但小于或等于DB_FILES,控制文件将自动扩展,以便数据文件部分可以容纳更多的文件。
(4)考虑数据文件数量对性能的影响

  表空间中包含的数据文件的数量,以及数据库本身,都会对性能产生影响。
  Oracle数据库允许数据库中的数据文件超过操作系统定义的限制。数据库DBWn进程可以打开所有在线数据文件。Oracle 数据库能够将打开的文件描述符视为缓存,当打开的文件描述符数量达到操作系统定义的限制时自动关闭文件。这可能会对性能产生负面影响。如果可能,请调整操作系统对打开的文件描述符的限制,使其大于数据库中联机数据文件的数量。

3.确定数据文件的大小

  在创建表空间时,应该估计数据库对象的潜在大小,并创建足够的数据文件。
  稍后,如果需要,您可以创建额外的数据文件,并将它们添加到表空间中,以增加分配给表空间的磁盘空间总量,从而增加数据库。最好将数据文件放在多个设备上,以确保数据均匀地分布在所有设备上。

4.将数据文件放置于合适的位置

  表空间位置由构成该表空间的数据文件的物理位置决定。适当使用计算机的硬件资源。
  例如,如果有多个磁盘驱动器可用来存储数据库,那么可以考虑将可能存在竞争的数据文件放在不同的磁盘上。这样,当用户查询信息时,两个磁盘驱动器可以同时工作,同时检索数据。

5.数据文件与重做日志文件分开存放

  数据文件不应该与数据库重做日志文件存储在同一个磁盘驱动器上。如果数据文件和重做日志文件存储在同一个磁盘驱动器上,而该磁盘驱动器发生故障,则不能在数据库恢复过程中使用这些文件。
  如果你复用你的重做日志文件,那么丢失所有重做日志文件的可能性很低,所以你可以把数据文件和一些重做日志文件存储在同一个驱动器上。

二、创建数据文件并向表空间中添加数据文件

  在所有情况下,您都可以为正在创建的数据文件指定文件规范,也可以使用Oracle Managed files特性创建由数据库服务器创建和管理的文件。

SQL Statement Description
CREATE TABLESPACE 创建一个表空间和组成它的数据文件
CREATE TEMPORARY TABLESPACE 创建一个本地管理的临时表空间和组成它的tempfile(临时文件是一种特殊类型的数据文件)
ALTER TABLESPACE … ADD DATAFILE 创建数据文件并将其添加到表空间
ALTER TABLESPACE … ADD TEMPFILE 创建临时文件并将其添加到临时表空间
CREATE DATABASE 创建数据库及与其相关的数据文件
ALTER DATABASE … CREATE DATAFILE 创建一个新的空数据文件来代替旧的数据文件——这对于重新创建没有备份而丢失的数据文件很有用。

  如果您向表空间添加新的数据文件,但没有完全指定文件名,数据库将在默认数据库目录或当前目录中创建数据文件,具体取决于您的操作系统。Oracle建议始终为数据文件指定一个完全限定的名称。除非您想重用现有文件,否则请确保新文件名不会与其他文件冲突。以前删除的旧文件将被覆盖。

  如果创建数据文件的语句失败,数据库将删除所有已创建的操作系统文件。但是,由于文件系统和存储子系统可能会出现大量潜在错误,因此可能会出现必须使用操作系统命令手动删除文件的情况。

三、修改数据文件的可用性

1.关于修改数据文件可用性

  您可以通过使单个数据文件或临时文件脱机或联机来更改它们的可用性。
脱机数据文件对数据库不可用,并且在恢复联机之前不能访问它们。

更改数据文件可用性的原因包括:

  • 您需要对数据文件执行脱机备份。
  • 重命名或重新定位脱机数据文件。您可以先使数据文件脱机或使表空间脱机。
  • 数据库写入数据文件时出现问题,并自动使数据文件脱机。解决问题后,可以手动使数据文件联机。
  • 数据文件丢失或损坏。在打开数据库之前,必须使其脱机。

  只读表空间的数据文件可以脱机或联机,但联机不影响该表空间的只读状态。只有当表空间恢复到读写状态后,才可以对数据文件进行写入操作。

说明通过使表空间本身脱机,可以使表空间的所有数据文件暂时不可用。你必须把这些文件留在表空间中,以使表空间重新联机。

  要使数据文件脱机或联机,必须具有ALTER DATABASE系统权限。要使用ALTER TABLESPACE语句使所有数据文件或临时文件脱机,必须具有ALTER TABLESPACE或MANAGE TABLESPACE系统权限。在Oracle Real Application Clusters环境中,数据库必须以独占模式打开。

2.在ARCHIVELOG模式下使数据文件联机或脱机

# 1.下面的语句使指定的数据文件脱机:
## 数据字典视图dba_data_files的online_status列可以查看数据文件的联机状态
ZB@orcl> alter database datafile '/u01/app/oracle/oradata/orcl/tbs16k.dbf' offline;
Database altered.

## 查看验证
ZB@orcl> col file_name for a40
ZB@orcl> select file_name,online_status from dba_data_files where file_id = 14;
FILE_NAME				 ONLINE_
---------------------------------------- -------
/u01/app/oracle/oradata/orcl/tbs16k.dbf  RECOVER

## 发现该数据文件的联机状态为recover,所以在将其联机之前需要对数据文件进行介质恢复

# 2.介质恢复
ZB@orcl> recover datafile '/u01/app/oracle/oradata/orcl/tbs16k.dbf';
Media recovery complete.

## 查看数据文件的状态
ZB@orcl> select file_name,online_status from dba_data_files where file_id = 14;
FILE_NAME				 ONLINE_
---------------------------------------- -------
/u01/app/oracle/oradata/orcl/tbs16k.dbf  OFFLINE

# 3.使数据文件联机
ZB@orcl> alter database datafile '/u01/app/oracle/oradata/orcl/tbs16k.dbf' online;
Database altered.

说明要使用这种形式的ALTER DATABASE语句,数据库必须处于ARCHIVELOG模式。这个要求可以防止您意外地丢失数据文件,因为在NOARCHIVELOG模式下使数据文件脱机可能会导致丢失文件。

3.在NOARCHIVELOG模式使数据文件脱机和联机

  当数据库处于NOARCHIVELOG模式时,要使数据文件脱机,可以使用带有DATAFILE和offline FOR DROP子句的ALTER database语句。
  OFFLINE关键字使数据库将数据文件标记为OFFLINE,无论它是否已损坏,以便您可以打开数据库。
  FOR DROP 关键字标记数据文件以供后续删除。

# 0.查看数据库的归档状态,如果不是NOARCHIVELOG,请将其设置为NOARCHIVELOG状态
SYS@mynewdb> select log_mode from v$database;
LOG_MODE
------------
NOARCHIVELOG


# 1.使数据文件脱机
SYS@mynewdb> alter database datafile 5 offline for drop;
Database altered.

## 查看数据文件状态
SYS@mynewdb> select file_id,file_name,tablespace_name,online_status,status  from dba_data_files where file_id = 5;

   FILE_ID
----------
FILE_NAME
----------------------------------------------------------------------------------------------------
TABLESPACE_NAME 	       ONLINE_ STATUS
------------------------------ ------- ---------
	 5
/u01/app/oracle/oradata/mynewdb/test_tbs.dbf
TEST_TBS		       RECOVER AVAILABLE

## 发现数据文件的online_status 为recover,所以在其联机之前,需要介质恢复

# 2.介质恢复
SYS@mynewdb> recover datafile 5;
Media recovery complete.

# 3.使数据文件联机
SYS@mynewdb> alter database datafile 5 online;
Database altered.

说明这个操作实际上并没有删除数据文件。它保留在数据字典中,您必须自己使用以下方法之一删除它:

  • ALTER TABLESPACE … DROP DATAFILE语句
    在OFFLINE FOR DROP之后,此方法仅适用于字典管理的表空间。

  • DROP TABLESPACE … INCLUDING CONTENTS AND DATAFILES语句

SYS@mynewdb> drop tablespace test_tbs including contents and datafiles;
Tablespace dropped.

  如果前面的方法失败了,可以使用操作系统命令删除数据文件。这是最不可取的方法,因为它在数据字典和控制文件中留下了数据文件的引用。

4.修改表空间中所有数据文件或临时文件的可用性

  ALTER TABLESPACE语句的子句允许您更改表空间内所有数据文件或临时文件的联机或脱机状态。

  • ALTER TABLESPACE … DATAFILE {ONLINE|OFFLINE}
  • ALTER TABLESPACE … TEMPFILE {ONLINE|OFFLINE}

  您只需要输入表空间名称,而不需要输入单个数据文件或临时文件。所有数据文件或临时文件都会受到影响,但表空间本身的联机/脱机状态不会改变。
  在大多数情况下,只要挂载数据库,即使数据库没有打开,也可以发出上述ALTER TABLESPACE语句。但是,如果表空间是SYSTEM表空间、undo表空间或默认的临时表空间,则不能打开数据库。ALTER DATABASE DATAFILE和ALTER DATABASE TEMPFILE语句也有ONLINE/OFFLINE子句,但是在这些语句中必须输入表空间的所有文件名。
  ALTER TABLESPACE语句使数据文件和表空间脱机,但不能用来改变临时表空间或其临时文件的状态。

五、重命名和重定位数据文件

1.重命名和重新定位联机数据文件

  您可以使用ALTER DATABASE MOVE DATAFILE SQL语句重命名或重新定位联机数据文件。此语句允许您在数据库打开且用户正在访问数据文件时重命名或重新定位数据文件。
  对联机数据文件进行重命名或重定位时,数据库控制文件中记录的指向数据文件的指针会发生变化。这些文件还会在操作系统级别上进行物理重命名或重新定位。

您可能会重命名或重新定位联机数据文件,因为您希望在执行以下任务之一时允许用户访问数据文件:

  • 将数据文件从一种存储类型移动到另一种存储类型
  • 将不经常访问的数据文件转移到成本较低的存储空间
  • 将表空间设置为只读,并将其数据文件移动到只写一次的存储
  • 将数据库移动到Oracle自动存储管理(ASM)

  当您运行ALTER DATABASE MOVE DATAFILE语句并且目标位置中存在同名文件时,您可以指定REUSE 选项来覆盖现有文件。如果没有指定REUSE,并且目标位置中存在同名文件,则不会覆盖现有文件,并且该语句将返回错误。
  默认情况下,当您运行ALTER DATABASE MOVE DATAFILE语句并为数据文件指定新位置时,该语句将移动数据文件。但是,您可以指定KEEP选项以将数据文件保留在旧位置并将其复制到新位置。在这种情况下,当语句成功完成时,数据库只使用新位置中的数据文件。
  当您使用ALTER DATABASE MOVE DATAFILE语句重命名或重新定位数据文件时,Oracle数据库在执行该操作时创建一个数据文件的副本。在操作过程中,请确保有足够的磁盘空间存放原始数据文件和副本数据文件。
  通过查询DBA_DATA_FILES视图,可以查看每个数据文件的名称、位置和在线状态。

SYS@mynewdb> select file_name,online_status from dba_data_files;

FILE_NAME					   ONLINE_
-------------------------------------------------- -------
/u01/app/oracle/oradata/mynewdb/system01.dbf	   SYSTEM
/u01/app/oracle/oradata/mynewdb/sysaux01.dbf	   ONLINE
/u01/app/oracle/oradata/mynewdb/undotbs01.dbf	   ONLINE
/u01/app/oracle/oradata/mynewdb/users01.dbf	   ONLINE

说明

  • 如果指定的数据文件脱机,ALTER DATABASE MOVE DATAFILE语句将引发错误。
  • 如果使用备用数据库,则可以在主数据库和备用数据库(物理或逻辑数据库)上独立执行联机移动数据文件操作。当数据文件在主服务器上移动时,备用服务器不受影响,反之亦然。
  • 闪回操作不会将已经移动的数据文件重新定位到以前的位置。如果联机将数据文件从一个位置移动到另一个位置,然后将数据库闪回到移动之前的时间点,则数据文件仍保留在新位置,但数据文件的内容将更改为闪回中指定的时间点的内容。
  • 当您在Windows平台上重新定位数据文件时,原始数据文件可能会保留在旧位置,即使省略了KEEP选项。在这种情况下,当语句成功完成时,数据库只使用新位置中的数据文件。如有需要,可在操作完成后手动删除旧数据文件。
# 1.重命名联机数据文件
## 本例将数据文件tbs16k.dbf重命名为tbs16k_1.dbf,同时将数据文件保持在相同的位置。
SYS@orcl> alter database move datafile '/u01/app/oracle/oradata/orcl/tbs16k.dbf' to '/u01/app/oracle/oradata/orcl/tbs16k_1.dbf';
Database altered.

# 2.重新定位联机数据文件
## 这个例子将数据文件tbs16k_1.dbf从“/u01/app/oracle/oradata/orcl/”目录下移到“/u01/app/oracle/oradata/”目录下。
## 操作完成后,“/u01/app/oracle/oradata/orcl/”目录下不再有该文件。
SYS@orcl> alter database move datafile '/u01/app/oracle/oradata/orcl/tbs16k_1.dbf' to '/u01/app/oracle/oradata/tbs16k_1.dbf';
Database altered.

## 将该文件移动到原来的位置,操作省略

# 3.复制联机数据文件(keep)
## 这个例子将数据文件tbs16k_1.dbf从“/u01/app/oracle/oradata/orcl/”目录下复制到“/u01/app/oracle/oradata/”目录下。
## 操作完成后,“/u01/app/oracle/oradata/orcl/”目录下会保留旧文件。
SYS@orcl> alter database move datafile '/u01/app/oracle/oradata/orcl/tbs16k_1.dbf' to '/u01/app/oracle/oradata/tbs16k_1.dbf' keep;
Database altered.

# 4.重新定位联机数据文件并覆盖已有文件(reuse)
ALTER DATABASE MOVE DATAFILE '/u01/oracle/rbdb1/user1.dbf' 
  TO '/u02/oracle/rbdb1/user1.dbf' REUSE;
  
# 5.将联机数据文件重定位到ASM  
ALTER DATABASE MOVE DATAFILE '/u01/oracle/rbdb1/user1.dbf' 
  TO '+dgroup_01/data/orcl/datafile/user1.dbf';

# 6.将文件从一个ASM位置移动到另一个ASM位置
ALTER DATABASE MOVE DATAFILE '+dgroup_01/data/orcl/datafile/user1.dbf' 
  TO '+dgroup_02/data/orcl/datafile/user1.dbf';

2.重命名和重新定位脱机数据文件

  重命名和重新定位脱机数据文件时,只会更改数据库控制文件中记录的指向数据文件的指针。文件不会在物理上重命名,也不会在操作系统级复制。

(1)重命名和重定位单个表空间中的脱机数据文件
# 1.使包含数据文件的表空间脱机。数据库必须处于打开状态。
SYS@orcl> alter tablespace bigtbs offline normal;
Tablespace altered.

# 2.使用操作系统命令更改数据文件的名称
[oracle@oracle4 /u01/app/oracle/oradata/orcl]$ mv bigtbs01.dbf bigtbs1.dbf 

# 3.alter tablespace ... rename datafile ... to ...更改数据文件的名称
SYS@orcl> alter tablespace bigtbs rename datafile '/u01/app/oracle/oradata/orcl/bigtbs01.dbf' to '/u01/app/oracle/oradata/orcl/bigtbs1.dbf';
Tablespace altered.

# 4.重定位脱机数据文件
## (1)复制数据文件到新的位置
SYS@orcl> host cp /u01/app/oracle/oradata/orcl/bigtbs1.dbf /u01/app/oracle/oradata/bigtbs1.dbf

## (2)重定位数据文件
SYS@orcl> alter tablespace bigtbs rename datafile '/u01/app/oracle/oradata/orcl/bigtbs1.dbf' to '/u01/app/oracle/oradata/bigtbs1.dbf';
Tablespace altered.


# 4.使用带有online子句的ALTER tablespace语句使表空间重新联机
SYS@orcl> alter tablespace bigtbs online;
Tablespace altered.

说明可以使用SQLPlus HOST命令暂时退出SQLPlus,执行操作系统命令复制文件。

(2)重命名和重定位多个表空间中的脱机数据文件

  您可以使用ALTER DATABASE rename FILE语句重命名和重新定位一个或多个表空间中的数据文件。

说明要重命名或重新定位SYSTEM表空间、默认临时表空间或活动undo表空间的数据文件,必须使用ALTER DATABASE方法,因为不能使这些表空间脱机。
要重命名和重定位多个表空间中的数据文件,请执行以下步骤:

# 1.确保数据库已挂载但已关闭。
## 可选择地,数据库不必关闭,但数据文件(或临时文件)必须脱机。
## 关闭数据库
SYS@orcl> shutdown immediate;
SYS@orcl> startup mount;

# 2.使用操作系统命令重命名和重定位数据文件
[oracle@oracle4 /u01/app/oracle/oradata/orcl]$ mv aestbs01.dbf ../aestbs1.dbf
[oracle@oracle4 /u01/app/oracle/oradata/orcl]$ mv ictbs.dbf ../ictbs1.dbf

# 3.alter database rename file 
SYS@orcl> alter database rename file '/u01/app/oracle/oradata/orcl/aestbs01.dbf','/u01/app/oracle/oradata/orcl/ictbs.dbf'
    to '/u01/app/oracle/oradata/aestbs1.dbf','/u01/app/oracle/oradata/ictbs1.dbf';
Database altered.

六、删除数据文件

  使用ALTER TABLESPACE语句的DROP DATAFILE和DROP TEMPFILE子句删除单个数据文件或临时文件。
  数据文件必须为空(当数据文件未分配任何区时,该数据文件被视为空)。删除数据文件或临时文件时,将从数据字典和控制文件中删除对数据文件或临时文件的引用,并从文件系统或Oracle自动存储管理(ASM)磁盘组中删除物理文件。

# 1.删除Oracle ASM磁盘组中特定地数据文件
ALTER TABLESPACE example DROP DATAFILE '+DGROUP1/example_df3.f';

# 2.删除临时表空间的数据文件
ALTER TABLESPACE lmtemp DROP TEMPFILE '/u02/oracle/data/lmtemp02.dbf';

## 等价于
ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' DROP 
     INCLUDING DATAFILES;

说明如果存在使用临时文件的会话,并且您试图删除临时文件,则会返回一个错误,并且不会删除临时文件。在这种情况下,临时文件将脱机,当临时文件脱机时,尝试使用临时文件的查询将失败。

删除数据文件的一些限制:

  • 数据库必须处于打开状态。
  • 如果数据文件不为空,则不能删除。
  • 如果必须删除一个非空的数据文件,并且该数据文件不能通过删除模式对象而变为空,则必须删除包含该数据文件的表空间。
  • 不能删除表空间中的第一个或唯一一个数据文件。
    因此,DROP DATAFILE不能用于大文件表空间。
  • 不能删除从字典管理迁移到本地管理的只读表空间中的数据文件。支持从所有其他只读表空间中删除数据文件。
  • 不能删除SYSTEM表空间中的数据文件。
  • 如果本地管理表空间中的数据文件处于脱机状态,则不能删除该数据文件。

七、验证数据文件中的数据块

  要将数据库配置为使用校验和验证数据块,请将初始化参数DB_BLOCK_CHECKSUM设置为TYPICAL(默认值)。
  该设置导致DBWn进程和直接加载器会为每个块计算校验和,并在将块写入磁盘时将校验和存储在块头中。
  当读取数据块时验证校验和,但前提是DB_BLOCK_CHECKSUM为TRUE,并且最后一次写入数据块时存储了校验和。如果检测到损坏,数据库将返回消息ORA-01578,并将有关损坏的信息写入警报日志。
  DB_BLOCK_CHECKSUM参数的值可以使用ALTER SYSTEM语句动态更改。不管这个参数的设置如何,SYSTEM表空间中的数据块总是使用校验和进行验证。

SYS@orcl> show parameter db_block_checksum;

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
db_block_checksum		     string	 TYPICAL

八、使用数据库服务器复制文件

  您可以使用DBMS_FILE_TRANSFER包在数据库内复制文件或在数据库之间传输文件。

1.关于使用数据库服务器复制文件

  DBMS_FILE_TRANSFER包可以使用本地文件系统或ASM (Oracle Automatic Storage Management)磁盘组作为文件传输的源端或目标端。只有 Oracle 数据库文件(数据文件、临时文件、控制文件等)可以参与 Oracle ASM 之间的传输。
  在UNIX系统上,由DBMS_FILE_TRANSFER包创建的文件的所有者是运行该实例的影子进程的所有者。通常情况下,该所有者为ORACLE。使用DBMS_FILE_TRANSFER创建的文件对于数据库中的所有进程始终是可写可读的,但是需要直接读写这样一个文件的非特权用户可能需要系统管理员的访问。

警告不要使用DBMS_FILE_TRANSFER包复制或传输数据库正在修改的文件,因为这样做可能会导致文件不一致。

2.在本地文件系统上复制文件

  您可以使用DBMS_FILE_TRANSFER包中的COPY_FILE过程在本地文件系统上复制文件。

# 0.创建测试环境目录和文件
[oracle@oracle4 ~]$ mkdir source 
[oracle@oracle4 ~]$ mkdir destination
[oracle@oracle4 ~]$ cp /u01/app/oracle/oradata/orcl/tbs16k_1.dbf source

# 1.在SQL*Plus中,使用可以授予权限和创建目录对象的管理用户进行连接
[oracle@oracle4 ~]$ sqlplus / as sysdba

# 2.创建目录对象
SYS@orcl> create directory source_dir as '/home/oracle/source';
Directory created.

SYS@orcl> create directory dest_dir as '/home/oracle/destination';
Directory created.

# 3.将所需的特权授予将运行COPY_FILE过程的用户。
SYS@orcl> grant execute on dbms_file_transfer to zb;
Grant succeeded.

SYS@orcl> grant read on directory source_dir to zb;
Grant succeeded.

SYS@orcl> grant write on directory dest_dir to zb;
Grant succeeded.


# 4.以zb用户连接,并在出现提示时提供用户密码
SYS@orcl> connect zb

# 5.运行COPY_FILE过程复制文件
begin
  dbms_file_transfer.copy_file(
  source_directory_object => 'SOURCE_DIR',
  source_file_name => 'tbs16k_1.dbf',
  destination_directory_object => 'DEST_DIR',
  destination_file_name => 'tbs16k_1_copy.dbf');
end;
/  

PL/SQL procedure successfully completed.

## 查看验证
[oracle@oracle4 ~]$ ll destination/
total 20496
-rw-r----- 1 oracle dba 20987904 Feb  1 16:20 tbs16k_1_copy.dbf

## 如果使用该包传输一个普通的文本文件时,会报如下错
ORA-19505: failed to identify file "/home/oracle/source/test.txt"
ORA-27046: file size is not a multiple of logical block size

  在运行该过程之前,source_file_name参数必须指定source_directory_object参数指定的目录中的一个文件,而destination_file_name参数必须指定destination_directory_object参数指定的新位置中的文件的新名称。

3.第三方文件传输

  尽管DBMS_FILE_TRANSFER包中的过程通常作为‘本地过程调用’调用,但它们也可以作为‘远程过程调用’调用。远程过程调用允许您在数据库中复制文件,即使您连接到不同的数据库。

  例如:你可以复制数据库orcl上的文件,即使你连接到另一个数据库通过执行以下远程过程调用

# 1.连接mynewdb数据库
[oracle@oracle4 ~]$ sqlplus sys/sys1234@mynewdb as sysdba

# 2.创建连接到orcl数据库的数据库链接
SYS@mynewdb> create public database link to_orcl_zb connect to zb identified by zb1234 using '10.0.0.70:1521/orcl';
Database link created.

# 3.通过连接mynewdb数据库复制orcl数据库中的数据文件
begin
  dbms_file_transfer.copy_file@to_orcl_zb(
  source_directory_object => 'SOURCE_DIR',
  source_file_name => 'tbs16k_1.dbf',
  destination_directory_object => 'DEST_DIR',
  destination_file_name => 'tbs16k_1_copy2.dbf');
end;
/
PL/SQL procedure successfully completed.


## 验证
[oracle@oracle4 ~]$ ll destination/
total 20496
-rw-r----- 1 oracle dba 20987904 Feb  2 13:17 tbs16k_1_copy2.dbf

  使用远程过程调用允许您在两个数据库之间复制文件,即使您没有连接到其中任何一个数据库。例如,您可以连接到数据库A,然后将一个文件从数据库B传输到数据库c。在本例中,数据库A是第三方,因为它既不是传输文件的源端,也不是传输文件的目标端。
  第三方文件传输可以推送和拉取文件。继续前面的示例,如果您有从A到B或C的数据库链接,并且数据库B有到数据库C的数据库链接,则可以执行第三方文件传输。您可以在A上执行DBMS_FILE_TRANSFER包中的过程在B和C之间传输文件。
  例如:有三个数据库orcl,mynewdb,test,mynewdb有到orcl的数据库连接to_orcl_zb,orcl有到test数据库的连接orcl_to_test。

# 1.环境准备
## to_orcl_zb数据库链接已经在前面的步骤中创建,在orcl中创建orcl_to_test数据库链接
SYS@orcl> create public database link orcl_to_test connect to system identified by sys123 using '10.0.0.70:1521/test';
Database link created.

## 创建操作系统目录
[oracle@oracle4 ~]$ mkdir /home/oracle/destination_test

## 在test数据库上创建目录对象
SYS@test> create directory dest_dir as '/home/oracle/destination_test';
Directory created.

# 2.在mynewdb上执行DBMS_FILE_TRANSFER.PUT_FILE,将orcl上的文件复制到test数据库上
begin
  dbms_file_transfer.put_file@to_orcl_zb(
  source_directory_object => 'SOURCE_DIR',
  source_file_name => 'tbs16k_1.dbf',
  destination_directory_object => 'DEST_DIR',
  destination_file_name => 'tbs16k_1_copy3.dbf',
  destination_database => 'orcl_to_test');
  end;
  /

PL/SQL procedure successfully completed.

## 验证 
[oracle@oracle4 ~]$ ll destination_test
total 20496
-rw-r----- 1 oracle dba 20987904 Feb  6 13:35 tbs16k_1_copy3.dbf

# 3.将test数据库上的文件复制到orcl数据库上
begin
  dbms_file_transfer.get_file@to_orcl_zb(
  source_directory_object => 'DEST_DIR',
  source_file_name => 'tbs16k_1_copy3.dbf',
  source_database => 'orcl_to_test',
  destination_directory_object => 'DEST_DIR',
  destination_file_name => 'tbs16k_1_copy4.dbf');
  end;
  /

PL/SQL procedure successfully completed.

## 验证
[oracle@oracle4 ~]$ ll destination/tbs16k_1_copy4.dbf 
-rw-r----- 1 oracle dba 20987904 Feb  6 13:40 destination/tbs16k_1_copy4.dbf

4.V$DATAFILE视图相关列说明

  file#列出了每个数据文件的文件号;与数据库一起创建的SYSTEM表空间中的第一个数据文件总是文件1。STATUS为数据文件的其他信息。如果数据文件是SYSTEM表空间的一部分,则其状态为SYSTEM(除非需要恢复)。非system表空间下的数据文件联机时,其状态为online。如果非system表空间下的某个数据文件脱机,其状态为offline或RECOVER。CHECKPOINT列出为数据文件的最近检查点编写的最终SCN(系统更改号)。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论