yy's profile每天都要做出不同的选择BlogLists Tools Help

yy

每天都要做出不同的选择

May 04

转: Linux内存中Swap和Buffer Cache机制

--------------来自网络---------------------------------------------
 
Linux的产生与发展,更多的应用与服务器,那么对于Linux的各个管理机制要非常清楚,一个完整的Linux系统主要有存储管理,内存管理,文件系统和进程管理等几方面组成,以下主要说明Swap和Buffer Cache机制

  Linux支持虚拟内存(virtual memory),虚拟内存是指使用磁盘当作RAM的扩展,这样可用的内存的大小就相应地增大了。内核会将暂时不用的内存块的内容写到硬盘上,这样一来,这块内存就可用于其它目的。当需要用到原始的内容时,它们被重新读入内存。这些操作对用户来说是完全透明的;Linux下运行的程序只是看到有大量的内存可供使用而并没有注意到时不时它们的一部分是驻留在硬盘上的。当然,读写硬盘要比直接使用真实内存慢得多(要慢数千倍),所以程序就不会象一直在内存中运行的那样快。用作虚拟内存的硬盘部分被称为交换空间(Swap Space)。

  一般,在交换空间中的页面首先被换入内存;如果此时没有足够的物理内存来容纳它们又将被交换出来(到其他的交换空间中)。如果没有足够的虚拟内存来容纳所有这些页面,Linux就会波动而不正常;但经过一段较长的时间Linux会恢复,但此时系统已不可用了。

  有时,尽管有许多的空闲内存,仍然会有许多的交换空间正被使用。这种情况是有可能发生的,例如如果在某一时刻有进行交换的必要,但后来一个占用很多物理内存的大进程结束并释放内存时。被交换出的数据并不会自动地交换进内存,除非有这个需要时。此时物理内存会在一段时间内保持空闲状态。对此并没有什么可担心的,但是知道了是怎么一回事,也就无所谓了。

  许多操作系统使用了虚拟内存的方法。因为它们仅在运行时才需要交换空间,以解决不会在同一时间使用交换空间,因此,除了当前正在运行的操作系统的交换空间,其它的就是一种浪费。所以让它们共享一个交换空间将会更有效率。

  注意,如果会有几个人同时使用这个系统,他们都将消耗内存。然而,如果两个人同时运行一个程序,内存消耗的总量并不是翻倍,因为代码页以及共享的库只存在一份。

  Linux系统常常动不动就使用交换空间,以保持尽可能多的空闲物理内存。即使并没有什么事情需要内存,Linux也会交换出暂时不用的内存页面。这可以避免等待交换所需的时间:当磁盘闲着,就可以提前做好交换。

  可以将交换空间分散在几个硬盘之上。针对相关磁盘的速度以及对磁盘的访问模式,这样做可以提高性能。

  与访问(真正的)的内存相比,磁盘的读写是很慢的。另外,在相应较短的时间内多次读磁盘同样的部分也是常有的事。例如,某人也许首先阅读了一段e-mail消息,然后为了答复又将这段消息读入编辑器中,然后又在将这个消息拷贝到文件夹中时,使得邮件程序又一次读入它。或者考虑一下在一个有着许多用户的系统中 ls命令会被使用多少次。通过将信息从磁盘上仅读入一次并将其存于内存中,除了第一次读以外,可以加快所有其它读的速度。这叫作磁盘缓冲(disk buffering),被用作此目的的内存称为高速缓冲(Buffer Cache)。

  但是,由于内存是一种有限而又不充足的资源,高速缓冲不可能做的很大(它不可能包容要用到的所有数据)。当缓冲充满了数据时,其中最长时间不用的数据将被舍弃以腾出内存空间用于新的数据。

  对写磁盘操作来说磁盘缓冲技术同样有效。一方面,被写入磁盘的数据常常会很快地又被读出(例如,原代码文件被保存到一个文件中,又被编译器读入),所以将要被写的数据放入缓冲中是个好主意。另一方面,通过将数据放入缓冲中,而不是将其立刻写入磁盘,程序可以加快运行的速度。以后,写的操作可以在后台完成,而不会拖延程序的执行。
 
  大多数操作系统都有高速缓冲(尽管可能称呼不同),但是并不是都遵守上面的原理。有些是直接写(write-through):数据将被立刻写入磁盘(当然,数据也被放入缓存中)。如果写操作是在以后做的,那么该缓存被称为后台写(write-back)。后台写比直接写更有效,但也容易出错:如果机器崩溃,或者突然掉电,缓冲中改变过的数据就被丢失了。如果仍未被写入的数据含有重要的薄记信息,这甚至可能意味着文件系统(如果有的话)已不完整。

  针对以上的原因,出现了很多的日志文件系统,数据在缓冲区修改后,同时会被文件系统记录修改信息,这样即使此时系统掉电,系统重启后会首先从日志记录中恢复数据,保证数据不丢失。当然这些问题不再本文的叙述范围。

  由于上述原因,在使用适当的关闭过程之前,绝对不要关掉电源,sync命令倾空(flushes)缓冲,也即,强迫所有未被写的数据写入磁盘,可用以确定所有的写操作都已完成。在传统的UNIX系统中,有一个叫做update的程序运行于后台,每隔30秒做一次sync操作,因此通常无需手工使用sync命令了。Linux另外有一个后台程序,bdflush,这个程序执行更频繁的但不是全面的同步操作,以避免有时sync的大量磁盘I/O操作所带来的磁盘的突然冻结。

  在Linux中,bdflush是由update启动的。通常没有理由来担心此事,但如果由于某些原因bdflush进程死掉了,内核会对此作出警告,此时你就要手工地启动它了(/sbin/update)。

  缓存(cache)实际并不是缓冲文件的,而是缓冲块的,块是磁盘I/O操作的最小单元(在Linux中,它们通常是1KB)。这样,目录、超级块、其它文件系统的薄记数据以及非文件系统的磁盘数据都可以被缓冲了。

  缓冲的效力主要是由它的大小决定的。缓冲太小的话等于没用:

  它只能容纳一点数据,因此在被重用时,所有缓冲的数据都将被倾空。实际的大小依赖于数据读写的频次、相同数据被访问的频率。只有用实验的方法才能知道。

  如果缓存有固定的大小,那么缓存太大了也不好,因为这会使得空闲的内存太小而导致进行交换操作(这同样是慢的)。为了最有效地使用实际内存,Linux自动地使用所有空闲的内存作为高速缓冲,当程序需要更多的内存时,它也会自动地减小缓冲的大小。

  这就是一般情况下Linux内存的一般机制,当然Linux内存的运行机制远远比这个复杂,但是只有了解了这个机制,我们管理服务器才能得心应手!

