2005年09月22日

一、关于裸设备 

1.1 什么是裸设备(RAW DEVICE) 

裸设备是指未创建文件系统的磁盘分区(raw partition)或逻辑卷(raw logical volume),应用程序直接通过一 
个字符设备驱动程序对它进行访问。如何对设备上的数据读写决定于使用它的应用程序。由于对裸设备的操作不通过UNIX的缓冲区,数据在ORACLE的数据缓冲区(BUFFER CACHE)和磁盘之间直接传递,所以使用裸设备在一定程度上能够提高I/O性能,适合I/O量大的系统。另外OPS/RAC (Oracle Parallel Server/Real Application Cluster)环境下,多个节点同时访问同一个数据库,所以CONTROL FILE、DATA FILE、REDO LOG都必须建在RAW DEVICE上。 

1.2 裸设备的可用空间 

不同的UNIX对裸设备的管理不完全相同,特别要注意的是某些UNIX在每个裸设备的头部要保留一定的空间,应用程序在使用裸设备时不可以覆盖这一部分,否则会对裸设备造成损坏。所以一个裸设备的实际可用空间是分配给裸设备的空间再减去这部分操作系统保留空间。下面是常用UNIX的OS Reserved Size列表: 

UNIXOS Reserved Size 

—————————- 

SUN Solaris0 

HP-UX0 

IBM AIX4k 

Tru64 UNIX64k 

Linux0 

1.3 dd命令 

UNIX上读写裸设备不能使用cp, cpio, tar等命令,必须用dd,下面是几个dd常用参数的简单说明,更详细的信息请参考UNIX使用手册或用命令man dd。 

dd [ operand=value ... ] 

if=file 指定输入文件,缺省值是标准输入 

of=file 指定输出文件,缺省值是标准输出 

bs=n 设置输入和输出的块大小为n字节,也可以用“k”作单位 

skip=n 在拷贝之前跳过n个输入块,缺省值是0 

seek=n 在拷贝之前从输出文件首部跳过n块,缺省值是0 

count=n 指定拷贝的块数,缺省拷贝到输入文件结束 

1.4 对本文中示例的说明 

a. 所有例子中ORACLE的DB_BLOCK_SIZE都是8k 

b. /oradata是一文件系统目录 

c. /dev/rlv_data,/dev/rlv_redo和/dev/rlv_ctrl是三个RAW DEVICE,大小均为8MB(8192k) 

d. 在未提到操作系统时,默认是AIX,OS_RESERVED_SIZE=4K 

二、移动数据文件(DATAFILE) 

2.1 在裸设备上建立数据文件 

用以下命令建立表空间: 

SQL> CREATE TABLESPACE ts_test DATAFILE ’/dev/rlv_data’ SIZE 8180k; 

SIZE指定的数值必须小于或等于8180k,否则语句将会失败: 

ORA-01119: error in creating database file ’/dev/rlv_data’ 

ORA-27042: not enough space on raw partition to fullfill request 

这个最大值的计算方法如下: 

8192k(RAW DEVICE SIZE) - 4k (OS_RESERVED_SIZE) - 8k (DB_BLOCK_SIZE) = 8180k 

为什么还要减去一个DB_BLOCK_SIZE呢?这是因为ORACLE建立DATAFILE时,在命令中SIZE指定的大小之外,还要在文件头另加一个BLOCK,叫作“Oracle OS Header Block”,里面保存有这个文件的逻辑块大小和文件块数等信息。这一点并不是在RAW DEVICE上建DATAFILE特有的,如果你在文件系统上建一个DATAFILE,指定SIZE 1000k的话,你用ls -l或dir命令看到的文件大小将是1008k (DB_BLOCK_SIZE=8K)。 

2.2 在文件系统和裸设备之间移动数据文件 

2.2.1 从文件系统到裸设备 

a. 在文件系统上建一个4M的DATAFILE 

SQL> CREATE TABLESPACE test DATAFILE ’/oradata/test.dbf’ SIZE 4M; 

b. 查看一下这个新建的DATAFILE的大小 (注:4202496 = 4M + 8K) 

$ ls -l /oradata/test.dbf 

-rw-r—– 1 oracle dba 4202496 Aug 29 15:01 /oradata/test.dbf 

c. 按下表公式确定dd的参数 



d. 在数据库没有OPEN的状态下,用dd进行拷贝,下面给出命令及输出 

AIX$ dd if=/oradata/test.dbf of=/dev/rlv_data bs=4k seek=1 

1026+0 records in 

1026+0 records out 

Tru64$ dd if=/oradata/test.dbf of=/dev/rlv_data bs=64k seek=1 

64+1 records in 

64+1 records out 

Other$ dd if=/oradata/test.dbf of=/dev/rlv_data bs=1024k 

4+1 records in 

4+1 records out 

2.2.2 从裸设备到文件系统 

a. 确定数据文件实际大小file_size,用于下一步计算dd的参数count。如果count计算不对,拷贝出的数据文件无效,数据库无法打开。 

SQL> SELECT bytes, blocks, bytes/blocks db_block_size, bytes+bytes/blocks file_size 

FROM dba_data_files WHERE file_name=’/dev/rlv_data’; 

BYTESBLOCKSDB_BLOCK_SIZEFILE_SIZE 

———- ——– ————- ——— 

419430451281924202496 

b. 按下表公式确定dd的参数,min表示二者之中取较小的 



c. 在数据库没有OPEN的状态下,用dd进行拷贝,下面给出命令及输出 

AIX$ dd if=/dev/rlv_data of=/oradata/test2.dbf bs=4k skip=1 count=1026 

1026+0 records in 

1026+0 records out 

Tru64$ dd if=/dev/rlv_data of=/oradata/test2.dbf bs=8k skip=8 count=513 

513+0 records in 

513+0 records out 

Other$ dd if=/dev/rlv_data of=/oradata/test2.dbf bs=8k count=513 

513+0 records in 

513+0 records out 

2.2.3 无论从FILE SYSTEM拷贝到RAW DEVICE还是反之,想让ORACLE以新的数据文件打开数据库,必须进行RENAME操作 

SQL> STARTUP MOUNT; 

SQL> ALTER DATABASE RENAME FILE ’oldfilename’ TO ’newfilename’; 

SQL> ALTER DATABASE OPEN; 

三、移动联机重作日志(ONLINE REDO LOG) 

3.1 在裸设备上建ONLINE REDO LOG 

用以下命令增加一组ONLINE REDO LOG: 

SQL> ALTER DATABASE ADD LOGFILE GROUP 4 ’/dev/rlv_redo’ SIZE xxxxk; 

在裸设备上建REDO LOG时也要计算SIZE子句可使用的最大值,方法类似于在2.1中建DATAFILE时的计算方法,唯一不同的是要把公式中的DB_BLOCK_SIZE换成REDO_BLOCK_SIZE(即REDO LOG的逻辑块大小)。这个REDO_BLOCK_SIZE在不同操作系统上取值不同,用以下两种方法均可得到这个值,同时还可计算出REDO LOG的实际文件大小file_size): 

方法1:dump现有的REDO LOG FILE 

SQL> ALTER SYSTEM DUMP LOGFILE ’/oradata/redo01.log’; 

SQL> SHOW PARAMETER user_dump_dest 

查看user_dump_dest目录下刚产生的trc文件: 

FILE HEADER: 

Software vsn=135294976=0×8107000, Compatibility Vsn=135290880=0×8106000 

Db Id=3227187598=0xc05af98e, Db Name=’V817′ 

Control Seq=12474=0×30ba, File size=8192=0×2000 

File Number=5, Blksiz=512, File Type=2 LOG 

方法2:用ORACLE提供的工具dbfsize,对文件系统和RAW DEVICE上的文件都适用 

$ dbfsize /oradata/redo01.log 

Database file: /oradata/redo01.log 

Database file type: file system 

Database file size: 8192 512 byte blocks 

从以上两个输出都可得知REDO_BLOCK_SIZE=512,blocks=8192 

file_size=(blocks + 1) * REDO_BLOCK_SIZE = (8192+1)*512=4194816 

如果已知所在平台的REDO_BLOCK_SIZE,也可以通过查询数据字典来计算file_size: 

SQL> SELECT b.member, b.bytes, b.bytes+512 file_size FROM v$logfile a, v$log b 

WHERE a.group#=b.group# and a.member=’/oradata/redo01.log ’; 

MEMBERBYTES FILE_SIZE 

——————–——–——— 

/oradata/redo01.log41943044194816 

下表列出了常用OS上的ORACLE REDO_BLOCK_SIZE: 

OSREDO_BLOCK_SIZE 

—————– ————— 

Windows512 

SUN Solaris512 

HP-UX1024 

IBM AIX512 

Compaq Tru64 UNIX1024 

Linux512 

3.2在文件系统和裸设备之间移动ONLINE REDO LOG 

参见2.2拷贝DATAFILE的过程,唯一不同是要把DB_BLOCK_SIZE换成REDO_BLOCK_SIZE。另外,REDO LOG也可以不用dd进行拷贝,而采用删除重建的方法: 

SQL> SELECT * FROM v$log; –be sure it’s not current and archived 

SQL> ALTER SYSTEM SWITCH LOGFILE; –if it’s current, force switch 

SQL> ALTER DATABASE DROP LOGFILE GROUP n; 

SQL> ALTER DATABASE ADD LOGFILE GROUP n ’newlogfilename’ SIZE xxxxM; 

四、移动控制文件(CONTROL FILE) 

4.1在裸设备上建控制文件 

ORACLE的控制文件是执行CREATE DATABASE或CREATE CONTROLFILE语句时生成的,其名字是由初始化参数文件init$ORACLE_SID.ora中的control_files参数指定。CONTROL FILE的大小不能显式指定,而且随着数据库的运行,它还会自动增长,所以为控制文件划分裸设备时要根据经验,留好足够的余量,以免不必要的麻烦。CONTROL FILE的逻辑块大小和DB_BLOCK_SIZE相同,而且文件头部也和DATAFILE一样有一块“Oracle OS Header Block”。 

4.2在文件系统和裸设备之间移动控制文件 

4.2.1 使用dd复制 

拷贝CONTROL FILE的方法基本与2.2中拷贝DATAFILE相同,唯一不同是当由裸设备向文件系统拷贝时,如何确定CONTROL FILE的实际大小file_size (ORACLE数据字典里没有CONTROL FILE大小的数据)。下面介绍两个方法: 

方法1:执行完下面的SQL语句,再到user_dump_dest目录查看刚产生的trc文件 

SQL> ALTER SESSION SET EVENTS ’IMMEDIATE TRACE NAME CONTROLF LEVEL 10′; 

FILE HEADER: 

Software vsn=135266304=0×8100000, Compatibility Vsn=134217728=0×8000000 

Db Id=1937054535=0×73751b47, Db Name=’O817′ 

Control Seq=5838=0×16ce, File size=476=0×1dc 

File Number=0, Blksiz=8192, File Type=1 CONTROL 

方法2:用ORACLE提供的工具dbfsize 

$ dbfsize /oradata/control01.ctl 

Database file: /oradata/control01.ctl 

Database file type: file system 

Database file size: 476 8192 byte blocks 

从以上两个方法的输出结果都可得到file_size=(476+1)*8192=3907584 

4.2.2 使用SQL命令复制 

相对于4.2.1介绍的用dd拷贝CONTROL FILE,下面用SQL语句进行复制的方法更为简洁: 

SQL> STARTUP MOUNT 

SQL> ALTER DATABASE BACKUP CONTROLFILE TO ’newcontrolfile’; 

语句中newcontrolfile既可以是文件系统文件,也可以是RAW DEVICE,所以在MOUNT状态下运行这个命令就可以生成一个与现有CONTROL FILE完全相同CONTROL FILE复件。 

4.2.3 修改初始化参数文件(init$ORACLE_SID.ora) 

无论用4.2.1还是4.2.2的方法产生了新的CONTROL FILE,为了让数据库使用新的CONTROL FILE,只要修改init$ORACLE_SID.ora里的control_files参数即可。 

五、Recovery Manager (RMAN) 

RMAN是ORACLE8开始提供的备份与恢复工具,它能自动正确地跳过裸设备头部的OS Reserved Block,通过使用RMAN的BACKUP和RESTORE功能,可以方便地达到把DATAFILE和CONTROL FILE在文件系统和裸设备之间移动的目的,具体操作过程在这里不再详述,请参见RMAN手册。 

ORACLE联机日志文件丢失或损坏的处理方法 
 

经验总结: 

联机日志分为当前联机日志和非当前联机日志,非当前联机日志的损坏是比较简单的,一般通过clear命令就可以解决问题。

损坏非当前联机日志:
1、启动数据库,遇到ORA-00312 or ORA-00313错误,如:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: ’/setup/oradata/hydb/redo01.log’
从这里我们知道日志组1的数据文件损坏或丢失了
从报警文件可以看到更详细的信息
2、查看V$log视图:
SQL> select group#,sequence#,archived,status from v$log;

   GROUP#  SEQUENCE# ARC STATUS
———- ———- — —————-
         1          0 YES UNUSED
         2          1 NO  CURRENT

可以知道,该组是非当前状态,而且未用过
3、用CLEAR命令重建该日志文件
SQL>alter database clear logfile group 1;
如果是该日志组还没有归档,则需要用
SQL>alter database clear unarchived logfile group 1;
4、打开数据库,重新备份数据库
SQL>alter database open;
说明:
1)、如果损坏的是非当前的联机日志文件,一般只需要clear就可以重建该日志文件,但是如果该数据库处于归档状态但该日志还没有归档,就需要强行clear。
2)、建议clear,特别是强行clear后作一次数据库的全备份。
3)、此方法适用于归档与非归档数据库。

损坏当前联机日志

归档模式下当前日志的损坏有两种情况,
一、是数据库是正常关闭,日志文件中没有未决的事务需要实例恢复,当前日志组的损坏就可以直接用alter database clear unarchived logfile group n来重建。
二、是日志组中有活动的事务,数据库需要媒体恢复,日志组需要用来同步,有两种补救办法
A. 最好的办法就是通过不完全恢复,可以保证数据库的一致性,但是这种办法要求在归档方式下,并且有可用的备份
B. 通过强制性恢复,但是可能导致数据库不一致。
下面分别用来说明这两种恢复方法
5.1.2.1 通过备份来恢复
1、打开数据库,会遇到一个类似的错误
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: ’D:\ORACLE\ORADATA\TEST\REDO01.LOG’
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) 系统找不到指定的文件

2、查看V$log,发现是当前日志
SQL> select group#,sequence#,archived,status from v$log;


3、发现clear不成功
SQL> alter database clear unarchived logfile group 2;
alter database clear unarchived logfile group 2
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of thread 1
ORA-00312: online log 1 thread 1: 
4、拷贝有效的数据库的全备份,并不完全恢复数据库
可以采用获取最近的SCN的办法用until scn恢复或用until cnacel恢复
recover database until cancel
先选择auto,尽量恢复可以利用的归档日志,然后重新
recover database until cancel
这次输入cancel,完成不完全恢复,也就是说恢复两次。
如:
SQL> recover database until cancel;
Auto
……
SQL> recover database until cancel;
Cancel;
5、利用alter database open resetlogs打开数据库
说明:
1、这种办法恢复的数据库是一致的不完全恢复,会丢失当前联机日志中的事务数据
2、这种方法适合于归档数据库并且有可用的数据库全备份。
3、恢复成功之后,记得再做一次数据库的全备份。
4、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。

如果没有备份,进行强制性恢复
1、打开数据库,会遇到一个类似的错误
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: ’D:\ORACLE\ORADATA\TEST\REDO01.LOG’
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) 系统找不到指定的文件

2、查看V$log,发现是当前日志
SQL> select group#,sequence#,archived,status from v$log;

GROUP# SEQUENCE# ARCHIVED STATUS
———- ———- ——– —————-
1 1 NO CURRENT
2 2 YES INACTIVE
3 3 YES INACTIVE

3、发现clear不成功
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of thread 1
ORA-00312: online log 1 thread 1: ’D:\ORACLE\ORADATA\TEST\REDO01.LOG’

4、把数据库down掉
SQL>shutdown immediate

5、在init<sid>.ora中加入如下参数
_allow_resetlogs_corruption=TRUE

6、用pfile重新启动数据库,利用until cancel恢复
SQL>recover database until cancel; 
Cancel
如果出错,不再理会,发出 
SQL>alter database open resetlogs;

7、数据库被打开后,马上执行一个full export

8、shutdown数据库,去掉_all_resetlogs_corrupt参数 

9、重建库

10、import并完成恢复

11、建议执行一下ANALYZE TABLE …VALIDATE STRUCTURE CASCADE;
说明:
1、该恢复方法是没有办法之后的恢复方法,一般情况下建议不要采用,因为该方法可能导致数据库的不一致
2、该方法也丢失数据,但是丢失的数据没有上一种方法的数据多,主要是未写入数据文件的已提交或未提交数据。
3、建议成功后严格执行以上的7到11步,完成数据库的检查与分析
4、全部完成后做一次数据库的全备份
5、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的










2005-7-22
c shell的历史命令调用 [转]

