Oracle 12c 新特性 --- Move a Data File Online

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leo__1990/article/details/90032801

概念 

In this release, a data file can now be moved online while it is open and being accessed.
在这个版本中,一个数据文件现在可以在打开和被访问的时候在线移动。
Being able to move a data file online means that many maintenance operations, such as moving data to another storage device or moving databases into Oracle Automatic Storage Management (Oracle ASM), can be performed while users are accessing the system. This ensures that continuity of service and service-level agreements (SLA) on uptime can be met.
能够在线移动数据文件意味着许多维护操作,例如将数据移动到另一个存储设备或将数据库移动到Oracle自动存储管理(Oracle ASM),可以在用户访问系统时执行。这确保了服务和服务水平协议(SLA)在正常运行时的连续性

基本语法:
ALTER DATABASE MOVE DATAFILE ( 'filename' | 'ASM_filename' | file_number )
 [ TO ( 'filename' | 'ASM_filename' ) ]
 [ REUSE ] [ KEEP ]

源文件可以使用文件编号或名称指定,而目标文件必须由文件名指定。重用关键字表示应该创建新文件,即使它已经存在。KEEP关键字表示datafile的原始副本应该保留。

当源文件是OMF文件时,保留选项不能被使用。如果目标文件是一个OMF文件,则可以省略TO子句,并且将在DB_CREATE_FILE_DEST位置创建一个带有OMF名称的文件。

可以从V $ DATAFILE和DBA_DATA_FILES查看文件编号。

实验

1 CDB 1.1 可以从V$DATAFILE和DBA_DATA_FILES查看文件编号。
[[email protected] ~]$ sqlplus "/as sysdba"

SQL*Plus: Release 12.1.0.2.0 Production on Sat Aug 19 16:48:31 2017

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> SET LINESIZE 100
SQL> COLUMN name FORMAT A70
SQL> SELECT file#, name FROM v$datafile WHERE con_id = 1 ORDER BY file#;

     FILE# NAME
---------- ----------------------------------------------------------------------
	 1 /u01/app/oracle/oradata/cndba/system01.dbf
	 3 /u01/app/oracle/oradata/cndba/sysaux01.dbf
	 4 /u01/app/oracle/oradata/cndba/undotbs01.dbf
	 6 /u01/app/oracle/oradata/cndba/users01.dbf
	12 /u01/app/oracle/oradata/cndba/users02.dbf
--在CDB 中创建test 表空间
SQL> CREATE TABLESPACE test
  DATAFILE '/u01/app/oracle/oradata/cndba/test01.dbf'
  SIZE 1M AUTOEXTEND ON NEXT 1M;  2    3  

Tablespace created.

SQL> SELECT file#, name FROM v$datafile WHERE con_id = 1 ORDER BY file#;

     FILE# NAME
---------- ----------------------------------------------------------------------
	 1 /u01/app/oracle/oradata/cndba/system01.dbf
	 3 /u01/app/oracle/oradata/cndba/sysaux01.dbf
	 4 /u01/app/oracle/oradata/cndba/undotbs01.dbf
	 6 /u01/app/oracle/oradata/cndba/users01.dbf
	12 /u01/app/oracle/oradata/cndba/users02.dbf
	21 /u01/app/oracle/oradata/cndba/test01.dbf

6 rows selected.

SQL> COLUMN file_name FORMAT A70
SQL> SELECT file_id, file_name FROM dba_data_files ORDER BY file_id;

   FILE_ID FILE_NAME
---------- ----------------------------------------------------------------------
	 1 /u01/app/oracle/oradata/cndba/system01.dbf
	 3 /u01/app/oracle/oradata/cndba/sysaux01.dbf
	 4 /u01/app/oracle/oradata/cndba/undotbs01.dbf
	 6 /u01/app/oracle/oradata/cndba/users01.dbf
	12 /u01/app/oracle/oradata/cndba/users02.dbf
	21 /u01/app/oracle/oradata/cndba/test01.dbf

6 rows selected.

1.2 在CDB 中创建test 表
SQL> create table test (id number(10)) tablespace test;

Table created.
SQL> insert into test values(1);

1 row created.

SQL> insert into test values(2);

1 row created.

SQL> commit;

Commit complete.
SQL> set long 500
SQL> select dbms_metadata.get_ddl('TABLE','TEST') from dual;