July 31

RA-01123: 无法启动联机备份;未启用介质恢复

 
问题:
-------------------------------------------
SQL> alter tablespace system begin backup;
alter tablespace system begin backup
*
ERROR 位于第 1 行:
ORA-01123: 无法启动联机备份;未启用介质恢复
 
原因:
-------------------------------------------
在noarchive的模式下不能做alter tablespace ....begin backup, 在进行热备份之前,必须先启用介质恢复。可以用archive log list查看当前数据库是否是归档的。

步骤:
------------------------------------------
SQL> archive log list;
数据库日志模式             非存档模式
自动存档             禁用
存档终点            D:\oracle\ora92\RDBMS
最早的概要日志序列     5
当前日志序列           7
 
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。

SQL> alter database archivelog;
数据库已更改。
 
SQL> archive log list
数据库日志模式            存档模式
自动存档             禁用
存档终点            D:\oracle\ora92\RDBMS
最早的概要日志序列     5
下一个存档日志序列   7
当前日志序列           7

SQL> archive log start
已处理的语句
 
SQL> alter tablespace system begin backup;
表空间已更改。

结果:
----------------------------------
搞定!

ORA-12560: TNS: 协议适配器错误

{转贴}

 
解决ORA-12560: TNS: 协议适配器错误,与大家共享

今天遭遇ORA-12560: TNS: 协议适配器错误的问题,经过一番努力问题已经解决,与大家共享。
造成ORA-12560: TNS: 协议适配器错误的问题的原因有三个:
1.监听服务没有起起来。windows平台个一如下操作:开始---程序---管理工具---服务,打开服务面板,

启动oraclehome92TNSlistener服务。
2.database instance没有起起来。windows平台如下操作:开始---程序---管理工具---服务,打开服务

面板,启动oracleserviceXXXX,XXXX就是你的database SID.
3.注册表问题。regedit,然后进入HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0将该环境变量ORACLE_SI

D设置为XXXX,XXXX就是你的database SID.或者右几我的电脑,属性--高级--环境变量---系统变量--新建

,变量名=oracle_sid,变量值=XXXX,XXXX就是你的database SID.或者进入sqlplus前,在command line下