3-5 history 的設定與運用

    history 說起來可算是 C Shell 的重大功能之一。history 這個字如果以它的整體功能來說,或許我們可稱它為 UNIX 的指令使用記錄。它負責記錄使用過的指令,供使用者“再利用”。這個“再利用”的動作可說是靈活多變,可運用的方面除了指令行外,連別名(aliases)、預設變數(Predefined Variables)的設定或 shell script 的程式設計等均可見到 history 的運用蹤跡。實在是一項使用者不能忽略的好功能。

     

    3-5-1 製定 history 的使用環境

     

    要能善用 history,首先得熟悉關於 history 使用環境的三個重要的預設變數。以下讓我們來為你一一地介紹:

        $history 變數

         

        變數 history 是使用 history 功能之前必須先設定的。通常都在 C Shell 的啟始檔案“.cshrc”中設定此變數,當然也可用手動的方式來設定或更改。設定的語法如下:

            set history = n (n是數字且必須是整數)

        如果你把 n 設定為 30,則 C Shell 將會隨時為你保留最後所下的 30 道指令,供你呼叫顯示到螢幕上,這便是 history list,它可供你運用 history 的其它功能。如果你想查看此變數的設定值,可使用指令

            echo $history

        來顯示 history 設定值。要重新設定可修改“.cshrc”檔案內的設定,再以指令 source .cshrc 便能更新設定值。也可直接下指令 set history = n 來更改。但後者設定的設定值會隨著該 Shell 的終結而消失,此點請注意。

        $savehist 變數

         

        設定這個變數的作用是在 Shell 終結後,將最後某幾道指令儲存到使用者的 home 目錄下的“.history”特殊檔案中,以供你下次 login 或另一個還在工作的 shell 來運用,上一個 shell 所記錄下來的最後幾道指令。如你設定為下:

            set savehist = 50

        則每一個 shell 的終結,都會對“~/.history”檔案做資料寫入、更新的動作。請注意!再重覆一遍,是每一個 shell 的終結都會更新 home 目錄下的“.history”檔案。所以當你下次 login 時所見到的 history list,便是“.history”檔案的內容。

         

        如果你常在 X Windows 或者是 Open Windows 等 GUI Windows 界面下工作的話,相信你一定會開好幾個 Windows 同時工作。在這種工作環境下如果你不去加以控制要儲存那一個 shell 的話,建議你不要使用它,或許會比較好些。

        $histchars 變數

         

        這個變數便是用來改變設定 history 的運用符號。用來解決符號的使用習慣問題。history 的專屬符號有兩個,第一個使用的符號“!”第二個符號“^”。如果你如下設定:

            set histchars = "#/"

        則符號“#”取代符號“!”;而符號“/”取代符號“^”。老實說來 UNIX系統對特殊符號的運用可說到了一“符”多“棲”的田地了,小心改出毛病來。建議你謹慎使用(最好是不用)。

    3-5-2 history 的運用說明

        3-5-2-1 設定 history 的數量與顯示的關係

        在一般使用的情況下,history 的設定數量大約都在 20 ~ 50 之間。這是因為設定太大了會佔用系統資源,用不上的話實在不划算。適中夠用就是好的設定值。你也可就螢幕顯示的列數來做為設定值的參考。免得列出history 時超過螢幕所能容納的行數。要在螢幕上列出 history 相當簡單,鍵入 history 便可。如果你嫌“history”字太長不好記,設個別名“alias h history”,相信也不會有人罵你懶!

         

        在指令行模式下鍵入 history 可顯示出 history list。當然你也可以在指令 history 後加上一個數字,用來控制顯示 history list 的數量。如下:

            25 % history 5
            21 ls
            22 cd subdir1
            23 ls
            24 cl
            25 history 5

        在 BSD 版本的 UNIX 系統中,C Shell 會提供 history 一項比較特殊的選項,就是“-r”選項。它的作用是將 hisroty list 顯示的事件次序倒過來。如下所示:

            26 % history -r 5
            26 history -r 5
            25 history 5
            24 cl
            23 ls
            22 cd subdir1
            27 %

        較長的設定值在顯示上會有超出螢幕行數的情況產生,這個問題很好解決,提供幾種別名設定供你參考使用:

            alias hup ’history | head -15′ (前15道history)
            alias hdn ’history | tail -15′ (後15道history)
            alias hm ’history | more’ (一頁一頁看)

        3-5-2-2 history 對過去指令的處理方式說明

         

        C Shell 的 history 功能,對於使用者所執行過的每個指令,基本上都把它當成一個“事件(event)”來處理。而每個事件都以數字來編號代表之。讓我們來在設定預設變數 $prompt 中加入 history 功能來說明,這種事件的處理情況。在指令行中鍵入如下:

            % set prompt = ’\! % ’

        這樣你便可在提詞(prompt)中清楚地看到 history 對“事件”的編號情況。如以下實際例子:

            % set prompt = ’\! % ’
            13 % history
            4 cd test
            5 \rm -r test
            6 tar cvf /dev/rst8 backup &
            7 ls
            8 vi backup.task
            9 set history = 50
            10 ps axu | grep cron
            11 cd
            12 set prompt = ’! % ’
            13 history
            14 % echo $history
            10

        從以上實例中看到 history 對過去指令的編號情況。通常 history 對指令的編號由 1 開始編起,每次自動加 1。但如果你設定預設變數 $savehist,則由此變數的數字加 1 算起。此點請注意。

         

        到此相信你對 history 的運作應該有一個概略的瞭解了吧!接下來便開始來運用 history 的功能,來“便利”我們的指令操作。如果你能善用將可大大改變你的使用效率。它至少可以降低你因為打多了鍵盤而得到職業病的機率。

        3-5-2-3 history 的符號說明與基本運用

         

        我們已經知道 history 對指令是以事件來處理,且加以編號。要如何簡單地“再利用”這些過去的“事件”呢?history 定義了一群符號來供我們變化使用。這些符號都是組合式的,基礎的第一個符號是“!”。此符號用來啟動 history 功能,但緊接在符號後的不能是下列這些符號:TAB 鍵、空白鍵、換行、等號或“(”及“.”等。接上這些符號將會產生錯誤。

        history 在指令行運作下的常用到的符號運用組合,我們以功能分類來加以說明:

         

        1. 指定事件執行

            符號“!!”

            “!!”執行上一個指令。在運用上除了執行上個指令外,並可在符號後在加入與指令語法不相沖的字元來修飾上個指令。如下例:

             

            % ls
            akira.sch passwd

             

            以上是指令 ls 的執行情況,當你覺得所顯示的訊息不足,想要加上選項-l時,你可在運用 history 時再加上該選項,如下用“!! -l”便相當於下指令“ls -l”:

             

            % !! -l
            total 2
            1 -rw-r–r– 1 akira 184 Sep 16 11:32 akira.sch
            1 -rw-r–r– 1 akira 65 Sep 16 11:31 passwd

             

            符號“!n”

            “!n”執行第 n 個事件。注意到這第 n 個事件一定得還在 history list 內才能順利執行。

            假設我們的 history 變數設定值為 10,當我們執行到第 22 個事件時,想要用符號“!n”來執行第 5 個事件,會產生什麼情況呢?請看下面:

             

            21 % echo $history
            10
            22 % !5
            5: Event not found.
            22 %

             

            “5: Event not found.”這個錯誤訊息便明顯的告訴了我們,指令所要執行的 history 事件以不在 history list 的範圍之內。如果你常會有這種情況發生,可以考慮將 history 變數的設定值加大到適當的數字。另外請注意到在事件 22 執行指令“!5”時,因產生“5: Event not found.”的錯誤,history 對此錯誤的指令並不記錄下來,所以事件的編號停留“22”。如果你所指定的事件在 history list 的範圍內的話,指令便能順利的執行過去的事件。如下:

             

            22 % !17
            ls
            total 4
            2 cshrc* 1 file 1 passwd

             

            符號“!-n”

            “!-n” 執行在 history list 中倒數第 n 個事件。

            我們用下面的例子說明它的使用情況:

             

            24 % h
            15 ps axu | grep cron
            16 pwd
            17 ls
            18 vi passwd
            19 h
            20 cl
            21 echo $history
            22 vi ~/.cshrc
            23 ls
            24 h
            25 % !-4
            echo $history
            10
            26 %

             

            看到沒有事件 25 的指令“!-4”所執行的是 history list 的事件 21,剛好是倒數第四個。

        2. 搜尋指定執行

            “!string” 搜尋以某字串 string 為開頭的過去指令並加以執行。

             

            “!?string?” 搜尋過去指令行中有某字串 ?string? 並加以執行。

             

            以上兩種使用方式均是在 history list 的 event 中,搜尋 event 的開頭或 event 中間有指定的字串,來加以執行。但均是執行第一個符合條件的 event。搜尋時以由 event 數字大到小。如下例所示:

             

            34 % h
            25 h
            26 cd
            27 tar cvf /dev/rst8 akbin &
            28 ps
            29 vi ~/.cshrc
            30 tar tvf /dev/rst8
            31 cd test
            32 ls
            33 vi passwd
            34 h
            35 % !v

             

            在上例中最後指令“!v”所執行的是第33個“vi passwd”,而不會是第27個“vi ~/.cshrc”。如果要執行第 27 個 event,你可用“!?cshrc”來執行,當然你也可直接用“!27”來執行,但會使用搜尋方式,自然是在不記的第幾個 event 的情況下才會採用的,不是嗎?又如果你設定的 $history 為 100 個,要用眼睛在 history list 中找尋,倒不如“奴役”電腦還來得好。是嗎?

             

            接下來介紹一個比較特殊的符號“!{…}”,用來應付一種比較特殊的情況。譬如你想在重執行以下這個指令:

             

            % cat /etc/hosts > ~/hosts

             

            並且要緊接著在指令後加入一些字串。如將重導向的“~/hosts”這個檔案名稱改為“~/hosts.bak”, 如果你下指令如下:

             

            % !cat.bak
            cat.bak: Event not found.

             

            這種錯誤是因為搜尋的字串與添加的字串沒有區隔開來的結果。解決的方法是使用大括號“{ }”將搜尋的字串括起來,再僅接著添加的字串便可。如下所示:

             

            % !{cat}.bak
            cat /etc/passwd > ~/hosts.bak

        3. 修改執行過去指令

            下錯指令、打錯字的情況是難免會發生的,或大同小異的指令也偶而會連續使用,像此類的情況運用修改的方式相當適當。(由其指令又臭又長的時候,你使用時一定會感激造令者的偉大)先來看一個例子:

            % rsh hosta -l user "screendump -x 20 -y 20 -X 300 -Y 300 scrfileA"

            如果是像這種指令打錯了一個字,比方說指令 screendump 少打了一個字母 e,變成 screndump,天呀!主管在旁邊看耶!!重打一次?如果再打錯保證你年終獎金少一半!!!這可怎麼辦??不用急,露一手什麼叫“知錯能改”,如下:

            語法 ^old^new^ 修改上個指令的old為new後執行。

            實際指令 % ^re^ree^

            就這樣把你漏打的字母補了進去。簡單幾個字就搞定,方便吧!不過這種方式的修改是有限制的。它只能還是以上面那個長的不得了的指令中更改一個地方,而且還得是上一個“事件”才行。如果不是上一道指令,要做類似的修改運用,可用以下的語法均可做到:

            !n:s/old/new/ 修改第 n 個事件的 old 為 new 後執行。

            !string:s/old/new/ 搜尋以 string 為開頭的事件並修改 old 為 new 後執行之。

            到目前所介紹的三種方式,均有個共通性,就是只能更改一組字串。而且字串內不可有空白鍵。如果有空白鍵會造成修改錯誤。如果要同時修改兩個以上相同的字串,對後面兩種語法中再加一個“g”便可,如下:

            !n:gs/old/new/ 修改第 n 個事件中所有的 old 為 new 後執行。

            !string:gs/old/new/ 搜尋以 string 為開頭的事件並修改所有的 old 為 new 後執行之。

            用這種方法便可輕易地將那個臭長指令中的 20,一起更改為想要的數字了。如下示:

            % !rsh:gs/20/50/

            這時我們所得到的將相當於下:

            % rsh hosta -l user "screendump -x 50 -y 50 -X 300 -Y 300 scrfileA"

            自己找例子試一試吧!它們真的是太好用了。

        3-5-2-4 history 對於事件的引數(argument)運用

            1. 引數的區分方式

            在前面我們曾經提到 history 對指令是以編號的事件來處理,但你除了可再利用這些事件外,同時你也可再利用事件中的每一個引數。先讓我們來看一個底下這個例子:

            事件的引數由 0 開始編起,所以 0 便代表事件開頭的指令。接下來是以空白鍵來隔開的字串或以特殊符號依序編號。注意到引數的編號,並非全以空白鍵隔開才算,因為只要有特殊符號,不管它與前後有無空白鍵都得算是一個單獨的引數。(這些特殊符號有 |,<,<<,>,>>,& 等)history 對引數安排了多種方式來代表引數的位置,如數字(0,1,2,…)或符號(“^”“$”“*”“x*”“x-”)。對引數的運用可單一的或者是一個範圍(x-y)均可。

            以下我們以表列來說明引數的符號使用方式:

符號


說            明
!!:n  使用上個事件的第 n 個引數,如“!!:3”
!!:x-y  使用上個事件的第 x 個引數到第 y 個引數,如“!!:0-4”
!n:^  使用第 n 個事件的第 1 個引數,符號“^”代表第一個引數
!^  使用上個事件的第 1 個引數
!$  使用上個事件的最後一個引數,符號“$”代表第最後個引數
!*  使用上個事件的第 1 個引數到最後一個引數
!!:x*  使用上個事件的第 x 個引數到最後一個引數,(相當於“!!:x-$”)如“!!:2*”即代表使用第 2 個之後的所有引數
!!:x-  與上相似不同處為不包含最後的引數,如“!!:2-”即代表使用第 2個到最後的倒數第一個引數。(語法“!!:x-”就是“!!:x-$”去掉“$”後所剩下來的樣子)

            2. 引數在指令行的運用

            在指令行模式下有些時候會連續好幾個指令都用到同一個或一群檔名,也就事說,你可能會有一個字串要一再重複鍵入。比方有以下情況:

             

            1 % ls -l ch1.doc ch2.doc ch3.doc
            2 % chmod g+w ch1.doc ch2.doc ch3.doc
            3 % tar cvf /dev/rst8 ch1.doc ch2.doc ch3.doc

             

            像以上這接連的三個指令都用到相同的檔案名稱 ch1.doc,ch2.doc, ch3.doc,利用 C Shell 的 history 功能,我們可在指令中將過去事件的引數利用符號代入,以簡化指令的長度,如以下所示:

             

            4 % ls -l ch1.doc ch2.doc ch3.doc
            5 % chmod g+w !!:2*
            6 % tar cvf /dev/rst8 !!:2*

             

            指令 5 中的“!!:2*”就代表指令 4 中的第 2 到最後的引數,所以指令 5 相當於指令 2。同理指令 6 相當於指令 3。

            再舉一個例子:

             

            7 % ls -l *.doc *.txt
            8 % rm -r !$
            9 % cat *.doc > doc.files
            10 % !6:0-2 !!$

             

            指令 8 中的“!$”既代表指令 7 中的最後的引數,就是“*.txt”。指令 10 的使用在語法上是成立的。連用 history 功能來組成指令,第一組“!6:0-2”是使用事件 6 的第 0 到第 2 個引數,接著空白鍵,接著第二組“!!$”使用前一個事件的最後一個引數。所以此指令相當於下:

             

            10 % tar cvf /dev/rst8 doc.file

             

            這便是 history 的引數的組合運用。對了!相信你還記得下面這個又臭又長的指令吧!

             

            % rsh hosta -l user "screendump -x 50 -y 50 -X 300 -Y 300 scrfileA"

             

            如果現在要你運用 history 的修改功能來更改第二個“50”變為“60”的話,你該如何下指令?回憶一下過去所介紹過的“修改功能”中,只能更改第一個或全部都改,這只改第二個可怎麼改才好呢?相信上面的指令 10會代給你靈感的。想到了沒,答案如下:

             

            % !rsh:0-7 60 !rsh:9*

             

            我們用該事件的引數 0 到 7,而引數 8 便是要修改的對像,我們不引用。在“!rsh:0-7”之後,我們便加上“□60□”,再接上該事件的引數 9 到最後的引數。如此便能成功地將某個事件中的某個引數,代換成所需(“□”代表空白鍵)。運用這樣較麻煩的方法可補原先與修改功能的不足與缺憾。希望有一天這種方法能幫你解決一些困擾。

            在 history 功能中有一項是僅將指令或所須的功能列出,而不執行。使用的符號為“”。這種列出不執行的方式,對比較複雜或比較沒有把握的組合運用是有幫助的。我們來修改第 10 個的使用語法成為只顯示而不執行,來看看它的用法:

             

            10 % !6:0-2 !!:$
            tar cvf /dev/rst8 doc.file
            11 %

             

            如上指令 10 所得的結果顯示在下行,但並不執行。如果錯誤則可加以更正,如果正確無誤想要執行則再鍵入“!!”便可。

            3. 引數的特殊符號運用

            在 history 的引數運用上有一項是比較特殊的,它是關於路徑(path)的運用。一般也並不常運用在指令行模式之下,倒是在 shell 的程式設計上相當有用。不過我們在介紹時,還是將它運用在指令行模式之下,讀者可借此瞭解它的功能。

             

            27 % !cat
            cat /usr/adm/messages > message.1
            28 % !!:1:t
            messages
            29 % !cat:1:h
            /usr/adm

             

            由上例中我們可藉由 history 的功能來將一個路徑分離成兩個部份,如 “/usr/adm/messages”可分離成,“/usr/adm”與“messages”。如果以前面這個情況來說,一個絕對路徑(full path)可將它分離成檔案所在的路徑及檔案名稱這兩項資料吧!這個運用情況,我們將在 shell 程式設計中再為你舉例說明。

    3-5-3 關於 history list 的說明

     

    history list 實際上便是你啟動 History 功能之後所產生的一個指令暫存器。這個指令暫存器會記錄的你下過的指令,也可稱之為事件(even)。儲存事件的數量便是你使用內建指令「set history = xx」所指定的數量。 history list 的內容允許被呼叫出來加以再次使用或者是修改使用,被呼叫出來的事件可以是整個事件也可以是事件的部份引數,在使用上有相當多的方式及符號,當然組合的變化也相當多。同時這個 history list 的內容也可以在你 logout 前儲存成特殊檔案供你下一次 login 時再利用。

     

    3-5-4 如何傳遞 hisrory list 到另一個 C shell 中

     

    在前面我們曾提到變數 savehist,它的功能是可以在你結束 C shell 之後,把該 shell 的  history list 儲存起來供你下一次 login 時,或者是另一個 C shell 來使用,但如果你並不想終結現在正在操作的 C shell,卻需要將 history list 儲存起來,提供另一個 C shell 運用時。此時變數 savehist 的功能就不能適用了。我們得尋求變通的方式來達到這個目的。首先,將所需的 history list 數量重導向到一個檔案中儲存,如下所示:

        33 % history -h 15 > history.15
        34 % vi history.15

    接著便是使用編輯器清除檔案內不必要的指令。然後退出 vi。這時另一個 C shell 便可以看見這個檔案“history.15”。這時我們便可使用內建指令 source -h 來將該讀取“history.15”檔案內的各行指令,將它們加入到這個 C shell 的 history list 中,如此便可以供我們來運用了。請見實際的指令操作:

        10 % source -h history.15
        22 %

    (請注意,加上選項 -h 的作用在於只讀入指令,但並不執行。關於詳細的情況請參考內建指令 source 說明)



dennyzhao 发表于 >2005-7-22 9:27:28 保存该日志到本地 [全文] [评论] [引用] [推荐] [档案] [推给好友]

2005-7-19
apache的ssl模块使用 [原]

环境:
Redhat AS 3.0

一、Apache的安装
./configure –prefix=/mypath/apache –enable-module=so –enable-ssl=static –with-ssl=/usr/share/ssl
#link the krb head file for openssl
ln -s /usr/kerberos/include/com_err.h /usr/include/
ln -s /usr/kerberos/include/profile.h /usr/include/
ln -s /usr/kerberos/include/krb5.h /usr/include/
make
make install

二、证书的升成
ln /usr/share/ssl /etc/ssl
cd /etc/ssl
1、生成CA私有KEY
openssl genrsa -des3 -out ca.key 1024
2、生成自认证CA根证书
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
 -x509参数用于生成证书,而不是认证请求。
3、生成服务器专有KEY
openssl genrsa -des3 -out server.key 1024
4、生成服务器认证请求
openssl req -new -key server.key -out server.csr
5、用ca.csr为server.csr签发证书
./sign.sh server.csr

备注
证书等信息查看
openssl rsa -noout -text -in server.key
openssl req -noout -text -in server.csr
openssl x509 -noout -text -in server.crt

三、http的配置
确认conf/ssl.conf文件中有以下配置
Listen 0.0.0.0:443

DocumentRoot "/mypath/apache/itoneadmin"
ServerName www.mydomain.com:443
ServerAdmin postmaster@mydomain.com
ErrorLog /mypath/apache/logs/error_ssl_log
TransferLog /mypath/apache/logs/access_ssl_log
SSLCertificateFile /etc/ssl/server.crt
SSLCertificateKeyFile /etc/ssl/server.key



四、http服务的启动

为了防止apache启动要求输入密码,在/etc/ssl下执行
cd /etc/ssl
mv server.key server.key.pass
openssl rsa -in server.key.pass -out server.key
chmod 400 server.key


./apachectl startssl
即可启动apache含ssl的支持
./apachectl stop
停止 apache

sign.sh脚本如下
#!/bin/sh
##
## sign.sh – Sign a SSL Certificate Request (CSR)
## Copyright (c) 1998-1999 Ralf S. Engelschall, All Rights Reserved.
##
# argument line handling
CSR=$1
if [ $# -ne 1 ]; then
echo "Usage: sign.sign .csr"; exit 1
fi
if [ ! -f $CSR ]; then
echo "CSR not found: $CSR"; exit 1
fi
case $CSR in
*.csr ) CERT="`echo $CSR | sed -e ’s/.csr/.crt/’`" ;;
* ) CERT="$CSR.crt" ;;
esac
# make sure environment exists
if [ ! -d ca.db.certs ]; then
mkdir ca.db.certs
fi
if [ ! -f ca.db.serial ]; then
echo ’01′ >ca.db.serial
fi
if [ ! -f ca.db.index ]; then
cp /dev/null ca.db.index
fi
# create an own SSLeay config
cat >ca.config < [ ca ]
default_ca = CA_own
[ CA_own ]
dir = /etc/ssl
certs = /etc/ssl
new_certs_dir = /etc/ssl/ca.db.certs
database = /etc/ssl/ca.db.index
serial = /etc/ssl/ca.db.serial
RANDFILE = /etc/ssl/ca.db.rand
certificate = /etc/ssl/ca.crt
private_key = /etc/ssl/ca.key
default_days = 365
default_crl_days = 30
default_md = md5
preserve = no
policy = policy_anything
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
EOT
# sign the certificate
echo "CA signing: $CSR -> $CERT:"
openssl ca -config ca.config -out $CERT -infiles $CSR
echo "CA verifying: $CERT <-> CA cert"
openssl verify -CAfile /etc/ssl/ca.crt $CERT
# cleanup after SSLeay
rm -f ca.config
rm -f ca.db.serial.old
rm -f ca.db.index.old
# die gracefully
exit 0



dennyzhao 发表于 >2005-7-19 15:15:26 保存该日志到本地 [全文] [评论] [引用] [推荐] [档案] [推给好友]

2005-7-15
在UNIX裸设备和文件系统之间移动ORACLE [转]

一、关于裸设备 

1.1 什么是裸设备(RAW DEVICE) 

裸设备是指未创建文件系统的磁盘分区(raw partition)或逻辑卷(raw logical volume),应用程序直接通过一 
个字符设备驱动程序对它进行访问。如何对设备上的数据读写决定于使用它的应用程序。由于对裸设备的操作不通过UNIX的缓冲区,数据在ORACLE的数据缓冲区(BUFFER CACHE)和磁盘之间直接传递,所以使用裸设备在一定程度上能够提高I/O性能,适合I/O量大的系统。另外OPS/RAC (Oracle Parallel Server/Real Application Cluster)环境下,多个节点同时访问同一个数据库,所以CONTROL FILE、DATA FILE、REDO LOG都必须建在RAW DEVICE上。 

1.2 裸设备的可用空间 

不同的UNIX对裸设备的管理不完全相同,特别要注意的是某些UNIX在每个裸设备的头部要保留一定的空间,应用程序在使用裸设备时不可以覆盖这一部分,否则会对裸设备造成损坏。所以一个裸设备的实际可用空间是分配给裸设备的空间再减去这部分操作系统保留空间。下面是常用UNIX的OS Reserved Size列表: 

UNIXOS Reserved Size 

—————————- 

SUN Solaris0 

HP-UX0 

IBM AIX4k 

Tru64 UNIX64k 

Linux0 

1.3 dd命令 

UNIX上读写裸设备不能使用cp, cpio, tar等命令,必须用dd,下面是几个dd常用参数的简单说明,更详细的信息请参考UNIX使用手册或用命令man dd。 

dd [ operand=value ... ] 

if=file 指定输入文件,缺省值是标准输入 

of=file 指定输出文件,缺省值是标准输出 

bs=n 设置输入和输出的块大小为n字节,也可以用“k”作单位 

skip=n 在拷贝之前跳过n个输入块,缺省值是0 

seek=n 在拷贝之前从输出文件首部跳过n块,缺省值是0 

count=n 指定拷贝的块数,缺省拷贝到输入文件结束 

1.4 对本文中示例的说明 

a. 所有例子中ORACLE的DB_BLOCK_SIZE都是8k 

b. /oradata是一文件系统目录 

c. /dev/rlv_data,/dev/rlv_redo和/dev/rlv_ctrl是三个RAW DEVICE,大小均为8MB(8192k) 

d. 在未提到操作系统时,默认是AIX,OS_RESERVED_SIZE=4K 

二、移动数据文件(DATAFILE) 

2.1 在裸设备上建立数据文件 

用以下命令建立表空间: 

SQL> CREATE TABLESPACE ts_test DATAFILE ’/dev/rlv_data’ SIZE 8180k; 

SIZE指定的数值必须小于或等于8180k,否则语句将会失败: 

ORA-01119: error in creating database file ’/dev/rlv_data’ 

ORA-27042: not enough space on raw partition to fullfill request 

这个最大值的计算方法如下: 

8192k(RAW DEVICE SIZE) - 4k (OS_RESERVED_SIZE) - 8k (DB_BLOCK_SIZE) = 8180k 

为什么还要减去一个DB_BLOCK_SIZE呢?这是因为ORACLE建立DATAFILE时,在命令中SIZE指定的大小之外,还要在文件头另加一个BLOCK,叫作“Oracle OS Header Block”,里面保存有这个文件的逻辑块大小和文件块数等信息。这一点并不是在RAW DEVICE上建DATAFILE特有的,如果你在文件系统上建一个DATAFILE,指定SIZE 1000k的话,你用ls -l或dir命令看到的文件大小将是1008k (DB_BLOCK_SIZE=8K)。 

2.2 在文件系统和裸设备之间移动数据文件 

2.2.1 从文件系统到裸设备 

a. 在文件系统上建一个4M的DATAFILE 

SQL> CREATE TABLESPACE test DATAFILE ’/oradata/test.dbf’ SIZE 4M; 

b. 查看一下这个新建的DATAFILE的大小 (注:4202496 = 4M + 8K) 

$ ls -l /oradata/test.dbf 

-rw-r—– 1 oracle dba 4202496 Aug 29 15:01 /oradata/test.dbf 

c. 按下表公式确定dd的参数 



d. 在数据库没有OPEN的状态下,用dd进行拷贝,下面给出命令及输出 

AIX$ dd if=/oradata/test.dbf of=/dev/rlv_data bs=4k seek=1 

1026+0 records in 

1026+0 records out 

Tru64$ dd if=/oradata/test.dbf of=/dev/rlv_data bs=64k seek=1 

64+1 records in 

64+1 records out 

Other$ dd if=/oradata/test.dbf of=/dev/rlv_data bs=1024k 

4+1 records in 

4+1 records out 

2.2.2 从裸设备到文件系统 

a. 确定数据文件实际大小file_size,用于下一步计算dd的参数count。如果count计算不对,拷贝出的数据文件无效,数据库无法打开。 

SQL> SELECT bytes, blocks, bytes/blocks db_block_size, bytes+bytes/blocks file_size 

FROM dba_data_files WHERE file_name=’/dev/rlv_data’; 

BYTESBLOCKSDB_BLOCK_SIZEFILE_SIZE 

———- ——– ————- ——— 

419430451281924202496 

b. 按下表公式确定dd的参数,min表示二者之中取较小的 



c. 在数据库没有OPEN的状态下,用dd进行拷贝,下面给出命令及输出 

AIX$ dd if=/dev/rlv_data of=/oradata/test2.dbf bs=4k skip=1 count=1026 

1026+0 records in 

1026+0 records out 

Tru64$ dd if=/dev/rlv_data of=/oradata/test2.dbf bs=8k skip=8 count=513 

513+0 records in 

513+0 records out 

Other$ dd if=/dev/rlv_data of=/oradata/test2.dbf bs=8k count=513 

513+0 records in 

513+0 records out 

2.2.3 无论从FILE SYSTEM拷贝到RAW DEVICE还是反之,想让ORACLE以新的数据文件打开数据库,必须进行RENAME操作 

