http://blog.itpub.net/785478/viewspace-1028200/
在11gR1之前,当业务系统需要升级的时候,我们常常需要停下,从而保证版本的一直性和访问的连续性,对于一些APP变更频繁但又不允许经常停应用的IT系统,
这实在是一个很头大的问题,那么现在好了,从11gR2开始,Oracle引入了一个edition(版本)的概念,借助这个特性,我们可以实现app的online upgrade.同时该
特性允许pre-upgrade application and the post-upgrade application并存,等我们确认post-upgrade app没问题的时候再把pre-upgrade app切换下来,在
这期间整个APP的访问是不受影响的.从而可以最大程度的减少application down time.
实际上这个特性,在11gR1中已经提供了,只不过需要通过一个隐藏参数来控制
_edition_based_redefinition 11gR1中该参数默认是false.
11gR2中,该参数已经被废弃!
关于的edition-based redefinition的一些特性
1)一个database至少有一个缺省的edition
SQL> SELECT * FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_EDITION';
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
----------------- ---------------- ------------------------------------
DEFAULT_EDITION ORA$BASE Name of the database default edition
SQL>
2)设置数据库的缺省edition
alter database DEFAULT EDITION = edition_name;
3)与edition相关的系统权限有
SQL> select name from system_privilege_map where name like '%EDITION%';
NAME
------------------
ALTER ANY EDITION
DROP ANY EDITION
CREATE ANY EDITION
SQL>
这些系统权限都默认授予了DBA角色,也就是说任何具有DBA role的用户都可以执行与Edition-Based Redefinition相关的任务。
这些任务包括
▪Grant or revoke privileges to create, alter, and drop editions
▪Enable editions for a schema
▪Set the database default edition
4)与edition相关的数据字典
*_editions -->列出了当前数据库中的所有的EDITIONS,缺省情况下ORA$BASE
SQL> select * from dba_editions;
EDITION_NAME PARENT_EDITION_NAME USABLE
-------------- -------------------- ------
ORA$BASE YES
*_objects -->描述当前版本下对应的objects的可见性(是实际对象还是继承对象)
SQL> select owner,object_name,edition_name from dba_objects;
*_objects_ae -->描述当前数据库中每个真实的objects(所有版本)
SQL> select owner,object_name,edition_name from dba_objects_ae;
5)通过不同的edition连接数据库
从11gR2开始,SQL*Plus这样的工具也有对edition的连接支持
[AS {SYSDBA | SYSOPER | SYSASM}] [EDITION=value]
默认情况下EDTION=DEFAULT_EDITION,也就是对应当前数据库的缺省版本
6)11gR2中editions支持的objects type有
■ Synonym
■ View
■ Function
■ Procedure
■ Package (specification and body)
■ Type (specification and body)
■ Library
■ Trigger
7)用户要想使用edition,必须先Enable editions for a schema。
注意:这是一个不可逆的动作,一旦enable了就不能disable了
比如
conn /as sysdba
alter user study enable editions;
通过如下语句可以查看某个schema是否enable editions.
select username,editions_enabled from dba_users;
注:这里有一个隐藏参数来控制是否对所有的用户enable editions,默认是false,需要按照上面的方法去enable.
_enable_editions_for_users FALSE enable editions for all users
创建Editions
要创建一个edition,用户必须具有create any editions的权限.
Create edtion的语法如下
CREATE EDITION edition [AS CHILD OF parent_edition];
说明:1)This statement creates a new edition as a child of an existing edition. An edition makes it possible to have two or more
versions of the same editionable objects in the database. When you create an edition, it immediately inherits all of the editionable
objects of its parent edition。
2)用户定义的第一个edtion对应的parent edition 一定是ORA$BASE.
3)在11gR2中,一个edition 只能有一个child edition.否则你可能会遇到类似如下的错误
ORA-38807: Implementation restriction: an edition can have only one child
这个时候你就到dba_editions视图中去查看了。
示例
--查看当前数据库的缺省DEFAULT_EDITION
SQL> SELECT * FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_EDITION';
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------ ----------------- ------------------------------------
DEFAULT_EDITION ORA$BASE Name of the database default edition
SQL>
--创建一个edition
SQL> create edition app_version_01;
Edition created.
SQL>
SQL> select * from dba_editions;
EDITION_NAME PARENT_EDITION_NAME USABLE
----------------- --------------------- ------
ORA$BASE YES
APP_VERSION_01 ORA$BASE YES
SQL>
默认情况下,如果不指定as child of parent_edition字句的话,对应的partent_edition 一定是DEFAULT_EDITION.
这个时候如果再默认创建一个app_version_02,那么就会遇到错误
SQL> create edition app_version_02;
create edition app_version_02
*
ERROR at line 1:
ORA-38807: Implementation restriction: an edition can have only one child
SQL>
出现这个错误的原因就是一个edition只能有一个child edition.而当前系统中默认的DEFAULT_EDITION已经有一个child edition:app_version_01了,改成如下就可以了,当然了
这样创建的意义不是很大,我只是为了说明问题而已。
SQL> create edition app_version_02 as child of app_version_01;
Edition created.
SQL>
No comments:
Post a Comment