输set oracle_sid=XXXX,XXXX就是你的database SID.
经过以上步骤,就可以解决问题。

July 19

如何使用sqlplus的HELP功能:

说明:在默认安装中,是没有安装联机帮助文档的,因此我们要在使用sqlplus时使用联机

帮助文档,就必须自己运行两个脚本:

安装目录为:

$ORACLE_HOME\sqlplus\admin\help

 

命令:

Sqlplus system/<system password>     //记得一定要使用system用户登陆

@$oracle_home\sqlplus\admin\help\helpbld.sql helpus.sql

//根据实际情况输入你的ORACLE_HOME

 

测试:

SQL> help

 HELP

 ----

 Accesses this command line help system. Enter HELP INDEX for a list

 of topics.

 In iSQL*Plus, click the Help button to display iSQL*Plus help.

 

 HELP [topic]

 

//不足的是,在sqlplushelp命令只可以查到少数命令的使用:

SQL> help index

 

Enter Help [topic] for help.

 

 @               COPY          PAUSE                    SHUTDOWN

 @@             DEFINE        PRINT                     SPOOL

 /                DEL           PROMPT                   SQLPLUS

 ACCEPT         DESCRIBE     QUIT                      START

 APPEND         DISCONNECT  RECOVER                  STARTUP

 ARCHIVE LOG   EDIT          REMARK                   STORE

 ATTRIBUTE     EXECUTE      REPFOOTER                TIMING

 BREAK         EXIT          REPHEADER                 TTITLE

 BTITLE         GET           RESERVED WORDS (SQL)     UNDEFINE

 CHANGE        HELP          RESERVED WORDS (PL/SQL)  VARIABLE

 CLEAR         HOST          RUN                      WHENEVER OSERROR

 COLUMN       INPUT         SAVE                   WHENEVER SQLERROR

 COMPUTE      LIST           SET

 CONNECT      PASSWORD     SHOW

 

July 04

完整性约束的状态

在学习的过程中,自己看了好几遍还是不能把约束的四种状态分清楚,经过一个高人指点,终于茅塞顿开,现在,把我的理解过程跟大家分享一下:

完整性约束可以是以下的其中一种转态:

l         禁止非验证(DISABLE NOVALIDATE

l         禁止验证(DISABLE VALIDATE

l         允许非验证(ENABLE NOVALIDATE

l         允许验证(ENABLE VALIDATE

 

怎么理解这四种状态呢,它们之间又有什么区别,我们可以这样来理解,数据库中的数据是分为新数据(New data 现有数据(Existing data)的,而禁止(DISABLE)与允许(ENABLE)是针对新数据(New data)的,验证与非验证是针对现有数据(Existing data)的。

让我们先来理解允许、禁止以及验证非验证的含义:

如果约束是允许(ENABLE)的,当New data在插入或更新的时候会被检测,凡是不符合约束规则的数据都不允许被插入;

如果约束是禁止(DISABLE)的,当New data在插入或更新的时候,不管是否符合约束规则都能够进入数据库。

如果约束被设为非验证状态(NOVALIDATE),那么不管数据库中的现有数据(Existing data)是否符合约束规则,都不需要进行验证。

如果约束被设为验证状态(VALIDATE),那么就会对数据库中所有的现有数据(Existing data)进行验证,而如果约束是从非验证状态转为验证状态,那么就要先把那些不满足条件的数据删除或更新。

禁止验证(DISABLE VALIDATE)是属于一个特殊的状态,如果约束处于这一状态,则对约束字段的任何修改都是不允许的,也就是不允许任何的DML操作,就相当与该约束字段被锁定了。另外,基于约束的索引也会被删除,约束被禁止。

通过故障解释客户端连接到数据库的详细过程

故障:TNS-12154 (ORA-12154)TNS:could not resolve service name
该错误表示用于连接的网络服务名在tnsnames.ora文件中不存在,如果在tnsnames.ora中的网络服务名只有test,假如用户在连接时用sqlplus system/manager@test1则就会给出TNS-12154错误。

要注意的是,有时即使在tnsnames.ora文件中有相应的网络服务名,可是用该网络服务名连接时还会出错,出现这种情况的典型配置如下(在客户端的机器上):

sqlnet.ora
文件:

---------------------------
NAMES.DIRECTORY_PATH = (TNSNAMES, ….)
NAMES.DEFAULT_DOMAIN = server.com


tnsnames.ora

文件:

----------------------------
test =
(DESCRIPTION=
(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=1521))
)
(CONNECT_DATA=(SERVICE_NAME=orcl.testserver.com)
)
)

sql*plus
运行基本机理:

在用户输入sqlplus system/manager@test后,sqlplus程序会自动到sqlnet.ora文件中找NAMES.DEFAULT_DOMAIN参数,假如该参数存在,则将该参数中的值取出,加到网络服务名的后面,即此例中你的输入由sqlplus system/manager@test自动变为sqlplus system/manager@test.server.com ,然后再到tnsnames.ora文件中找test.server.com网络服务名,这当然找不到了,因为该文件中只有test网络服务名,所以报错。解决的办法就是将sqlnet.ora文件中的NAMES.DEFAULT_DOMAIN参数注释掉即可,如#NAMES.DEFAULT_DOMAIN = server.com。假如NAMES.DEFAULT_DOMAIN参数不存在,则sqlplus程序会直接到tnsnames.ora文件中找test网络服务名,然后取出其中的hostporttcpservice_name,利用这些信息将连接请求发送到正确的数据库服务器上。

另外原则上tnsnames.ora中的配置不区分大小写,但也有可能遇到区分大小写的情况,所以最好将使用的网络服务与tnsnames.ora中配置的完全一样。

另外,如果在$oracle_home\network\admin中不存在tnsname.ora,则可以通过Net Configuration Assistant来进行配置

MTS/dedicate

oracle server有两个可选的配置:MTS,dedicate:

 

1、MTSmultiple thread servers)多线程服务器:
顾名思义,它用少数的共享服务器进程执行很多的客户连接。它是用调度器、共享服务器和队列来实现的。
一般来说,在支持大量用户的应用中,多线程服务器的性能更好。

MTS在小用户情况下比专有服务器要消耗更多的资源,因此在在线用户数较少的情况下不要把服务器设为MTS

2、Dedicate方式是指独占进程服务器方式:
Oracle
为每个连接到instanceclient启动一个专用的前台服务进程。这个进程仅仅为一个用户会话服务;

 

我们可以通过查看tnsname.ora($oracle_home\network\admin\tnsname.ora)文件来查看oracle server到底是选择哪一种方式:

tnsname.ora

--------------------------------------------------------

ZYY_ZYY =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = zyy)(PORT = 1521))

    )

    (CONNECT_DATA =

      (sid = zyy)

      (SERVER = DEDICATED)

    )

  )

---------------------------------------

其中,

如果:Server=DEDICATED
      则为独占进程服务器
如果:server=SHARED
      则为共享服务器





 

ORACLE客户端连服务器的注意事项(转)

 

1. 通过SQL*NET协议,ORACLE客户端连服务器时一般需要配置sqlnet.oratnsnames.ora
它们默认的目录在 $ORACLE_HOME/network/admin 目录下

也可以设置环境变量TNS_ADMIN指向你想用的sqlnet.ora和tnsnames.ora目录
例如:
TNS_ADMIN=/home/oracle/config/9.0.1;export TNS_ADMIN

sqlnet.ora文件决定找数据库服务器别名的方式

默认的参数有
NAMES.DEFAULT_DOMAIN = WORLD
NAMES.DIRECTORY_PATH = (TNSNAMES, ONAMES, HOSTNAME)

如果你的ORACLE客户端和服务器默认的域名不一样,需要用#号注释第一行
#NAMES.DEFAULT_DOMAIN = WORLD使它不起作用。

   NAMES.DIRECTORY_PATH指定找服务器别名的顺序 (本地的tnsnames.ora文件, 命名服务器, 主机名方式)
  
   服务器的sqlnet.ora里可以设置检查客户端是否alive的时间间隔
   sqlnet.expire_time = 10
  
   tnsnames.ora文件里写数据库服务器别名的详细内容,有以下几种写法:

   # 一般的写法              APPDB =
     (DESCRIPTION =
       (ADDRESS_LIST =
         (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1521))
       )
       (CONNECT_DATA =
         (SERVICE_NAME = appdb)
       )
     )

   # 明确标明用dedicated方式连接数据库   APPD=
   (DESCRIPTION=
     (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.35)(PORT=1521))
     (CONNECT_DATA=
       (SERVICE_NAME=appdb)
       (SERVER=DEDICATED))) 

   # 对多个listener端口做均衡负载方式连接数据库
   APPS =
     (DESCRIPTION =
     (ADDRESS_LIST =
         (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1521))
         (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1856))
      )
       (CONNECT_DATA =
         (SERVICE_NAME = appdb)
       )
     )   
 