SQL> STARTUP MOUNT; 

SQL> ALTER DATABASE RENAME FILE ’oldfilename’ TO ’newfilename’; 

SQL> ALTER DATABASE OPEN; 

三、移动联机重作日志(ONLINE REDO LOG) 

3.1 在裸设备上建ONLINE REDO LOG 

用以下命令增加一组ONLINE REDO LOG: 

SQL> ALTER DATABASE ADD LOGFILE GROUP 4 ’/dev/rlv_redo’ SIZE xxxxk; 

在裸设备上建REDO LOG时也要计算SIZE子句可使用的最大值,方法类似于在2.1中建DATAFILE时的计算方法,唯一不同的是要把公式中的DB_BLOCK_SIZE换成REDO_BLOCK_SIZE(即REDO LOG的逻辑块大小)。这个REDO_BLOCK_SIZE在不同操作系统上取值不同,用以下两种方法均可得到这个值,同时还可计算出REDO LOG的实际文件大小file_size): 

方法1:dump现有的REDO LOG FILE 

SQL> ALTER SYSTEM DUMP LOGFILE ’/oradata/redo01.log’; 

SQL> SHOW PARAMETER user_dump_dest 

查看user_dump_dest目录下刚产生的trc文件: 

FILE HEADER: 

Software vsn=135294976=0×8107000, Compatibility Vsn=135290880=0×8106000 

Db Id=3227187598=0xc05af98e, Db Name=’V817′ 

Control Seq=12474=0×30ba, File size=8192=0×2000 

File Number=5, Blksiz=512, File Type=2 LOG 

方法2:用ORACLE提供的工具dbfsize,对文件系统和RAW DEVICE上的文件都适用 

$ dbfsize /oradata/redo01.log 

Database file: /oradata/redo01.log 

Database file type: file system 

Database file size: 8192 512 byte blocks 

从以上两个输出都可得知REDO_BLOCK_SIZE=512,blocks=8192 

file_size=(blocks + 1) * REDO_BLOCK_SIZE = (8192+1)*512=4194816 

如果已知所在平台的REDO_BLOCK_SIZE,也可以通过查询数据字典来计算file_size: 

SQL> SELECT b.member, b.bytes, b.bytes+512 file_size FROM v$logfile a, v$log b 

WHERE a.group#=b.group# and a.member=’/oradata/redo01.log ’; 

MEMBERBYTES FILE_SIZE 

——————–——–——— 

/oradata/redo01.log41943044194816 

下表列出了常用OS上的ORACLE REDO_BLOCK_SIZE: 

OSREDO_BLOCK_SIZE 

—————– ————— 

Windows512 

SUN Solaris512 

HP-UX1024 

IBM AIX512 

Compaq Tru64 UNIX1024 

Linux512 

3.2在文件系统和裸设备之间移动ONLINE REDO LOG 

参见2.2拷贝DATAFILE的过程,唯一不同是要把DB_BLOCK_SIZE换成REDO_BLOCK_SIZE。另外,REDO LOG也可以不用dd进行拷贝,而采用删除重建的方法: 

SQL> SELECT * FROM v$log; –be sure it’s not current and archived 

SQL> ALTER SYSTEM SWITCH LOGFILE; –if it’s current, force switch 

SQL> ALTER DATABASE DROP LOGFILE GROUP n; 

SQL> ALTER DATABASE ADD LOGFILE GROUP n ’newlogfilename’ SIZE xxxxM; 

四、移动控制文件(CONTROL FILE) 

4.1在裸设备上建控制文件 

ORACLE的控制文件是执行CREATE DATABASE或CREATE CONTROLFILE语句时生成的,其名字是由初始化参数文件init$ORACLE_SID.ora中的control_files参数指定。CONTROL FILE的大小不能显式指定,而且随着数据库的运行,它还会自动增长,所以为控制文件划分裸设备时要根据经验,留好足够的余量,以免不必要的麻烦。CONTROL FILE的逻辑块大小和DB_BLOCK_SIZE相同,而且文件头部也和DATAFILE一样有一块“Oracle OS Header Block”。 

4.2在文件系统和裸设备之间移动控制文件 

4.2.1 使用dd复制 

拷贝CONTROL FILE的方法基本与2.2中拷贝DATAFILE相同,唯一不同是当由裸设备向文件系统拷贝时,如何确定CONTROL FILE的实际大小file_size (ORACLE数据字典里没有CONTROL FILE大小的数据)。下面介绍两个方法: 

方法1:执行完下面的SQL语句,再到user_dump_dest目录查看刚产生的trc文件 

SQL> ALTER SESSION SET EVENTS ’IMMEDIATE TRACE NAME CONTROLF LEVEL 10′; 

FILE HEADER: 

Software vsn=135266304=0×8100000, Compatibility Vsn=134217728=0×8000000 

Db Id=1937054535=0×73751b47, Db Name=’O817′ 

Control Seq=5838=0×16ce, File size=476=0×1dc 

File Number=0, Blksiz=8192, File Type=1 CONTROL 

方法2:用ORACLE提供的工具dbfsize 

$ dbfsize /oradata/control01.ctl 

Database file: /oradata/control01.ctl 

Database file type: file system 

Database file size: 476 8192 byte blocks 

从以上两个方法的输出结果都可得到file_size=(476+1)*8192=3907584 

4.2.2 使用SQL命令复制 

相对于4.2.1介绍的用dd拷贝CONTROL FILE,下面用SQL语句进行复制的方法更为简洁: 

SQL> STARTUP MOUNT 

SQL> ALTER DATABASE BACKUP CONTROLFILE TO ’newcontrolfile’; 

语句中newcontrolfile既可以是文件系统文件,也可以是RAW DEVICE,所以在MOUNT状态下运行这个命令就可以生成一个与现有CONTROL FILE完全相同CONTROL FILE复件。 

4.2.3 修改初始化参数文件(init$ORACLE_SID.ora) 

无论用4.2.1还是4.2.2的方法产生了新的CONTROL FILE,为了让数据库使用新的CONTROL FILE,只要修改init$ORACLE_SID.ora里的control_files参数即可。 

五、Recovery Manager (RMAN) 

RMAN是ORACLE8开始提供的备份与恢复工具,它能自动正确地跳过裸设备头部的OS Reserved Block,通过使用RMAN的BACKUP和RESTORE功能,可以方便地达到把DATAFILE和CONTROL FILE在文件系统和裸设备之间移动的目的,具体操作过程在这里不再详述,请参见RMAN手册。 

来源: ::URL::
http://www.ccw.com.cn
原作者: Rejoice999 



dennyzhao 发表于 >2005-7-15 15:38:46 保存该日志到本地 [全文] [评论] [引用] [推荐] [档案] [推给好友]

2005-7-9
推开宏观之窗笔记

<推开宏观之窗>读书笔记

概述
利率、国债、重点工程、物价、通货膨胀、出口退税、GDP增长、打压房地产、股市低迷、人民币升值、物价指数、赤字等众多我们耳熟能详的概念都是宏观经济的表现,这些因素直接影响着我们生活的品质、国家的地位、大家的幸福感等,可以说宏观经济客观的存在于我们生活的各个方面,直接影响着我们的生活。

一国经济的平衡
宏观经济是研究经济总量和总量之间的关系。
将一个国家分为家庭和企业两个基本单元,则一国经济的平衡就是家庭挣的钱全花了,企业生产的产品全卖了。但由于有储蓄与投资的存在,所以宏观经济平衡的一个重要条件就是:储蓄=投资
当储蓄大于投资时,通货就在紧缩,因为东西多了,企业只能便宜卖或保本卖;当投资大于储蓄时,大家都想赚钱,这时需求多了,东西少了,物以称为贵,企业的商品就会卖高价,这时就出现通货膨胀。
钱越来越值钱,就表现为通货紧缩;钱越来越不值钱,则表现为通货膨胀。
当把政府也加入宏观经济时,则其平衡为财政之出等于财政收入。
当把国外部门加入时,则其平衡条件是:出口等于进口。当出口大于进口时就表现为贸易顺差,反之为贸易逆差。
将家庭、企业、政府与国外部门一起算入宏观经济,则出现了以下的总供求=总需求的总供求平衡式:
消费品+储蓄+财政收入+进口=消费+投资+财政支出+出口
用字母表示即为:
C+S+T+M=C+I+G+X
只有当上述的总供求=总需求时,一国经济才能正常发展。当总需求大于总供给时,就表现物价指数上升,即通货膨胀;当总供给大于总需求时,就会出现价格找平,即产品价格降低。
所以一般情况下,当价格指数开始上升时,经济开始回暖,表现为通货开始膨胀了;当价格指数开始向下时,表示总供给过大,经济开始变冷了,开始通货紧缩。
由于需求是可以马上调节的,所以政府平衡经济的方式,短期是在调整需求,长期是在调整供给。
价格找平,是不平衡时的一种自然市场处理方法,所以当调整失效时,就会能过价格的升降来找找平,就会相应的出现通货膨胀或通货紧缩。

GDP,国内生产总值
GDP指的是一个国家或一个地区的所有常住单位在一定在时期(一般是一年)所生产和提供的最终产品和劳务的价值总和。也就是说一个国家和一个地区在一年内究竟创造了多少新的财富。
从收入的角度看,GDP由四块组成:
固定资产折旧+劳动者报酬+政府的净税收+企业盈余
从支出的角度看,GDP由三部份组成:
总消费+总投资+净出口
这也是国际上比较通行的GDP计算方法。
根据以上GDP的组成,我们可以发现政府拉动经济主要有三个手段:
一是刺激消费,二是加大总投资,三是鼓励出口。
从政府和企业家的角度看,增加GDP一最效的方式就是:
想方设法把企业的价值链做长,把经济的价值链做长,把产品的附加值做大。

整个国家的经济增长,并不意味着每个个体的收入增长:
而更多的表现在富人越富,穷人越穷;
表现在某些行业的收入在增长,而某些行业的收入可能在降低;
面对这种国家整体经济增长,而个体却不增长反而降低的情况,这件要求我们不断给自己充电,给自己提高竞争力,或改行而从事更有前景的收入增长的行业。
总而言之,只要社会整体在增长,我们能顺应社会的变化与发展,则对每个人都是有机会的。

亚当斯密认为市场就是一只无形的手,它可以自动调节市场经济,但在现实社会中,却存在很多市场不能解决的问题,如环境保护、国防的保护、收入分配不公等,这就要求一国经济的发展,对于市场能自动调节的市场经济行为由那只无形的手去自己解决,而对市场不能自选解决的问题,则由政府来主动调节。

外在性:当人们做了一件事的时候,对发生的后果不负任何责任,即做了坏事不受惩罚,做了好事得不到补偿的时个,这时经济中就出现了外在性。
负的外在性:一些人的行为损害了其他人的利益,他们并不为此付费,所以造成了负的外在性。如海上漏油,过度开垦,直排污水等。
正的外在性:一些人做了好事却得不到补偿。如一项发明被世人免费使用了。
当外在性存在时,市场机制是无法解决的,这就是市场失灵的表现。

全社会的资源分为两种:一种是私人物品,一种是公共物品。
私人物品具有两个特性:一是竞争性,一是排他性。竞争性是指你所消费的东西,别人就不能消费,你们的消费处于竞争状态;排他性是指因为你有钱买了这个东西,别人没钱,他就排斥在外。私人物品是市场机制、价格机制可以解决的。如你穿的衣服,你享受的一些专有服务。
公共物品则有两个特性:非排他性与非竞争性。如街上的路灯、国防、教育等。
除了以上两种物品外,有些物品只有竞争性与排他性中的一种,则其为准公共物品。收费的高速公路就是具有排他性的准公共物品。
在公共物品的使用上,排斥别人的费用是极高的,也是非常困难的;但增加一个人消费,却不增加他的成本。
提供尽可能多的公共物品或准公共物品是一国政府的责任,其的数量表示了一个国家的富裕程度。

银行的存款中,80%的储蓄是20%的人们存的钱,这就是收入分配的不公,这种问题市场机制也无法解决。

归纳起来说市场失灵表现在三个方面:一是经济中的外在性;一是社会需要大量的公共物品;一是收入分配不公。

政府的作用:
第一是稳定经济。
第二是提供公共服务,这是因为公共物品多的地方,对一地的经济发展越有利。如西部大开发,就要先提供大量的公共物品,给企业一个好的环境而增加资金在西部的投入,而促进西部经济的增长。
第三是创造公平竞争的条件,让所有人都有公平竞争的机会。
第四是进行收入的再分配,充分解决弱势群体的生活。
简单来说,政府在市场经济中,不应该进入竞争性的行业,不应该做那些市场可以解决的事情,而应该去解决市场不能解决的事情。如避免经济负的外在性,提供教育、国防、公共设施等公共物品,收入再分配,解决穷人吃饭的问题。

有了财政收入,政府才能去行使他的经济职能。当财政收入大于财政支出的时候,就会出现财政赢余;当财政收入低于财政支出的时候,就会出现财政赤字。

财政收入主要有四个来源:
第一是税收收入,这是一国最大的财政收入,我国现有的税收管理体制分为国家税和地方税两部分,国税归中央财政所有,地税归地方政府所有。
第二是债务收入,即政府发行的国债,其收入的原则是自愿的,而且政府要还本付息。
第三是企业收入,即国有企业在还了银行利息、缴了国家的税款后,还有的利润。
第四是其它收入,如土地、资源使用转让收入等。

财政支出分为两部分:
一是经常性支出,是政府每月都要向外支付并且无法回收的,如公务员工资。
一是建设性支出,主是投资关系全局的基础设施建设和投资大中型企业的建设。
财政的支出有效用原则,效率原则两种。我国现在是采用的基数原则。即根据商定的情况,先拨,不够再找中央财政要钱,这容易造成大家都找中央要财政的情况,并且由于基数定的不合理而出现的不公平。由于我国经济发展的不平衡,中央政府要加大转移支付的能力,在不伤害富裕地区经济发展的情况下,又保护落后地区的惰性为适度的补贴原则。
一般来讲,只有当一国中央的财政收入占整个国家的财政收入的60%以上时,中央政府才有宏观调控的能力。
现在我国是采用的是中央和地方分开征税的分税制,一个是中央税,一个是地方税,还有一个是共享税。一般来讲,中内政府承担全国性的支出,地方政府承担本地区的发展。

当财政支出大于财政收入时,就会出现财政赤字。对财政赤字,国际上有两条警戒线:
第一条是:赤字不能高于GDP的3%,对一个GDP总量很大的国家来讲,这很重要。
第二条是:政府的赤字不能超过总支出的15%。
当出现赤字时,政府有两种办法来解决:
第一种方法是透支。向银行取,透支的后果是储蓄的钱不够了,最后只有开动印钞机,于是就出现通货膨胀,这种定寅吃卯粮的方法会严重影响一国长久的发展。
第二种方法是发行国债。政府出售债券获得资金,用于基础建设,通过加大政府投资来拉动经济,再从经济增长中获得税收,用来赎回当初发行的国债。这样就不用多发行钞票,就不会出现通货膨胀。从本质上来说,发行国债就是政府把未来的钱拿到现在来花。
由于发行国债是要在未来还本付息的,因此只有造成的日后增长的国债才是合理的,对于政府经常性支出,如工资、国防等是不能通过发行国债来解决的,因为那些支出不会带来经济的增长,也即不可以带来未来的财政收入。

货币是人们因交换的需要而产生的,其有以下职能:
第一种职能是一种交换的媒介。
第二种职能是价值储藏的手段。
第三个职能是作为一种计量单位。
第四个职能是作为一种延期支付的手段。如先把货放到这边,我卖完后再给钱,这种延期支付就产生了信用,出现了相互赊欠的行为。随着信用的增多,大量信用的基础之上,出现了一个中介机构来从事货币的存贷业务,让人们都遵守资金信用,这个中介机构就是银行。
在现代社会,货币供给是由银行创造的。如每国都有法定准备金率,如20%。由于贷一次交20%,剩下的80%再存银行,再贷,再交20%,到最终就出现了100元最终成了100/20%=500元的资金供给。
现代社会里,银行的信誉越好,它创造货币供给的能力就越大;一国的法定准备金率越低,银行创造的货币供给就越多。
银行是信用的产物,如果失去了信用,银行将不复存在。在现代社会,银行已经成为经济生活的神经中枢,如果它出了问题,整个国家经济就可能面临崩溃。所以现代社会经济是靠 信用来运行的,信用是市场经济的基石。

中央银行在经济生活中要解决两个问题:
第一要保护储户的利益。
第二要保持一个融资的渠道。
当一国货币升值的时候,标志着一国经济开始变好了,它是一种信心的象征。
中央银行作为一国银行总的枢纽,它是政府管理商业银行的机构,它不能经营一般的存贷业务,它的使命是制定货币政策,保证币值的稳定。

中央银行有三个最重要的职能:
第一它是发行银行。
第二它是银行的银行,用法定准备金率来调整。
第三它是政府的银行。
中央银行最主要的调节经济手段的方法就是实行不同的货币政策。

货币政策有三个重要工具:
一是法定准备金率,通过调高低来控制货币的供给,调高则减低货币供给,调低则加大货币提供。
二是工具贴现率。当商业银行自有的资金不够用时就会向中央银行借钱,商业银行从中央银行借款的利率叫贴现率。如拿普通人的债券向中央银行借款就要付贴现率,这个贴现率在中国叫再贷款利率。贴现率高则,则货币供给就少,调低则加大货币供给。
贴现率在中国叫贷款利率,在美国叫做联邦基金利率,央行就是通过控制商业银行从中央银行贷款的利率,即贴现率,从而控制商业银行的贷款利率施加影响。
三是公开市场业务。即在市场上买入或卖出债券。买则加大货币供给,卖则减少货币供给。
一国的实际利率应该是名义利率减去通货膨胀率。

资金的融通叫做金融,为这些金融活动提供的场所就叫金融市场。
最常见的融资方式有三种:
一是靠感情,靠原始的信任向大家借钱。这样的融资成本相对高,有信息不对称、有高额时间成本、机会成本等。
二是找银行融资,其实是间接找所有储户借了钱。银行创造了资金的流动性,它可以贷出很多钱,使资金由没利可图的行业向有利可图的行业转移。
三是到股市去融资,这样的资金成本最低,除了上市费用外,关键是不用像向银行贷款那样要归还本金。这是一种成本最低的直接融资方式。
由于金融机构获得资本的成本最小,监督债务人的成本也最小,并且分摊风险,所以金融机构越来越多。

金融市场分为两部分:
一是货币市场,即短期的只经营一年信用的市场。
二是资本市场,其是经营长期信用的市场。其又分为证券市场(含股票市场与债券市场)和长期借贷市场。

股票由本质上来说是一个赚取股息的市场,所以只有当股息远高于银行利率时,人们才愿意购买股票。所以银行利率与股价存在着连动关系,一般来讲当利率升高时股价就会跌,当利率降低时,股价就会涨。
股市真正的上涨,必须要公司效益好,才能上涨。经济不好,而股市涨,那是炒作,只是短期行情。
因此炒股要学会搭宏观经济的顺风车,宏观经济向好时,股票一定会涨,相反就肯定会跌。按国外经验,股市一般提前三个月表明经济的状况。
我们看股市,企业效益是一个因素,利率水平是一个因素,经济好坏是一个因素,政治因素和国际经济形势的变化也是重要因素。
政治和国际经济的不稳定就会使经济不稳定,就会打击人们的信心,股市就很难有好的表现。
中国股市由于早期的非正常炒作,不规范,必然会经受一个艰难的调整期,但在中国宏观经济向好的情况下,必会有一个向上的发展。
股票上市后,上市公司就把钱拿走了,去进行实体投资,而在股市上交易的则只是虚拟资金。
在任何股市,都会有些股票有泡沫,但如果股市里大多数股票都有泡沫时,就会存在很大的风险了。一旦这个泡沫破灭,就会导致整个股市长时期的一蹶不振,而严重影响一国经济的长期发展。
虽然股市会有各种各样的问题,但各国却仍大力发展它,那是因为股票的市场价格是和公司的盈利能力相匹配的,为了达到这个匹配,股市有以下几个很重要的作用:
一是它是企业融资的渠道。
二是股市可以使资金从效益低的企业流向效益好的企业。
三是股市可以促进企业改善经营管理。
四是股市是政府税收的一个主要来源。
当发现股市里赚钱太容易了,股票市场只涨不跌,所有投资者都赚钱的时候,就说明股市过热了,这时就应该考虑即时退出了,否则就可能成为最后一棒的接手者。

汇率反映的是国与国之间货币的比较,反映的是国与国之间的经济甚至包括政治和军事实力的比较,汇率可以算得上是更大范围内的宏观问题。
全球的货币政策有两种:
一种是象美国一样走强势美元政策,希望其升值,这样本国人民就可以以很少的钱买到更多外国廉价的商品,于是就会呈现巨大的逆差。
一种是如日本那样,希望货币贬值,这样本国的产品出口到外国时就可以以比较低的价格卖,而有很好的市场,于是就形成了巨大的贸易顺差。
一般来讲,为了增加出口就贬值,为了方便进口就希望升值。
但汇率作为货币的价格,它是由供给和需求来决定的,并不能任由国家控制。
影响一国汇率根本走向的,是一国的综合实力和经济增长速度。如果一国经济高速增长,就意味着经济中存在大量致富机会,这会带动国内外对该国货币的需求,从而在汇率上反映为一国货币汇率的上升和货币的升值。
判断汇率的变化,其实最简单的方式,就是购买力平均。即用同样的钱买同样的东西,看其数量多少,或买同样多的东西,看花的钱要多少。
如果从宏观的角度来观察经济和汇率,就会发现要学会逆向的思维,反向的操作。
当太热时,可以已经到顶了,该出了。当太冷时,可能已经到底了,该行动了。
现代的社会是一个全球经济流动的时代,各国的外汇储备、国债情况、外债情况、金融市场、汇率都会有全球的参与。如果一国的经济无法支撑外债的偿还,就会使人们对经济产生失去信心,就会出现很不正常的换汇和挤兑的情况,于是倒致汇率的失控,货币的大副贬值,通货急剧膨胀等情况而严重削弱一国的经济实力。
因此,一个国家政府要时刻关注在金融市场的大量外国资金情况和热钱的流动。

一国政府调控宏观经济有三大政策:
一是财政政策,主要表现为财政的收入与支出。
二是货币政策,主要表现为央行的作用。
三是对外经济政策,主要表现为汇率和关税的作用。
当经济过热时,就要踩刹车,主要表现为财政支出减少,货币供应减少等,减少出口等。
当经济过冷时,就要踩油门,主要表现为加大财政建设性支出,增加货币供给,鼓励出口等。
但任何一国的财政、货币、对外经济政策都无法避免经济的周期性波动,其主要的作用是稳定经济的持续稳定发展,对整国的经济进行效益的配置与转移,保证一国经济有长久的发展动力。

中国经济现在面临几个很严重的问题:
一是农民问题,如何保证农民的生产积极性和加大农民收入。
二是失业问题,如何保证失业人群的再就业,消除社会的不稳定因素。
三是建立社会保障体系的问题,使弱势群体能有所保障。
四是金融体系的不良资产问题,如何保证金融的稳定和防范金融的风险。
五是社会的贫富差距问题,收入分配不公问题。
六是环境保护问题,即可持续发展问题。