DBMS_METADATA.GET_DDL('TABLE','TEST')
--------------------------------------------------------------------------------

  CREATE TABLE "SYS"."TEST"
   (	"ID" NUMBER(10,0)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "TEST"

move 数据文件之前查看表数据
  
SQL> select *from test;

	ID
----------
	 1
	 2

1.3 下面的示例显示了一个基本的文件移动,通过名称指定源和目的地。注意原始文件已不再存在。

SQL> ALTER DATABASE MOVE DATAFILE '/u01/app/oracle/oradata/cndba/test01.dbf' TO '/tmp/test01.dbf';

Database altered. move 数据文件之后,表可以查到,移动数据文件对数据没有影响 SQL> select *from test; ID ---------- 1 2 SQL> SELECT file_id, file_name FROM dba_data_files WHERE file_id=21; FILE_ID FILE_NAME ---------- ---------------------------------------------------------------------- 21 /tmp/test01.dbf SQL> host ls -al /u01/app/oracle/oradata/cndba/test01.dbf ls: cannot access /u01/app/oracle/oradata/cndba/test01.dbf: No such file or directory SQL> host ls -al /tmp/test01.dbf -rw-r-----. 1 oracle oinstall 1056768 Aug 19 16:59 /tmp/test01.dbf 1.4 下一个示例使用源文件的文件编号,并保存原始文件。 SQL> ALTER DATABASE MOVE DATAFILE 21 TO '/u01/app/oracle/oradata/cndba/test01.dbf' KEEP; Database altered. SQL> SELECT file_id, file_name FROM dba_data_files WHERE file_id =21; FILE_ID FILE_NAME ---------- ---------------------------------------------------------------------- 21 /u01/app/oracle/oradata/cndba/test01.dbf SQL> host ls -al /u01/app/oracle/oradata/cndba/test01.dbf -rw-r-----. 1 oracle oinstall 1056768 Aug 19 17:02 /u01/app/oracle/oradata/cndba/test01.dbf SQL> host ls -al /tmp/test01.dbf -rw-r-----. 1 oracle oinstall 1056768 Aug 19 17:02 /tmp/test01.dbf

1.5 使用OMF 用法

SQL> ALTER SYSTEM SET db_create_file_dest='/u01/app/oracle/oradata/cndba';

System altered. SQL> ALTER DATABASE MOVE DATAFILE '/u01/app/oracle/oradata/cndba/test01.dbf'; Database altered. SQL> SELECT file_id, file_name FROM dba_data_files WHERE file_id =21; FILE_ID FILE_NAME ---------- ---------------------------------------------------------------------- 21 /u01/app/oracle/oradata/cndba/PDBCNDBA_P/datafile/o1_mf_test_dshzqvqw_.dbf

1.6 示例尝试使用KEEP选项,其中源文件位于OMF文件中。注意,KEEP选项是如何被忽略的。

SQL> ALTER DATABASE MOVE DATAFILE 21 TO '/u01/app/oracle/oradata/cndba/test01.dbf' KEEP;

Database altered. SQL> SELECT file_id, file_name FROM dba_data_files WHERE file_id =21; FILE_ID FILE_NAME ---------- ---------------------------------------------------------------------- 21 /u01/app/oracle/oradata/cndba/test01.dbf SQL> host ls -al /u01/app/oracle/oradata/cndba/PDBCNDBA_P/datafile/o1_mf_test_dshzqvqw_.dbf ls: cannot access /u01/app/oracle/oradata/cndba/PDBCNDBA_P/datafile/o1_mf_test_dshzqvqw_.dbf: No such file or directory 2 PDB 2.1 容器数据库(CDB)不能移动属于可插入数据库的文件。下面的查询显示了CDB和PDBs的所有数据文件。 [[email protected] ~]$ sqlplus "/as sysdba" SQL*Plus: Release 12.1.0.2.0 Production on Sat Aug 19 17:16:44 2017 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> SELECT file#, name FROM v$datafile ORDER BY file#; FILE# NAME ---------- ---------------------------------------------------------------------- 1 /u01/app/oracle/oradata/cndba/system01.dbf 3 /u01/app/oracle/oradata/cndba/sysaux01.dbf 4 /u01/app/oracle/oradata/cndba/undotbs01.dbf 5 /u01/app/oracle/oradata/cndba/pdbseed/system01.dbf 6 /u01/app/oracle/oradata/cndba/users01.dbf 7 /u01/app/oracle/oradata/cndba/pdbseed/sysaux01.dbf 8 /u01/app/oracle/oradata/cndba/pdbcndba/system01.dbf 9 /u01/app/oracle/oradata/cndba/pdbcndba/sysaux01.dbf 10 /u01/app/oracle/oradata/cndba/pdbcndba/pdbcndba_users01.dbf 11 /u01/app/oracle/oradata/cndba/pdbcndba/test01.dbf 12 /u01/app/oracle/oradata/cndba/users02.dbf FILE# NAME ---------- ---------------------------------------------------------------------- 17 /u01/app/oracle/oradata/cndba/pdbcndba2/system01.dbf 18 /u01/app/oracle/oradata/cndba/pdbcndba2/sysaux01.dbf 19 /u01/app/oracle/oradata/cndba/pdbcndba2/pdbcndba_users01.dbf 20 /u01/app/oracle/oradata/cndba/pdbcndba2/test01.dbf 21 /u01/app/oracle/oradata/cndba/test01.dbf 16 rows selected.

2.2 如果我们试图移动属于PDB的数据文件,则返回错误。

SQL> ALTER DATABASE MOVE DATAFILE '/u01/app/oracle/oradata/cndba/pdbcndba/system01.dbf' TO '/tmp/system01.dbf' REUSE;

ALTER DATABASE MOVE DATAFILE '/u01/app/oracle/oradata/cndba/pdbcndba/system01.dbf' TO '/tmp/system01.dbf' REUSE * ERROR at line 1: ORA-01516: nonexistent log file, data file, or temporary file "8"

2.3 如果我们切换到PDB容器,数据文件可以正常移动。

SQL> ALTER SESSION SET container=pdbcndba;

Session altered. SQL> CREATE TABLESPACE test2 DATAFILE '/u01/app/oracle/oradata/cndba/pdbcndba/test02.dbf' SIZE 1M AUTOEXTEND ON NEXT 1M; 2 3 Tablespace created. SQL> create table test2 (id number(10)) tablespace test2; Table created. SQL> insert into test2 values(1); 1 row created. SQL> insert into test2 values(2); 1 row created. SQL> commit; Commit complete. SQL> SELECT file#, name FROM v$datafile ORDER BY file#; FILE# NAME ---------- ---------------------------------------------------------------------- 4 /u01/app/oracle/oradata/cndba/undotbs01.dbf 8 /u01/app/oracle/oradata/cndba/pdbcndba/system01.dbf 9 /u01/app/oracle/oradata/cndba/pdbcndba/sysaux01.dbf 10 /u01/app/oracle/oradata/cndba/pdbcndba/pdbcndba_users01.dbf 11 /u01/app/oracle/oradata/cndba/pdbcndba/test01.dbf 22 /u01/app/oracle/oradata/cndba/pdbcndba/test02.dbf 6 rows selected. SQL> select *from test2; ID ---------- 1 2 SQL> ALTER DATABASE MOVE DATAFILE '/u01/app/oracle/oradata/cndba/pdbcndba/test02.dbf' TO '/tmp/system01.dbf' REUSE; Database altered. SQL> select *from test2; ID ---------- 1 2

3 ALTER DATABASE MOVE DATAFILE语法不适用于临时文件。

这不是一个大问题,因为临时文件可以很简单地创建和删除

SQL> SELECT file_id, file_name FROM dba_data_files WHERE file_id =22; FILE_ID FILE_NAME ---------- ---------------------------------------------------------------------- 22 /tmp/system01.dbf SQL> ALTER DATABASE MOVE DATAFILE 22 TO '/u01/app/oracle/oradata/cndba/pdbcndba/test02.dbf' REUSE; Database altered. SQL> SELECT file_id, file_name FROM dba_data_files WHERE file_id =22; FILE_ID FILE_NAME ---------- ---------------------------------------------------------------------- 22 /u01/app/oracle/oradata/cndba/pdbcndba/test02.dbf SQL> ALTER SESSION SET container=CDB$ROOT; Session altered. [[email protected] ~]$ sqlplus "/as sysdba" SQL*Plus: Release 12.1.0.2.0 Production on Sat Aug 19 17:16:44 2017 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> SELECT file_id, file_name FROM dba_temp_files; FILE_ID FILE_NAME ---------- -------------------------------------------------- 1 /u01/app/oracle/oradata/cndba/temp01.dbf SQL> ALTER DATABASE MOVE DATAFILE '/u01/app/oracle/oradata/cndba/temp01.dbf' TO '/tmp/temp01.dbf' REUSE; ALTER DATABASE MOVE DATAFILE '/u01/app/oracle/oradata/cndba/temp01.dbf' TO '/tmp/temp01.dbf' REUSE * ERROR at line 1: ORA-01516: nonexistent log file, data file, or temporary file "/u01/app/oracle/oradata/cndba/temp01.dbf"

参考文档

http://docs.oracle.com/database/121/NEWFT/chapter12101.htm#NEWFT002

http://docs.oracle.com/database/121/ADMIN/dfiles.htm#ADMIN13837

http://docs.oracle.com/database/121/SQLRF/statements_1006.htm#SQLRF00802

[Niàn]
动词 study; say; think; read aloud
名词 idea; thought; commemoration
 

猜你喜欢

转载自blog.csdn.net/leo__1990/article/details/90032801