# 注意:如果数据库服务器用MTS,客户端程序需要用database link时最好明确指明客户端用dedicated直连方式,
#       不然会遇到很多跟分布式环境有关的ORACLE BUG。
#     一般情况下数据库服务器用直接的连接会好一些,除非你的实时数据库连接数接近1000。
    
2. /etc/hosts (UNIX)
   或者windows\hosts(WIN98)  winnt\system32\drivers\etc\hosts (WIN2000)
   客户端需要写入数据库服务器IP地址和主机名的对应关系。
  
   127.0.0.1       localhost
   192.168.0.35    oracledb oracledb
   192.168.0.45    tomcat tomcat
   202.84.10.193   bj_db    bj_db   
  
   有些时候我们配置好第一步后,tnsping 数据库服务器别名显示是成功的,
   但是sqlplus username/password@servicename不通,jdbc thin link 也不通的时候,        
   一定不要忘了在客户端做这一步,原因可能是DNS服务器里没有设置这个服务器IP地址和主机名的对应关系。
  
   如果同时有私有IP和Internet上公有IP,私有IP写在前面,公有IP写在后面。
  
   编辑前最好留一个备份,增加一行时也最好用复制粘贴,避免编辑hosts时空格或者tab字符错误。
  
3. UNIX下ORACLE多数据库的环境,OS客户端需要配置下面两个环境变量

   ORACLE_SID=appdb;export ORACLE_SID
   TWO_TASK=appdb;export TWO_TASK 
  
   来指定默认的目标数据库。

Listener的三种处理客户端请求的方式(转)

1. Dedicated Connection
当客户端发出请求后,listener直接建立一个新的进程处理客户端请求,

当连接建立后,Listener会放弃对客户端与该进程通讯的控制权。
所以该连接也称为dedicated 或者bequeath连接。注意该新建的进程
是在客户端请求时候Listener建立的。

2.Prespawned Connection
Prespawned connection
Dedicated connection的特例。如果你希望客户端
能与服务器快速建立连接,而又是Dedicated connection的话,
可以采用该方式。因为当客户端发送连接请求到服务器的时候,不需要等待Listener
去建立一个进程来服务该客户端,因为这些进程已经预先Spawn(Listener在启动时候
就已经根据配置参数Spawn相应数量的进程,放在一个Prespawned processes Pool里面,
此参数PRESPAWN_MAXlistener.ora文件里面配置)。所以称之为Prespawned.
注意:PRESPAWN_MAX这个参数是指总的prespawned processes,你可以指定每种
协议prespawnprocess(pool_size参数),当然,总数不能超出PRESPAWN_MAX的值。

3.Multithreaded Connection
这种连接方式也有相应的服务客户端的进程,称之为Dispatcher
它和Prespawned process有点相似,也是预先Spawn的。不过跟Prespawned process
有两点区别:
a)dispatcher
是在instance启动时候就spawn的,而prespawned process
是在listener启动时候spawn的。
b)dispatcher
是共享的,也就是说,它不只是为一个客户端服务,当它接受了
客户端连接后,会把客户请求放在request queue里面,让另外一个进程
shared server process
进行处理;跟着它就会服务另外一个客户端的请求。
c)dispatcher
在完成与客户端的成功连接后,需要向Listener注册该连接(Prespawned
process
没这个步骤)。需要这个步骤是因为可以让listener知道当前每个dispatcher
负载情况,使dispatcher不会超出它能handle的最大连接数 (通过配置init.ora文件
里面的mts_dispatchers参数的子参数CONSESS就可以决定dispatcherhandle的最大
连接数。不过别混淆CONSESS子参数的意义,因为如果你需要实现connection
pooling
的话,就要靠这两个参数);另一方面,可以实现我们常说的load-balancing(负载平衡)。

解决非正常关闭数据库后出现的问题

我的数据库原本是正常使用的,但是在做试验的过程中用shutdown关闭数据库之后,很久都没有反应(之前都是很快),所以就手工把sqlplus /nolog界面关闭了,在关闭以后就不能开启数据库,登陆不了OEM,显示ORA-12519: TNS: 没有发现适用的服务处理程序:

出现的问题:

----------------------------------------------------------

SQL> conn sys/oracle@zyy_zyy as sysdba

ERROR:

ORA-12519: TNS: 没有发现适用的服务处理程序

 