宏观经济是客观存在,不以个人意志为转移的。面对宏观经济的时候,我们所能做的不是抱怨,而应是顺宏观经济之势,适时调整自我,随宏观大势而变,以最小的成本获得最大的收益。
对一个国家来讲,最缺的是人才;对个人来讲,最稀缺的是时间。对个人来讲,我们就应放弃一些眼前的利益,而选择机会,选择未来,坚持学习,不断的给自己充电,以适应新的变化,而在变化中获得机会。



dennyzhao 发表于 >2005-7-9 17:09:07 保存该日志到本地 [全文] [评论] [引用] [推荐] [档案] [推给好友]

2005-7-8
mscs情况下oracle failsaft配置 [转]

最近做了oracle HA 应用的方案,小结一下以供大家参考  

硬件配置:  
两台联想万全T630服务器((标配,每台服务器都有两块intel 82550网卡)  
万全SUREFIRE200R磁盘阵列柜,配备13块18G的硬盘。它将用作群集磁盘  

网络要求:  
· 唯一的 NetBIOS 群集名称。  
· 五个唯一的静态 IP 地址:两个用于专用网络的网卡,两个用于公用网络的网卡, 还有一个用于群集本身。  
· 用于群集服务的域用户帐户(所有节点必须是同一域的成员)。  
· 每个节点都应该有两个网卡 - 一个用于连接公用网络,另一个用于节点对节点的专用群集网络。  

节点1 节点2  
服务器名 T630R T630L  
活动目录域名 cluster.legend.com  
群集名称 Mycluster  
公用网络IP 192.0.35.1 192.0.35.2  
公用网络子网掩码 255.255.255.0 255.255.255.0  
专用网络IP 10.1.1.1 10.1.1.2  
专用网络子网掩码 255.0.0.0 255.0.0.0  
集群虚拟IP 192.0.35.100  
集群虚拟IP子网掩码 255.255.255.0  
集群账户 Cluster  

有了以上的规划就可以开始系统的安装了:  
这些步骤是:  
· 在每一节点上安装 Windows 2000 Advanced Server。  
· 安装网络。  
· 安装磁盘。  
· 安装活动目录  
每个节点都完成以上步骤后,执行下列步骤:  
· 在每一节点上安装MSCS。  

第一步装2000  

我们就略过:  

第二步装网络:  
每个群集节点至少要求两个网卡 - 一个与公用网络连接,另一个与只包含群集节点的专用网络连接。  
专用网络适配器建立节点对节点的通讯、群集状态信号和群集管理。每个节点的公用网络适配器都将群集与客户机所在的公用网络连接。  
验证所有的网络连接是否正确,专用网络适配器只与其它专用网络适配器连接,而公用网络适配器与公用网络连接。这些连接如下面图 1 所示。在继续安装共享磁盘之前在每个群集节点上执行这些步骤。  
第三步安装磁盘略过:  
第四步装活动目录:  

群集中的所有节点必须是同一域的成员,并能访问域控制器和 DNS 服务器。可以将它们配置为成员服务器或域控制器。如果您决定将一个节点配;为域控制器,那么您应该将同一域中的所有其它节点都配置为域控制器。此次把两个节点配置为域控制器。  
注意事项:  
如果域中没有DNS服务器,在安装活动目录时,使用第一个节点服务器作为DNS服务器,那么在安装第二台服务器的活动目录之前,在配置网卡的ip时,将DNS配置为第一台服务器的IP地址,这样,安装第二台服务器的活动目录,就可以做出正确的域名解析。  

正确的做完以上几步就可以进行MSCS 的安装了:  

备注 在第一个节点安装群集服务的过程中,在 Windows 2000 启动之前,要么将其它所有节点切断电源,要么使其停止运行。应该开启所有共享存储设备的电源。  
1. 单击开始,单击设置,然后单击控制面板。  
2. 双击添加/删除程序。  
3. 双击添加/删除 Windows 组件。  
4. 选择群集服务。单击下一步。  
5. 群集服务文件位于 Windows 2000 Advanced Server 或 Windows 2000 Datacenter Server CD-ROM 中。输入 x:\i386(其中 x 是 CD-ROM 的驱动器号。)如果是从网络安装的 Windows 2000,则应输入适当的网络路径。(如果显示 Windows 2000 安装闪屏,则应将其关闭。)单击确定。  
6. 单击下一步。  
7. 单击我理解接受下述条件:只有硬件兼容列表上硬件的群集服务才能得到支持。  
8. 因为这是群集中的第一个节点,您必须创建群集本身。选择群集中的第一个节点,然后单击下一步。  
9. 按照表1输入群集名称,然后单击下一步。  
10. 键入在预先安装时创建的群集服务帐户的用户名。(在本例中,此用户名是 cluster。)不设密码。键入域名,然后单击下一步。  
备注 一般说来您应该为此用户帐户提供一个安全的密码。  
此时群集服务配置向导验证用户帐户和密码。  
11. 单击下一步。  

配置群集磁盘  
备注 默认情况下,不与系统盘在同一总线上的所有 SCSI 磁盘将出现在“被管理的磁盘”列表中。因此,如果节点有多个 SCSI 总线,那么也可能列出一些不用作共享存储设备(例如,内部的 SCSI 驱动器)的磁盘。应该将这样的磁盘从“被管理的磁盘”列表中删除。  
1. 在添加或删除被管理的磁盘对话框指定群集服务将使用共享 SCSI 总线上的哪些磁盘。按需要添加或删除磁盘,然后单击下一步。  
2. 单击配置群集网络对话框中的下一步。  
3. 一定要确保网络名称和 IP 地址符合“公用”网络的网络接口。  
4. 选中为群集使用启用这个网络复选框。  
5. 选择选项只用于客户访问(公用网络)。  
6. 单击下一步。  
7. 在下一个对话框中配置专用网络。一定要确保网络名称和 IP 地址符合“专用”网络的网络接口。  
8. 选中为群集使用启用这个网络复选框。  
9. 选择选项只用于内部群集通讯 。  
10. 单击下一步。  
11. 确保列表中的第一个连接是专用群集连接,然后单击下一步。  
要点 设置连接的顺序时一定要将专用群集连接放在列表的第一位。  
12. 按照表1输入群集唯一的 IP 地址和子网掩码,然后单击下一步。  
群集服务配置向导自动将群集 IP 地址与一个公用网络或混合网络相关联。它使用子网掩码来选择正确的网络。  
13. 单击完成以完成第一个节点的群集配置。  
群集服务安装向导复制完成群集服务安装所需要的文件,从而结束第一个节点的安装过程。复制完文件后,将创建群集服务注册表项,在仲裁资源上创建日志文件,然后在第一个节点上启动群集服务。  
会出现一个对话框,告诉您群集服务已成功地启动。  
14. 单击确定。  
15. 关闭添加/删除程序;口。  

可以验证群集安装  
使用“群集管理器”管理单元来验证第一个节点上的群集服务安装是否成功。  

配置第二个节点  
备注 在本节中,让节点 1 和所有共享磁盘的电源保持打开状态。开启第二个节点的电源。  
在第二个节点上安装群集服务所需要的时间比第一个节点要少。安装过程基于第一个节点的配置,配置第二个节点的群集服务网络设置。  
在第二个节点上安装群集服务开始时的步骤与第一个节点完全相同。在第二个节点的安装过程中,第一个节点必须运行。  
安装过程与在第一个节点上安装群集服务所采用的步骤基本相同,只是有下面几点区别:  
1. 在创建或加入群集对话框中,选择群集中的第二个或下一个节点,然后单击下一步。  
2. 输入前面创建的群集名称(在实验中是 LegendCluster),然后单击下一步。  
3. 不要选中用下面帐户连接到群集。群集服务配置向导将自动提供在安装第一个节点时选择的用户帐户的名称。要使用安装第一个群集节点时所使用的同一帐户。  
4. 输入帐户的密码(如果有的话)然后单击下一步。  
5. 在下一个对话框中,单击完成以完成配置。  
6. 群集服务将启动。单击确定。  
7. 关闭添加/删除程序。  

配置集群属性  
用右键单击ClusterGroup,然后单击属性。为了测试系统故障转移和故障回复的性能,在实验中,设定首选服务器为SRV1,故障转移阈值设为0,并选定故障回复为立即。  

正确的完成以上步骤时,oracle HA 应用基本上就已经完成了一大半,接下来就可以进行FAILSAFE 的安装了,如果没有正确安装MSCS,是不能进行以下的安装的,因为Oracle Fail Safe 是架构在 Microsoft Cluster Server(MSCS)上的一个 Oracle 产品,必须确保其安装的正确性。  

安装步骤:  
1、 在节点一上安装 Oracle 9.0.1,选择自定义安装,安装过程中选择部创建数据库;  
2、 重新启动节点一;  
3、 在节点二上安装 Oracle 9.0.1,选择自定义安装,安装过程中选择部创建数据库;  
4、 重新启动节点二;  
5、 在节点一上创建要添加到集群中的数据库,新数据库不要配置 Net8,即不要配置 listener.ora 和 tnsnames.ora 文件。注意 Control 文件、redo log files 和 data files 必须创建在磁盘柜的共享分区上;  
6、 在节点一和节点二的注册表中相应位置添加第五步所创建的数据库的 ORACLE_SID;  
7、 在节点一上安装 FailSafe 3.2;  
8、 重新启动节点一;  
9、 在节点二上安装 FailSafe 3.2;  
10、 重新启动节点二;  
11、 在两台机器上修改文件c:\winnt\system32\drivers\etc\hosts 如下:  
192.0.35.1 clunode1 (节点1)  
192.0.35.2 clunode2 (节点2)  
192.0.35.100 mycluster (MSCS Cluster 的别名,也就是虚拟 IP的别名)  

注意节点上listener 使用的 IP 地址应该是虚拟 IP;  
12、 打开 Oracle Fail Safe Manager  
Start -> Programs -> OraHome91> -> Oracle Fail Safe Manager  
打开后出现 Add Cluster to Tree 对话框,在该对话框里输入 CLUSTER 名称,会  
提示输入在域里有管理权限的用户名和密码;输入后会出现 Verify Cluster 对话  
框,对该集群各项资源进行有效性验证;  
13、 在每台节点机上检查是否有服务 OracleMSCSServices,并启动该服务;  
14、 在每台节点机上启动集群管理器(启动 -> 程序 -> 管理工具 -> 集群管理器),在 Cluster Group 检查是否有 Oracle Services for MSCS 这一项;并检查 Resource Types 中是否有 Oracle Database 和 Oracle TNS Listener。  
15、 在 Oracle Fail Safe Manager 中的Groups 菜单里选择 Create;打开 Create Group Wizard 后可以设置 failover 和 failback 策略,并自动打开 Add Resource to Group Wizard 可以向组添加virtual address(选择Resources,然后Add to Group)。  
16、 在 Troubleshooting 菜单上选择 Verify Standalone Database 验证 Oracle数据库以及 Oracle Net 配置,该命令确认 Oracle Fail Safe 可以访问数据库,并且 standlone 数据库位于共享分区上;  
17、 在 Resources 菜单上选择 Add to Group,然后选择 Oracle Database打开 Add Resource to Group Wizard,该向导用来将 single-instance Oracle database server 配置为基于 MSCS 的高可用性数据库服务器;  

其他说明:  
在安装完 fail safe 后,Windows 2000 中的群集管理器中 群集配置 –〉 资源类型 –〉 下会出现两个资源类型:Oracle Database 和 Oracle TNS Listener,两者使用的资源 DLL 都是 FsResOdbs.dll 。  
在 FailSafe 里添加组 grptest 并将数据库群集添加后,在群集管理器里也增加了该组,组包含的内容有:IP Address 、Network Name scsi817、Disk R:、OracleOraHome81TNSListenerFslscsi817 和 LEGEND(数据库实例名)  
其中:(C:\winnt\system\drivers\etc 的内容如下:)  
192.0.35.1 t630r  
192.0.35.3 t630l  
192.0.35.100 mycluster (群集的名称)  
192.168.34.71 scsi817 (Oracle 集群使用的 IP 和网络名称)  

基本上ORACLE HA 就已经完成了,接下来就是把应用做成服务添加到集群管理器里。  
这种方式,安装应用都非常方便,又可以做到系统的高可靠性,应该说物廉价美吧,不过有些缺点就是不能做流量均衡等。

以上内容转自
::URL::
http://blog.tomxp.com/view/262.html


dennyzhao 发表于 >2005-7-8 16:41:27 保存该日志到本地 [全文] [评论] [引用] [推荐] [档案] [推给好友]

2005-7-7
oracle联机日志恢复 [转]

ORACLE联机日志文件丢失或损坏的处理方法 
 

经验总结: 

联机日志分为当前联机日志和非当前联机日志,非当前联机日志的损坏是比较简单的,一般通过clear命令就可以解决问题。

损坏非当前联机日志:
1、启动数据库,遇到ORA-00312 or ORA-00313错误,如:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: ’/setup/oradata/hydb/redo01.log’
从这里我们知道日志组1的数据文件损坏或丢失了
从报警文件可以看到更详细的信息
2、查看V$log视图:
SQL> select group#,sequence#,archived,status from v$log;

   GROUP#  SEQUENCE# ARC STATUS
———- ———- — —————-
         1          0 YES UNUSED
         2          1 NO  CURRENT

可以知道,该组是非当前状态,而且未用过
3、用CLEAR命令重建该日志文件
SQL>alter database clear logfile group 1;
如果是该日志组还没有归档,则需要用
SQL>alter database clear unarchived logfile group 1;
4、打开数据库,重新备份数据库
SQL>alter database open;
说明:
1)、如果损坏的是非当前的联机日志文件,一般只需要clear就可以重建该日志文件,但是如果该数据库处于归档状态但该日志还没有归档,就需要强行clear。
2)、建议clear,特别是强行clear后作一次数据库的全备份。
3)、此方法适用于归档与非归档数据库。

损坏当前联机日志

归档模式下当前日志的损坏有两种情况,
一、是数据库是正常关闭,日志文件中没有未决的事务需要实例恢复,当前日志组的损坏就可以直接用alter database clear unarchived logfile group n来重建。
二、是日志组中有活动的事务,数据库需要媒体恢复,日志组需要用来同步,有两种补救办法
A. 最好的办法就是通过不完全恢复,可以保证数据库的一致性,但是这种办法要求在归档方式下,并且有可用的备份
B. 通过强制性恢复,但是可能导致数据库不一致。
下面分别用来说明这两种恢复方法
5.1.2.1 通过备份来恢复
1、打开数据库,会遇到一个类似的错误
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: ’D:\ORACLE\ORADATA\TEST\REDO01.LOG’
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) 系统找不到指定的文件

2、查看V$log,发现是当前日志
SQL> select group#,sequence#,archived,status from v$log;


3、发现clear不成功
SQL> alter database clear unarchived logfile group 2;
alter database clear unarchived logfile group 2
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of thread 1
ORA-00312: online log 1 thread 1: 
4、拷贝有效的数据库的全备份,并不完全恢复数据库
可以采用获取最近的SCN的办法用until scn恢复或用until cnacel恢复
recover database until cancel
先选择auto,尽量恢复可以利用的归档日志,然后重新
recover database until cancel
这次输入cancel,完成不完全恢复,也就是说恢复两次。
如:
SQL> recover database until cancel;
Auto
……
SQL> recover database until cancel;
Cancel;
5、利用alter database open resetlogs打开数据库
说明:
1、这种办法恢复的数据库是一致的不完全恢复,会丢失当前联机日志中的事务数据
2、这种方法适合于归档数据库并且有可用的数据库全备份。
3、恢复成功之后,记得再做一次数据库的全备份。
4、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。

如果没有备份,进行强制性恢复
1、打开数据库,会遇到一个类似的错误
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: ’D:\ORACLE\ORADATA\TEST\REDO01.LOG’
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) 系统找不到指定的文件

2、查看V$log,发现是当前日志
SQL> select group#,sequence#,archived,status from v$log;

GROUP# SEQUENCE# ARCHIVED STATUS
———- ———- ——– —————-
1 1 NO CURRENT
2 2 YES INACTIVE
3 3 YES INACTIVE

3、发现clear不成功
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of thread 1
ORA-00312: online log 1 thread 1: ’D:\ORACLE\ORADATA\TEST\REDO01.LOG’

4、把数据库down掉
SQL>shutdown immediate

5、在init<sid>.ora中加入如下参数
_allow_resetlogs_corruption=TRUE

6、用pfile重新启动数据库,利用until cancel恢复
SQL>recover database until cancel; 
Cancel
如果出错,不再理会,发出 
SQL>alter database open resetlogs;

7、数据库被打开后,马上执行一个full export

8、shutdown数据库,去掉_all_resetlogs_corrupt参数 

9、重建库

10、import并完成恢复

11、建议执行一下ANALYZE TABLE …VALIDATE STRUCTURE CASCADE;
说明:
1、该恢复方法是没有办法之后的恢复方法,一般情况下建议不要采用,因为该方法可能导致数据库的不一致
2、该方法也丢失数据,但是丢失的数据没有上一种方法的数据多,主要是未写入数据文件的已提交或未提交数据。
3、建议成功后严格执行以上的7到11步,完成数据库的检查与分析
4、全部完成后做一次数据库的全备份
5、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。
 
以上内容来自::URL::
http://www.ddvip.net/database/oracle/index5/190.htm


dennyzhao 发表于 >2005-7-7 18:07:29 保存该日志到本地 [全文] [评论] [引用] [推荐] [档案] [推给好友]

2005-7-5
oracle 备用数据库实现 [原]

oracle备用数据库种类

物理备用数据库
物理备用数据库是主数据库的一个块到块的副本
使用数据库恢复功能来应用更改
可以以只读方式打开,用于生成报表和查询
还可用于备份和减轻生产数据库的负载
逻辑备用数据库
逻辑备用数据库是一个开放、独立和活动的数据库
包含与生产数据库相同的逻辑信息(行)
物理组织和结构可能大不相同
可以托管多种模式
当通过 SQL 来应用日志时,可以查询逻辑备用数据库,以进行报表操作
可以创建额外的索引和物化视图,以获得更高的查询性能

oracle dataguard服务
Log Transport Service
    Automated Transfer of Redo Log Control Data Protection Level
Log Apply Service
    Apply Redo to Physical Standby Database Apply SQL to Logical Standby Database
Role Management Service
    Control the Shift of Primary and Standby

oracle dataguard 模式
Maximum Protection
Transaction committed until redo data is available at least one standby database(当备用库无法联机时,会导致生产库的等待)
Maximum Availability
Redo data transferred synchronously as possible,Primary database does not wait if standby failure
Maximum Performance
Redo data transferred asynchronously, Primary database does not wait if standby failure(异步传输,最适合生产库业务量大时的情况)

oracle 备用库实现要求
主备数据库均运行于归档模式
同样的oracle版本与发行号
相同的硬件平台与操作系统,并要示操作系统位数相同
要求禁用非LOG的直接写操作,实现强制的log
要有sysdba权限的操作系统帐号

oracle 物理备用库实现
主数据库准备
Enable force logging
SQL> ALTER DATABASE FORCE LOGGING;
Enable archiving and define a local archiving destination
archive log list查看,具体设置见本BLOG

备用数据库信息准备
在主数据库上标识数据文件位置
select name from v$datafile;
在主数据库上为备用数据库创建控制文件
ALTER DATABASE CREATE STANDBY CONTROLFILE AS ’/youpath/for/standby/control.ctl’;
在主数据库上为备用数据库创建基准参数文件
CREATE PFILE=’/yourpath/for/standby/initsid.ora’ from spfile; 

备用数据库创建
关闭主数据库,将准备好的数据文件、控制文件与参数文件CP到备用服务器上

备用数据库参数更改
控制文件位置

专用的*.standby_archive_dest=位置,尽量与*.log_archive_dest_1位置分开
专用的*.db_file_name_convert=’主数据库数据文件位置’,'备用数据库数据文件位置’
专用的*.log_file_name_convert=’主数据库联机日志位置’,'备用数据库联机日志位置’

*.log_archive_format指明备用库归档格式,建议在主数据库基础上有变化。
*.log_archive_dest_1指明备用库归档位置,不要与standby_archive_dest同
根据备用库情况,更改对应的dump文件位置
*.core_dump_dest,*.background_dump_dest,*.user_dump_dest三个trace的位置
*.standby_file_management设为自动
*.remote_archive_enable设为TRUE,保证备用库可以收发远程archive log 文件

根据standby_archive_dest,log_archive_dest_1,dump,initfile,备用数据库联机日志等位置创建对应的oracle有权限目录


数据库监听与TNSNAMES更改,以保证相互访问
备用库的SID最好与主库不一样
$ORACLE_HOME/network/admin/listener.ora
主数据库上必须要有监听主数据库的服务条目,其SID_NAME 为主数据库的ORACLE_SID
备用库上是有监听备用库的服务条目,其SID为备用库上的SID
tnsnames.ora
主数据库上要设定访问备用数据库的网络服务别名,注意这时的备用数据库的SID 是指
备用数据库上,要启动作为备用数据库的ORACLE_SID
同样,在备用数据库上也要指明主数据库对应的tnsname
如果要确认上述的配置正确,可以在sqlplus状态下进行远程连接测试
conn sys/syspass@tnsname as sysdba;
如果可连上,则证明OK

备用库上口令生成
orapwd file=’/you/path/for/orapwSID’ password=yousyspassword entries=4

备用数据库启动
export ORACLE_SID=standby_sid;
sqlplus /nolog <<END
conn / as sysdba;
startup nomount pfile=’/you/path/for/your/standby/pfile’;
alter database mount standby database;
END
在数据库mount成standby模式之后,我们有三种选择:
1、手动恢复
当数据存在差距时,就要手动恢复。
recover standby database; 
2、进入自动恢复模式
alter database recover managed standby database disconnect from session;
此时sql将停止响应15分钟,系统也只接受对固定表与视图的查询,不接受对普通表与视图的查询。
如果要取消数据库的自动恢复模式,则可用
recover managed standby database cancel;
3、以只读方式打开数据库
alter database open read only;
要打开,只有在mount后打开,或managed cancel后打开。

如果打开报错,则可以在主库上进行几次alter system switch logfile,保证主库上的archive日志能转储到备用库上,然后再手动恢复后,即可正常的以read only模式打开了。


对一个大型的生产库,建议采用平常open read only模式,在晚上再手动恢复后再重新以open read only模式打开,这样可以方便standby库可以作为查询库使用。


主数据库的设置
为了归档日志的自动传送,请使用以下命令:
alter system set log_archive_dest_2 = ‘service=standbydb mandatory reopen=10’ scope=both
将归档的第二个位置放在备用库上的归档目录中

其中standby指的是备用库在主库上定义的tnsname

alter system set log_archive_dest_state_2 = enable scope=both
启用第二归档

备用数据库的激活
备用数据库激活是单向的,被击活的 standby database 是无法再回到 standby 状态下。
其步骤如下:
1、尽量先归档主库上的联机日志
alter system archive log current; 
2、做最后一次LOG应用,保证数据最新
3、关闭主库
4、将备用库mount后,激活
 alter database activate standby database;
5、关闭备用库,做系统冷备
6、以正常方式重启数据库。



dennyzhao 发表于 >2005-7-5 11:37:49 保存该日志到本地 [全文] [评论] [引用] [推荐] [档案] [推给好友]

2005-6-28
oracle性能调整总结_应用篇1 [转]

