mysql表⾥restrict_数据库的三种状态RESTRICT、QUIESCE
和SUSP。。。
数据库的这三种状态有相似之处,这⾥简单总结⼀下。
这⼀篇介绍RESTRICT状态。
在Oracle中,有时候要执⾏⼀些管理性的操作,⽽这些操作运⾏的时候不能有其他⽤户同时访问数据库。对于这种情况可以设置系统进⼊RESTRICTED SESSION状态禁⽌普通⽤户登陆数据库。
mysql安装配置实训总结数据库可以在启动的时候以RESTRICT⽅式来启动数据库:
SQL> conn / as sysdba已连接。SQL> shutdown immediate数据库已经关闭。已经卸载数据库。ORACLE例程已经关闭。SQL> startup restrict
ORACLE例程已经启动。
Total System Global Area 5279498240 bytes
Fixed Size 2094528 bytes
Variable Size 3192597056 bytes
Database Buffers 2080374784 bytes
Redo Buffers 4431872 bytes数据库装载完毕。数据库已经打开。SQL> conn test/test
ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege
警告:您不再连接到ORACLE。SQL> conn / as sysdba已连接。SQL> select granted_role from dba_role_privs
2 where grantee = 'TEST';
GRANTED_ROLE
------------------------------------------------------------
CONNECT
RESOURCE
SQL> grant dba to test;
授权成功。
SQL> conn test/test已连接。SQL> conn / as sysdba已连接。SQL> revoke dba from test;
撤销成功。
SQL> grant restricted session to test;
授权成功。
SQL> conn test/test已连接。
可以看到,当数据库以RESTRICT状态启动,或者进⼊到RESTRICT状态,则Oracle禁⽌普通⽤户连接数据库。
⽽拥有DBA⾓⾊的⽤户,或者拥有RESTRICTED SESSION权限的⽤户可以登陆数据库。
在Oracle11g的管理员⼿册⽂档中有⼀个地⽅的描述错误:
Further, when the instance is in restricted mode, a database administrator cannot access the instance remotely through an Oracle Net listener, but can only access the instance locally from the machine that the instance is running on.
根据⽂档的描述,如果数据库处于RESTRICTED SESSION状态,则禁⽌⽤户采⽤NET服务⽅式登陆,⽽必须在服务器上直接登陆,但是测试发现,Oracle并没有这个限制。
SQL> conn / as sysdba已连接。SQL> alter system disable restricted session;
系统已更改。
SQL> conn test/test@test11g已连接。SQL> conn / as sysdba已连接。SQL> alter system enable restricted session;
系统已更改。
SQL> conn test/test@test11g已连接。
⽆论是在本机通过服务名⽅式,还是在其他客户端通过服务名⽅式都可以连接到RESTRICTED SESSION状态的数据库,只要登陆⽤户拥有RESTRICTED SESSION权限。
下⾯再来看看RESTRICTED SESSION状态,对于已经登陆数据库的普通⽤户有何影响:
SQL> conn / as sysdba已连接。SQL> revoke restricted session from test;
撤销成功。
SQL> alter system disable restricted session;
handle with care标志
系统已更改。
在会话1,回收TEST⽤户的RESTRICTED SESSION权限,使其变为普通⽤户。并将数据库从RESTRICTED SESSION状态转为正常状态。
下⾯在会话2⽤TEST⽤户登陆数据库:
SQL> CONN TEST/test已连接。SQL> SET SQLP 'SQL2> '
SQL2> SELECT * FROM SESSION_PRIVS;
PRIVILEGEajax代码解析
--------------------------------------------------------------------------------
CREATE SESSION
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE DATABASE LINK
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
已选择10⾏。
下⾯回到会话1,将数据库置于RESTRICT SESSION状态:
SQL> alter system enable restricted session;
系统已更改。
执⾏RESTRICTED SESSION命令很快就返回了,说明命令已经执⾏成功,下⾯尝试普通⽤户登陆:
SQL> conn test/test
ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege
警告:您不再连接到ORACLE。
登陆报错,说明RESTRICT状态已经⽣效,回到会话2,看看数据库的RESTRICTED SESSION状态对已经登陆的普通会话是否有影响:
flash透明度在哪里
SQL2> SELECT * FROM DUAL;
DU
--
X
SQL2> CREATE TABLE T1 (ID NUMBER);
CREATE TABLE T1 (ID NUMBER)
*第1⾏出现错误:
ORA-01536:超出表空间'YANGTK'的空间限额
SQL2> CREATE OR REPLACE PROCEDURE P AS
2 BEGIN
3 NULL;
4 END;
5 /
过程已创建。
虽然建表语句失败了,但是这时由于刚才回收DBA⾓⾊,导致UNLIMITED TABLESPACE权限被连带回收造成的,与RESTRICTED SESSION的状态⽆关。
可以看到,虽然数据库处于RESTRICTED SESSION状态,但是数据库中已经登陆的会话可以继续执⾏任何操作,直到会话断开连接。
这个现象说明,如果希望数据库处于RESTRICTED SESSION状态,且此时不希望普通⽤户登陆数据库,那么最好的⽅法是采⽤STARTUP RESTRICT的⽅式来启动数据库,这样可以确保没有普通⽤户登陆。⽽ALTER SYSTEM ENABLE RESTRICTED SESSION的⽅式虽然可以使得数据库进⼊RESTRICT状态,但是不能保证现有的连接⽤户都是具有RESTRICTED SESSION权限的。即使是在STARTUP之后,马上发出ENABLE RESTRICTED SESSION命令也是不可靠的,因为这个时间差可能使得后台JOB运⾏了。因此如果是使⽤ENABLE RESTRINCTED SESSION⽅式,还需要在后台通过ALTER SYSTEM KILL SESSION的⽅式清除掉所有的普通⽤户连接。
最后来看看RESTRICTED SESSION状态和RAC环境的关系。
RESTRICTED命令是在实例上执⾏的,因此Oracle是否将这个命令应⽤到整个RAC环境需要通过测试来说明。
为了更好的说明情况,下⾯的测试在⼀个三节点的RAC环境中进⾏,其中两个节点处于启动状态,另⼀个节点关闭。
随后在实例1上发出ALTER SYSTEM ENABLE RESTRICTED SESSION语句,检查这个操作对实例2是否⽣效,将实例3启动,检查这个限制新启动的实例3是否有效。
mysql语句转oraclebash-2.03$ srvctl status db -d testrac
Instance testrac1 is running on node racnode1
Instance testrac2 is running on node racnode2
Instance testrac3 is running on node racnode3
bash-2.03$ srvctl stop inst -d testrac -i testrac3
bash-2.03$ srvctl status db -d testrac
Instance testrac1 is running on node racnode1
Instance testrac2 is running on node racnode2
Instance testrac3 is not running on node racnode3
bash-2.03$ sqlplus test/test@testrac1
SQL*Plus: Release 10.2.0.3.0 - Production on星期四2⽉19 23:09:47 2009 Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
以c开头的女英文名连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production With the Partitioning, Real Application Clusters, OLAP and Data Mining options SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE SYNONYM
CREATE VIEW
CREATE SEQUENCE
CREATE DATABASE LINK
CREATE PROCEDURE
CREATE TRIGGER
CREATE MATERIALIZED VIEW
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
已选择14⾏。
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
testrac1
将实例1变为RESTRICTED SESSION状态:
SQL> conn sys@testrac1 as sysdba输⼊⼝令:已连接。SQL> alter system enable restricted session;
系统已更改。
SQL> conn test/test@testrac1
ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege
警告:您不再连接到ORACLE。SQL> conn test/test@testrac2已连接。SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
testrac2
显然实例1上的设置与实例2⽆关,对于实例3⽽⾔其实都不⽤测试,因为数据库启动的时候没有指定STARTUP RESTRICT,⾃然不会启⽤RESTRICTED SESSION状态,不过为了严谨,还是测试⼀下:
SQL> host
$ srvctl start inst -d testrac -i testrac3
$ exit
SQL> conn test/test@testrac1
ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege
警告:您不再连接到ORACLE。SQL> conn test/test@testrac3已连接。SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
testrac3
SQL> select instance_name, status, logins from gv$instance;
INSTANCE_NAME STATUS LOGINS
---------------- ------------ ----------
testrac3 OPEN ALLOWED
testrac2 OPEN ALLOWED
testrac1 OPEN RESTRICTED
对于RESTRICTED SESSION状态,RAC环境的各个实例之间是相互独⽴的,各⾃的状态完全由各⾃的实例进⾏设置。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。