| yy's profile每天都要做出不同的选择BlogLists | Help |
每天都要做出不同的选择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)。 但是,由于内存是一种有限而又不充足的资源,高速缓冲不可能做的很大(它不可能包容要用到的所有数据)。当缓冲充满了数据时,其中最长时间不用的数据将被舍弃以腾出内存空间用于新的数据。 对写磁盘操作来说磁盘缓冲技术同样有效。一方面,被写入磁盘的数据常常会很快地又被读出(例如,原代码文件被保存到一个文件中,又被编译器读入),所以将要被写的数据放入缓冲中是个好主意。另一方面,通过将数据放入缓冲中,而不是将其立刻写入磁盘,程序可以加快运行的速度。以后,写的操作可以在后台完成,而不会拖延程序的执行。 针对以上的原因,出现了很多的日志文件系统,数据在缓冲区修改后,同时会被文件系统记录修改信息,这样即使此时系统掉电,系统重启后会首先从日志记录中恢复数据,保证数据不丢失。当然这些问题不再本文的叙述范围。 由于上述原因,在使用适当的关闭过程之前,绝对不要关掉电源,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: 协议适配器错误的问题,经过一番努力问题已经解决,与大家共享。 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]
//不足的是,在sqlplus中help命令只可以查到少数命令的使用: 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操作,就相当与该约束字段被锁定了。另外,基于约束的索引也会被删除,约束被禁止。 June 22 oracle安装文档及软件下载网址Oracle 软件下载地址 Oracle9i: http://www.oracle.com/technology/software/products/oracle9i/index.html Oracle10g: http://www.oracle.com/technology/software/products/database/oracle10g/index.html
Oracle 在各个平台的安装文档:
oracle documentation links:(index of all platform) http://www.oracle.com/technology/documentation/index.html
通过故障解释客户端连接到数据库的详细过程故障:TNS-12154 (ORA-12154):TNS:could not resolve service name ---------------------------
---------------------------- 另外,如果在$oracle_home\network\admin中不存在tnsname.ora,则可以通过Net Configuration Assistant来进行配置 MTS/dedicateoracle server有两个可选的配置:MTS,dedicate:
1、MTS(multiple thread servers)多线程服务器: MTS在小用户情况下比专有服务器要消耗更多的资源,因此在在线用户数较少的情况下不要把服务器设为MTS 2、Dedicate方式是指独占进程服务器方式:
我们可以通过查看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 ORACLE客户端连服务器的注意事项(转)
1. 通过SQL*NET协议,ORACLE客户端连服务器时一般需要配置sqlnet.ora和tnsnames.ora。 也可以设置环境变量TNS_ADMIN指向你想用的sqlnet.ora和tnsnames.ora目录 sqlnet.ora文件决定找数据库服务器别名的方式 默认的参数有 如果你的ORACLE客户端和服务器默认的域名不一样,需要用#号注释第一行 NAMES.DIRECTORY_PATH指定找服务器别名的顺序 (本地的tnsnames.ora文件, 命名服务器, 主机名方式) # 一般的写法 APPDB = # 明确标明用dedicated方式连接数据库 APPD= # 对多个listener端口做均衡负载方式连接数据库 ORACLE_SID=appdb;export ORACLE_SID Listener的三种处理客户端请求的方式(转)1. Dedicated Connection 解决非正常关闭数据库后出现的问题
我的数据库原本是正常使用的,但是在做试验的过程中用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
2、怎样查得数据库的SID ? SQL> select name from v$database; NAME
也可以直接查看 init.ora文件 3、查看数据库的版本信息,包含版本信息,核心版本信息,位数信息(32位或64位)等 SQL> select * BANNER June 20 系统权限与用户权限
windows快捷键(转)
我的愿望
Linux访问Windows,解决文件共享
IT业人士群聚喝酒的讲究
刚创建的用户怎样才能成功创建一个表
|
|||||||||||||||||||||||
|
|