以下内容转自
::URL::
http://blog.csdn.net/superbirdxp/

2.  应用优化
下面我们从技术的角度入手,来探讨数据库优化方面的问题。通常作为优化Oracle系统的人,或者是DBA,其实很多时候对应用并不很了解甚至可以说是完全不了解,更不要说对应用程序代码的了解。事实上呢,一个系统运行的快或者慢相信大家都明白,第一重要的是数据库的设计,然后是应用的设计, SQL语句的编写,最后才是数据库参数的调整和硬件、网络的问题,等等。所以在我们不了解一个系统的时候来优化数据库应用不是一个轻松的容易的事情。那么我们第一步应该怎么做呢?
通常有两类方法:
其中一个方法就是我们常用的,使用statspack来进行诊断系统的瓶颈所在。在statspack中oracle给出了几乎涵盖oracle大部分重要内容的信息。
另外一种方式,就是trace session。假如某个session运行很慢或者某个用户的某个查询很慢,那么这个时候我们可以通过trace session的方式来诊断到底是慢在哪里,看究竟执行计划是怎样的,然后在user_dump_dest下根据该session的进程号或者线程号可以找到一个产生的trace文件。通过使用tkprof格式化文件之后我们就可以看见很多的统计信息,这里包括了执行计划、parse/fetch等步骤消耗cpu的时间。通常我们是观察query模式下的consistent gets来首先看sql是否使用了索引,然后看执行计划是不是正常,是不是有调整的余地。当然如果您没有实际做过的话,这些内容说起来很抽象。这是在不了解应用和程序下针对特定session的诊断和调整过程。
trace session的方式是一种自下而上的方法,从sql入手;而statspack是自顶向下的方法,也就是从宏观上先诊断数据库的瓶颈在哪里,然后从瓶颈入手来做调整,这个习惯上又可以称为通过等待事件(wait event)入手的方法。

2.1  使用statspack
statspack是一个性能诊断工具,首先发布于Oracle8.1.6版本,在8.1.7版本中功能得到加强。Statspack除了查找实例中的性能问题外,还可以查找应用程序中高负荷的SQL语句,很容易确定Oracle 数据库的瓶颈所在,并且记录数据库性能状态。
在数据库中Statspack 的脚本位于$ORACLE_HOME/RDBMS/ADMIN 目录下,对于ORACLE8.1.6,是一组以stat 开头的文件;对于ORACLE8.1.7,是一组以sp 开头的文件。
在Statspack 发布之前,我们通常能够使用诊断数据库的工具是两个脚本UTLBSTAT.SQL 和UTLESTAT.SQL,BSTAT/ESTAT 是一个非常简单的性能诊断工具。UTLBSTAT 获得开始时很多V$视图的快照,UTLESTAT 通过先前的快照和当前视图生成一个报表。
该报表实际上相当于statspack 中的两个采样点。
Statspack 通过连续的采样,能够给我们提供至关重要的趋势分析数据。这是一个巨大的进步。能够使用Statspack 的环境我们就尽量不要使用BSTAT/ESTAT 的方式来诊断数据库问题。

2.1.1  安装statapack
§ 步骤一:
为了能够顺利安装和运行Statspack ,首先需要设置以下两个系统参数:
1.  job_queue_processes
为了能够建立自动任务,执行数据收集,该参数需要大于0。你可以在初试化参数文件中修改该参数(使该参数在重起后以然有效)。
该参数可以在系统级动态修改(重起后失效)。

SQL> alter system set job_queue_processes = 6;
System altered

在Oracle9i 当中,可以指定范围,如 both,这样该修改在当前及之后保持有效(仅当你使用spfile 时,如果在9i 中仍然使用pfile,那么更改方法同8i 相同):

SQL> alter system set job_queue_processes = 6 scope=both;
System altered


2.  timed_statistics
收集操作系统的计时信息,这些信息可被用来显示时间等统计信息、优化数据库和 SQL 语句。要防止因从操作系统请求时间而引起的开销,请将该值设置为False。
使用statspack 收集统计信息时建议将该值设置为 TRUE,否则收集的统计信息大约只能起到10%的作用,将timed_statistics 设置为True 所带来的性能影响与好处相比是微不足道的。
该参数使收集的时间信息存储在在V$SESSTATS 和V$SYSSTATS 等动态性能视图中。
timed_statistics 参数也可以在实例级进行更改

SQL> alter system set timed_statistics = true;
System altered

如果你担心一直启用timed_statistics 对于性能的影响,你可以在使用statspack 之前在system 更改,采样过后把该参数动态修改成false。

§ 步骤二:
需要单独为statspack创建一个存储数据的表空间,如果采样间隔较短,周期较长,打算长期使用,那么可能需要一个大一点的表空间,如果每个半个小时采样一次,连续采样一周,数据量是很大的。下面的例子中创建了一个500M 的测试表空间。
注意: 这里创建的表空间不能太小,如果太小的话创建对象会失败,建议至少建立100M 表空间。

SQL> create tablespace perfstat
2 datafile ’/oracle/oradata/oradata/res/perfstat.dbf’
3 size 500M;
Tablespace created。

§ 步骤三:
在 sqlplus 中用internal 身份登陆,或者拥有SYSDBA(connect / as sysdba)权限的用户登陆。
注: 在Oracle9i 中,不存在internal 用户,可以使用sys 用户以sysdba 身份连接。
先转到$ORACLE_HOME/RDBMS/ADMIN 目录,检查安装脚本是否存在,同时我们执行脚本也可以方便些。

$ cd $ORACLE_HOME/rdbms/admin
$ ls -l sp*.sql
-rw-r–r–   1 oracle   other       1774 Feb 18  2000 spauto.sql
-rw-r–r–   1 oracle   other      62545 Jun 15  2000 spcpkg.sql
-rw-r–r–   1 oracle   other        877 Feb 18  2000 spcreate.sql
-rw-r–r–   1 oracle   other      31193 Jun 15  2000 spctab.sql
-rw-r–r–   1 oracle   other       6414 Jun 15  2000 spcusr.sql
-rw-r–r–   1 oracle   other        758 Jun 15  2000 spdrop.sql
-rw-r–r–   1 oracle   other       3615 Jun 15  2000 spdtab.sql
-rw-r–r–   1 oracle   other       1274 Jun 15  2000 spdusr.sql
-rw-r–r–   1 oracle   other       6760 Jun 15  2000 sppurge.sql
-rw-r–r–   1 oracle   other      71034 Jul 12  2000 spreport.sql
-rw-r–r–   1 oracle   other       2191 Jun 15  2000 sptrunc.sql
-rw-r–r–   1 oracle   other      30133 Jun 15  2000 spup816.sql


接下来我们就可以开始安装Statspack 了。在Oracle8.1.6 版本中运行statscre.sql; 在Oracle8.1.7 版本中运行spcreate.sql。
这期间会提示你输入缺省表空间和临时表空间的位置,输入我们为 perfstat 用户创建的表空间和你的临时表空间。安装脚本会自动创建perfstat 用户。

$ sqlplus

SQL*Plus: Release 8.1.7.0.0 - Production on Sat Jul 26 16:27:31 2003

(c) Copyright 2000 Oracle Corporation.  All rights reserved.

Enter user-name: internal

Connected to:
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production

SQL>
SQL> @spcreate
… Installing Required Packages

Package created.

Grant succeeded.

View created.

Package body created.

Package created.

Synonym dropped.

Synonym created.
……

Specify PERFSTAT user’s default   tablespace
Enter value for default_tablespace: perfstat
Using perfstat for the default tablespace

User altered.

User altered.

Specify PERFSTAT user’s temporary tablespace
Enter value for temporary_tablespace: temp
Using temp for the temporary tablespace

User altered.

NOTE:
SPCUSR complete. Please check spcusr.lis for any errors.

……

如果安装成功,你可以接着看到如下的输出信息:
….
Creating Package STATSPACK…

Package created.

No errors.
Creating Package Body STATSPACK…

Package body created.

No errors.

NOTE:
SPCPKG complete. Please check spcpkg.lis for any errors.

可以查看.lis 文件查看安装时的错误信息。

§ 步骤四:
如果安装过程中出现错误,那么可以运行spdrop.sql 脚本来删除这些安装脚本建立的对象。然后重新运行spcreate.sql来创建这些对象。

SQL> @spdrop
Dropping old versions (if any)

Synonym dropped.

Sequence dropped.

Synonym dropped.

Table dropped.

Synonym dropped.

View dropped.
……
NOTE:
SPDUSR complete. Please check spdusr.lis for any errors.

(以上的安装过程描述是在 HP 11.11 + Oracle 8.1.7 平台上得到的)

2.1.2  测试statspack
运行statspack.snap 可以产生系统快照,运行两次,然后执行spreport.sql 就可以生成一个基于两个时间点的报告。
如果一切正常,说明安装成功。

SQL>execute statspack.snap
PL/SQL procedure successfully completed.
SQL>execute statspack.snap
PL/SQL procedure successfully completed.
SQL>@spreport.sql

可是有可能你会得到以下错误:

SQL> exec statspack.snap;
BEGIN statspack.snap; END;
*
ERROR at line 1:
ORA-01401: inserted value too large for column
ORA-06512: at "PERFSTAT.STATSPACK", line 978
ORA-06512: at "PERFSTAT.STATSPACK", line 1612
ORA-06512: at "PERFSTAT.STATSPACK", line 71
ORA-06512: at line 1

这是Oracle 的一个Bug,Bug 号1940915。
该Bug 自8.1.7.3 后修正。
这个问题只会出现在多位的字符集, 需要修改spcpkg.sql 脚本,$ORACLE_HOME/rdbms/admin/spcpkg.sql,将"substr" 修改为 "substrb",然后重新运行该脚本。
该脚本错误部分:
select l_snap_id
, p_dbid
, p_instance_number
, substr(sql_text,1,31)
...........
substr 会将多位的字符, 当作一个byte.substrb 则会当作多个byte。在收集数据时, statpack 会将 top10 的 sql 前 31 个字节 存入数据表中,若在SQL 的前31 个字有中文,就会出现此错误。
注意:运行 spcpkg.sql 也需要以 internal 用户登录 sqlplus


2.1.3  生成statspack报告
调用spreport.sql 可以生成分析报告:
当调用spreprot.sql 时,系统首先会查询快照列表,然后要求你选择生成报告的开始快照ID(begin_snap)和结束快照ID(end_snap),生成一个报告.
为了生成一个report,我们至少需要两次采样:


SQL> @spreport  

   DB Id    DB Name      Inst Num Instance
———–   ————       ——– ————
  2749170756 RES              1      res

Completed Snapshots

                           Snap                    Snap
Instance     DB Name         Id   Snap Started    Level Comment
———— ———— —– —————– —– ———————-
res          RES              1 26 Jul 2003 16:36     5
                              2 26 Jul 2003 16:37     5
                              3 26 Jul 2003 17:03     5


Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap:2
Begin Snapshot Id specified: 2

Enter value for end_snap: 3
End   Snapshot Id specified: 3


Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is sp_2_3.  To use this name,
press to continue, otherwise enter an alternative.
Enter value for report_name: rep0726.txt  

 ……

 End of Report


在运行 spreport.sql 生成 statspack 报告的过程中,会有三个地方提示用户输入:
1、 开始快照ID;
2、 结束快照ID;
3、 输出报告文件的文件名,缺省的文件名是sp__
上面输入的开始快照ID是2,开始快照ID是3,输出报告文件的文件名是rep0726.txt
成功运行一次 statspack.snap 就会产生一个 snapshot ,在生成 statspack 报告的时候就可以看到这个 snap id 和 snap 运行的时间。运行 statspack.snap ,就是上面所说的采样,statspack 报告是分析两个采样点之间各种情况。

2.1.4  删除历史快照数据
前面讲过,成功运行一次 statspack.snap 就会产生一个 snapshot ,这个 snapshot 的基本信息是存放在 PERFSTAT.stats$snapshot 表中的,生成 statspack报告时会查询该表的数据,供用户选择准备分析的 snapshot 。如果运行 statspack.snap 次数多了以后,该表的数据也会增加,历史数据会影响正常运行的效果,因此需要定时清理一下历史快照数据。
删除stats$snapshot 数据表中的相应数据,其他表中的数据会相应的级连删除:

SQL> select max(snap_id) from stats$snapshot;
MAX(SNAP_ID)
————
166

SQL> delete from stats$snapshot where snap_id < = 166;
143 rows deleted

你可以更改snap_id 的范围以保留你需要的数据。
在以上删除过程中,你可以看到所有相关的表都被锁定。
SQL> select a.object_id,a.oracle_username ,b.object_name
from v$locked_object a,dba_objects b
where a.object_id = b.object_id
/
OBJECT_ID ORACLE_USERNAME OBJECT_NAME
————————————- ——————————————————————————–
156 PERFSTAT SNAP$
39700 PERFSTAT STATS$LIBRARYCACHE
39706 PERFSTAT STATS$ROLLSTAT
39712 PERFSTAT STATS$SGA
39754 PERFSTAT STATS$PARAMETER
39745 PERFSTAT STATS$SQL_STATISTICS
39739 PERFSTAT STATS$SQL_SUMMARY
39736 PERFSTAT STATS$ENQUEUESTAT
39733 PERFSTAT STATS$WAITSTAT
39730 PERFSTAT STATS$BG_EVENT_SUMMARY
39724 PERFSTAT STATS$SYSTEM_EVENT
39718 PERFSTAT STATS$SYSSTAT
39715 PERFSTAT STATS$SGASTAT
39709 PERFSTAT STATS$ROWCACHE_SUMMARY
39703 PERFSTAT STATS$BUFFER_POOL_STATISTICS
39697 PERFSTAT STATS$LATCH_MISSES_SUMMARY
39679 PERFSTAT STATS$SNAPSHOT
39682 PERFSTAT STATS$FILESTATXS
39688 PERFSTAT STATS$LATCH
174 PERFSTAT JOB$
20 rows selected

Oracle 还提供了系统脚本用于Truncate 这些统计信息表,这个脚本名字是: sptrunc.sql (8i、9i 都相同)
该脚本主要内容如下,里面看到的就是statspack 相关的所有系统表:
truncate table STATS$FILESTATXS;
truncate table STATS$LATCH;
truncate table STATS$LATCH_CHILDREN;
truncate table STATS$LATCH_MISSES_SUMMARY;
truncate table STATS$LATCH_PARENT;
truncate table STATS$LIBRARYCACHE;
truncate table STATS$BUFFER_POOL_STATISTICS;
truncate table STATS$ROLLSTAT;
truncate table STATS$ROWCACHE_SUMMARY;
truncate table STATS$SGA;
truncate table STATS$SGASTAT;
truncate table STATS$SYSSTAT;
truncate table STATS$SESSTAT;
truncate table STATS$SYSTEM_EVENT;
truncate table STATS$SESSION_EVENT;
truncate table STATS$BG_EVENT_SUMMARY;
truncate table STATS$WAITSTAT;
truncate table STATS$ENQUEUESTAT;
truncate table STATS$SQL_SUMMARY;
truncate table STATS$SQL_STATISTICS;
truncate table STATS$SQLTEXT;
truncate table STATS$PARAMETER;
delete from STATS$SNAPSHOT;
delete from STATS$DATABASE_INSTANCE;
commit;

2.1.5  一些重要脚本
1.通过导出保存及共享数据
在诊断系统问题时,可能需要向专业人士提供原始数据,这时我们可以导出Statspack 表数据,
其中我们可能用到:spuexp.par
其内容主要为:
file=spuexp.dmp log=spuexp.log compress=y grants=y indexes=y rows=y constraints=y owner=PERFSTAT consistent=y
我们可以导出如下:
exp userid=perfstat/my_perfstat_password parfile=spuexp.par

2.删除数据
spdrop.sql 在执行时主要调用两个脚本: spdtab.sql 、spdusr.sql
前者删除表及同义词等数据,后者删除用户

3.Oracle92 中新增加的脚本
1) 用于升级statspack 对象的脚本,这些脚本需要以具有SYSDBA 权限的用户运行, 升级前请先
备份存在的Schema 数据:
spup90.sql: 用于升级9.0 版本的模式至9.2 版本。
spup817.sql: 如果从Statspack 8.1.7 升级,需要运行这个脚本
spup816.sql: 从Statspack 8.1.6 升级,需要运行这个脚本,然后运行spup817.sql
2) sprepsql.sql 用于根据给定的SQL Hash 值生成SQL 报告


2.1.6  调整statspack的收集门限
Statspack 有两种类型的收集选项:

1.级别(level):控制收集数据的类型
Statspack 共有三种快照级别,默认值是5
a. level 0: 一般性能统计。包括等待事件、系统事件、系统统计、回滚段统计、行缓存、SGA、会话、锁、缓冲池统计等等。
b. level 5: 增加SQL 语句。除了包括level0 的所有内容,还包括SQL 语句的收集,收集结果记录在stats$sql_summary 中。
c. level 10: 增加子锁存统计。包括level5 的所有内容。并且还会将附加的子锁存存入stats$lathc_children 中。在使用这个级别时需要慎重,建议在Oracle support 的指导下进行。
可以通过statspack 包修改缺省的级别设置
SQL>execute statspack.snap(i_snap_level=>0,i_modify_parameter=>’true’);
通过这样的设置,以后的收集级别都将是0 级。
如果你只是想本次改变收集级别,可以忽略i_modify_parameter 参数。
SQL>execute statspack.snap(i_snap_level=>10);