警告: 您不再连接到 ORACLE

SQL> conn sys/oracle as sysdba

已连接到空闲例程。

SQL> startup

ORA-01081: cannot start already-running ORACLE - shut it down first

SQL> startup pfile='h:\oracle\ora92\database\initzyy.ora'

ORA-01081: cannot start already-running ORACLE - shut it down first

SQL> shutdown

ORA-24324: 未初始化服务句柄

ORA-24323: 不允许此值

ORA-01090: 正在进行关闭 --- 不允许连接

 

解决办法:

---------------------------------------------------------

SQL> shutdown abort

ORACLE 例程已经关闭。

SQL> startup

ORACLE 例程已经启动。

SQL> conn sys/oracle@zyy_zyy as sysdba

已连接。

 

原因:

---------------------------------------------------------

从出现问题的原因中我们可以看到,数据库是因为关闭过程被中断所引起的,之后用shutdown命令也无法关闭数据库,因此可以想到,在正常关闭和立即关闭无法工作时,我们可以用shutdown abort来中止当前的数据库实例。

Shutdown abort中止一个实例时具有如下特点:

l         Oracle服务器立即中止当前正在处理的SQL语句;

l         ORACLE服务器不会等待当前与数据库连接的用户断开连接;

l         数据重做日志缓冲不会写到磁盘中;

l         未完成的事务不会回滚;

l         实例终止,而不会关闭文件;

l         ORACLE关闭和卸载数据库;

l         下一次启动需要实例恢复,这是自动的。

 

lsnrctl命令的使用

获取lsnrctl的帮助信息:

C:\>lsnrctl help

 

LSNRCTL for 32-bit Windows: Version 9.2.0.4.0 - Production on 22-6 -2006 11:05

:46

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

 

以下操作可用

星号 (*) 表示修改符或扩展命令:

start               stop                status

services            version             reload

save_config         trace               change_password

quit                exit                set*

show*

 

其中比较常用的有:

1、启动:

    lsnrctl start

2、停止:

    lsnrctl stop

3、当前Listener的状态:

   Lsnrctl status

June 21

查看数据字典

1、怎样查看哪些用户拥有SYSDBA、SYSOPER权限?

SQL>conn sys/change_on_install
SQL>select * from V_$PWFILE_USERS;

 

2、怎样查得数据库的SID ?

SQL> select name from v$database;

NAME
---------
ZYY

 

也可以直接查看 init.ora文件

3、查看数据库的版本信息,包含版本信息,核心版本信息,位数信息(32位或64位)等

SQL> select *
  2  from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
PL/SQL Release 9.2.0.4.0 - Production
CORE    9.2.0.3.0       Production
TNS for 32-bit Windows: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production

June 20

系统权限与用户权限

在数据库中,权限可以分为两种
1、系统权限
2、对象权限
 
系统权限:
该权限要求用户具有进行系统级活动的能力,即执行一个特定的数据库操作或一类数据库操作。这些操作包括创建、删除和修改表、视图、回滚段与过程。
对象权限:
每个对象权限使得用户能够对特定的对象执行特定的动作,比如表、视图、序列、过程、函数或包。
需要注意的是:
1、在授予对象权限时应该是:with grant option子句
   在授予系统权限时应该用:with admin option子句
2、任何拥有含ADMIN OPTION的系统权限的用户的都可以从数据库中任何其他用户中回收相
      应的权限,而回收者不一定是最初授予该权限的用户。
   如果撤销的是对象权限,撤销者必须是该权限的初始授权者。
3、1)在撤销系统权限时,不会有任何连锁效应,不管授权时是否使用WITH ADMIN OPTION。
    比如: DBA 给A授予了CREATE ANY TABLE 的权限,并且带有WITH ADMIN OPTION,
             之后A给B授予了CREATE ANY TABLE 的权限。
          当DBA从A那回收了CREATE ANY TABLE的权限后,A所创建的表仍然存在,但他
          不能在创建任何新表了。B却仍然拥有表和CREATE  ANY TABLE的系统权限,即
          对A的权限的回收不影响到B.
   2)在使用了WITH GRANT OPTION授予对象权限后,撤销对象权限会有连锁效应。
 
可以利用数据字典视图system_privilege_map获得完整的系统权限。
我们可以先看看视图system_privilege_map的结构:
SQL> desc system_privilege_map;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- --------------------------
 PRIVILEGE                                 NOT NULL NUMBER
 NAME                                      NOT NULL VARCHAR2(40)
 PROPERTY                                  NOT NULL NUMBER