2.快照门限:设置收集的数据的阈值。
快照门限只应用于stats$sql_summary 表中获取的SQL 语句。
因为每一个快照都会收集很多数据,每一行都代表获取快照时数据库中的一个SQL 语句,所以stats$sql_summary 很快就会成为Statspack 中最大的表。
门限存储在stats$statspack_parameter 表中。让我们了结一下各种门限:
a. executions_th 这是SQL 语句执行的数量(默认值是100)
b. disk_reads_tn 这是SQL 语句执行的磁盘读入数量(默认值是1000)
c. parse_calls_th 这是SQL 语句执行的解析调用的数量(默认值是1000)
d. buffer_gets_th 这是SQL 语句执行的缓冲区获取的数量(默认值是10000)
任何一个门限值超过以上参数就会产生一条记录。
通过调用statspack.modify_statspack_parameter 函数我们可以改变门限的默认值。
例如:
SQL>execute statspack.modify_statspack_parameter(i_buffer_gets_th=>100000,i_disk_reads_th=>100000;



dennyzhao 发表于 >2005-6-28 11:16:28 保存该日志到本地 [全文] [评论] [引用] [推荐] [档案] [推给好友]

2005-6-28
oracle性能调整总结_参数篇 [转]

以下内容转自
::URL::
http://blog.csdn.net/superbirdxp/

Oracle Tuning的一些总结

        关于Oracle的性能调整,一般包括两个方面,一是指Oracle数据库本身的调整,比如SGA、PGA的优化设置,二是连接Oracle的应用程序以及SQL语句的优化。做好这两个方面的优化,就可以使一套完整的Oracle应用系统处于良好的运行状态。
        本文主要是把一些Oracle Tuning的文章作了一个简单的总结,力求以实际可操作为目的,配合讲解部分理论知识,使大部分具有一般Oracle知识的使用者能够对Oracle Tuning有所了解,并且能够根据实际情况对某些参数进行调整。关于更加详细的知识,请参见本文结束部分所提及的推荐书籍,同时由于该话题内容太多且复杂,本文必定有失之偏颇甚至错误的地方,请不吝赐教,并共同进步。

1.  SGA的设置
        在Oracle Tuning中,对SGA的设置是关键。SGA,是指Shared Global Area , 或者是 System Global Area , 称为共享全局区或者系统全局区,结构如下图所示。


 
        对于SGA区域内的内存来说,是共享的、全局的,在UNIX 上,必须为oracle 设置共享内存段(可以是一个或者多个),因为oracle 在UNIX上是多进程;而在WINDOWS上oracle是单进程(多个线程),所以不用设置共享内存段。

1.1  SGA的各个组成部分
下面用 sqlplus 查询举例看一下 SGA 各个组成部分的情况:
SQL> select * from v$sga;
NAME                      VALUE
——————–              ———-
Fixed Size                   104936
Variable Size              823164928
Database Buffers          1073741824
Redo Buffers                 172032

或者
SQL> show sga
Total System Global Area   1897183720 bytes
Fixed Size                   104936 bytes
Variable Size              823164928 bytes
Database Buffers          1073741824 bytes
Redo Buffers                 172032 bytes

Fixed Size
        oracle 的不同平台和不同版本下可能不一样,但对于确定环境是一个固定的值,里面存储了SGA 各部分组件的信息,可以看作引导建立SGA的区域。

Variable Size
        包含了shared_pool_size、java_pool_size、large_pool_size 等内存设置

Database Buffers
        指数据缓冲区,在8i 中包含db_block_buffer*db_block_size、buffer_pool_keep、buffer_pool_recycle 三部分内存。在9i 中包含db_cache_size、db_keep_cache_size、db_recycle_cache_size、 db_nk_cache_size。

Redo Buffers
       指日志缓冲区,log_buffer。在这里要额外说明一点的是,对于v$parameter、v$sgastat、v$sga查询值可能不一样。v$ parameter 里面的值,是指用户在初始化参数文件里面设置的值,v$sgastat是oracle 实际分配的日志缓冲区大小(因为缓冲区的分配值实际上是离散的,也不是以block 为最小单位进行分配的),v$sga 里面查询的值,是在oracle 分配了日志缓冲区后,为了保护日志缓冲区,设置了一些保护页,通常我们会发现保护页大小是8k(不同环境可能不一样)。参考如下内容
SQL> select substr(name,1,10) name,substr(value,1,10) value
       2 from v$parameter where name = ’log_buffer’;
NAME                 VALUE
——————–  ——————–
log_buffer              163840

SQL> select * from v$sgastat where pool is null;

POOL        NAME                       BYTES
———– ————————–                ———-
            fixed_sga                      104936
            db_block_buffers            1073741824
            log_buffer                     163840

SQL> select * from v$sga;

NAME                      VALUE
——————–              ———-
Fixed Size                   104936
Variable Size               823164928
Database Buffers           1073741824
Redo Buffers                 172032

172032 – 163840 = 8192

(以上试验数据是在 HP B.11.11 + Oracle 8.1.7.4 环境下得到的)


1.2  SGA的大小设置
       在对SGA的结构进行简单分析以后,下面是关于如何根据系统的情况正确设置SGA大小的问题。
SGA是一块内存区域,占用的是系统物理内存,因此对于一个Oracle应用系统来说,SGA决不是越大越好,这就需要寻找一个系统优化的平衡点。


1.2.1  设置参数前的准备
在设置SGA的内存参数之前,我们首先要问自己几个问题
一:物理内存多大
二:操作系统估计需要使用多少内存
三:数据库是使用文件系统还是裸设备
四:有多少并发连接
五:应用是OLTP 类型还是OLAP 类型

根据这几个问题的答案,我们可以粗略地为系统估计一下内存设置。那我们现在来逐个问题地讨论,首先物理内存多大是最容易回答的一个问题,然后操作系统估计使用多少内存呢?从经验上看,不会太多,通常应该在200M 以内(不包含大量进程PCB)。
接下来我们要探讨一个重要的问题,那就是关于文件系统和裸设备的问题,这往往容易被我们所忽略。操作系统对于文件系统,使用了大量的buffer 来缓存操作系统块。这样当数据库获取数据块的时候,虽然SGA 中没有命中,但却实际上可能是从操作系统的文件缓存中获取的。而假如数据库和操作系统支持异步IO,则实际上当数据库写进程DBWR写磁盘时,操作系统在文件缓存中标记该块为延迟写,等到真正地写入磁盘之后,操作系统才通知DBWR写磁盘完成。对于这部分文件缓存,所需要的内存可能比较大,作为保守的估计,我们应该考虑在 0.2——0.3 倍内存大小。但是如果我们使用的是裸设备,则不考虑这部分缓存的问题。这样的情况下SGA就有调大的机会。
关于数据库有多少并发连接,这实际上关系到PGA 的大小(MTS 下还有large_pool_size)。事实上这个问题应该说还跟OLTP 类型或者OLAP 类型相关。对于OLTP类型oracle 倾向于可使用MTS,对于OLAP 类型使用独立模式,同时OLAP 还可能涉及到大量的排序操作的查询,这些都影响到我们内存的使用。那么所有的问题综合起来,实际上主要反映在UGA的大小上。UGA主要包含以下部分内存设置
SQL> show parameters area_size

NAME                                 TYPE    VALUE
————————————               ——-     ——–
bitmap_merge_area_size                   integer    1048576
create_bitmap_area_size                   integer    8388608
hash_area_size                           integer     131072
sort_area_size                            integer     65536
SQL>

在这部分内存中我们最关注的通常是sort_area_size,这是当查询需要排序的时候,数据库会话将使用这部分内存进行排序,当内存大小不足的时候,使用临时表空间进行磁盘排序。由于磁盘排序效率和内存排序效率相差好几个数量级,所以这个参数的设置很重要。
当出现大量排序时的磁盘I/O操作时,可以考虑增加sort_area_size的值。sort_area_size是Oracle用于一次排序所需的最大内存数,在排序结束但是结果列返回之前,Oracle会释放sort_area_size大小的内存,但是会保留 sort_area_retained_size大小的内存,知道最后一行结果列返回以后,才释放所有的内存。
会导致排序的语句有 SELECT DISTINCT , MINUS , INTERSECT , UNION 和 min()、max()、count() 操作;而不会导致排序的语句有 UPDATE , 带BETWEEN子句的SELECT 等等。
这四个参数都是针对会话进行设置的,是单个会话使用的内存的大小,而不是整个数据库使用的。偶尔会看见有人误解了这个参数以为是整个数据库使用的大小,这是极其严重的错误。假如设置了MTS,则UGA被分配在large_pool_size,也就是说放在了共享内存里面,不同进程(线程)之间可以共享这部分内存。在这个基础上,我们假设数据库存在并发执行server process 为100 个,根据上面我们4 个参数在oracle8.1.7 下的默认值,我们来计算独立模式下PGA 的大致大小。由于会话并不会经常使用create_bitmap_area_size 、bitmap_merge_area_size,所以我们通常不对四个参数求和。在考虑到除这四个参数外会话所保存的变量、堆栈等信息,我们估计为 2M,则200 个进程最大可能使用200M 的PGA。

1.2.2  一个经验公式
       现在,根据上面这些假定,我们来看SGA 实际能达到多少内存。在1G 的内存的服务器上,我们能分配给SGA 的内存大约为400—500M。若是2G 的内存,大约可以分到1G的内存给SGA,8G 的内存可以分到5G的内存给SGA。当然我们这里是以默认的排序部分内存sort_area_size=64k进行衡量的,假如我们需要调大该参数和 hash_area_size等参数,然后我们应该根据并发的进程的数量,来衡量考虑这个问题。

事实上,通常我们更习惯通过直观的公式化来表达这样的问题:
OS 使用内存+SGA+并发执行进程数*(sort_area_size+hash_ara_size+2M) < 0.7*总内存

(公式是死的,系统是活的,实际应用的调整不必框公式,这不过是一个参考建议)

在我们的实际应用中,假如采用的是裸设备,我们可适当的增大SGA(如果需要的话)。由于目前几乎所有的操作系统都使用虚拟缓存,所以实际上如果就算SGA 设置的比较大也不会导致错误,而是可能出现频繁的内存页的换入与换出(page in/out)。在操作系统一级如果观察到这个现象,那么我们就需要调整内存的设置。


1.2.3  各个参数的设置
那么SGA中的各个参数具体应该按照什么样的原则来设置呢,下面进行讨论:
log_buffer
对于日志缓冲区的大小设置,通常我觉得没有过多的建议,因为参考LGWR写的触发条件之后,我们会发现通常超过3M意义不是很大。作为一个正式系统,可能考虑先设置这部分为log_buffer=1—3M 大小,然后针对具体情况再调整。
large_pool_size
对于大缓冲池的设置,假如不使用MTS,建议在20—30M 足够了。这部分主要用来保存并行查询时候的一些信息,还有就是RMAN 在备份的时候可能会使用到。如果设置了MTS,则由于UGA部分要移入这里,则需要具体根据session最大数量和 sort_ares_size 等相关会话内存参数的设置来综合考虑这部分大小的设置,一般可以考虑为 session * (sort_area_size + 2M)。这里要提醒一点,不是必须使用MTS,我们都不主张使用MTS,尤其同时在线用户数小于500的情况下。。
java_pool_size
假如数据库没有使用JAVA,我们通常认为保留10—20M大小足够了。事实上可以更少,甚至最少只需要32k,但具体跟安装数据库的时候的组件相关(比如http server)。
shared_pool_size
这是迄今为止最具有争议的一部分内存设置。按照很多文档的描述,这部分内容应该几乎和数据缓冲区差不多大小。但实际上情况却不是这样的。首先我们要考究一个问题,那就是这部分内存的作用,它是为了缓存已经被解析过的SQL,而使其能被重用,不再解析。这样做的原因是因为,对于一个新的SQL (shared_pool 里面不存在已经解析的可用的相同的SQL),数据库将执行硬解析,这是一个很消耗资源的过程。而若已经存在,则进行的仅仅是软分析(在共享池中寻找相同 SQL),这样消耗的资源大大减少。所以我们期望能多共享一些SQL,并且如果该参数设置不够大,经常会出现ora-04031错误,表示为了解析新的 SQL,没有可用的足够大的连续空闲空间,这样自然我们期望该参数能大一些。但是该参数的增大,却也有负面的影响,因为需要维护共享的结构,内存的增大也会使得SQL 的老化的代价更高,带来大量的管理的开销,所有这些可能会导致CPU 的严重问题。

在一个充分使用绑定变量的比较大的系统中,shared_pool_size 的开销通常应该维持在300M 以内。除非系统使用了大量的存储过程、函数、包,比如oracle erp 这样的应用,可能会达到500M甚至更高。于是我们假定一个1G内存的系统,可能考虑设置该参数为100M,2G 的系统考虑设置为150M,8G 的系统可以考虑设置为200—300M。
对于一个没有充分使用或者没有使用绑定变量系统,这可能给我们带来一个严重的问题。所谓没有使用bind var 的SQL,我们称为Literal SQL。也就是比如这样的两句SQL我们认为是不同的SQL,需要进行2 次硬解析:
select * from EMP where name = ‘TOM’;
select * from EMP where name = ‘JERRY’;
假如把 ’TOM’ 和 ’JERRY’ 换做变量V,那就是使用了bind var,我们可以认为是同样的SQL 从而能很好地共享。共享SQL 本来就是shared_pool_size 这部分内存存在的本意,oracle的目的也在于此,而我们不使用bind var 就是违背了oracle 的初衷,这样将给我们的系统带来严重的问题。当然,如果通过在操作系统监控,没有发现严重的cpu问题,我们如果发现该共享池命中率不高可以适当的增加 shred_pool_size。但是通常我们不主张这部分内存超过800M(特殊情况下可以更大)。
事实上,可能的话我们甚至要想办法避免软分析,这在不同的程序语言中实现方式有差异。我们也可能通过设置session_cached_cursors 参数来获得帮助(这将增大PGA)
关于使用绑定变量的话题,在下面的应用优化中继续讨论。

Data buffer
现在我们来谈数据缓冲区,在确定了SGA 的大小并分配完了前面部分的内存后,其余的,都分配给这部分内存。通常,在允许的情况下,我们都尝试使得这部分内存更大。这部分内存的作用主要是缓存 DB BLOCK,减少甚至避免从磁盘上获取数据,在8i中通常是由db_block_buffers*db_block_size 来决定大小的。如果我们设置了buffer_pool_keep 和buffer_pool_recycle,则应该加上后面这两部分内存的大小。

可以看出,设置SGA时基本上应该掌握的原则是:
  data buffer 一般可以尽可能的大
  shared_pool_size 应该适度
  log buffer 在 1MB 以内就可以了

假定oracle是 32 bit ,服务器RAM大于2G ,注意你的PGA的情况,,则建议
shared_pool_size + data buffer +large_pool_size + java_pool_size < 1.6G

再具体化,如果512M RAM
建议 shared_pool_size = 50M, data buffer = 200M

如果1G RAM
shared_pool_size = 100M , data buffer = 500M

如果2G RAM
shared_pool_size = 150M ,data buffer = 1.2G

物理内存再大已经跟参数没有关系了

假定64 bit ORACLE
内存4G
shared_pool_size = 200M , data buffer = 2.5G

内存8G
shared_pool_size = 300M , data buffer = 5G

内存 12G
shared_pool_size = 300M—–800M , data buffer = 8G

1.3  32bit 与 64bit 对SGA的影响
为什么在上面SGA大小设置的经验规则中要分 32bit Oracle 和 64bit Oracle 呢,是因为这关系到SGA大小的上限问题。在32bit的数据库下,通常oracle只能使用不超过1.7G的内存,即使我们拥有12G的内存,但是我们却只能使用1.7G,这是一个莫大的遗憾。假如我们安装64bit的数据库,我们就可以使用很大的内存,几乎不可能达到上限。但是64bit 的数据库必须安装在64bit 的操作系统上,可惜目前windows上只能安装32bit的数据库,我们通过下面的方式可以查看数据库是 32bit 还是 64bit :
SQL> select * from v$version;
BANNER
—————————————————————-
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
PL/SQL Release 8.1.7.0.0 - Production
CORE 8.1.7.0.0 Production
TNS for 32-bit Windows: Version 8.1.7.0.0 - Production
NLSRTL Version 3.4.1.0.0 – Production

在UNIX平台下的显示有所不同,明显可以看出是 64bit Oracle ,比如在HP-UX平台上:
SQL> select * from v$version;

BANNER
—————————————————————-
Oracle8i Enterprise Edition Release 8.1.7.4.0 - 64bit Production
PL/SQL Release 8.1.7.4.0 - Production
CORE    8.1.7.0.0       Production
TNS for HPUX: Version 8.1.7.4.0 - Production
NLSRTL Version 3.4.1.0.0 – Production

32bit的oracle无论跑在32bit或者64bit的平台都有SGA的限制的,而对于32bit的平台只能跑32bit的oracle,但是在特定的操作系统下,可能提供了一定的手段,使得我们可以使用超过1.7G 的内存,达到2G 以上甚至更多。由于我们现在一般都使用64bit Oracle,因此关于如何在32bit平台上扩展SGA大小的问题不再赘述。


1.4  9i中相关参数的变化
oracle的版本的更新,总是伴随着参数的变化,并且越来越趋向于使得参数的设置更简单,因为复杂的参数设置使得DBA们经常焦头烂额。关于内存这部分的变化,我们可以考察下面的参数。事实上在9i中数据库本身可以给出一组适合当前运行系统的SGA相关部分的参数调整值(参考V$ DB_CACHE_ADVICE、V$SHARED_POOL_ADVICE),关于PGA也有相关视图V$PGA_TARGET_ADVICE 等。

Data buffer
9i 中保留了8i中的参数,如设置了新的参数,则忽略旧的参数。9i中用db_cache_size来取代db_block_buffers , 用db_keep_cache_size 取代buffer_pool_keep, 用db_recycle_cache_size 取代buffer_pool_recycle;这里要注意9i 中设置的是实际的缓存大小而不再是块的数量。另外9i新增加了db_nk_cache_size,这是为了支持在同一个数据库中使用不同的块大小而设置的。对于不同的表空间,可以定义不同的数据块的大小,而缓冲区的定义则依靠该参数的支持。其中n 可以为2、4、6、8、16 等不同的值。在这里顺便提及的一个参数就是db_block_lru_latches,该参数在9i中已经成为了保留参数,不推荐手工设置。

PGA
在9i 里面这部分也有了很大的变化。在独立模式下,9i已经不再主张使用原来的UGA相关的参数设置,而代之以新的参数。假如 workarea_size_policy=AUTO(缺省),则所有的会话的UGA 共用一大块内存,该内存由 pga_aggregate_target 设置。在我们根据前面介绍的方法评估了所有进程可能使用的最大PGA 内存之后,我们可以通过在初始化参数中设置这个参数,从而不再关心其他 ”*_area_size” 参数。

SGA_MAX_SIZE
在9i中若设置了SGA_MAX_SIZE,则在总和小于等于这个值内,可以动态的调整数据缓冲区和共享池的大小
SQL> show parameters sga_max_size
NAME       TYPE             VALUE
—————- ——————– ——- ————-
sga_max_size  unknown         193752940
SQL>
SQL> alter system set db_cache_size = 30000000;
System altered.
SQL> alter system set shared_pool_size = 20480000;
System altered.


1.5  lock_sga = true 的问题
由于几乎所有的操作系统都支持虚拟内存,所以即使我们使用的内存小于物理内存,也不能避免操作系统将SGA 换到虚拟内存(SWAP)。所以我们可以尝试使得SGA 锁定在物理内存中不被换到虚拟内存中,这样减少页面的换入和换出,从而提高性能。但在这里遗憾的是,windows 是无法避免这种情况的。下面我们来参考在不同的几个系统下怎么实现lock_sga
AIX 5L(AIX 4.3.3 以上)
logon aix as root
cd /usr/samples/kernel
./vmtune (信息如下) v_pingshm已经是1
./vmtune -S 1
然后oracle用户修改initSID.ora 中 lock_sga = true
重新启动数据库

HP UNIX
Root身份登陆
Create the file "/etc/privgroup": vi /etc/privgroup
Add line "dba MLOCK" to file
As root, run the command "/etc/setprivgrp -f /etc/privgroup":
$/etc/setprivgrp -f /etc/privgroup
oracle用户修改initSID.ora中lock_sga=true
重新启动数据库

SOLARIS (solaris2.6以上)
8i版本以上数据库默认使用隐藏参数 use_ism = true ,自动锁定SGA于内存中,不用设置lock_sga, 如果设置 lock_sga =true 使用非 root 用户启动数据库将返回错误。

WINDOWS
不能设置lock_sga=true,可以通过设置pre_page_sga=true,使得数据库启动的时候就把所有内存页装载,这样可能起到一定的作用。

 




dennyzhao 发表于 >2005-6-28 11:12:43 保存该日志到本地 [全文] [评论] [引用] [推荐] [档案] [推给好友]

2005-6-27
aix性能监控 [原]

aix的常用监视工具
常用命令 软件包
vmstat,iostat,sar bos.acct
topas,svmon,filemon,fileplace bos.perf.tools
vmtune,schedtune bos.adt.samples
netstat bos.net.tcp.client

vmstat报告CPU与内存信息
如下例所示:
kthr memory page faults cpu 
—– ————– ————————- ———— ———– 
r b avm fre re pi po fr sr cy in sy cs us sy id wa 
2 11 1116402 0 0 19 24 583 1328 0 1514 10956 6379 17 4 45 34 
0 35 1117232 0 0 15 75 1908 4207 0 2675 9350 18901 10 8 0 82 
1 45 1118296 0 0 51 108 1873 3580 0 2298 8699 15324 9 8 0 83 
0 22 1116890 0 0 78 19 830 1577 0 1836 8530 3891 7 6 0 87 
13 29 1117030 0 0 5 26 1304 2737 0 1924 7619 9908 7 7 0 86 
内核线程
r表示内核中运行的线程数,如果其数超过系统的CPU个数,则说明等待进程越多
b表示内核中等待的线程数,由于挂起或IO等待

内存列
pi列表示每秒钟从Paging Space置换到内存的页数。 
po列表示每秒钟从内存置换到Paging Space的页数。 
如果这两列持续大于5,则系统的性能瓶颈很可能是内存不足,而导致交换频繁。
fr列表示每秒钟页面置换算法释放的页数。 
sr列表示每秒钟页面置换算法检查的页数。 

故障列
in 设备中断次数
sy 系统调用次数
cs 内核线程上下文交换,即时间片用完后,再轮到时的上下文计算,如果太高,则要仔细观察

内存信息
avm与free两项分别表示了物理内存的活动页数与可用页数(每页4096bytes),其大小可用其值/256获得MB数。
其中free数如果持续为0或很低则预示内存不足,此时可能会导致大量的页面交换,而在CPU中显示为wa很高,此值的多少也与vmtune中的-f -p设置有关

CPU信息
在以上信息中,关于CPU是的后四列:
id高表示系统空闲,us、sy分别表示用户和系统进程CPU占用,wa表示IO等待时间
如果us与sy之和持续超过90%时,CPU出现了瓶颈。
如果wa长期很高>50,则表示IO太忙,具体看是应用IO多,还是交换分页多,如果是后者,则显示内存不足,
如果是前者,则应关注应用的IO性能状况,优化应用与磁盘设备




sar命令优势
sar可以针对SMP系统来分别查看CPU使用情况
sar -P ALL 3 2
AIX testhost 1 5 0050C33A4C00 06/28/05

17:30:02 cpu %usr %sys %wio %idle
17:30:05 0 38 4 43 15
1 32 3 49 16
2 51 3 44 2
3 53 3 42 2
- 44 3 44 9
17:30:08 0 35 1 46 18
1 18 3 70 9
2 24 2 60 14
3 16 1 81 3
- 23 2 64 11

Average 0 36 2 45 16
1 25 3 59 13
2 38 3 52 8
3 34 2 62 2
- 33 3 54 10
以上显示了一个单CPU系统的显示,

sar也可以查看系统调用情况
sar -c 3 2 
AIX test 1 5 0050C33A4C00 06/28/05

17:31:00 scall/s sread/s swrit/s fork/s exec/s rchar/s wchar/s
17:31:03 5738 484 439 0.00 0.00 952729 1073997
17:31:06 3365 149 266 0.00 0.00 11620 930150

Average 4553 317 352 0.00 0.00 482957 1002193

svmon使用
svmon可以查看内存的详细使用情况,含分页
svmon -G  -i 5 2
               size      inuse       free        pin    virtual
memory      2097136    2096903        233     107570    1622941
pg space    1507328    1400132

               work       pers       clnt      lpage
pin          107324        246          0          0
in use      1236897     860006          0          0
               size      inuse       free        pin    virtual
memory      2097136    2096212        924     107570    1623787
pg space    1507328    1400135

               work       pers       clnt      lpage
pin          107324        246          0          0
in use      1237139     859073          0          0
其中memory行显示了内存总量,使用量,钉入量和虚拟总量
pg space行显示了分面空间的使用量
pin行显示了正在用的钉入量,永久钉入量和客户量
in use显示了总内存的工作页面量,永久页面量,客户端页面量
如想将oracle进行lock_sga设置,可以查看PIN值来确认是否生效
要使pin生效必需vmtune -S 1

svmon -U oracle可以查看oracle用户的用量
svmon -U oracle
===============================================================================
User                                 Inuse      Pin     Pgsp  Virtual  LPageCap
oracle                             1897660     3007  1210399  1459736         N
计算出其大小为         7412M 11M 4728M  5702M
…………………………………………………………………….
SYSTEM segments                      Inuse      Pin     Pgsp  Virtual
                                      3236     2089     1935     4889
                                      13M      8M        8M     
…………………………………………………………………….
EXCLUSIVE segments                   Inuse      Pin     Pgsp  Virtual
                                   1893883      918  1208317  1453304
                                      7398      4M
SHARED segments                      Inuse      Pin     Pgsp  Virtual
                                       541        0      147     1543
                                       2M
在以上表中SYSTEM是所有系统共用段,EXCLUSIVE是此用户专用段,SHARED段是共享段

svmon -C oracletest
可以统计oracletest命令的所有内存使用情况
在其中也分为SYSTEM,EXCLUSIVE,SHARED三段,在其中将会发现SHARED段很大,那是因为其与其它oracle进程共用的结果
在整个输出中,其类型分为
work 表示进程和内存共享段的区域
perm 表示文件,目录,日志,大文件等使用段,其代表了文件操作所用内存的值
clie 表示NFS,CDROM等文件系统使用段

svmon -P
可以查看所有进程的内存使用情况,加上PID可以查看单个进程的内存使用情况
能过此种方式,可以标识所用命令
通过上述命令获得的命令名,再通过svmon -C来查看其专用内存段,进行对比,可以区分出不同命令所用内存多少,对oracle不同进程之间的分析有用

磁盘IO
iostat 可以查看时间段内的CPU状况和磁盘状况
tty:      tin         tout   avg-cpu:  % user    % sys     % idle    % iowait
          0.0         55.3              11.6      2.0       20.4      66.0     

Disks:        % tm_act     Kbps      tps    Kb_read   Kb_wrtn
hdisk0          24.9     153.0      38.3       1236       296
hdisk1          31.3     193.8      48.7       1656       284
dac0             0.0     2969.1     179.1      11564     18164
hdisk2         100.0     2969.1     179.1      11564     18164
cd0              0.0       0.0       0.0          0         0
其中% tm_act是指活动时间,kbps是在统计时间内所有Kb_read与Kb_wrtn之和除以时间的值,即每秒传输的字节数
如果% tm_act常过70%却只有很低的Kbps,系统可能是有比较多的LV碎片或文件碎片,当都高时则系统正常。
tps表示每秒的IO数,不同的磁盘系统其可承受的IO数不同。

sar -d 10 2也可以查看IO情况
12:11:16     device    %busy    avque    r+w/s   blks/s   avwait   avserv

12:11:26     hdisk0     34      1.0       50      201      0.0      0.0
             hdisk1     41      0.0       64      259      0.0      0.0
               dac0      0      0.0      331     4197      0.0      0.0
             hdisk2     99      5.0      331     4197      0.0      0.0
                cd0      0      0.0        0        0      0.0      0.0
其中的%busy对应的% tm_act
avque表示等待IO对列数,其值很高则预示着磁盘有较大瓶颈
r+w/s对应tps,blks/s是按0.5Kbytes/s计算的传输速度
sar -d 最大好处是可以对较长时间的值会有一个总体平均值


vmtune使用
/usr/samples/kernel/vmtune 会得出当前设置数据
vmtune:  current values:
  -p       -P        -r          -R         -f       -F       -N        -W
minperm  maxperm  minpgahead maxpgahead  minfree  maxfree  pd_npages maxrandwrt
 400921  1603684       2          8        120      128      65536        0

  -M      -w      -k      -c        -b         -B           -u        -l    -d
maxpin npswarn npskill numclust numfsbufs hd_pbuf_cnt lvm_bufcnt lrubucket defps
1677709   47104   11776       1     186        224          9      131072     1

        -s              -n         -S         -L          -g           -h
sync_release_ilock  nokilluid  v_pinshm  lgpg_regions  lgpg_size  strict_maxperm
        0               0           0           0            0        0

    -t           -j              -J               -z
maxclient  j2_nPagesPer j2_maxRandomWrite  j2_nRandomCluster
1603684           32            0                  0

    -Z                  -q                    -Q                -y
j2_nBufferPer  j2_minPageReadAhead  j2_maxPageReadAhead   memory_affinity
      512              2                    8                 0

    -V                  -i
num_spec_dataseg  spec_dataseg_int
      0                512

PTA balance threshold percentage = 50.0%

number of valid memory pages = 2097136  maxperm=80.0% of real memory
maximum pinable=80.0% of real memory    minperm=20.0% of real memory
number of file memory pages = 847042    numperm=42.2% of real memory
number of compressed memory pages = 0   compressed=0.0% of real memory
number of client memory pages = 0       numclient=0.0% of real memory
# of remote pgs sched-pageout = 0       maxclient=80.0% of real memory

其中的minfree限制了当系统的分页数少于此值时就要交换出此页数,并在达到maxfree时停止
其中maxfree必须>minfree+maxpgahead
./vmtune -F maxfree_pages -f minfree_pages 用于进行以上设置

minperm,maxperm对文件分页的控制
MINPERM与MAXPERM的意义
当内存中的文件缓存页在MINPERM以下时,内存页交换算法同时交换文件缓存页和程序页(computational pages) 
当内存中的文件缓存页在MAXPERM以上时,内存页交换算法只交换文件缓存页。 
当内存中的文件缓存页在MINPERM和MAXPERM之间时,内存页交换算法通常只交换文件缓存页,但如果文件缓存页的交换率大于程序页时,程序页也同样被交换。 
MINPERM和MAXPERM参数的缺省值为20%与80%
即vmtune -p 20 -P 80
可以用以下命令将MINPERM设为5%的内存页,而MAXPERM设为20%的内存页。
# vmtune -p 5 -P 20
在vmtune的输出中,有一个numperm的值,其对我们调整很有参考意义

在Oracle数据库应用的环境下,可以将MINPERM和MAXPERM分别设为5%和20%甚至更小,从而使内存更多地被用于Oracle的SGA而不是系统的文件缓存。
但此时也要考虑系统的dbrw量的多少,用lock_sga方法可以更好的控制sga的是否交换(在lock_sga前,应该先vmtune -S 1 启用pinshm以支持应用的内存pin)
2005年06月24日

从metalink上找到的,看看有没有用:
  
fact: Oracle Forms Developer 9.0.2
fact: Oracle Forms 9i Builder
symptom: Running forms fails
symptom: FRM-10142: The HTTP Listener is not running on <host> at  
port 8888
symptom: Please start the listener or check your runtime preferences
cause: Unlike Forms 6i, Forms 9i does not support client-server. A fmb run  
from the Forms Builder is a ‘web deployed form.’  
  
To do this Forms 9i Builder needs to integrate with some form of HTTP Listener.  
This is provided by another component of the Oracle 9iDS Rel 2 install – the  
OC4J (Oracle Container For J2EE). If there is no HTTP Listener started FRM-
10142 occurs  
  
Once an OC4J instance has been started it acts as lightweight HTTP Listener  
enabling the developer to test the forms / reports application modules in a  
true web (even if only intranet) architecture.
  
fix:
  
1. Start the OC4J instance:  
-> In the Start menu click,
Start\Programs\Oracle 9i Developer Suite\Reports Developer\Start OC4J Instance.
OR
-> Find and run the startinst.bat file in your Dev 9i home.  
It is usually in  
Dev9i home\j2ee\Oracle9iDS\
  
On MS Windows an MS DOS dialogue should appear indicating that an OC4J instance  
has been started, simply minimize this DOS window to the taskbar
  
2. Then try running the form again from Forms Builder
  
3. Having finished with Forms Builder, to stop the OC4J instance:
- use the Stop OC4J Instance shortcut, located in same place as the Start  
shortcut
or shut the DOS window)