windows快捷键(转)

  CTRL+A:选中活动窗口的所有内容

  CTRL+C:把选中的东西复制到粘贴板

  CTRL+F:显示“查找和替换”对话框

  CTRL+G:显示定位对话框

  CTRL+N:显示新建对话框

  CTRL+O:显示打开对话框

  CTRL+P:显示打印对话框

  CTRL+S:保存当前文档

  CTRL+V:粘贴

  CTRL+X:剪切

  CTRL+Z:撤销

  CTRL+F4:关闭当前活动窗口

  CTRL+拖放文件:复制拖放的文件

  CTRL+ESC:显示开始菜单

  CTRL+F6:打开活动应用程序的下一个文档窗口

  ALT+ENTER:显示选中对象的属性

  ALT+F4:关闭活动项目或者退出活动的程序

  ALT+空格:打开当前活动窗口的快捷菜单

  ALT+TAB:在打开窗口间切换

  ALT+ESC:以打开的顺序切换窗口

  F1:提供当前窗口或者选中项目的帮助文件

  F2:重命名选中的项目

  F3:搜索文件或文件夹

  F4:显示我的电脑或Windows Explorer中的地址栏

  F5:刷新活动窗口

  F6:在当前窗口中的元素间切换,与TAB键功能一样

  F10:激活当前窗口的菜单栏

  Win:显示或隐藏开始菜单

  Win+BREAK:显示系统属性对话框

  Win+D:显示桌面

  Win+M:最小化所有窗口

  Win+SHIFT+M:恢复最小化窗口

  Win+E:打开我的电脑

  Win+F:搜索文件或文件夹

  CTRL+Win+F:搜索计算机

  Win+F1:显示Windows帮助文件

  Win+L:锁住键盘

  Win+R:打开运行窗口

  Win+U:打开辅助工具管理器

  TAB:在选项间切换

  SHIFT+TAB:在选项间切换,顺序与TAB相反

  CTRL+TAB:在标签间进行切换

  CTRL+SHIFT+TAB:在标签间反向切换

  ALT+带下划线的字母:运行相应的命令或选择相应的选项

  空格键:如果焦点选中复选框,选择或反选复选框

  以下的快捷键用于与Windows资源管理器类型的程序:

  NUM LOCK+星号(*):显示选中文件夹的所有子文件夹

  NUM LOCK+加号(+):显示选中文件夹的内容

  NUM LOCK+减号(—):折叠选中文件夹

我的愿望

我用心祈祷

神终于感动了

神问我的愿望是什么

我说要和我的兄弟姐妹做一生的朋友

神说行只能七天

我说好星期一到星期七

神说不行只能四天

我说好春天 夏天 秋天 冬天

神说不行只能三天

我说好昨天 今天 明天

神说不行只能两天

我说好白天 夜天

神又说不行只能一天

我说好在我活者的每一天

最后神哭了我笑了

Linux访问Windows,解决文件共享

很多人都会在硬盘上安装双系统windows/linux,因为大家习惯了windows平台,如果能够在linux下访问windows下的文件,就会很方便,利用linux自带的samba,或者用VMWARE workstation都可以实现这一需求,但是都比较麻烦,这里提供一种既简单又方便的方法:

首先,可以在根用户下查询分区情况,假设为第一个分区(/dev/hda1), 键入:

su - root //切换到根目录

password: //输入你的密码

然后用fdisk命令查看分区情况,键入:

fdisk -l

以下是我的系统的情况:

------------------------------------------------------

Disk /dev/hda: 80.0 GB, 80026361856 bytes

255 heads, 63 sectors/track, 9729 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System

/dev/hda1 * 1 973 7815591 b Win95 FAT32

/dev/hda2 974 9729 70332570 f Win95 Ext'd (LBA)

/dev/hda5 974 1039 530113+ 6 FAT16

/dev/hda6 1040 2797 14121103+ b Win95 FAT32

/dev/hda7 2798 4621 14651248+ b Win95 FAT32

/dev/hda8 4622 7053 19535008+ b Win95 FAT32

/dev/hda9 8110 9729 13012618+ 7 HPFS/NTFS

/dev/hda10 7054 7066 104391 83 Linux

/dev/hda11 7067 8044 7855753+ 83 Linux

/dev/hda12 8045 8109 522081 82 Linux swap

------------------------------------------------------------

然后创建一个装配点用以保存Windows分区的数据,键入:

  mkdir /mnt/vfat //创建文件夹

 

 要以Xterm的根用户访问分区,键入如下内容:

  

mount -t vfat /dev/hdal /mnt/vfat //挂载

最后,你就可以进入目录/mnt/vfat下查看该文件夹下的文件

也可用命令

cd /mnt/vfat //切换目录

ls //查看该目录下的文件

IT业人士群聚喝酒的讲究

大家喝的是啤酒,这时你入座了......

    你给自己倒了杯可乐,这叫低配置。

    你给自已倒了杯啤酒,这叫标准配置。

    你给自己倒了杯茶水,这茶的颜色还跟啤酒一样,这叫木马。

    你给自己倒了杯可乐,还滴了几滴醋,不仅颜色跟啤酒一样,而且不冒热气还有泡泡,这叫超级木马。

    你的同事给你倒了杯白酒,这叫推荐配置。

    人到齐了,酒席开始了。

    你先一个人喝了一小口,这叫单元测试。

    你跟旁边的人说哥们咱们随意,这叫交叉测试。

    但是他说不行,这杯要干了,这叫压力测试。

    于是你说那就大家一起来吧,这叫内部测试。

    这个时候boss向全场举杯了,这叫公开测试。

    菜过三巡,你就不跟他们客气了。

    你向对面的人敬酒,这叫p2p.

    你向对面的人敬酒,他回敬你,你又再敬他......,这叫tcp.

    你向一桌人挨个敬酒,这叫令牌环。

    你说只要是兄弟就干了这杯,这叫广播。

    可是你的上司jj听了不高兴了,只有兄弟么,罚酒三杯。这叫炸弹。

    可是你的下级mm听了不高兴了,我喝一口,你喝一杯,这叫恶意攻击。

    有一个人过来向这桌敬酒,你说不行你先过了我这关,这叫防火墙。

    你的小弟们过来敬你酒,这叫一对多。

    你是boss,所有人过来敬你酒,这叫服务器。

刚创建的用户怎样才能成功创建一个表

 

 

当一个用户刚被创建时是不具备任何权限的,因此要在该用户模式下创建表,需授予CREATE SESSIONCREATE TABLE、以及UNLIMITED TABLESPACE(或分配配额)权限,因为:

当用户要连接到数据库时必须拥有CREATE SESSION权限

当用户要创建表时必须拥有CREATE TABLE权限,同时用户还需要在表空间中拥有配额或者被授予UNLIMITED TABLESPACE。现在我们来做一个测试:

斜体代表在sys用户下的操作,加粗代表在用户test下的操作:

1)、创建用户TEST,密码为passwd_1:

SQL> CREATE USER test

2         IDENTIFIED BY passwd_1

3         ;

用户已创建

2)当用TEST连接数据库时:

SQL> conn test/passwd_1

ERROR:

ORA-01045: user TEST lacks CREATE SESSION privilege; logon denied

警告: 您不再连接到 ORACLE

//因为缺少CREATE SESSION的权限,登陆失败。

 

3)利用SYSTEST授予CREATE SESSION权限:

SQL> grant create session to test;

授权成功。

 

4SQL> conn test/passwd_1

已连接。

 

5)在test的方案中创建表exam1:

SQL> create table exam1

  2  (student_id int,

  3   paper_id int);

create table exam1

*

ERROR 位于第 1 :

ORA-01031: 权限不足

 

//因为未给TEST用户授予create table 权限,因此不能够创建表exam1.

 

6) TEST用户授予CRETE TABLE 权限

SQL> grant create table to test;

授权成功。

 

7SQL> create table exam1

  2  (student_id int,

  3   paper_id int);

create table exam1

*

ERROR 位于第 1 :

ORA-01950: 表空间'SYSTEM'中无权限

 

//因为在创建用户时没有指定表空间,因此默认的表空间是SYSTEM表空间,而TEST用户还需要在表空间SYSTEM中既没有拥有配额又没有被授予UNLIMITED TABLESPACE权限,因此对于这种情况有两种解决办法:

 

第一种方法:

SQL> alter user test

  2  quota 15m on system;

用户已更改。

//SYSTEM表空间中,给用户TEST分配15M的使用空间

 

SQL> create table exam1

  2  (student_id int,

  3   paper_id int);

表已创建

 

第二种方法:

SQL> grant unlimited tablespace to test

  2  ;

授权成功。

SQL> create table exam2

  2  (student_id int,

  3   paper_id int);

表已创建