a problem met in Oracle9i Developer Suite

当我按ctrl+r运行表单时,出现如图错误提示。
是什么原因照成的?我该怎么解决?
  
/bow 本贴包含图片附件:

 



a problem met in Oracle9i Developer Suite

当我按ctrl+r运行表单时,出现如图错误提示。
是什么原因照成的?我该怎么解决?
  
/bow 本贴包含图片附件:

 


2005年05月08日

篇文章主要是示范如何在一台新装的RedHatLinux AS3上用配置sendmail-8.12.10-1服务,构架你的e-mail服务器.
1.sendmail的安装
若用户在RedHatLinux AS3默认安装时已经安装了sendmail 8.12服务.可忽略安装过程,相关资料请查阅redhat CD里的文档. 若没有安装,安装sendmail服务,操作如下:
//查看是否安装了sendmail
#rpm –qa|grep sendmail
//将RedHatLinux AS3的第一张安装光盘放入光驱后挂载
#cd /mnt/cdrom
//进入光盘的RedHat/RPMS目录
#cd/mnt/cdrom/RedHat/RPMS
//安装所需的软件包
#rpm –ivh sendmail-8.12.10-1.i386.rpm
//将RedHat Linux9的第3张安装光盘放入光驱后挂载
#cd /mnt/cdrom
//进入光盘的RedHat/RPMS目录
#cd/mnt/cdrom/RedHat/RPMS
//安装所需的软件包
#rpm –ivh sendmail-cf-8.12.10-1.i386.rpm
#rpm –ivh sendmail-doc-8.12.10-1.i386.rpm
//弹出光盘
#cd;eject

2.检验DNS SERVER的正反向解析是否成功
要使你的新e-mail服务器正常工作,必须先解决DNS问题.把你的e-mail服务器的主机名和ip地址加入到DNS中,并用nslookup来确认:
[root@AS3 / ]#  nslookup -sil mail.supermaster.com
Server:         192.168.0.111
Address:        192.168.0.111#53
Name:   www.supermaster.com
Address: 192.168.0.111
同样你也要试一下反向域名解析,这个对防止邮件延迟有很重要的作用.现在大部分的邮件服务器都是把反向域名解析作为邮件传送时
认证的一部分.所以用的你ip地址来试一下反向域名解析是否正确.
[root@AS3 / ]# nslookup -sil 192.168.0.111
Server:         192.168.0.111
Address:        192.168.0.111#53
111.0.168.192.in-addr.arpa      name = www.supermaster.com.
111.0.168.192.in-addr.arpa      name = mail.supermaster.com.
111.0.168.192.in-addr.arpa      name = ftp.supermaster.com.
111.0.168.192.in-addr.arpa      name = ssL.supermaster.com.
3.配置sendmail服务
>>1.监听本机的smtp端口
RedHatLinux AS3 默认安装已经可以使SMTP服务在本机运行.
你用netstat -nl可以看到所有后台程序监听的端口,注意这一行:127.0.0.1:25,这个表示sendmail服务已经在监听本机的25(SMTP)
端口了:
[root@AS3 / ]# netstat -nl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State   
tcp        0      0 0.0.0.0:32768           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:32769         0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:2049            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:32770           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:931             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:139             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:6000            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:913             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN     
tcp        0      0 192.168.0.111:53        0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN     
udp        0      0 0.0.0.0:32768           0.0.0.0:*                          
udp        0      0 0.0.0.0:2049            0.0.0.0:*                          
udp        0      0 0.0.0.0:32769           0.0.0.0:*                          
udp        0      0 0.0.0.0:32770           0.0.0.0:*                          
udp        0      0 192.168.0.111:137       0.0.0.0:*                          
udp        0      0 0.0.0.0:137             0.0.0.0:*                          
udp        0      0 192.168.0.111:138       0.0.0.0:*                          
udp        0      0 0.0.0.0:138             0.0.0.0:*                          
udp        0      0 0.0.0.0:910             0.0.0.0:*                          
udp        0      0 0.0.0.0:928             0.0.0.0:*                          
udp        0      0 192.168.0.111:53        0.0.0.0:*                          
udp        0      0 127.0.0.1:53            0.0.0.0:*                          
udp        0      0 0.0.0.0:710             0.0.0.0:*                          
udp        0      0 0.0.0.0:111             0.0.0.0:*                          
udp        0      0 0.0.0.0:631             0.0.0.0:*                          
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     2456   /dev/gpmctl
unix  2      [ ACC ]     STREAM     LISTENING     2634   /tmp/.gdm_socket
unix  2      [ ACC ]     STREAM     LISTENING     2496   /tmp/.font-unix/fs7100
unix  2      [ ACC ]     STREAM     LISTENING     2644   /tmp/.X11-unix/X0
 
但这个仅仅表示e-mail服务器只接收你本机的邮件.为了解决这个问题,你必须修改配置,告诉sendmail去监听你对外的网卡地址.
>>2.解决对外smtp端口的监听
假设你的服务器上安装了一块网卡(eth0),并用ifconfig配置好你的ip地址.这个地址可以和DNS解, , 析的地址不一样,但你要保证DNS可以正确 地解析邮件服务器的地址.这里我们使用的地址是一样的(推荐):
[root@AS3 / ]# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0C:29:65:C8:DC 
          inet addr:192.168.0.111  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:661 errors:0 dropped:0 overruns:0 frame:0
          TX packets:399 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:68152 (66.5 Kb)  TX bytes:50136 (48.9 Kb)
          Interrupt:10 Base address:0×1400
可以看到这台主机的eth0的ip地址是192.168.0.111.现在修改/etc/mail/sendmail.cf文件来配置sendmail的监听端口:
# SMTP daemon options
O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA
更改为
O DaemonPortOptions=Port=smtp,Addr=192.168.0.111, Name=MTA
改完后保存退出,并且重新启动sendmail服务:
[root@AS3 / ]# service sendmail restart
Shutting down sendmail:                                    [  OK  ]
Shutting down sm-client:                                   [  OK  ]
Starting sendmail:                                         [  OK  ]
Starting sm-client:                                        [  OK  ]
[root@mail /root]#
现在可以用netstat -nl来查看是不是已经更改了.如你所看到的,sendmail的监听端口现在是eth0的ip地址:192.168.0.111了.
[root@AS3 / ]# netstat -nl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State    
tcp        0      0 0.0.0.0:32768           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:32769         0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:2049            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:32770           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:931             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:139             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:6000            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:913             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN     
tcp        0      0 192.168.0.111:53        0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 192.168.0.111:25        0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN     
udp        0      0 0.0.0.0:32768           0.0.0.0:*                          
udp        0      0 0.0.0.0:2049            0.0.0.0:*                          
udp        0      0 0.0.0.0:32769           0.0.0.0:*                          
udp        0      0 0.0.0.0:32770           0.0.0.0:*                          
udp        0      0 192.168.0.111:137       0.0.0.0:*                          
udp        0      0 0.0.0.0:137             0.0.0.0:*                          
udp        0      0 192.168.0.111:138       0.0.0.0:*                          
udp        0      0 0.0.0.0:138             0.0.0.0:*                          
udp        0      0 0.0.0.0:910             0.0.0.0:*                          
udp        0      0 0.0.0.0:928             0.0.0.0:*                          
udp        0      0 192.168.0.111:53        0.0.0.0:*                          
udp        0      0 127.0.0.1:53            0.0.0.0:*                          
udp        0      0 0.0.0.0:710             0.0.0.0:*                          
udp        0      0 0.0.0.0:111             0.0.0.0:*                          
udp        0      0 0.0.0.0:631             0.0.0.0:*                          
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     2456   /dev/gpmctl
unix  2      [ ACC ]     STREAM     LISTENING     2634   /tmp/.gdm_socket
unix  2      [ ACC ]     STREAM     LISTENING     2496   /tmp/.font-unix/fs7100
unix  2      [ ACC ]     STREAM     LISTENING     2644   /tmp/.X11-unix/X0

>>3.设置允许接受的域名
现在sendmail已经可以接收来自外部的连接了.我们还需要设定sendmail允许接收的域名.这个可以在/etc/mail/local-host-names
文件中设定.就把域名输入进去就可以了:
# local-host-names – include all aliases for your machine here.
supermaster.com //add
保存退出后重新启动sendmail服务:/etc/init.d/sendmail restart .这样sendmail就可以接收来自多个域的信件了. 如果你需要再增加新的域,只有修改这个文件就可以了.
>>4.client 端的设置
现在的e-mail服务器在本机上已经可以完全正常的工作.它已经可以接收来自任何地方的信件(允许的域),但如果想要发送和传递邮 件,则必须在这台电脑上执行.如果你的用户都直接登录到你的服务器上来发送邮件,则不需要更改任何配置,如果你希望大部分或者所有的用户可以在远程主机上使用该e-mail服务器,例如利用KMail和Outlook Express及Mozilla Mail等客户端工具,则你必须更改配置来允许这些主机使
用你的e-mail服务器.你需要在/etc/mail/access文件中加入下面一行,保存后运行make access.db 的命令来生成access.db文件.
supermaster.com RELAY
改完后的access文件应该是这样的:
# Check the /usr/share/doc/sendmail/README.cf file for a description
# of the format of this file. (search for access_db in that file)
# The /usr/share/doc/sendmail/README.cf is part of the sendmail-doc
# package.
#
# by default we allow relaying from localhost…
localhost.localdomain           RELAY
localhost                       RELAY
127.0.0.1                       RELAY
supermaster.com                 RELAY //add
然后运行:
[root@AS3 mail ]# make access.db
[root@AS3 mail ]#
这个make access.db命令把你的新的设定添加到sendmail的hash数据库里.sendmail用它来判断允许那些主机通过你的e-mail服务器来传递邮件.而且这样还可以通过设定子网(例如:192.168)来限制该域.但你要注意,这样设定就对外开放了,可能会有人发大量的垃圾 信件来攻击你的系统.
现在你可以收到所有来自外部的邮件.并且允许信赖的客户在远程传递信件.接下去你想要做的可能是如何在远程收取这些信件.要达到这个目的,你需要安装IMAP 或者 POP. RedHatLinux AS3默认安装的时候并没有安装POP/IMAP,所以你需要安装imap-2002d-2包. 要查看这个包的安装状态,可以用下面的命令:rpm -aq | grep -i imap.如果发现没有安装,那就把RedHatLinux AS3第二张安装光盘 放到光驱里.然后运行如下命令:
[root@AS3 mail ]# mount /dev/cdrom /mnt/cdrom
mount: block device /dev/cdrom is write-protected, mounting read-only
(Successful Mount of Read-Only Media)
mount上光盘后运行这个命令来安装这个包:rpm -Uvh /mnt/cdrom/RedHat/RPMS/ imap-2002d-2.i386.rpm.
[root@AS3 mail ]# rpm -Uvh /mnt/cdrom/RedHat/RPMS/ imap-2002d-2.i386.rpm
Preparing… ########################################### [100%]
1:imap ########################################### [100%]
再运行一次 rpm -aq | grep -i imap
IMAP 包就罗列出来了.
[root@AS3 mail ]# rpm -aq | grep -i imap
imap-2002d-2
[root@AS3 mail ]#
>>5.ipop3的设置
当正确的包被安装后你要打开POP3的连接端口,这需要修改/etc/xinetd.d/下面的ipop3文件,把disable的值改成yes.这个文件
大致是这样的:
# default: off
# description: The POP3 service allows remote users to access their mail
#              using an POP3 client such as Netscape Communicator, mutt,
#              or fetchmail.
service pop3
{
        disable = no //change
        socket_type             = stream
        wait                    = no
        user                    = root
        server                  = /usr/sbin/ipop3d
        log_on_success  += HOST DURATION
        log_on_failure  += HOST
}
接下去重新启动xinetd来是它生效:
[root@AS3 xinetd.d]# service xinetd restart
Stopping xinetd: [ OK ]
Starting xinetd: [ OK ]
[root@AS3 xinetd.d]#
建议将ipop3 设置成自动启动,操作如下:
#redhat-config-services或setup或ntsysv
OK,至此sendmail的配置完成,发送一封测试邮件到你的e-mail服务器,并且用你熟悉的收信工具来收取这封信.
4.sendmail的性能优化
或许你会收到这样的抱怨,说是当客户端程序运行在防火墙后面的话会发生连接pop端口速度变慢. 造成这个延时的原因是你的e-mail服务器初始一个IDENT会话来确认客户端的身份.如果这个询问没有反应,那服务器就会在5秒后发出一个超时信号.这个值可以降低到1秒,从而减少IDENT产生影响.修改/etc/mail/sendmail.cf文件,把timeout的值改成你想要的值.
# timeouts (many of these)
#O Timeout.ident=5s
change to
O Timeout.ident=1s
现在你的e-mail服务器可以给你的用户提供服务了.当然还有更多的配置可以用来提高服务器性能,在这篇文章中就不多提了. Linux将会为你的e-mail服务提供一个稳定的,高效的平台.如果想了解更多的关于sendmail的知识,请访问www.sendmail.org.
注:笔者建议大家在第一测试sendmail时,把fireware 服务关闭

Oracle数据库的初始化参数,主要来源于两个Oracle内部数据字典表:X$KSPPCV,X$KSPPI
通常我们查询的v$parameter视图就来源于这两个表,只不过隐去了部分参数。

通过以下脚本可以查询获得这些被隐含的参数

set linesize 132
column name format a30
column value format a25
select
  x.ksppinm  name,
  y.ksppstvl  value,
  y.ksppstdf  isdefault,
  decode(bitand(y.ksppstvf,7),1,’MODIFIED’,4,’SYSTEM_MOD’,'FALSE’)  ismod,
  decode(bitand(y.ksppstvf,2),2,’TRUE’,'FALSE’)  isadj
from
  sys.x$ksppi x,
  sys.x$ksppcv y
where
  x.inst_id = userenv(‘Instance’) and
  y.inst_id = userenv(‘Instance’) and
  x.indx = y.indx and
  x.ksppinm like ‘%_&par%’
order by
  translate(x.ksppinm, ‘ _’, ‘ ‘)
/

如何在SQL*PLUS中使用Autotrace?

如何在SQL*PLUS中使用Autotrace?

sqlplus system or sys as sysdba
SQL> @?/rdbms/admin/utlxplan.sql
SQL> create public synonym plan_table for plan_table;
SQL> grant all on plan_table to public;
SQL> conn / as sysdba
SQL> @?/sqlplus/admin/plustrce.sql
SQL> grant plustrace to public;

SET AUTOTRACE OFF | ON EXPLAIN | ON STATISTICS | ON | TRACEONLY | TRACE EXPLAIN
SET AUTOTRACE OFF —————- 不生成AUTOTRACE 报告,这是缺省模式
SET AUTOTRACE ON EXPLAIN —— AUTOTRACE只显示优化器执行路径报告
SET AUTOTRACE ON STATISTICS — 只显示执行统计信息
SET AUTOTRACE ON —————– 包含执行计划和统计信息
SET AUTOTRACE TRACEONLY —— 同set autotrace on,但是不显示查询输出
下面看個例子吧(注意普通user中不能查看含有系統表或視圖的執行計划)

Microsoft Windows 2000 [版本 5.00.2195]
(C) Copyright 1985-2000 Microsoft Corp.

C:>sqlplus /nolog

SQL*Plus: Release 9.2.0.1.0 – Production on 星期五 4月 8 08:33:22 2005

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

SQL> conn / as sysdba
已連線.
SQL> set autot on;
SP2-0613: 無法驗證 PLAN_TABLE 格式或實體
SP2-0611: 啟動 EXPLAIN 報表時發生錯誤
SQL> conn system/password
已連線.
SQL> @?/rdbms/admin/utlxplan.sql

已建立表格.

SQL> create public synonym plan_table for plan_table;

已建立同義字.

SQL> grant all on plan_table to public;

順利授權.

SQL> conn / as sysdba
已連線.
SQL> @?/sqlplus/admin/plustrce.sql
SQL>
SQL> drop role plustrace;
drop role plustrace
          *
 ERROR 在行 1:
ORA-01919: 角色 ‘PLUSTRACE’ 不存在


SQL> create role plustrace;

已建立角色.

SQL>
SQL> grant select on v_$sesstat to plustrace;

順利授權.

SQL> grant select on v_$statname to plustrace;

順利授權.

SQL> grant select on v_$session to plustrace;

順利授權.

SQL> grant plustrace to dba with admin option;

順利授權.

SQL>
SQL> set echo off
SQL> grant plustrace to public;

順利授權.

SQL> set autot on
SQL> set autot off
SQL> conn / as sysdba
已連線.
SQL> set autot traceonly
SQL> select table_name from user_tables;

已選取 324 個資料列.


執行計畫
———————————————————-
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   NESTED LOOPS
   2    1     NESTED LOOPS (OUTER)
   3    2       NESTED LOOPS (OUTER)
   4    3         NESTED LOOPS (OUTER)
   5    4           NESTED LOOPS (OUTER)
   6    5             NESTED LOOPS
   7    6               TABLE ACCESS (BY INDEX ROWID) OF ‘OBJ$’
   8    7                 INDEX (RANGE SCAN) OF ‘I_OBJ2′ (UNIQUE)
   9    6               TABLE ACCESS (CLUSTER) OF ‘TAB$’
  10    9                 INDEX (UNIQUE SCAN) OF ‘I_OBJ#’ (NON-UNIQUE)
  11    5             TABLE ACCESS (BY INDEX ROWID) OF ‘OBJ$’
  12   11               INDEX (UNIQUE SCAN) OF ‘I_OBJ1′ (UNIQUE)
  13    4           INDEX (UNIQUE SCAN) OF ‘I_OBJ1′ (UNIQUE)
  14    3         TABLE ACCESS (CLUSTER) OF ‘USER$’
  15   14           INDEX (UNIQUE SCAN) OF ‘I_USER#’ (NON-UNIQUE)
  16    2       TABLE ACCESS (CLUSTER) OF ‘SEG$’
  17   16         INDEX (UNIQUE SCAN) OF ‘I_FILE#_BLOCK#’ (NON-UNIQUE)
  18    1     TABLE ACCESS (CLUSTER) OF ‘TS$’
  19   18       INDEX (UNIQUE SCAN) OF ‘I_TS#’ (NON-UNIQUE)

統計值
———————————————————-
          0  recursive calls
          0  db block gets
          0  consistent gets
          0  physical reads
          0  redo size
          0  bytes sent via SQL*Net to client
          0  bytes received via SQL*Net from client
          0  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
        324  rows processed

SQL> select * from scott.emp;

已選取 14 個資料列.


執行計畫
———————————————————-
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (FULL) OF ‘EMP’

 


統計值
———————————————————-
          0  recursive calls
          0  db block gets
          0  consistent gets
          0  physical reads
          0  redo size
          0  bytes sent via SQL*Net to client
          0  bytes received via SQL*Net from client
          0  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         14  rows processed

SQL>

SQL> conn scott/tiger
已連線.
SQL> set autot traceonly
SQL> select table_name from user_tables;


執行計畫
———————————————————-
ERROR:
ORA-01039: 權限不足, 無法存取構成視觀表的基底物件


SP2-0612: 產生 AUTOTRACE EXPLAIN 報表時發生錯誤

統計值
———————————————————-
          7  recursive calls
          0  db block gets
         20  consistent gets
          0  physical reads
          0  redo size
        574  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          5  rows processed

SQL> select *from emp;

已選取 14 個資料列.


執行計畫
———————————————————-
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (FULL) OF ‘EMP’

統計值
———————————————————-
        193  recursive calls
          0  db block gets
         27  consistent gets
          4  physical reads
          0  redo size
       1306  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
         14  rows processed

SQL>

oracle 9i database 在win2k server上搬家!
发表人:vongates | 发表时间: 2005年一月26日, 16:14
oracle 9i database 在win2k server上搬家!最快速的主機切換。但是前題是你可以停機喲。在實驗時比較有用。。生產庫就不太可能了。。


說明:
因硬件更換需移動oracle dbatabase! 
OS:win2k server +sp4
oracle: oracle 9201 for windows
需在停線1ˉ2個小時內搞定(40G的數據)
以下 A:原機
   B: 新機

方案准備:
1。做cold backup 硬copy.
2. 做exp imp

操作步驟:
1.B機裝好OS(電腦名稱,ip不可以變同A機)不連網絡
2.B機裝好oracle (按A機上的路徑,sid等)
3.停B機上的所有和oracle相關的service并改為手動啟動
4.改B機的電腦名稱(因為和A機相同)需連上網絡准備copy datafile
5.停A機上的所有oracle service
5.1做full exp
6.把B機重啟連上網絡從A機上copy 所有的datafile(data file,control file,redo file,archive logfile,spfile,pwdfile )
7.關閉A機,改B機電腦名稱與A機同,也記得ip也要改相同喲!
8.在B機上改oradata的目錄為從A機上copy過來的!同是替換pwd file,和spfile(它們是放在ORACLE_HOMEDATABASE下的)
9.把B機上相關的oarcle service改為自動啟動.
10.重啟B機成功完成方案<1>

2005年02月22日

整理:Fenng
日期:06-Apr-2004  
出处:http://www.dbanotes.net
版本:1.01


不久前,Oracle(甲骨文)公司在美国加州的总部宣布, Oracle 10g 数据库 与 Oracle RAC 在 TPC-H 基准测试中创造了新的世界纪录.这是个令人震惊的消息.因为这个测试是在 Linux ( Red Hat Enterprise Linux Advanced Server 3) 的平台上进行的. 这充分显示了 Oracle 在低成本 Linux 集群服务器上高效管理大规模数据仓库的能力, 也表明 Linux 在性能价格比上显而易见的优势,标志着Linux在大规模企业应用上已经成熟.

相信很多朋友已经对10g跃跃欲试了,现在从这里让我们开始10g之旅.

本文描述了在Red Hat Enterprise Linux Advanced Server 3 (RHEL 3)上安装Oracle 10g 必要的步骤和相关知识. 本文假定你的Linux 操作系统已经安装完毕,并且您应该具有一定的 Unix 操作系统背景知识.

配置RedHat AS 3


操作系统版本:

Red Hat Enterprise Linux AS release 3 (Taroon)
Kernel 2.4.21-4.EL on an i686

按照常规来安装操作系统,记得要安装开发工具(gcc等必要工具).

必要的硬件信息检查



检查内容 最小值 检查命令参考
物理内存 512M # grep MemTotal /proc/meminfo
交换空间 1.0 GB或者2倍内存大小 # grep SwapTotal /proc/meminfo
/tmp 空间 400 MB # df -k /tmp
软件所需空间 2.5 GB # df -k (空间越大越好,如果是正式系统,应该进行详尽的规划)
数据库文件 1.2 GB # df -k (空间越大越好,如果是正式系统,应该进行详尽的规划)

检查完如上各项之后, 应该修改核心参数.执行如下命令:

#vi /etc/sysctl.conf

#注释:
#表示使用root用户操作,$表示使用oracle 用户进行操作.提示符后面的蓝色部分表示需要输入的命令,以下同.

在该文件末尾加入如下内容:

kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000

编辑完之后,保存,执行 # /sbin/sysctl -p 命令操作来使我们所做的变更生效.

注:上面kernel.shmmax/kernel.sem等是典型的核心参数配置.您可能需要根据您的实际环境进行适当的变动.

关于这些核心参数的说明在Oracle的 Oracle9i Installation Guide Release 2 (9.2.0.1.0) for UNIX Systems 中有很详细的说明.( http://download-west.oracle.com/docs/html/A96167_01/toc.htm )

然后,应该检查一下上面的操作是否正确:

# /sbin/sysctl -a | grep sem
# /sbin/sysctl -a | grep shm
# /sbin/sysctl -a | grep file-max
# /sbin/sysctl -a | grep ip_local_port_range

为Oracle用户设定Shell的限制

一般来说,出于性能上的考虑,还需要需要进行如下的设定,以便改进Oracle用户的有关 nofile(可打开的文件描述符的最大数)和nproc(单个用户可用的最大进程数量)

# vi /etc/security/limits.conf
# 添加如下的行

*               soft    nproc   2047
*               hard    nproc   16384
*               soft    nofile  1024
*               hard    nofile  65536

添加如下的行到/etc/pam.d/login 文件:

session    required     /lib/security/pam_limits.so

编辑 /etc/profile 文件,添加如下部分:

if [ $USER = "oracle" ]; then
	if [ $SHELL = "/bin/ksh" ]; then
		ulimit -p 16384
		ulimit -n 65536
	else
		ulimit -u 16384 -n 65536
	fi
fi

之后,执行$ unlimit 验证一下.

检查并安装相关补丁

在这个版本的RHEL上安装Oracle,必须要有几个软件包. 确认以下 rpm包都已经安装:

make-3.79
binutils-2.11
openmotif-2.2.2-16
setarch-1.3-1
compat-db-4.0.14.5
compat-gcc-7.3-2.96.122
compat-gcc-c++-7.3-2.96.122
compat-libstdc++-7.3-2.96.122
compat-libstdc++-devel-7.3-2.96.122

# rpm -qa | grep compat
# 在我的机器上输出如下:

compat-gcc-c++-7.3-2.96.122
compat-libstdc++-7.3-2.96.122
compat-libstdc++-devel-7.3-2.96.122
compat-glibc-7.x-2.2.4.32.5
compat-db-4.0.14-5
compat-gcc-7.3-2.96.122

# rpm -qa | grep openmotif
openmotif-devel-2.2.2-16
openmotif-2.2.2-16

# rpm -qa | grep setarch
setarch-1.3-1

上面显示的内容是在笔者已经安装了具体的RPM包之后的结果.一般情况下,你的系统上的输出结果和这个不同.如果个别包没有安装,把系统安装光盘mount上,找到具体的软件包(大多数在第三张光盘上),然后利用如下的命令来安装相应的包:

# rpm -ivh compat.....rpm

要额外注意的是,这些软件包之间是有依赖性的,先后的顺序要找好.否则会报告不能安装的错误. 此外,最好验证一下 gcc和glibc的版本(要求是gcc-3.2.3-2 或者更高):

#gcc -v
#rpm -q glibc



创建用户和相关的组

# /usr/sbin/groupadd oinstall
# /usr/sbin/groupadd dba
# /usr/sbin/useradd -g oinstall -G dba oracle 

如果只是测试目的的话,不创建oinstall组也没什么. 不过还是规范一点比较好.如果oracle 用户和dba组等已经存在,作适当的调整即可.

检查并调整环境变量

登录为oracle用户

# su - oracle
$ cd
$ vi .bash_profile

#添加如下内容,你的具体值应该不会和这个完全相同.

export ORACLE_BASE=/u/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.1.0/db_1
export ORACLE_SID=TEST
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
export LC_CTYPE=en_US.UTF-8

然后执行

$ source .bash_profile

使环境变量生效. /u/app/oracle 等目录应该建立好并做合适的授权.

开始安装10g

mount你的安装盘.(我一般都是把文件拷贝到系统中一个具体的位置,比如/u/install ) .执行:

$ sh /u/install/runInstaller

如果不能出现安装画面,查看本文后面的FAQ。

非常值得称道的是,10g的安装相比以前的多了一个 Checking operating system certification 的步骤。特别实用。安装文件会自动检测所需的条件。如果有不符合的地方,安装程序会报告给你.并会给出具体原因。大大减少了出错的可能. 下面是检查成功输出的内容 :

Checking operating system certification
Expected result: One of redhat-2.1,redhat-3,UnitedLinux-1.0
Actual Result: redhat-3
Check complete. The overall result of this check is: Passed
======================================================================= 

Checking kernel parameters
Checking for VERSION=2.4.9.25; found VERSION=2.4.21. Passed
Checking for shmall=2097152; found shmall=2097152. Passed
Checking for shmseg=10; found shmseg=4096. Passed
Checking for semmsl=250; found semmsl=250. Passed
Checking for semmni=128; found semmni=128. Passed
Checking for filemax=65536; found filemax=65536. Passed
Checking for shmmni=4096; found shmmni=4096. Passed
Checking for semmns=32000; found semmns=32000. Passed
Checking for semopm=100; found semopm=100.Passed
Checking for shmmin=1; found shmmin=1. Passed
Checking for shmmax=2147483648; found shmmax=2147483648. Passed
Check complete. The overall result of this check is: Passed
======================================================================= 

Checking recommended operating system packages
Checking for make-3.79; found make-3.79.1-17. Passed
Checking for binutils-2.11.90.0.8-12; found binutils-2.14.90.0.4-26. Passed
Checking for gcc-2.96; found gcc-3.2.3-20. Passed
Checking for openmotif-2.1.30-11; found openmotif-2.2.2-16. Passed
Check complete. The overall result of this check is: Passed
======================================================================= 

Checking recommended glibc version
Expected result: 2.2.4.31.7
Actual Result: 2.3.2.95.3
Check complete. The overall result of this check is: Passed
======================================================================= 

Validating ORACLE_BASE location (if set)
Check complete. The overall result of this check is: Passed
=======================================================================

其他的步骤比较清晰,不再赘述.

最后系统会提示你运行root.sh文件.按照提示做即可.

FAQ (在Linux平台安装Oracle比较常见的问题)

1. 不能启动安装界面

运行runInstaller提示信息类似如下:

xlib:connection to "localhost:0.0" refused by server
xlib:client is not authorized to connect to server 

Exception in thread "main" java.lang.InternalError:
can't connect to x11 window server using "localhost:0.0" at .......

解决办法: 设定你的DISPLAY环境参数.

# export DISPLAY= your_IPaddress :0.0

把your_IPaddress换成你的IP.或者用root简单的执行一下# xhost + (要注意这样会有安全上的隐患)

2.安装界面显示很多”口口”样子的乱码

解决办法:查看locale输出

# locale
LANG=en_US.UTF-8
LC_CTYPE=zh_CN.GB18030
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

执行#export LC_CTYPE=en_US.UTF-8 然后重新调用安装程序.

3. 用IE登录Linux服务器上的em出现乱码


在Linux(Unix) 环境下成功安装了Oracle 10g,从windows下用IE浏览器登录 10g 的em, 按钮是”口口”这样的方框.

解决办法: 参考:

http://www.dbanotes.net/Oracle/Oracle-10g-font.properties.htm 



4.创建数据库的时候出现ORA-03113的错误

解决办法: 查看核心参数是否调整正确.参考:

http://www.dbanotes.net/Oracle/ORA-03113.htm

5. RedHat 9 / FC1等系统10g不支持如何安装?


解决办法:在10g不支持的Linux发行版上安装10g的解决方法

1). 运行runInstaller -ignoreSysPrereqs,这样会跳过检查.
2). 摘自 www.puschitz.com 修改/etc/redhat-release文件:

#su - root
#cp /etc/redhat-release /etc/redhat-release.backup
#cat > /etc/redhat-release <<   EOF
Red Hat Enterprise Linux AS release 3 (Taroon)
EOF

安装完毕,执行如下操作:

#su - root
#cp /etc/redhat-release.backup /etc/redhat-release

3). http://www.dbanotes.net/Oracle/10G-Beta-Install-Bug.htm

同样的思路,我们可以修改Oracle 的install/oraparam.ini文件达到目的.

6.如何关掉那些 ocssd.bin 进程?

解决办法:编辑/etc/inittab文件(做好备份)

注释掉这一行:

h1:3:respawn:/etc/init.d/init.cssd run >/dev/null 2>................

参考信息

Werner Puschitz 的 10g 安装指南 – http://www.puschitz.com/InstallingOracle10g.shtml
Werner Puschitz 的站点的文章很翔实,如果您遇到了本文没有说清的问题,可以去看看那里.本文借鉴了该站点不少内容.

http://www.google.com – http://www.google.com
关于核心参数等信息一定要用Google查找.

Oracle Database Quick Installation Guide 10g Release 1 (10.1) for Linux x86
http://download-west.oracle.com/docs/html/B10813_01/toc.htm

Oracle Database Installation Guide 10g Release 1 (10.1) for UNIX Systems http://download-west.oracle.com/docs/html/B10811_02/toc.htm

DBAnotes.net 我的站点 包括不少和Oracle有关的信息 - http://www.dbanotes.net



2005年02月17日

情况描述:

所有控制文件损坏,掉电(shutdown abort),无归档,无备份的成功恢复。

一个例子希望给大家以帮助。

注意:创建控制文件的时候,正常的话使用红色部分的reuse and noresetlogs,这样就不用 
   手工apply日志而是直接就可以自动恢复了。

 

连接到:

Oracle8i Enterprise Edition Release 8.1.7.0.0 – Production

With the Partitioning option

JServer Release 8.1.7.0.0 – Production

 

SQL> drop table rn;

 

表已丢弃。

 

SQL> alter system checkpoint;

 

系统已更改。

 

SQL> drop table test_group;

 

表已丢弃。

 

SQL> conn / as sysdba

已连接。

SQL> shutdown abort

Oracle 例程已经关闭。

SQL> startup nomount

Oracle 例程已经启动。

 

Total System Global Area 31229980 bytes

Fixed Size 75804 bytes

Variable Size 14299136 bytes

Database Buffers 16777216 bytes

Redo Buffers 77824 bytes

SQL> CREATE CONTROLFILE SET/reuse DATABASE “billy” RESETLOGS/NOresetlogs NOARCHIVELOG

2 MAXLOGFILES 64

3 MAXLOGMEMBERS 2

4 MAXDATAFILES 254

5 MAXINSTANCES 32

6 MAXLOGHISTORY 113

7 LOGFILE

8 GROUP 1 ‘E:\Oracle\ORADATA\BILLY\REDO01.LOG’ SIZE 1048576 ,

9 GROUP 2 ‘E:\Oracle\ORADATA\BILLY\REDO02.LOG’ SIZE 1048576 ,

10 GROUP 3 ‘E:\Oracle\ORADATA\BILLY\REDO03.LOG’ SIZE 1048576

11 DATAFILE

12 ‘E:\Oracle\ORADATA\BILLY\SYSTEM01.DBF’,

13 ‘E:\Oracle\ORADATA\BILLY\RBS01.DBF’,

14 ‘E:\Oracle\ORADATA\BILLY\USERS01.DBF’,

15 ‘E:\Oracle\ORADATA\BILLY\TEMP01.DBF’,

16 ‘E:\Oracle\ORADATA\BILLY\TOOLS01.DBF’,

17 ‘E:\Oracle\ORADATA\BILLY\INDX01.DBF’,

18 ‘E:\Oracle\ORADATA\BILLY\DR01.DBF’,

19 ‘E:\Oracle\ORADATA\BILLY\DB4K.DBF’

20 CHARACTER SET ZHS16GBK

21 ;

 

数据簇已更改。

 

SQL> shutdown

ORA-01109: ??????

 

 

已经卸载数据库。

Oracle 例程已经关闭。

SQL> startup mount

Oracle 例程已经启动。

 

Total System Global Area 31229980 bytes

Fixed Size 75804 bytes

Variable Size 14299136 bytes

Database Buffers 16777216 bytes

Redo Buffers 77824 bytes

数据库装载完毕。

SQL> recover database using backup controlfile until cancel;

ORA-00279: ?? 25526706 (? 03/20/2003 ??) ???? 1 ????

ORA-00289: ??: E:\Oracle\ORA81\RDBMS\ARC00001.001

ORA-00280: ?? 25526706 ???? 1 ???? # 1 ???

 

 

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

‘E:\Oracle\ORADATA\BILLY\REDO01.LOG’

ORA-00339: ???????????

ORA-00334: ????: ‘E:\Oracle\ORADATA\BILLY\REDO01.LOG’

 

 

ORA-01547: ??: RECOVER ??? OPEN RESETLOGS ???????

ORA-01194: ??1?????????????

ORA-01110: ???? 1: ‘E:\Oracle\ORADATA\BILLY\SYSTEM01.DBF’

 

 

SQL> recover database using backup controlfile until cancel;

ORA-00279: ?? 25526706 (? 03/20/2003 ??) ???? 1 ????

ORA-00289: ??: E:\Oracle\ORA81\RDBMS\ARC00001.001

ORA-00280: ?? 25526706 ???? 1 ???? # 1 ???

 

 

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

‘E:\Oracle\ORADATA\BILLY\REDO03.LOG’

已应用的日志。

完成介质恢复。

SQL> recover database using backup controlfile until cancel;

ORA-00279: ?? 25526718 (? 03/20/2003 ??) ???? 1 ????

ORA-00289: ??: E:\Oracle\ORA81\RDBMS\ARC00001.001

ORA-00280: ?? 25526718 ???? 1 ???? # 1 ???

 

 

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

‘E:\Oracle\ORADATA\BILLY\REDO01.LOG’

ORA-00339: ???????????

ORA-00334: ????: ‘E:\Oracle\ORADATA\BILLY\REDO01.LOG’

 

 

SQL> alter database open resetlogs;

 

数据库已更改。

 

SQL>

在最后一步注意日志文件选择的正确,一个一个试都没有关系

 

或问曰:

CREATE CONTROLFILE SET DATABASE “billy” RESETLOGS NOARCHIVELOG ??

应该不要resetlogs? redo log fileshut abort之前的数据不就全没有了吗?

 

:

如果reuse 创建控制文件就可以不用resetlogs

即使使用set 创建控制文件也可以进行完全恢复。

看下面:

 

SQL> conn rainy/rainy

已连接。

SQL> truncate table trans;

 

表已截掉。

 

SQL> alter system checkpoint;

 

系统已更改。

 

SQL> insert into trans values(1);

 

已创建 1 行。

 

SQL> commit;

 

提交完成。

 

SQL> conn / as sysdba

已连接。

SQL> shutdown abort

Oracle 例程已经关闭。

SQL> startup nomount

Oracle 例程已经启动。

 

Total System Global Area 31229980 bytes

Fixed Size 75804 bytes

Variable Size 14299136 bytes

Database Buffers 16777216 bytes

Redo Buffers 77824 bytes

 

SQL> CREATE CONTROLFILE SET DATABASE “billy” NORESETLOGS NOARCHIVELOG

2 MAXLOGFILES 64

3 MAXLOGMEMBERS 2

4 MAXDATAFILES 254

5 MAXINSTANCES 32

6 MAXLOGHISTORY 113

7 LOGFILE

8 GROUP 1 ‘E:\Oracle\ORADATA\BILLY\REDO01.LOG’ SIZE 1048576 ,

9 GROUP 2 ‘E:\Oracle\ORADATA\BILLY\REDO02.LOG’ SIZE 1048576 ,

10 GROUP 3 ‘E:\Oracle\ORADATA\BILLY\REDO03.LOG’ SIZE 1048576

11 DATAFILE

12 ‘E:\Oracle\ORADATA\BILLY\SYSTEM01.DBF’,

13 ‘E:\Oracle\ORADATA\BILLY\RBS01.DBF’,

14 ‘E:\Oracle\ORADATA\BILLY\USERS01.DBF’,

15 ‘E:\Oracle\ORADATA\BILLY\TEMP01.DBF’,

16 ‘E:\Oracle\ORADATA\BILLY\TOOLS01.DBF’,

17 ‘E:\Oracle\ORADATA\BILLY\INDX01.DBF’,

18 ‘E:\Oracle\ORADATA\BILLY\DR01.DBF’,

19 ‘E:\Oracle\ORADATA\BILLY\DB4K.DBF’

20 CHARACTER SET ZHS16GBK

21 ;

CREATE CONTROLFILE SET DATABASE “billy” NORESETLOGS NOARCHIVELOG

*

ERROR 位于第 1 :

ORA-01503: CREATE CONTROLFILE ??

ORA-01223: ???? RESETLOGS ?????????

 

 

SQL> CREATE CONTROLFILE SET DATABASE “billy” RESETLOGS NOARCHIVELOG

2 MAXLOGFILES 64

3 MAXLOGMEMBERS 2

4 MAXDATAFILES 254

5 MAXINSTANCES 32

6 MAXLOGHISTORY 113

7 LOGFILE

8 GROUP 1 ‘E:\Oracle\ORADATA\BILLY\REDO01.LOG’ SIZE 1048576 ,

9 GROUP 2 ‘E:\Oracle\ORADATA\BILLY\REDO02.LOG’ SIZE 1048576 ,

10 GROUP 3 ‘E:\Oracle\ORADATA\BILLY\REDO03.LOG’ SIZE 1048576

11 DATAFILE

12 ‘E:\Oracle\ORADATA\BILLY\SYSTEM01.DBF’,

13 ‘E:\Oracle\ORADATA\BILLY\RBS01.DBF’,

14 ‘E:\Oracle\ORADATA\BILLY\USERS01.DBF’,

15 ‘E:\Oracle\ORADATA\BILLY\TEMP01.DBF’,

16 ‘E:\Oracle\ORADATA\BILLY\TOOLS01.DBF’,

17 ‘E:\Oracle\ORADATA\BILLY\INDX01.DBF’,

18 ‘E:\Oracle\ORADATA\BILLY\DR01.DBF’,

19 ‘E:\Oracle\ORADATA\BILLY\DB4K.DBF’

20 CHARACTER SET ZHS16GBK

21 ;

 

数据簇已更改。

 

SQL>

SQL> shutdown

ORA-01109: ??????

 

 

已经卸载数据库。

Oracle 例程已经关闭。

SQL> startup mount

Oracle 例程已经启动。

 

Total System Global Area 31229980 bytes

Fixed Size 75804 bytes

Variable Size 14299136 bytes

Database Buffers 16777216 bytes

Redo Buffers 77824 bytes

数据库装载完毕。

SQL> recover database using backup controlfile until cancel;

ORA-00279: ?? 25546853 (? 03/20/2003 ??) ???? 1 ????

ORA-00289: ??: E:\Oracle\ORA81\RDBMS\ARC00002.001

ORA-00280: ?? 25546853 ???? 1 ???? # 2 ???

 

 

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

‘E:\Oracle\ORADATA\BILLY\REDO03.LOG’

ORA-00310: ???????? 1????? 2

ORA-00334: ????: ‘E:\Oracle\ORADATA\BILLY\REDO03.LOG’

 

 

ORA-01547: ??: RECOVER ??? OPEN RESETLOGS ???????

ORA-01194: ??1?????????????

ORA-01110: ???? 1: ‘E:\Oracle\ORADATA\BILLY\SYSTEM01.DBF’

 

 

SQL> recover database using backup controlfile until cancel;

ORA-00279: ?? 25546853 (? 03/20/2003 ??) ???? 1 ????

ORA-00289: ??: E:\Oracle\ORA81\RDBMS\ARC00002.001

ORA-00280: ?? 25546853 ???? 1 ???? # 2 ???

 

 

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

‘E:\Oracle\ORADATA\BILLY\REDO01.LOG’

已应用的日志。

完成介质恢复。

SQL> alter database open resetlogs;

 

数据库已更改。

 

SQL> conn rainy/rainy

已连接。

SQL> select * from trans;

 

A

———-

1

 

SQL>