2004年12月07日

分两部分:
a.如何配置ISA服务器,使得用户可以使用OWA来访问Microsoft Exchange 邮箱。

b.如何在OWA站点上使用SSL.


如何在ISA服务器后面发布OWA
1.配置ISA服务器接受外网卡的web请求:
   a. 启动 ISA Server 管理控制台:单击开始,指向程序,指向 Microsoft ISA Server,然后单击 ISA Management(ISA 管理)。

  b.展开左窗格中的”Servers(服务器)”文件夹,然后右键选择您的服务器属性。

   c.点击”Incoming Web Requests“页,再单击”Configure listeners  individually per IP address”.

     d.单击”Add”, 然后选择ISA Server和它的的外网卡ip地址。这一步确定了服务器响应外部http请求的ip地址和端口。

   e.单击”OK”完成,再单击”OK”回到ISA管理界面。

2. 创建”destination set”将Web客户端指向OWA站点的对应目录:

  a. 启动 ISA Server 管理控制台:单击开始,指向程序,指向 Microsoft ISA Server, 然后单击 ISA Management(ISA 管理)。

  b. 展开左窗格中的”Servers(服务器)”文件夹,再展开Policy Elements,右键选择 Destination Set文件夹,单击New, 然后单击Set. 您可以将该destination set命名为”OWA”.

  c.在Destination 一栏,输入外网用户访问OWA所使用的URL。

    注意:不要在URL里面包括”http://”;或者”https://”;部分。

d. 在Path一栏, 输入”/exchange*” (没有引号),然后单击OK.

 e.重复步骤d,分别为Exchweb和Public文件创建相应的路径:”/exchweb*”和”/public*”.

3. 用刚才创建的policy element 配置web publishing rule:
   a.展开Publishing,右键单击 Web Publishing Rules,选择New->Rule.
   b.在name一栏输入”OWA Access Rule” ,再单击Next.
  c.选择” specified destination set”,选择刚刚创建的OWA set,再单击Next.
   d. Apply the rule to Any Request, 再单击Next.
   e. 单击 “Redirect the request to this internal Web Server”,输入运行OWA的服务器的名称或者ip地址.
   f. 单击选择”Send the original header to publishing server instead of the actual one” ,再选择Next.
   g.单击finish.
   h. 在ISA 管理控制台里展开Monitoring图标,然后单击Services.
   i. 重新启动Web proxy和Firewall 服务:右键点击相应的服务,单击Stop,然后在菜单上启动。

如果OWA应用了SSL,必须在ISA服务器创建一条Server Publishing rule(HTTPS协议),选择内部OWA服务器的ip地址和ISA服务器外网卡地址(OWA服务器必须将ISA服务器的内网卡设为默认网关)。



如何用IIS5.0 和Certificate Server 2.0 建立SSL.
1. 首先,Web服务器必须做按照一下步骤证书请求:
   a.启动Internet Service Manager (ISM):开始->程序->管理工具->Internet Service Manager .
   b.右键点击需要建立SSL的站点,单击属性。
   c.单击目录安全页,再单击’服务器证书’,进入”Web服务器证书向导”.
   d.单击下一步开始向导,选择”创建一个新证书”。
   e.单击下一步,选择’现在准备请求,但稍候发送’。
   f.单击下一步,输入您的证书名称,你可以用web站点的名称。现在选择
位长,位长越长,证书加密越强。如果你的用户可能来自有加密限制的国家,就需要选择”服务器网关加密证书”.
   g.单击下一步,输入组织和组织单位。
  h. 单击下一步,输入公用名称,公用名称必须符合注册在DNS服务器上的 域名。例如如果URL是https://www.mydomain.com/securedir,那么公用  名称必须是 www.mydomain.com.如果客户使用IP地址访问该网站,如192.168.1.11,这儿的公用名称一定要使用”192.168.1.11″.
   i.单击下一步,输入您的国家、省、市。
   j.单击下一步,选择路径和您保存请求的文件名。
   k.再单击下一步两次,单击完成关闭向导。

2. 用Certificate Server处理您的请求,可以按照下列步骤来做:
  a.  在浏览器里面输入http://CAServerName/certsrv, 选择’Request a certificate‘. 注意:不要用”localhost“作为服务器名。
   b.单击Next并选择Advanced request.
   c.单击Next并选择Submit a certificate request using a base64 encoded PKCS #10 file or a renewal request using a base64 encoded PKCS #7 file.
   d.单击下一步,用Notepad打开您在Web证书向导中创建的请求文件。将整个文本文件(包括BEGIN和END两行),粘贴到Base64 Encoded Certificate   Request文本框。  
   e. 单击Submit。
   f. 关闭浏览器,在证书服务器上,打开Certification Authority 控制台。
   g.展开服务器名,选择Pending Requests folder.右键点击您提交的证书,选择 All Tasks,再选择Issue.
   h.右键点击服务器名您现在可以关闭Certification Authority 控制台。
   h. 打开一个新的浏览器窗口,输入步骤a里面的URL,选择Check on a      pending certificate.
  i. 单击下一步,选择您刚刚建立request.
   j. 单击下一步,选择DER encoded, 然后点击Download CA certificate的连接.保存证书文件到您的web服务器的本地硬盘,关闭浏览器。

3. 在IIS里完成证书安装,并启动SSL:

  a. 打开Internet Information Services MMC,右键点击需要应用SSL的web站点。
   b. 单击目录安全性,然后选择Server Certificate.
   c. 单击下一步,选择Process the pending request and install the certificate.
   d. 单击下一步,输入您上一部分保存的证书文件所在的路径和文件名。
   e. 单击下一步两次,点击完成推出向导。
   f. 单击web站点页,确认SSL端口一栏的端口是否正确。默认为443。
   g. 点击确认关闭web站点属性窗口。

现在我们已经建立了自己的一个SSL站点,但是这个站点不在Windows系列操作系统内建的信任之列,所以需要自己建立对该机构的信任,否则每次客户端访问该SSL站点,都会弹出该站点不被信任的窗口。

假如在试验中自己建立了一个根证书颁发机构MyCA2002,这个机构不在内建的受信任证书颁发机构之列,你可以按照下列步骤建立信任:
1.导出MyCA2002证书颁发机构的证书.
1)在CA服务器上单击”开始”菜单->”程序”->”管理工具”->”证书颁发机构”MMC管理单元,或者直接运行”%SystemRoot%\System32\certsrv.msc /s”.

(2)右击”证书颁发机构(本地)”下的”MyCA2002″节点,选择”属性”菜单项,打开”MyCA2002属性”对话框.

(3)在”MyCA2002属性”对话框”常规”页面单击”查看证书”,在跳出的”证书”对话框中切换到”详细信息”页面,单击下面的”复制到文件…”按钮,启动证书导出向导,将证书导出为”DER编码二进制X.509(.CER)”格式文件,假设文件名是”myca2002.cer”,文件大小约1k左右,复制到一个终端用户可以取到的位置,如软盘,网站(可以提供客户端下载)等.

2.在客户机建立对MyCA2002证书颁发机构的信任
(1)在客户机单击”开始”菜单->”设置”->”控制面板”->”Internet选项”,打开”Internet属性”对话框.
(2)切换到”内容”页面,单击下面的”证书…”按钮,打开”证书”对话框.
(3)切换到”受信任的根证书颁发机构”页面,单击下面的”导入…”按钮,启动”证书导入向导”,使用系统缺省的选
项将myca2002.cer证书导入.

(4)MyCA2002证书颁发机构成为受信任的根证书颁发机构.
如果OWA服务装在ISA服务器上,您需要禁用Socket Pooling. Socket Pooling 在IIS5.0里默认被启用,它使得IIS侦听所有ip地址的TCP 80 端口。关于如何禁用Socket Pooling,以及关于建立SSL和OWA的更详细的信息,可以

   Q238131 How to Disable Socket Pooling

   Q290625 HOWTO: Configure SSL in a Windows 2000 IIS 5.0 Test Environment
  Q290113 How to Publish Outlook Web Access Behind ISA Server
  Q267596 XWEB: How to Change OWA Passwords Through IIS

2004年12月01日

REM getsql.sql
REM author eygle
REM 在windows上,已知进程ID,得到当前正在执行的语句
REM 在windows上,进程ID为16进制,需要转换,在UNIX直接为10进制
SELECT   /*+ ORDERED */
         sql_text
    FROM v$sqltext a
   WHERE (a.hash_value, a.address) IN (
            SELECT DECODE (sql_hash_value,
                           0, prev_hash_value,
                           sql_hash_value
                          ),
                   DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)
              FROM v$session b
             WHERE b.paddr = (SELECT addr
                                FROM v$process c
                               WHERE c.spid = TO_NUMBER (‘&pid’, ‘2348′)))
ORDER BY piece ASC
/




























   
   

Oracle诊断案例—-如何捕获问题SQL解决过度CPU消耗问题


–使用vmstat,top等辅助解决Oracle数据库性能问题


Last Updated: Sunday, 2004-10-24 0:37 Eygle
    

 


问题描述:
开发人员报告系统运行缓慢,影响用户访问.



1.登陆数据库主机


使用vmstat检查,发现CPU资源已经耗尽,大量任务位于运行队列:






 

bash-2.03$ vmstat 3
procs memory page disk faults cpu
r b w swap free re mf pi po fr de sr s6 s9 s1 sd in sy cs us sy id
0 0 0 5504232 1464112 0 0 0 0 0 0 0 0 1 1 0 4294967196 0 0 -84 -5 -145
131 0 0 5368072 1518360 56 691 0 2 2 0 0 0 1 0 0 3011 7918 2795 97 3 0
131 0 0 5377328 1522464 81 719 0 2 2 0 0 0 1 0 0 2766 8019 2577 96 4 0
130 0 0 5382400 1524776 67 682 0 0 0 0 0 0 0 0 0 3570 8534 3316 97 3 0
134 0 0 5373616 1520512 127 1078 0 2 2 0 0 0 1 0 0 3838 9584 3623 96 4 0
136 0 0 5369392 1518496 107 924 0 5 5 0 0 0 0 0 0 2920 8573 2639 97 3 0
132 0 0 5364912 1516224 63 578 0 0 0 0 0 0 0 0 0 3358 7944 3119 97 3 0
129 0 0 5358648 1511712 189 1236 0 0 0 0 0 0 0 0 0 3366 10365 3135 95 5 0
129 0 0 5354528 1511304 120 1194 0 0 0 0 0 0 0 4 0 3235 8864 2911 96 4 0
128 0 0 5346848 1507704 99 823 0 0 0 0 0 0 0 3 0 3189 9048 3074 96 4 0
125 0 0 5341248 1504704 80 843 0 2 2 0 0 0 6 1 0 3563 9514 3314 95 5 0
133 0 0 5332744 1501112 79 798 0 0 0 0 0 0 0 1 0 3218 8805 2902 97 3 0
129 0 0 5325384 1497368 107 643 0 2 2 0 0 0 1 4 0 3184 8297 2879 96 4 0
126 0 0 5363144 1514320 81 753 0 0 0 0 0 0 0 0 0 2533 7409 2164 97 3 0
136 0 0 5355624 1510512 169 566 786 0 0 0 0 0 0 1 0 3002 8600 2810 96 4 0
130 1 0 5351448 1502936 267 580 1821 0 0 0 0 0 0 0 0 3126 7812 2900 96 4 0
129 0 0 5347256 1499568 155 913 2 2 2 0 0 0 0 1 0 2225 8076 1941 98 2 0
116 0 0 5338192 1495400 177 1162 0 0 0 0 0 0 0 1 0 1947 7781 1639 97 3 0


2.使用Top命令


观察进程CPU耗用,发现没有明显过高CPU使用的进程
$ top







 

last pid: 28313;  load averages: 99.90, 117.54, 125.71            23:28:38
296 processes: 186 sleeping, 99 running, 2 zombie, 9 on cpu
CPU states: 0.0% idle, 96.5% user, 3.5% kernel, 0.0% iowait, 0.0% swap
Memory: 4096M real, 1404M free, 2185M swap in use, 5114M swap free

PID USERNAME THR PRI NICE SIZE RES STATE TIME CPU COMMAND
27082 oracle8i 1 33 0 1328M 1309M run 0:17 1.29% oracle
26719 oracle8i 1 55 0 1327M 1306M sleep 0:29 1.11% oracle
28103 oracle8i 1 35 0 1327M 1304M run 0:06 1.10% oracle
28161 oracle8i 1 25 0 1327M 1305M run 0:04 1.10% oracle
26199 oracle8i 1 45 0 1328M 1309M run 0:42 1.10% oracle
26892 oracle8i 1 33 0 1328M 1310M run 0:24 1.09% oracle
27805 oracle8i 1 45 0 1327M 1306M cpu/1 0:10 1.04% oracle
23800 oracle8i 1 23 0 1327M 1306M run 1:28 1.03% oracle
25197 oracle8i 1 34 0 1328M 1309M run 0:57 1.03% oracle
21593 oracle8i 1 33 0 1327M 1306M run 2:12 1.01% oracle
27616 oracle8i 1 45 0 1329M 1311M run 0:14 1.01% oracle
27821 oracle8i 1 43 0 1327M 1306M run 0:10 1.00% oracle
26517 oracle8i 1 33 0 1328M 1309M run 0:33 0.97% oracle
25785 oracle8i 1 44 0 1328M 1309M run 0:46 0.96% oracle
26241 oracle8i 1 45 0 1327M 1306M run 0:42 0.96% oracle


3.检查进程数量







 

bash-2.03$ ps -ef|grep ora|wc -l
258
bash-2.03$ ps -ef|grep ora|wc -l
275
bash-2.03$ ps -ef|grep ora|wc -l
274
bash-2.03$ ps -ef|grep ora|wc -l
278
bash-2.03$ ps -ef|grep ora|wc -l
277
bash-2.03$ ps -ef|grep ora|wc -l
366

发现系统存在大量Oracle进程,大约在300左右,而正常情况下Oracle连接数应该在100左右.


4.检查数据库


查询v$session_wait获取各进程等待事件


 







 

 
SQL> select sid,event,p1,p1text from v$session_wait;

SID EVENT P1 P1TEXT
———- —————————— ———- —————————————————————-
124 latch free 1.6144E+10 address
1 pmon timer 300 duration
2 rdbms ipc message 300 timeout
3 rdbms ipc message 300 timeout
11 rdbms ipc message 30000 timeout
6 rdbms ipc message 180000 timeout
4 rdbms ipc message 300 timeout
134 rdbms ipc message 6000 timeout
147 rdbms ipc message 6000 timeout
275 rdbms ipc message 17995 timeout
274 rdbms ipc message 6000 timeout

SID EVENT P1 P1TEXT
———- —————————— ———- —————————————————————-
118 rdbms ipc message 6000 timeout
7 buffer busy waits 17 file#
56 buffer busy waits 17 file#
161 buffer busy waits 17 file#
195 buffer busy waits 17 file#
311 buffer busy waits 17 file#
314 buffer busy waits 17 file#
205 buffer busy waits 17 file#
269 buffer busy waits 17 file#
200 buffer busy waits 17 file#
164 buffer busy waits 17 file#

SID EVENT P1 P1TEXT
———- —————————— ———- —————————————————————-
140 buffer busy waits 17 file#
66 buffer busy waits 17 file#
10 db file sequential read 17 file#
18 db file sequential read 17 file#
54 db file sequential read 17 file#
49 db file sequential read 17 file#
48 db file sequential read 17 file#
46 db file sequential read 17 file#
45 db file sequential read 17 file#
35 db file sequential read 17 file#
30 db file sequential read 17 file#

SID EVENT P1 P1TEXT
———- —————————— ———- —————————————————————-
29 db file sequential read 17 file#
22 db file sequential read 17 file#
178 db file sequential read 17 file#
175 db file sequential read 17 file#
171 db file sequential read 17 file#
123 db file sequential read 17 file#
121 db file sequential read 17 file#
120 db file sequential read 17 file#
117 db file sequential read 17 file#
114 db file sequential read 17 file#
113 db file sequential read 17 file#

SID EVENT P1 P1TEXT
———- —————————— ———- —————————————————————-
111 db file sequential read 17 file#
107 db file sequential read 17 file#
80 db file sequential read 17 file#
222 db file sequential read 17 file#
218 db file sequential read 17 file#
216 db file sequential read 17 file#
213 db file sequential read 17 file#
199 db file sequential read 17 file#
198 db file sequential read 17 file#
194 db file sequential read 17 file#
192 db file sequential read 17 file#

SID EVENT P1 P1TEXT
———- —————————— ———- —————————————————————-
188 db file sequential read 17 file#
249 db file sequential read 17 file#
242 db file sequential read 17 file#
239 db file sequential read 17 file#
236 db file sequential read 17 file#
235 db file sequential read 17 file#
234 db file sequential read 17 file#
233 db file sequential read 17 file#
230 db file sequential read 17 file#
227 db file sequential read 17 file#
336 db file sequential read 17 file#

SID EVENT P1 P1TEXT
———- —————————— ———- —————————————————————-
333 db file sequential read 17 file#
331 db file sequential read 17 file#
329 db file sequential read 17 file#
327 db file sequential read 17 file#
325 db file sequential read 17 file#
324 db file sequential read 17 file#
320 db file sequential read 17 file#
318 db file sequential read 17 file#
317 db file sequential read 17 file#
316 db file sequential read 17 file#
313 db file sequential read 17 file#

SID EVENT P1 P1TEXT
———- —————————— ———- —————————————————————-
305 db file sequential read 17 file#
303 db file sequential read 17 file#
301 db file sequential read 17 file#
293 db file sequential read 17 file#
290 db file sequential read 17 file#
288 db file sequential read 17 file#
287 db file sequential read 17 file#
273 db file sequential read 17 file#
271 db file sequential read 17 file#
257 db file sequential read 17 file#
256 db file sequential read 17 file#

SID EVENT P1 P1TEXT
———- —————————— ———- —————————————————————-
254 db file sequential read 17 file#
252 db file sequential read 17 file#
159 db file sequential read 17 file#
153 db file sequential read 17 file#
146 db file sequential read 17 file#
142 db file sequential read 17 file#
135 db file sequential read 17 file#
133 db file sequential read 17 file#
132 db file sequential read 17 file#
126 db file sequential read 17 file#
79 db file sequential read 17 file#

SID EVENT P1 P1TEXT
———- —————————— ———- —————————————————————-
77 db file sequential read 17 file#
72 db file sequential read 17 file#
70 db file sequential read 17 file#
69 db file sequential read 17 file#
67 db file sequential read 17 file#
63 db file sequential read 17 file#
55 db file sequential read 17 file#
102 db file sequential read 17 file#
96 db file sequential read 17 file#
95 db file sequential read 17 file#
91 db file sequential read 17 file#

SID EVENT P1 P1TEXT
———- —————————— ———- —————————————————————-
81 db file sequential read 17 file#
15 db file sequential read 17 file#
19 db file scattered read 17 file#
50 db file scattered read 17 file#
285 db file scattered read 17 file#
279 db file scattered read 17 file#
255 db file scattered read 17 file#
243 db file scattered read 17 file#
196 db file scattered read 17 file#
187 db file scattered read 17 file#
170 db file scattered read 17 file#

SID EVENT P1 P1TEXT
———- —————————— ———- —————————————————————-
162 db file scattered read 17 file#
138 db file scattered read 17 file#
110 db file scattered read 17 file#
108 db file scattered read 17 file#
92 db file scattered read 17 file#
330 db file scattered read 17 file#
310 db file scattered read 17 file#
302 db file scattered read 17 file#
299 db file scattered read 17 file#
89 db file scattered read 17 file#
5 smon timer 300 sleep time

SID EVENT P1 P1TEXT
———- —————————— ———- —————————————————————-
20 SQL*Net message to client 1952673792 driver id
103 SQL*Net message to client 1650815232 driver id
….
148 SQL*Net more data from client 1952673792 driver id
291 SQL*Net more data from client 1952673792 driver id

244 rows selected.


发现存在大量db file scattered read及db file sequential read等待.


5.捕获相关SQL


这里用到了我的以下脚本getsqlbysid.sql:







 

SELECT   sql_text
FROM v$sqltext a
WHERE a.hash_value = (SELECT sql_hash_value
FROM v$session b
WHERE b.SID = ‘&sid’)
ORDER BY piece ASC
/

 







 

 
SQL> @getsql
Enter value for sid: 18
old 5: where b.sid=’&sid’
new 5: where b.sid=’18′

SQL_TEXT
—————————————————————-
select i.vc2title,i.numinfoguid from hs_info i where i.intenab
ledflag = 1 and i.intpublishstate = 1 and i.datpublishdate <=
sysdate and i.numcatalogguid = 2047 order by i.datpublishdate d
esc, i.numorder desc

SQL> /
Enter value for sid: 54
old 5: where b.sid=’&sid’
new 5: where b.sid=’54′

SQL_TEXT
—————————————————————-
select i.vc2title,i.numinfoguid from hs_info i where i.intenab
ledflag = 1 and i.intpublishstate = 1 and i.datpublishdate <=
sysdate and i.numcatalogguid = 33 order by i.datpublishdate des
c, i.numorder desc

SQL> /
Enter value for sid: 49
old 5: where b.sid=’&sid’
new 5: where b.sid=’49′

SQL_TEXT
—————————————————————-
select i.vc2title,i.numinfoguid from hs_info i where i.intenab
ledflag = 1 and i.intpublishstate = 1 and i.datpublishdate <=
sysdate and i.numcatalogguid = 26 order by i.datpublishdate des
c, i.numorder desc


对几个全表扫描进程跟踪以后,得到以上SQL语句.
以上语句如果良好编码应该使用绑定变量.但是现在这个不是我们关心的.


使用该应用用户连接,检查其执行计划:







 

SQL> set autotrace trace explain
SQL> select i.vc2title,i.numinfoguid
2 from hs_info i where i.intenabledflag = 1
3 and i.intpublishstate = 1 and i.datpublishdate <=sysdate
4 and i.numcatalogguid = 3475
5 order by i.datpublishdate desc, i.numorder desc ;

Execution Plan
———————————————————-
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=228 Card=1 Bytes=106)
1 0 SORT (ORDER BY) (Cost=228 Card=1 Bytes=106)
2 1 TABLE ACCESS (FULL) OF ‘HS_INFO’ (Cost=218 Card=1 Bytes=106)

SQL> select count(*) from hs_info;

COUNT(*)
———-
227404


该表这里有22万记录,全表扫描已经不再适合.


检查该表,存在以下索引:






SQL> select index_name,index_type  from user_indexes where table_name=’HS_INFO’;

INDEX_NAME INDEX_TYPE
—————————— —————————
HSIDX_INFO1 FUNCTION-BASED NORMAL
HSIDX_INFO_SEARCHKEY DOMAIN
PK_HS_INFO NORMAL

检查索引键值:

SQL> select index_name,column_name from user_ind_columns where table_name =’HS_INFO’;

INDEX_NAME COLUMN_NAME
—————————— ——————–
HSIDX_INFO1 NUMORDER
HSIDX_INFO1 SYS_NC00024$
HSIDX_INFO_SEARCHKEY VC2INDEXWORDS
PK_HS_INFO NUMINFOGUID

SQL> desc hs_info
Name Null? Type
—————————————————————– ——– —————————
NUMINFOGUID NOT NULL NUMBER(15)
NUMCATALOGGUID NOT NULL NUMBER(15)
INTTEXTTYPE NOT NULL NUMBER(38)
VC2TITLE NOT NULL VARCHAR2(60)
VC2AUTHOR VARCHAR2(100)
NUMPREVINFOGUID NUMBER(15)
NUMNEXTINFOGUID NUMBER(15)
NUMORDER NOT NULL NUMBER(15)
DATPUBLISHDATE NOT NULL DATE
INTPUBLISHSTATE NOT NULL NUMBER(38)
VC2PUBLISHERID VARCHAR2(30)
VC2INDEXWORDS VARCHAR2(200)
VC2WAPPREVPATH VARCHAR2(200)
VC2WEBPREVPATH VARCHAR2(200)
VC2WAP2PREVPATH VARCHAR2(200)
NUMVISITED NOT NULL NUMBER(15)
INTENABLEDFLAG NOT NULL NUMBER(38)
DATCREATETIME NOT NULL DATE
DATMODIFYTIME NOT NULL DATE
VC2NOTES VARCHAR2(1000)
INTINFOTYPE NOT NULL NUMBER(38)
VC2PRIZEFLAG VARCHAR2(1)
VC2DESC VARCHAR2(1000)


 


6.决定创建新的索引以消除全表扫描







 

 
SQL> create index hs_info_NUMCATALOGGUID on hs_info(NUMCATALOGGUID);

Index created.

SQL> set autotrace trace explain
SQL> select i.vc2title,i.numinfoguid
2 from hs_info i where i.intenabledflag = 1
3 and i.intpublishstate = 1 and i.datpublishdate <=sysdate
4 and i.numcatalogguid = 3475
5 order by i.datpublishdate desc, i.numorder desc ;

Execution Plan
———————————————————-
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=12 Card=1 Bytes=106)
1 0 SORT (ORDER BY) (Cost=12 Card=1 Bytes=106)
2 1 TABLE ACCESS (BY INDEX ROWID) OF ‘HS_INFO’ (Cost=2 Card=1 Bytes=106)
3 2 INDEX (RANGE SCAN) OF ‘HS_INFO_NUMCATALOGGUID’ (NON-UNIQUE) (Cost=1 Card=1)


7.观察系统状况


原大量等待消失






 
SQL> select sid,event,p1,p1text from v$session_wait where event not like ‘SQL%’;

SID EVENT P1 P1TEXT
———- —————————— ———- —————————————————————-
1 pmon timer 300 duration
2 rdbms ipc message 300 timeout
3 rdbms ipc message 300 timeout
6 rdbms ipc message 180000 timeout
59 rdbms ipc message 6000 timeout
118 rdbms ipc message 6000 timeout
275 rdbms ipc message 30000 timeout
147 rdbms ipc message 6000 timeout
62 rdbms ipc message 6000 timeout
11 rdbms ipc message 30000 timeout
4 rdbms ipc message 300 timeout

SID EVENT P1 P1TEXT
———- —————————— ———- —————————————————————-
305 db file sequential read 17 file#
356 db file sequential read 17 file#
19 db file scattered read 17 file#
5 smon timer 300 sleep time

15 rows selected.


 


持续观察的CPU使用情况


 






 
bash-2.03$ vmstat 3
procs memory page disk faults cpu
r b w swap free re mf pi po fr de sr s6 s9 s1 sd in sy cs us sy id
20 0 0 5421792 1503488 38 434 136 0 0 0 0 0 0 2 0 2931 7795 2622 91 9 0
23 1 0 5416080 1500632 95 734 56 0 0 0 0 0 0 0 0 2949 8057 2598 89 11 0
26 0 0 5412016 1498480 210 1170 21 5 5 0 0 0 2 1 0 3301 9647 3116 90 10 0
25 0 0 5394912 1490160 242 1606 56 0 0 0 0 0 0 1 0 3133 9318 2850 89 11 0
40 0 0 5390200 1488112 162 1393 66 0 0 0 0 0 0 0 0 2848 9080 2502 90 10 0
40 0 0 5377120 1481792 136 1180 120 2 2 0 0 0 1 1 0 2846 9099 2593 92 8 0
36 0 0 5363216 1475168 134 1169 53 0 0 0 0 0 3 2 0 2871 7989 2621 88 12 0
39 0 0 5348936 1469160 157 1448 210 0 0 0 0 0 0 0 0 3660 10062 3480 88 12 0
35 0 0 5344552 1466472 7 15 56 0 0 0 0 0 0 0 0 2885 7663 2635 92 8 0
34 0 0 5343016 1465416 44 386 77 0 0 0 0 0 0 0 0 3197 8486 2902 92 8 0
31 0 0 5331568 1459696 178 1491 122 0 0 0 0 0 0 3 0 3237 9461 3005 89 11 0
31 0 0 5317792 1453008 76 719 80 0 0 0 0 0 0 0 0 3292 8736 3025 93 7 0
31 2 0 5311144 1449552 235 1263 69 2 2 0 0 0 1 0 0 3473 9535 3357 88 12 0
25 0 0 5300240 1443920 108 757 18 2 2 0 0 0 1 1 0 2377 7876 2274 95 5 0
19 0 0 5295904 1441840 50 377 0 0 0 0 0 0 0 1 0 1915 6598 1599 98 1 0
—-以上为创建索引之前部分
—-以下为创建索引之后部分,CPU使用率恢复正常
procs memory page disk faults cpu
r b w swap free re mf pi po fr de sr s6 s9 s1 sd in sy cs us sy id
40 1 0 5290040 1439208 315 3894 8 2 2 0 0 0 1 6 0 3631 13414 5206 61 9 30
0 1 0 5237192 1414744 731 6749 45 0 0 0 0 0 2 7 0 3264 13558 4941 52 14 34
0 0 0 5163632 1380608 747 6585 10 0 0 0 0 0 0 1 0 2617 12291 3901 46 12 41
1 0 0 5090224 1348152 712 6079 29 0 0 0 0 0 0 6 0 2825 12416 4178 50 12 39
1 0 0 5023672 1317296 714 6183 24 0 0 0 0 0 0 5 0 3166 12424 4745 47 13 40
0 0 0 4955872 1287136 737 6258 16 0 0 0 0 0 0 3 0 2890 11777 4432 44 12 44
1 0 0 4887888 1256464 809 6234 8 2 2 0 0 0 0 2 0 2809 12066 4247 45 12 43
0 0 0 4828912 1228200 312 2364 13 5 5 0 0 0 2 1 0 2410 6816 3492 38 6 57
0 0 0 4856816 1240168 8 138 0 0 0 0 0 0 1 0 0 2314 4026 3232 34 4 62
0 0 0 4874176 1247712 0 86 0 0 0 0 0 0 0 0 0 2298 3930 3324 35 2 63
2 0 0 4926088 1270824 34 560 0 0 0 0 0 0 0 0 0 2192 4694 2612 29 16 55
0 0 0 5427320 1512952 53 694 0 0 0 0 0 0 3 2 0 2443 5085 3340 33 12 55
0 0 0 5509120 1553136 0 37 0 0 0 0 0 0 0 0 0 2309 3908 3321 35 1 64
0 0 0 5562048 1577000 16 234 0 0 0 0 0 0 0 0 0 2507 5187 3433 35 8 57
0 0 0 5665672 1623848 252 1896 8 2 2 0 0 0 1 0 0 2091 6548 2939 34 5 61
0 0 0 5654752 1618208 5 173 16 0 0 0 0 0 0 0 0 2226 4218 3051 35 4 60
0 0 0 5727024 1651120 28 254 0 0 0 0 0 0 0 0 0 2126 4224 2982 38 2 60
0 0 0 5723184 1648880 93 562 8 2 2 0 0 0 1 1 0 2371 5140 3432 38 3 59
0 0 0 5730744 1652512 7 177 26 2 2 0 0 0 1 0 0 2465 4442 3575 36 3 61

 


 


至此,此问题得以解决.


 


本文作者:
eygle,Oracle技术关注者,来自中国最大的Oracle技术论坛itpub.
www.eygle.com是作者的个人站点.你可通过Guoqiang.Gai@gmail.com来联系作者.欢迎技术探讨交流以及链接交换.



原文出处:


http://www.eygle.com/case/How.To.Capture.Problem.SQL.htm



如欲转载,请注明作者与出处.并请保留本文的连接.


回首页


 

很多时候我们的服务器可能会经历CPU消耗100%的性能问题.
排除系统的异常,这类问题通常都是因为系统中存在性能低下甚至存在错误的SQL语句, 消耗了大量的CPU所致.


本文通过一个案例就如何捕获这样的SQL给出一个通用的方法.


问题描述:系统CPU高度消耗,系统运行缓慢
OS:Sun Solaris8
Oracle:Oracle9203



1.首先通过Top命令查看






$ top

load averages: 1.61, 1.28, 1.25 HSWAPJSDB 10:50:44
172 processes: 160 sleeping, 1 running, 3 zombie, 6 stopped, 2 on cpu
CPU states: % idle, % user, % kernel, % iowait, % swap
Memory: 4.0G real, 1.4G free, 1.9G swap in use, 8.9G swap free

PID USERNAME THR PR NCE SIZE RES STATE TIME FLTS CPU COMMAND
20521 oracle 1 40 0 1.8G 1.7G run 6:37 0 47.77% oracle
20845 oracle 1 40 0 1.8G 1.7G cpu02 0:41 0 40.98% oracle
20847 oracle 1 58 0 1.8G 1.7G sleep 0:00 0 0.84% oracle
20780 oracle 1 48 0 1.8G 1.7G sleep 0:02 0 0.83% oracle
15828 oracle 1 58 0 1.8G 1.7G sleep 0:58 0 0.53% oracle
20867 root 1 58 0 4384K 2560K sleep 0:00 0 0.29% sshd2
20493 oracle 1 58 0 1.8G 1.7G sleep 0:03 0 0.29% oracle
20887 oracle 1 48 0 1.8G 1.7G sleep 0:00 0 0.13% oracle
20851 oracle 1 58 0 1.8G 1.7G sleep 0:00 0 0.10% oracle
20483 oracle 1 48 0 1.8G 1.7G sleep 0:00 0 0.09% oracle
20875 oracle 1 45 0 1064K 896K sleep 0:00 0 0.07% sh
20794 oracle 1 58 0 1.8G 1.7G sleep 0:00 0 0.06% oracle
20842 jiankong 1 52 2 1224K 896K sleep 0:00 0 0.05% sadc
20888 oracle 1 55 0 1712K 1272K cpu00 0:00 0 0.05% top
19954 oracle 1 58 0 1.8G 1.7G sleep 84:25 0 0.04% oracle


我们发现在进城列表里,存在两个高CPU耗用的Oracle进城,分别消耗了47.77%和40.98%的CPU资源.


 


2.找到存在问题的进程信息







 

 
$ ps -ef|grep 20521
oracle 20909 20875 0 10:50:53 pts/10 0:00 grep 20521
oracle 20521 1 47 10:43:59 ? 6:45 oraclejshs (LOCAL=NO)
$ ps -ef|grep 20845
oracle 20845 1 44 10:50:00 ? 0:55 oraclejshs (LOCAL=NO)
oracle 20918 20875 0 10:50:59 pts/10 0:00 grep 20845


确认这是两个远程连接的用户进程.


 


3.熟悉一下我的getsql.sql脚本







 

 
SELECT /*+ ORDERED */
sql_text
FROM v$sqltext a
WHERE (a.hash_value, a.address) IN (
SELECT DECODE (sql_hash_value,
0, prev_hash_value,
sql_hash_value
),
DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.paddr = (SELECT addr
FROM v$process c
WHERE c.spid = ‘&pid’))
ORDER BY piece ASC
/

注意这里我们涉及了3个视图,并应用其关联进行数据获取.
首先需要输入一个pid,这个pid即process id,也就是在Top或ps中我们看到的PID.
通过pid和v$process.spid相关联我们可以获得Process的相关信息
进而通过v$process.addr和v$session.paddr相关联,我们就可以获得和session相关的所有信息.
再结合v$sqltext,我们即可获得当前session正在执行的SQL语句.


通过v$process视图,我们得以把操作系统和数据库关联了起来.


 


4.连接数据库,找到问题sql及进程


通过Top中我们观察到的PID,进而应用我的getsql脚本,我们得到以下结果输出.







 

 
$ sqlplus “/ as sysdba”

SQL*Plus: Release 9.2.0.3.0 – Production on Mon Dec 29 10:52:14 2003

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

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.3.0 – 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.3.0 – Production

SQL> @getsql
Enter value for spid: 20521
old 10: where c.spid = ‘&pid’
new 10: where c.spid = ‘20521′

SQL_TEXT
—————————————————————-
select * from (select VC2URL,VC2PVDID,VC2MOBILE,VC2ENCRYPTFLAG,S
ERVICEID,VC2SUB_TYPE,CISORDER,NUMGUID,VC2KEY1, VC2NEEDDISORDER,V
C2PACKFLAG,datopertime from hsv_2cpsync where datopertime<=sysda
te and numguid>70000000000308 order by NUMGUid) where rownum<=20


那么这段代码就是当前正在疯狂消耗CPU的罪魁祸首.
接下来需要进行的工作就是找出这段代码的问题,看是否可以通过优化提高其效率,减少资源消耗.


 


5.进一步的我们可以通过dbms_system包跟踪该进程







 


SQL> @getsid
Enter value for spid: 20521
old 3: select addr from v$process where spid = &spid)
new 3: select addr from v$process where spid = 20521)


SID SERIAL# USERNAME MACHINE
—————————————————————-
45 38991 HSUSER_V51 hswapjsptl1.hurray.com.cn


SQL> exec dbms_system.set_sql_trace_in_session(45,38991,true);


PL/SQL procedure successfully completed.


SQL> !


 


这部分内容可以参考:
http://www.eygle.com/case/sql_trace_1.htm


对于Windows上的类似问题,可以参考:
http://www.eygle.com/faq/Use.Nt.tools.manage.Oracle.htm


 


6.一点说明


很多时候,高CPU消耗都是由于问题SQL导致的,所以找到这些SQL通常也就找到了问题所在,通过优化调整
通常就可以解决问题。


但是有时候你可能会发现,这些最消耗CPU的进程是后台进程,这一般是由于异常、BUG或者恢复后的异常
导致的,需要具体问题具体分析了.


 


 


 


本文作者:
eygle,Oracle技术关注者,来自中国最大的Oracle技术论坛itpub.
www.eygle.com是作者的个人站点.你可通过Guoqiang.Gai@gmail.com来联系作者.欢迎技术探讨交流以及链接交换.



原文出处:


http://www.eygle.com/case/how.to.getsql.which.cost.most.CPU.htm

2004年11月29日





 














首页 PL/SQL 数据库结构 备份与恢复 性能优化 OCP认证 数据库理论 其它数据库 UNIX基础 常用软件 电子书籍








20041129日 星期一
   






RESETLOGS后没有备份情况下的数据恢复(2)


作者:曹飞 本文选自:赛迪网


操作过程

本例中首先建立试验用户demo和表空间demo,当前时刻记为A点,用户demo建立表a后,插入数据1、2、3,之后的时刻记为B点,接着插入数据4、5、6后的时刻记为B’点,接着模拟丢失B’点的数据文件,从A点恢复到B点,用RESETLOGS选项打开数据库后,再向表a插入数据7、8、9,之后的时刻记为C点。此时模拟丢失C点的数据文件,用A点的备份和A、B之间及B、C之间的归档日志加上A、C两点的控制文件将数据库恢复到C点。下列步骤中的第17步最为关键,详细步骤如下:

(1)准备工作:建立表空间demo和临时用户demo。






create tablespace demo datafile ‘f:\test\demo.dbf’ size 5M;
create user demo identified by demo
default tablespace demo quota unlimited on demo
temporary tablespace temp;
grant connect,alter system to demo;
alter user demo account unlock;


 



(2)以SYSDBA身份查看归档日志并关闭数据库。






SQL> archive log list
Database log mode         Archive Mode
Automatic archival         Enabled
Archive destination        f:\test
Oldest online log sequence     18
Next log sequence to archive    19
Current log sequence        19
SQL> shutdown;


 



(3)当前时刻记为A点,做数据库的一致冷备份。






copy f:\test\*.dbf f:\cool\coola
copy f:\test1\ctl.ctl f:\cool\ctl_a


 



(4)以试验用户demo登录,并插入数据到表a中。






create table a (i number);
commit;
insert into a values(1);
commit;
alter system switch logfile;
insert into a values(2);
commit;
alter system switch logfile;
insert into a values(3);
commit;
alter system switch logfile;


 



(5)记录当前时刻为B点。






SQL> select to_char(sysdate,’DD-MONTH-YYYY HH24:MI:SS’) “DATE” from dual;
DATE
————————–
04-OCTOBER -2002 09:18:52


 



(6)继续由用户demo向表a插入数据。






insert into a values(4);
commit;
alter system switch logfile;
insert into a values(5);
commit;
alter system switch logfile;
insert into a values(6);
commit;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;


 



(7)记录当前时刻为B’点。






SQL> select to_char(sysdate,’DD-MONTH-YYYY HH24:MI:SS’) “DATE” from dual;
DATE
————————–
04-OCTOBER -2002 09:21:13


 



(8)以SYSDBA身份查看归档日志并关闭数据库。






SQL> archive log list
Database log mode        Archive Mode
Automatic archival       Enabled
Archive destination       f:\test
Oldest online log sequence   27
Next log sequence to archive  28
Current log sequence      28
SQL> shutdown


 



(9)模拟丢失所有当前(B’点)数据文件和控制文件。首先保存归档日志文,再把点A的数据文件和控制文件恢复到在线数据文件的目录。






del   f:\test\*.dbf
copy  f:\test\*.arc f:\cool\archa_b
copy  f:\cool\coola\*.dbf f:\test
copy  f:\cool\ctl_a\ctl.ctl f:\test1
copy  f:\cool\ctl_a\ctl.ctl f:\test2
copy  f:\cool\ctl_a\ctl.ctl f:\test3


 



(10)以SYSDBA身份登录,执行从时刻A到时刻B的基于时间点的不完全媒体恢复,因为媒体恢复过程使用时刻A的控制文件,所以要加上using backup controlfile子句。






conn /@test as sysdba
startup mount
SQL> recover database until time ‘2002-10-04:09:18:52′ using backup controlfile;
ORA-00279: change 690619 generated at 10/04/2002 08:56:01 needed for thread 1
ORA-00289: suggestion : F:\TEST\ARCH19.ARC
ORA-00280: change 690619 for thread 1 is in sequence #19


Specify log: {<RET&gt;=suggested | filename | AUTO | CANCEL}
f:\cool\archa_b\arch19.arc
ORA-00279: change 690763 generated at 10/04/2002 09:18:21 needed for thread 1
ORA-00289: suggestion : F:\TEST\ARCH20.ARC
ORA-00280: change 690763 for thread 1 is in sequence #20
ORA-00278: log file ‘f:\cool\archa_b\arch19.arc’ no longer needed for this
recovery


…… ……


 



接下来顺序应用归档日志文件直到日志序列号为22的日志文件f:\cool\archa_b\arch22.arc,注意归档日志文件的目录为f:\cool\archa_b。

(11)以SYSDBA身份打开数据库,因为是不完全媒体恢复,所以要使用RESETLOGS选项。查看表demo.a,证实时刻B之前插入的数据已被恢复。






SQL> alter database open resetlogs;
SQL> select * from demo.a;
     I
———-
     1
     2
     3


 



(12)以demo用户登录数据库,接着向表a插入数据。






insert into a values(7);
commit;
alter system switch logfile;
insert into a values(8);
commit; alter system switch logfile;
insert into a values(9);
commit;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;


 



(13)记录当前时刻为C点。






SQL> select to_char(sysdate,’DD-MONTH-YYYY HH24:MI:SS’) “DATE” from dual;
DATE
————————–
04-OCTOBER -2002 10:04:46


 



(14)以SYSDBA身份查看归档日志并关闭数据库。






SQL> conn /@test as sysdba
Connected.
SQL> archive log list
Database log mode        Archive Mode
Automatic archival       Enabled
Archive destination       f:\test
Oldest online log sequence   6
Next log sequence to archive  7
Current log sequence      7
SQL> shutdown


 



由此可见,RESETLOGS后日志序列号从1重新开始。

(15)不备份C点的数据文件,但要备份C点的控制文件和时刻B和时刻C之间的归档日志。删除当前(时刻C)数据文件,从A点复制数据文件和控制文件到当前位置。






del f:\test\*.dbf
copy f:\test\*.arc f:\cool\archb_c
copy f:\test1\ctl.ctl f:\cool\ctl_c
copy f:\cool\coola\*.dbf f:\test
copy f:\cool\ctl_a\ctl.ctl f:\test1
copy f:\cool\ctl_a\ctl.ctl f:\test2
copy f:\cool\ctl_a\ctl.ctl f:\test3


 



(16)以SYSDBA身份登录,执行从时刻A到时刻B的基于时间点的不完全媒体恢复,因为媒体恢复过程使用时刻A的控制文件,所以要加上using backup controlfile子句。该步骤类似于步骤(10)。






conn /@test as sysdba
startup mount
recover database until time ‘2002-10-04:09:18:52′ using backup controlfile;


 



(17)该步骤最为关键!!不要打开数据库。首先关闭数据库,然后把C点的控制文件恢复到在线控制文件的位置,然后用C点的控制文件恢复步骤(16)结束之后的数据文件,恢复进程会自动应用时刻B和时刻C之间的归档日志文件,从序列号为1的归档日志arch1.arc开始。注意:本例执行的是完全媒体恢复,必须在不丢失联机重做日志文件的情况下。否则,要恢复联机重做日志文件。当然,也可执行不完全媒体恢复,恢复到时刻B和时刻C之间的任一时刻。本步骤的关键技术在于要备份时刻C的控制文件,并用它实现跨越时刻B的媒体恢复。






SQL> shutdown
copy f:\cool\ctl_c\ctl.ctl f:\test1
copy f:\cool\ctl_c\ctl.ctl f:\test2
copy f:\cool\ctl_c\ctl.ctl f:\test3 SQL&gt;
conn /@test as sysdba Connected to an idle instance.
SQL&gt; startup mount
SQL&gt; recover database;
ORA-00279: change 690773 generated at 10/04/2002 09:59:31 needed for thread 1
ORA-00289: suggestion : F:\TEST\ARCH1.ARC
ORA-00280: change 690773 for thread 1 is in sequence #1


Specify log: {&lt;RET&gt;=suggested | filename | AUTO | CANCEL}
f:\cool\archb_c\arch1.arc
ORA-00279: change 690989 generated at 10/04/2002 10:04:11 needed for thread 1
ORA-00289: suggestion : F:\TEST\ARCH2.ARC
ORA-00280: change 690989 for thread 1 is in sequence #2
ORA-00278: log file ‘f:\cool\archb_c\arch1.arc’ no longer needed for this
recovery
…… ……
Log applied.
Media recovery complete.


 



(18)打开数据库,查看表demo.a,结果显示没有丢失时刻B和时刻C之间插入的数据7、8、9。






SQL> alter database open;
Database altered. SQL> select * from demo.a;
     I
———-
     1
     2
     3 
     7
     8
     9
     
6rows selected.


 



(19)马上做数据库的一致备份(冷备份或热备份)。

附加说明

另外要指出,如果忘记或不能提供时刻B的准确时间,可以查看报警日志文件,搜索”change”,找到系统更改号(SCN),也可在步骤(10)和步骤(16)中指定基于改变的恢复。命令格式如下:






recover database until change integer_scn [using backup controlfile]


 



注:integer_scn要用整数SCN替换。

本例中,数据库TEST的报警日志文件为f:\test\bdump\testALRT.log,在其中找到以下片段:






Fri Oct 04 09:57:15 2002
ALTER DATABASE RECOVER LOGFILE ‘ f:\cool\archa_b\arch22.arc’
Media Recovery Log f:\cool\archa_b\arch22.arc
Incomplete recovery done UNTIL CHANGE 690772
Media Recovery Complete
Completed: ALTER DATABASE RECOVER LOGFILE ‘f:\cool\archa_b
Fri Oct 04 09:59:31 2002
alter database open resetlogs


Fri Oct 04 09:59:31 2002
RESETLOGS after incomplete recovery UNTIL CHANGE 690772
Resetting resetlogs activation ID 1770840999 (0×698ce3a7)


 



由此可发现恢复到时刻B(2002-10-04:09:18:52)的SCN为690772,可以在不完全恢复中指定恢复到更改号690772,如下语句所示:






recover database until change 690773 using backup controlfile;


 



数据库执行过不完全恢复后,并在以RESETLOGS选项打开之前,SCN已经记录在报警日志文件中,也可以通过查询






select RESETLOGS_CHANGE#-1 from v$database;


 




找到SCN,这个结果与报警日志中的SCN相同,这样就可以恢复到该SCN。



1 2


 











关于本站 | 联络站长 | 意见、建议 | 业务合作 | 本站地图 | 广告服务 |









Copyright (C) 2003-2004 Oracle数据库在线 版权所有


2004年11月27日

http://www.itpub.net/showthread.php?threadid=126320

2004年11月24日

select dbms_flashback.get_system_change_number from dual;

2004年11月23日

在这里,我重点讲的是igenus的安装和调试,qmail的安装不再详细说明了。
我的系统环境:
系统: redhat 7.2
环境: qmail+mysql+vpopmail+qmailadmin
在安装之前,你要必须满足一下条件。
1、安装apache+php
2、安装qmail+mysql+vpopmail成功。
3、下载igenus_2_20030311.tgz (www.igenus.org)

首先,安装apache+php。我没有系统默认安装apache和php,因为要手工配置一下。
1、下载httpd-2.0.40.tar.gz (www.apache.org)
php4-200303121030.tar.gz (http://snaps.php.net)
# mkdir /home/software —把需要的文件放在software目录中。
2、安装apache
# cd /home/software/
# tar -zxvf httpd-2.0.40.tar.gz
# cd httpd-2.0.40
# ./configure –prefix=/var/www –enable-modules=so
# make
# make install
# vi /var/www/conf/httpd.conf
添加以下内容:

AddType application/x-tar.tgz
Addtype application/x-httpd-php .php
LoadModule php4_module /var/www/modules/libphp4.so

修改以下部分为:

DirectoryIndex index.php
DocumentRoot “/var/www/igenus”

User vpopmail
Group vchkpw

#vi /etc/rc.d/rc.local
添加:
/var/www/bin/apachectl start
注:使它开机自动启动。

3、安装php
# cd ../
# tar -zxvf php4-200303121030.tar.gz
# cd php4-200303121030
# ./configure –with-mysql –with-apxs2=/var/www/bin/apxs
# make
# make install
# cp php.ini-dist /usr/local/lib/php.ini
# vi /usr/local/lib/php.ini
register_globals =off 更改为:register_globals =on

(注:我编译APACHE,是使它支持DSO模块。然后编译PHP,将SO文件安装到你的APACHE的模块目录里,这样也方便以后扩展功能.)

接着,安装qmail+vpopmail+mysql+(qmailadmin可选)。在这里,就不详细的讲解它的安装了,大家可以参考其他的文献。对于初级用户,建议适用iceblood编写的qmail_setup-v1.5.3.tar.gz 或者
qmail_setup-v1.5.4a.stable.tar.gz,也是不错的。网上很多地方可以下载,也可以在论坛上和iceblood联系啊。如果用qmail_setup安装包的版本,解包后详细阅读install和setup文件,根据需要修改setup。
当安装完qmail+mysql+vpopmail时,要修改以下mysql的库文件的vpopmail databases。

# mysql -uroot -ppassword password—你的密码

在mysql中创建address表,具体表结构如下:
# use vpopmail
# create table address
(
id int(11) unsigned NOT NULL auto_increment,
pw_id int(5) unsigned NOT NULL default ‘0′,
name varchar(64) NOT NULL default ”,
email varchar(12 NOT NULL default ”,
UNIQUE KEY id (id),
KEY pw_id (pw_id)
);
修改原来的vpopmail表,方法如下:
use vpopmail;
alter table vpopmail drop primary key;
alter table vpopmail add column pw_id int(5) NOT NULL primary key auto_increment;

(注:添加address table,是因为要使用igenus中的个人通讯录,添加pw_id是因为igenus用它来标识用

户的唯一性的,但vpopmail用的是pw_uid)

最后,安装igenus.
1、安装igenus
# cd /home/software
# cp igenus_2_20030311.tgz /var/www
# cd /var/www
# mkdir temp
# chown vpopmail.vchkpw temp
# tar zxvf igenus_2_20030311.tgz

2、修改config/config_inc.conf文件。config_inc.conf是iGNEUS的配置文件,必须正确设置,具体设

置如下:
# vi /var/www/igenus

$CFG_BASEPATH = “/var/www/igenus”;
$ CFG_BASEPATH —–是iGNEUS webmail安装在系统的路径。

$CFG_MYSQL_HOST = ‘localhost’;
$CFG_MYSQL_HOST —–是mysql服务器的地址。

$CFG_MYSQL_USER = ‘root’;
$CFG_MYSQL_USER —–是mysql服务器的用户名。

$CFG_MYSQL_PASS = ‘123456′;
$CFG_MYSQL_PASS —–是mysql服务器的密码,根据你的实际填写

$CFG_HOSTNAME = “http://bsd.gic.ac.cn/mail/”;
$CFG_HOSTNAME—–是服务器的主机名,根据你的实际填写

$CFG_LANGUAGE = gb;
$CFG_LANGUAGE—–是系统默认语言,可有中英日可选。

$CFG_GMT = +8; // GMT time local
$CFG_GMT—-是时区设置,中国选+8。

$CFG_TEMP = $CFG_BASEPATH.”/../temp”;
$CFG_TEMP—-临时文件的位置。

3、修改默认登录域的设置,编辑login.php,查找以下字符,可设置你默认的邮件主机地址,可以设置多个。当然了,不改也可以的,略过这一步。

# vi /var/www/igenus/login.php

SIZE="10" STYLE="font-family: Tahoma">
@
webmail.readchina.com

好了,到这里,就全部结束了。
测试一下:
# /var/www/bin/apachectl start
# /home/vpopmail/bin/vadddomain mydomains.com –添加域
# /home/vpopmail/bin/vadduser test@mydomains.com –添加用户
你要是安装了qmailadmin,也可以从web添加用户。
浏览: httpd://domydomains.com ,就可以看到你的mail了。

后续:
今天太累了,看了一天的显示器,眼睛都快瞎了。就先写到这吧,有时间,我再把qmail+mysql+vpopmail的安装写一些。igenus可能在使用中还有一些需要根据你的实际情况要设置的,我会不断的补充上来的。由于写的匆忙,有什么问题,欢迎和大家讨论。在这里,也感谢论坛网友rocklzy的无私帮助。

【发表回复】【查看CU论坛原帖】【关闭】
wolf1980 回复于:2003-03-25 21:30:45
peng:
您太棒了。
我马上试一试

谢谢!!!!!!!!!!

自由世界就是么好!!!!!!!!!!

没办法!!!!!!!!!

好人太多!!!!!!!!!

henkon 回复于:2003-03-26 00:46:50
如果iceblood能做一个全部的安装包就好的 呵呵

白狐狸 回复于:2003-03-26 07:43:26
按照peng老大的做法,已经搞定igenus WEBMAIL,高兴啊,脱帽向peng老大致以崇高的敬意~~~~~

http://61.187.64.229/igenus/

test@lsedu.net
passwd: test

不过peng老大的文档还有少许错误,大家可要看认真喽,呵呵

peng 回复于:2003-03-26 09:52:39
to 白狐狸:
都有什么地发错啊?
赶快一一说明!
不然我可要放狗咬人了。:)

Lanyd 回复于:2003-03-26 10:01:37
真NB!
原来做在线邮局就这么简单呀,谢谢!!!

wmeng 回复于:2003-03-26 11:01:24
[quote:ec9093d43f="peng"]在这里,我重点讲的是igenus的安装和调试,qmail的安装不再详细说明了。
我的系统环境:
系统: redhat 7.2
环境: qmail+mysql+vpopmail+qmailadmin
在安装之前,你要必须满足一下条件。
1、安装apache+php
2……….[/quote:ec9093d43f]

老兄的这篇文章很不错
最近我也在看关于Qmail的设定,但是遇到了不少的问题。
能否大家一起讨论一下关于这方面,另外如何安全和优化呢?
谢谢

bsdbase 回复于:2003-03-26 15:56:16
[quote:f0957362aa="peng"]在这里,我重点讲的是igenus的安装和调试,qmail的安装不再详细说明了。
我的系统环境:
系统: redhat 7.2
环境: qmail+mysql+vpopmail+qmailadmin
在安装之前,你要必须满足一下条件。
1、安装apache+php
2……….[/quote:f0957362aa]

我,我,我 …….想要postfix下类似的实现~~ ops: ops:

peng 回复于:2003-03-26 16:42:13
to bsdbase:
应该是可以的,但要修改igenus的程序了。

Deepocean168 回复于:2003-03-30 03:45:53
peng老大,我用8.0,apache和php已经整合好,mysql在装系统时也搞定,iceblood的包也按照说明档装了(没装 httpd和sqwebmail),可是现在mysql和vpopmail好像关联不起来,mysql下面连vpopmail这个库都没有,怎么回事阿?
谢谢!^_^

神经到底 回复于:2003-03-31 06:32:49
本来我用qmail_setup安装的好好的了,看了peng的文章,我就开始了痛苦的探索……

首先我发现我用的_SQL=y选项根本不起作用,mysql里面根本就没有vpopmail这个数据库,我只好慢慢分析 setup script。

由于我的mysql版本是4.0.12max,我好像没看到哪里有 libmysqlclient.so.10 这个文件,因此在安装 qmail_setup的时候,我把 ‘find $_LIBDIR -name libmysqlclient.so.10′ 那一段检测去掉了,然后安装……可是不成功,vpopmail报告说“mysql server gone away… maybe gone with the wind”。

然后我不断乱试……包括单独编译每个包……还是没有成功

后来我终于我在安装包里面发现一个,就把它cp到/usr/lib里面,然后从新再安装……这回用vpopmail添加一个域,他说该域已存在,我要删掉那个域的时候,他又说该域不存在……真是很幽默!

结果我在计算机前面坐了一个通宵……

Deepocean168 回复于:2003-03-31 22:11:51
我也是同样得问题呀,郁闷很久了,难道iceblood的包里关于mysql的那段脚本真的有问题?没有理由呀,我仔细看过,里面关于vpopmail的那段参数设定并没有没涉及到的方面呀!

marinestat 回复于:2003-04-01 14:17:38
peng老大,好象是有错误啊。只能显示IGENUS。登陆显示如下错误:
Error create directory /var/www/igenus/var/www/temp,you must make /var/www/igenus/var/www/temp directory manual.Please read the INSTALL file.
Warning: Unknown(): Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0

求解

marinestat 回复于:2003-04-01 14:42:16
急~~~~~~~~~~~~~~peng老大在吗?联系qq:1411472

peng 回复于:2003-04-01 15:07:08
to marinestat :错误提示不是说得听清楚吗?
1、看看你的/var/www/temp 的权限,按照我的文档说得做了吗?
2、安装php时,有没有register_globals = on ?

to 神经到底:他说存在可能是在qmail的中设置了,qmail-setup我也没仔细看,但我用过,是可以用的。你最好都删除掉,重新安装。我也玉见过这种情况,我就是重新安装的,就没事了。

to Deepocean168:你的数据库更改用户和密码了吗?

Deepocean168 回复于:2003-04-01 15:49:28
多谢大麻!
问题已经搞定了,原来是vpopmail中mysql的root用户的密码跟mysql
本身root用户的密码不相同,我把iceblood包中的vpopmail解压看过了,里面的密码是secret,我想这里面不好改,于是就到 mysql中改root的密码为secret,并且把安装包里mysql的root用户密码也该成了secret(不知道有用没有),编译setup包后 mysql当中仍然没有自动生成vpopmail库,于是manual之,并按照大麻的提示在vpopmail库中创建address表,再去 /home/vpopmail/bin下添加域名跟用户,ok!mysql的vpopmail库vpopmail表中果然自动添加了域名跟用户!搞定!!!
真是感谢大麻,让我走出了一周来的阴影……..
3xing………….

marinestat 回复于:2003-04-01 15:51:41
谢谢PENG。解决了。

leaper 回复于:2003-04-01 23:57:18
好像不行,PHP+HTTPD 编译时通不过,!!!

marinestat 回复于:2003-04-02 11:04:39
为什么只能收不能发啊。郁闷

firer2000 回复于:2003-04-10 08:38:54
我在安装完成后用igenus登陆时总是无法通过身份验证!!这是什么原因。我看到自己建立的用户已经在vpopmail的表里面

kelei 回复于:2003-04-18 01:55:18
[quote:53f7ab7d72="firer2000"]我在安装完成后用igenus登陆时总是无法通过身份验证!!这是什么原因。我看到自己建立的用户已经在vpopmail的表里面[/quote:53f7ab7d72]

我也有同样问题,

在login.php中session_unset()后$domain被冲空,问题出在这里

但是我不懂php,不知道如何解决

哪位高手来援手?

haohaoo 回复于:2003-04-20 16:44:18
安装完qmail后,mysql中没有vpopmail这个库

lihn 回复于:2003-04-21 08:38:26
[quote:5ee82bc26a="白狐狸"]按照peng老大的做法,已经搞定igenus WEBMAIL,高兴啊,脱帽向peng老大致以崇高的敬意~~~~~

http://61.187.64.229/igenus/

test@lsedu.net
passwd: test

不过peng老大的文档还有少许错误,大家可要看认真?………[/quote:5ee82bc26a]
我在你的系统上注册了一个帐号但出错了:
vmysql: sql error[3]: Table ‘vpopmail.vpopmail’ doesn’t exist

xiaotuhzb 回复于:2003-04-24 16:55:53
[quote:f759cca0eb="Deepocean168"]我也是同样得问题呀,郁闷很久了,难道iceblood的包里关于 mysql的那段脚本真的有问题?没有理由呀,我仔细看过,里面关于vpopmail的那段参数设定并没有没涉及到的方面呀![/quote: f759cca0eb]

我也遇到上面同样的问题!

白狐狸 回复于:2003-04-25 08:46:55
[quote:24378ef5b9="lihn"]e ‘vpopmail.vpopmail’ doesn’t exist[/quote:24378ef5b9]

前些日子系统维护中,偶把邮件系统给重做了,呵呵

ncwangw 回复于:2003-04-25 20:19:51
白狐狸大侠,您好!
我下载的vqsignup只有用户名和密码功能,而您的还有输入真实姓名的功能,您能把修改过的vqsignup 给我一份吗?谢谢了    ncwangw@163.com
          

babodx 回复于:2003-04-30 03:01:55
我一登陆就出现如下错误
Warning: session_start() [function.session-start]: open(/tmp/sess_57574f710f602d4241c1581d07a59088, O_RDWR) failed: Permission denied (13) in /usr/local/apache/htdocs/igenus/login.php on line 37

Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at /usr/local/apache/htdocs/igenus/login.php:37) in /usr/local/apache/htdocs/igenus/login.php on line 37

garfy 回复于:2003-04-30 08:42:03
仔细看看login.php中该行怎么写的,是否和你的mysql一致。

haohaoo 回复于:2003-04-30 17:51:19
不知道peng老大那个注册的怎么做?
有没有忘记密码那项?

zengpx 回复于:2003-05-04 22:37:17
peng老大:

  请推荐几篇有关安装qmail+mysql+vpopmail的文章给我,好吗?

peng 回复于:2003-05-04 23:24:34
[quote:c4172e6036="zengpx"]peng老大:

  请推荐几篇有关安装qmail+mysql+vpopmail的文章给我,好吗?[/quote:c4172e6036]
正在点灯熬夜的写。:)

tony_list 回复于:2003-05-05 15:15:13
[quote:3f823b540e="Deepocean168"]我也是同样得问题呀,郁闷很久了,难道iceblood的包里关于 mysql的那段脚本真的有问题?没有理由呀,我仔细看过,里面关于vpopmail的那段参数设定并没有没涉及到的方面呀![/quote: 3f823b540e]

笨笨鸟 回复于:2003-05-05 16:40:52
[quote:a03605c484="神经到底"]本来我用qmail_setup安装的好好的了,看了peng的文章,我就开始了痛苦的探索……

首先我发现我用的_SQL=y选项根本不起作用,mysql里面根本就没有vpopmail这个数据库,我只好慢慢分析 setup script。

由于我的m……….[/quote:a03605c484]
确实有问题,你可以找到libmysqlclient.a,你只要把它复制一份,将文件名改为libmysqlclient.so.10。就可以了!

zengpx 回复于:2003-05-05 22:43:38
在此先感谢peng老大啦!

lcycc1 回复于:2003-05-06 08:57:17
[quote="peng"]
#vi/var/www/igenus/login.php

SIZE="10"STYLE="font-family:Tahoma">
@

应该是apache的问题!你是不是用的httpd2.*?
vi httpd.conf文件。
AddDefaultCharset ISO-8859-1 改为 AddDefaultCharset off
就ok了
其实不是apache的问题,是微软ie的问题,不标准。

ysb 回复于:2003-05-20 16:18:30
不想成为垃圾邮件的转发站!

hss202 回复于:2003-06-12 10:22:11
我的装好了,可以发信的时候却出来这个

Fatal error: Call to undefined function: mail() in /opt/www/igenus/include/send_fun.php on line 529

帮忙看看!!!谢谢
!!!

windblow 回复于:2003-06-16 08:19:04
我在用igenus登录后,出现错误提示不能进到邮箱界面,不知是什么原因,麻烦各位老大看看是什么原因呢?
Fatal error: Call to undefined function: mysql_connect() in /var/www/html/igenus/login.php on line 42

lzyking 回复于:2003-06-17 16:39:02
peng老大:我把一切都弄好了,用igenus发邮件也没问题,可是在发送附件的时候总是不能正常发送,这个问题该怎么解决呢?

wingger 回复于:2003-07-24 08:39:54
我不是应该重新安装php?

wingger 回复于:2003-07-24 08:37:26
错误:Fatal error: Call to undefined function: mysql_connect() in /var/www/html/igenus/login.php on line 42

我的邮件系统组成(linux,radhat9.0,mysql4)qmail+mysql+vpopmail+cmd5checkpassword+qmailadmin+ezmlm
+autorespond.
我的邮件系统收发正常,smtp验证也可以用,qmailadmin也正常,
但是igenus就是不能用。
一登陆就出现上述错误

czc9 回复于:2003-08-08 14:47:46
我的是出现如下问题
Warning: mysql_connect() [function.mysql-connect]: Access denied for user: ‘root@dbsvr’ (Using password: YES) in /var/www/igenus/login.php on line 42

Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in /var/www/igenus/login.php on line 43

czc9 回复于:2003-08-08 21:12:39
经过重装系统,现在已经完全搞好了,上面的哪个问题也没有了。我现在也不知道是什么原因。太感谢PENG了

yeeler 回复于:2003-08-12 00:56:29
我也遇到过,神经到底兄的问题,没有坐1晚,我重装了。上次安装被中断,结果,删么说不存在,./vdominfo 么 关于这个域的信息都在,郁闷坏了。
其实这些东东都在mysql的vpopmail库里。进入mysql,drop database vpopmail; 就ok了 呵呵。

netocool 回复于:2003-09-24 22:16:20
[quote:7847541ece="windblow"]我在用igenus登录后,出现错误提示不能进到邮箱界面,不知是什么原因,麻烦各位老大看看是什么原因呢?
Fatal error: Call to undefined function: mysql_connect() in /var/www/html/igenus/login.php on line 42[/quote:7847541ece]

在第二张碟那里找到php-mysql-xxxxx
rpm -vih php-mysql-xxxxx
就OK拉




[Oracle] ORA-03113错误分析与解决

作者:Fenng
日期:13-Oct-2004 
出处:http://www.dbanotes.net
版本:0.04 ($$ 2003-05-22 v0.1 $$ 2003-12-17 v0.3$$)





前言


每一个DBA在进行数据库管理的过程中不可避免的要遇到形形色色的错误(ORA-1547 ,ORA-904,ORA-1578 ……)。有些错误由于频繁出现、原因复杂而被 Oracle DBA 们戏称之为”经典的错误”。其中ORA-3113 “end of file on communication channel” 就是这样的一个。

我们可以简单的把这个错误理解为Oracle客户端进程和数据库后台进程连接中断。不过,导致这个错误的原因实际上有很多种:对数据库设置不当、任何能导致数据库后台进程崩溃的行为都可能产生这个错误。这个错误的出现还经常伴随着其它错误,比如说:
ORA-1034 ORACLE not available
此外,该错误出现的场景复杂,可能出现在:


  • 启动的Oracle的时侯
  • 试图创建数据库的时侯
  • 试图对数据库进行连接的时侯
  • 在客户端正在运行SQL/PL/SQL的时侯
  • 备份/恢复数据库的时侯
  • 其它一些情况下......
在论坛上也时常可以看到初级DBA对这个问题的求救。在这里简单的对该问题进行一下整理。


错误原因种种


根据网络上大家反映的情况来看,错误原因大约有这些:

  • Unix核心参数设置不当
  • Oracle执行文件权限不正确/环境变量问题
  • 客户端通信不能正确处理
  • 数据库服务器崩溃/操作系统崩溃/进程被kill
  • Oracle 内部错误
  • 特定SQL、PL/SQL引起的错误
  • 空间不够
  • 防火墙的问题
  • 其它原因
在开始解决问题之前,作如下几件事情:

  • 回忆一下在出现错误之前你都做了什么操作,越详细越好;
  • 查看 background_dump_dest 目录中的 alertSID.log 文件也是你必须要的事情;
  • 用Google.COM 搜索一下,在互联网上有很多信息等着你去发现,不要什么都问别人。
当然, 如果你找到了一些对你更有帮助的东西–这篇文档就不用看了 :-)


错误原因情景分析




  • Unix核心参数设置不当 / init参数设置不当

如果数据库在安装过程中没有设定正确的操作系统核心变量,可能在安装数据库文件的时侯没甚么问题,在创建数据库的时侯常常会出现03113错误。和此有关的另一个原因是init.ora 参数文件中的processes参数指定了不合理的值,启动数据库导致错误出现(当然这个归根到底也是核心参数的问题)。

这个错误信息一般如下:
ORA-03113: end-of-file on communication channel
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
解决办法有两个:

1、修改核心参数,加大相应核心参数的值(推荐);
2、减小init.ora参数的Processes的值。

需要注意的是:

SEMMSL必须设定为至少要10 + ‘进程数的最大值’;
SEMMNS 也依赖于每个数据库上的进程参数值。

注:

这个错误类型只在Unix平台上出现。在Windows上如果processes的值过大,则会出现类似如下的错误:
ORA-00068: invalid value 24200001 for parameter max_rollback_segments,
must be between 2 and 65535

/* 此时指定的参数值超过了65535 */

或者
ORA-27102: out of memory 
/* 小于65535的一个大参数值 */ 软件环境:
Windows 2000 Version 5.0 Service Pack 3, CPU type 586
ORACLE RDBMS Version: 8.1.7.0.0

在特定平台上更改核心参数可能会有差别,请参考Oracle Technet(http://otn.oracle.com) 上的安装文档。对特定Unix平台的安装文档也有对核心参数意义的解释。 Init.ora中的参数如果设置不当,会产生该错误。有经验表明:shared_pool_size设置过小会出现错误,此外timed_statistics=true的设置也会带来问题。


  • Oracle执行文件权限不正确/环境变量问题

这个问题只出现在Unix平台上。常见情况是有的时侯管理员为了方便而使用Unix的tar命令处理过的压缩包进行的安装,或者是系统管理员指定了额外的OS用户也可以管理数据库却没有指定正确的环境变量。
Oracle执行文件在$ORACLE_HOME/bin目录下,如果出现问题,应该用如下Unix类似命令来纠正 :
#chmod 7755 $ORACLE_HOME/bin/oracle
有的时侯要对Oracle进行relink操作。
在Unix上通过cp拷贝安装的时候,常常会出现环境变量的问题,和个别执行程序连接问题。 LD_LIBRARY_PATH如果设置的不正确会导致问题,在这种情况下,需要对Oracle进行relink。如果可执行文件oralcle被破坏,也要对其relink。 如果安装了并行服务器选项而Distributed Lock Manager没有安装或正确运行也会导致错误。


  • 客户端通信不能正确处理

1.SQL*Net驱动器的问题:

如果使用的版本比较低的驱动器,请更换到新版本的驱动。 SQL*Net 的驱动没有连接到Oracle可执行文件会导致错误。
2.检查TCP/IP网络是否通畅;
3.Windows平台的常见网络问题:

在Windows平台创建数据库的时侯,如果出现该问题可以考虑用如下的方法:

首先检查本地网络设置.查看网络上是否有同名的结点或有冲突的IP.如果问题依旧,可以保守的用下面的方法:

1). 禁用网卡:将本地连接状态改为禁用;
2). 将sqlnet.ora文件打开(以记事本形式)将nts验证注释掉:
#SQLNET.AUTHENTICATION_SERVICES= (NTS)
3). 创建数据库;
4). 创建成功后,恢复本地连接;


  • 数据库服务器崩溃/操作系统崩溃/进程被异常的Kill

在连接过程中,如果Oracle数据库的服务器崩溃或者数据库所在的操作系统崩溃,就会出现这 个错误,Oracle Server崩溃的原因可能因为主要后台进程死掉,被错误的进行了Kill操作。如果是这个原因还是比较容易解决的。此外,和OS有关的应用程序存在内存泄漏(或者有病毒)的时侯也会导致Oracle后台程序问题。 推荐排错步骤:

  • 1、 查看应用软件相关进程是否正常运行;
  • 2、 查看有无内存泄漏;
  • 3、 查杀病毒;
  • 4、 确定系统管理员没有进行误操作;
  • 5、 确定无黑客入侵行为;
  • 6、 其它不确定因素......


  • Oracle 内部错误 / Bug

如果查看background_dump_dest目录中的alert.log发现有ora-600/ora-07445等错误,可以到Metalink站点上查看具体信息及其解决方案。一般情况下要打软件补丁。


  • 特定SQL、PL/SQL引起的错误

尝试把SQL进行分开执行,也可以用SQL_TRACE来进行跟踪,找到导致问题的SQL语句。在SQLPlus下:
ALTER SESSION SET sql_trace=TRUE;
SQL语句中的非法字符和不合理的处理结果,甚至一些不可解释的原因偶尔会带来问题.
SQL问题举例:
SELECT *
FROM (SELECT ROWNUM AS num, k.*
FROM (SELECT a.cp_code, c.cp_cha_name, a.service_code,
a.service_name, a.content_name,
SUBSTR (a.access_time, 1, 8) thedate,
COUNT (*) AS hit_count
FROM sm_wap_log_daily_tab a, t_cp_info c
WHERE (SUBSTR (a.access_time, 1, 8) BETWEEN ‘20040301′
AND ‘20040304′
)
AND c.cp_code LIKE ‘%%’
AND a.cp_code = c.cp_code
AND a.service_code LIKE ‘%%’
GROUP BY a.cp_code,
c.cp_cha_name,
a.service_code,
a.service_name,
a.content_name,
SUBSTR (a.access_time, 1, 8)
ORDER BY a.cp_code,
a.service_code,
a.content_name,
SUBSTR (a.access_time, 1, 8) DESC) k) n;
上面这条语句在9204/Linux 系统上始终出现03113 的错误。对语句进行细化,分成小一点的子语句逐步执行,最后判定问题出现在
                 ORDER BY a.cp_code,
a.service_code,
a.content_name,
SUBSTR (a.access_time, 1, 8) DESC) k) n;
中的 SUBSTR (a.access_time, 1, 8) 这里。去掉SUBSTR (a.access_time, 1, 8)则问题不再出现。尝试调整SUBSTR (a.access_time, 1, 8) 的位置,语句得到通过。之后,顺便优化一下该语句。:) 
SELECT *
FROM (SELECT ROWNUM AS num, k.*
FROM (SELECT a.cp_code, c.cp_cha_name, a.service_code,
a.service_name, a.content_name,
SUBSTR (a.access_time, 1, 8) thedate,
COUNT (*) AS hit_count
FROM sm_wap_log_daily_tab a, t_cp_info c
WHERE (SUBSTR (a.access_time, 1, 8) BETWEEN ‘20040301′
AND ‘20040304′
)
AND c.cp_code LIKE ‘%%’
AND c.cp_code = a.cp_code
AND a.service_code LIKE ‘%%’
GROUP BY a.cp_code,
c.cp_cha_name,
a.service_code,
a.service_name,
a.content_name,
SUBSTR (a.access_time, 1, 8)
ORDER BY (SUBSTR (a.access_time, 1, 8)),
a.cp_code,
a.service_code,
a.content_name DESC) k) n;


  • 系统空间不够

任何时侯都要确保数据库系统有足够的空间.如果 USER_DUMP_DEST和BACKGROUND_DUMP_DEST没有剩余空间的话,会导致此问题.此外,如果打开了审计,AUDIT目录要由足够的空间.如果激活了Trace的话,Trace目录要由足够的空间. Dave Wotton的文档 (Local Copy) 表明,在对表进行插入数据的时侯,如果文件超过了2G (而文件系统有2G限制),会导致该问题.


  • 防火墙的问题

如果数据要通过防火墙,请联系系统管理员,询问是否对数据库数据进行了过滤或者是突然禁止了通信端口。如本地安装有个人防火墙,请检查本地设置。


  • 其它方面说明

导致这个错误的原因有很多种,上面列到的只是一些典型情况。经常去一些数据库技术论坛可能会有帮助。比如说ITPUB( http://www.itpub.net)、CNOUG(http://www.cnoug.org)等。

参考信息


Metalink – http://metalink.oracle.com Oracle的技术支持站点,要有CSI号码才可以登录。
参考Note编号:
Note:17613.1	ORA-3113 on Unix – What Information to Collect
NOTE:131207.1 How to Set UNIX Environment Variables
Note:131321.1 How to Relink Oracle Database Software on UNIX
Note:22080.1 An Introduction to Error Message Articles
http://www.jlcomp.demon.co.uk/faq/ORA-3113.html
技术专家Jonathan Lewis的站点上的一则FAQ





本文作者

Fenng,某美资公司DBA,业余时间混迹于各数据库相关的技术论坛且乐此不疲。目前关注如何利用ORACLE数据库有效地构建企业应用。对Oracle tuning、troubleshooting有一点研究。
个人技术站点:
http://www.dbanotes.net/ 。可以通过电子邮件 dbanotes@gmail.com 联系到他。



原文出处

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

回上页<-|->回首页



All Articles (by Fenng) are licensed under a
Creative Commons License.
I would welcome any feedback. Please send questions, comments or corrections to dbanotes@gmail.com
Valid XHTML 4.01 / Valid CSS

2004年11月20日








去除您企業中的惱人頭皮屑:
IBM Lotus Notes/Domino 6內含的反垃圾信件新功能介紹

 




這篇文章的預設閱讀對象是Lotus Notes系統管理工程師,要向大家介紹的本文重點摘要如下:
(一)﹑何謂垃圾信件?對企業有什麼樣的衝擊?
(二)﹑IBM Lotus Notes/Domino R5(目前版本)處理垃圾信件的現行方式與實際運作時的困擾。
(三)﹑即將上市的新版IBM Lotus Notes/Domino 6推出了哪些反垃圾信件的新功能。

讓我們直接切入要介紹的主題。

(一)﹑何謂垃圾信件?對企業有什麼樣的衝擊?


所謂垃圾信件就是不請自來的郵件(英文為unsolicited commercial email (UCE),electronic junkmail或spam)。讓我們先把焦點放在國外媒體的相關報導,來看看垃圾信件對企業有什麼樣的影響:

1.
InfoWorld根據META Group的統計(“No Spam Shortage Here,” META Group, May 2002)撰文:『企業來自網際網路的電子郵件中可被歸類為垃圾信件的比例約2%~10%,此比例未來五年將成長到10%~20%。中型規模的企業每天約收到二萬封垃圾信件,如果員工處理一封垃圾信件要花30秒,上述企業一天得花約167小時處理垃圾信件』。筆者估算假設一天工作8小時,企業需僱用21位員工來專職處理垃圾信件。

2.
NetworkWorldFusion引述Osterman Researc公司的預測:『一個有五千名員工的企業,一年的垃圾信件總量可達一千五百六十萬封,處理如此數量的垃圾信件其花費可達每年美金三十四萬四千元(約台幣一千二百萬元)』。

3.
網站www.cw360.com2002年8月14日刊載一篇標題為” IT staff top e-mail abuse table”的短文中,引用了NOP對100家英國各行業大型企業的問卷調查結果:”就算懷疑來信內容可能有問題,69%的受訪對象還是會開啟這封信。42%會轉呈給他人與工作無關的信件”。企業員工對電子郵件的濫用抱持著漫不經心的態度。

除了浪費時間與生產力外,垃圾信件擠爆了郵件伺服器、網路、員工信箱都會耗損可貴的IT資源、LAN頻寬也嚴重的影響網路與伺服器的效能。若系統管理人員一個不小心,讓有心人士把自己公司的郵件伺服器當成垃圾信件的發送源,可能因此造成公司郵件伺服器的IP位址被列入網路黑名單;變成網路SMTP郵件的拒絕往來戶。這樣對公司商譽的損害與因郵件被他人拒絕轉送或接收所流失的商機都有可能讓企業付出慘痛的代價。這就是為什麼IBM的Lotus Notes/Domino 6(以下簡稱ND6,預定2002年9月底前上市)在宣告此產品中內建了讓人注目的反垃圾信件的新功能時,不僅立刻獲得全美媒體的關注,也在英﹑德﹑義大利與丹麥等地被廣泛的報導(有興趣的讀者可連線下列網址,由該?W頁上的連結去閱讀各地媒體的文章)。

http://www.lotus.com/news/news.nsf/link/2ndspamstory

(二)﹑IBM Lotus Notes/Domino R5(目前版本)處理垃圾信件的現行方式與實際運作時的困擾。


IBM Lotus Notes/Domino R5在處裡垃圾信件的功能上,筆者分成伺服器端與工作站端的現有做法簡述如下:



【圖一 Domino R5公用通訊錄的架構文件中與外來郵件轉送控制相關的欄位】

 


在R5 Domino伺服器端處裡垃圾信件的現有做法:
系統管理人員可經由公用通訊錄(正確的名稱應該叫做Domino目錄或Domino名錄,不過因為只要是Notes工程師都聽得懂,筆者就沿用舊的稱呼)中的架構文件去指定Domino 的SMTP允許/拒絕可與自己連線的對象(圖一中標為的欄位,指定方式可以是IP位址﹑主機名稱或網域名稱),以及指定Domino 的SMTP允許/拒絕外來郵件可轉送的目的地(圖一中標為的欄位,指定方式可以是網域名稱﹑IP位址或主機名稱)。

在R5 Notes工作站端處裡垃圾信件的現有做法:
使用者可在自己的郵件檔中設定郵件規則(mail rules,如圖二所示):指定對符合所設規則的外來郵件所要進行的動作。舉例來說,使用者可以指定:外來郵件的主旨如果包含特定字串的話就刪除此信件。



【圖二 R5 Notes工作站可在郵件檔中指定郵件規則來處理垃圾信件】

 


上述分進夾擊的做法在實際運作時有哪些困擾呢?雖在伺服器端系統管理人員能夠以網域名稱﹑IP位址或主機名稱為設定條件來拒絕轉送外來郵件,但是仍有下列不足之處:













1.
狡詐的垃圾信件寄信人會不斷的變換各種方式來傳送垃圾信件,系統管理人員實務上很難找出一套通用且有效的過濾機制來全面防堵。更何況嚴苛的設定條件也有可能傷及無辜,甚或將往來重要客戶的郵件也視同垃圾信件處理而引起不必要的困擾。

2.
現行作業方式是由Domino R5伺服器上的郵件路由器(mail router)將外來郵件收入伺服器的mail.box後,再進行外來郵件是否為垃圾信件的判讀:如果是垃圾信件就將其視為dead mail而不再轉送。當有大量垃圾信件湧入時,路由器雖不轉送這堆垃圾信件,但郵件伺服器的mail.box中也因而殘留了一大票的dead mail要系統管理人員設法善後,增加了管理上的負擔。

3.
若在郵件伺服器上未做嚴格的過濾防堵,下一個關卡就是在漏網信件送達使用者郵件檔後,由使用者所設定的郵件規則來把關。當然使用者對是不是垃圾信件的判斷會更精準,且所設規則應該更符合個人需求。但讓我們面對人性吧!除非是每隔數十分鐘就不斷收到同樣來源的垃圾信件,否則真的會費心去設定過濾規則的使用者畢竟為數不多。更何況當垃圾信件真的送入使用者郵件檔後,前述所有對企業有不利影響的衝擊(時間﹑金錢﹑IT資源﹑員工浪費的生產力…)都已呈現;縱使能在使用者郵件檔中刪除此垃圾信件,我想這種結果也不能宣稱:在反垃圾信件的戰爭中已贏得了光榮的勝利吧!

(三)﹑即將上市的新版IBM Lotus Notes/Domino 6推出了下列反垃圾信件的新功能:
 

1. 新增伺服器端的外來郵件轉送管控權。
2. 新增『網路黑名單(public black-hole lists) 』的支援機制。
3. 新增伺服器端的『郵件規則』。
4. 新增『驗證寄給內部網域郵件的收件人地址必須出現於公用通訊錄』的功能。

 

當市面上的競爭友商(微軟等)還將垃圾信件的管控定位在用戶端的層次,把處理垃圾信件視為是使用者的職責(或是將反垃圾信件的功能視為是協力軟體開發夥伴的商機);ND6已將反垃圾信件的戰場提昇到伺服器的層次,在伺服器中內建了各類反垃圾信件的搭配機制。在反垃圾信件的處理過程中,在垃圾信件的發信端嘗試與Domino郵件伺服器連線﹑對方的垃圾信件還未送出前,ND6就可經由『網路黑名單』的機制(細節後述)判斷對方是垃圾主機而切斷其連線。想想看,垃圾信件的影子都還沒看到,連線送信方就已被拒絕!這與其他產品還要等到把來信收入郵件伺服器的mail.box或分送到使用者郵件檔後才做處理,功能高下是否一目了然呢?萬一還有漏網之魚鑽過這第一道防線,ND6在伺服器上還有其他的數套機制可解決此”火網餘孽”。在郵件伺服器上就解決垃圾信件的ND6特性(斃敵機先!),除了可以減少企業在管理﹑維護垃圾信件所需負擔的成本外,也大幅降低了垃圾信件帶給使用者的困擾(理想境界是使用者在自己的郵件檔中根本沒有收到垃圾信件的機會)。

 

以下的敘述中筆者會刻意的用”外來郵件(incoming mail)”來取代”垃圾信件(spam mail)”這個名詞,主要原因是後述ND6的新功能並不專門只為處理垃圾信件而存在,而是可做為所有外來郵件的處理機制-當然垃圾信件也算是一部份的外來郵件。ND6在外來郵件的管理上提供了下述新功能:

 

新增伺服器端的外來郵件轉送管控權


現行R5版本中,外來郵件的轉送控管(delivery control)機制預設都只作用在外部網域(external domain)郵件上,內部網域(internal domain)郵件會跳過此轉送控管的機制。
ND6在公用通訊錄內的架構文件(configuration document)上新增了三個欄位(如圖三所示),讓系統管理人員自行決定內部網域郵件是否要納入轉送控管的機制中。



【圖三 ND6外來郵件的新增轉送管控權】


 

圖三中的第一個欄位perform Anti-Relay enforcement for those connection hosts,其可用選項為:












”External hosts”:採用此選項代表轉送控管機制僅作用於外部網域郵件。
”All connection hosts”:採用此選項代表外部網域郵件與內部網域郵件都接受轉送控管的機制。
”None”:採用此選項代表停用轉送控管機制(不作用於任何內部網域或外部網域的外來郵件)。

 

圖三中的第二個欄位Exclude these connecting hosts from anti-relay check: 此欄位讓您指定哪些IP位址?蛑鳈C名稱(host name)不需進行外來郵件的轉送控管檢查。

圖三中的第三個欄位Exceptions for authenticated users的可用選項為:










“Perform anti-relay checks for authenticated users”:不管外來郵件的寄信人是否有身分認證資料,一律要做外來郵件的轉送控管檢查。
“Allow all authenticated users to relay”:如果外來郵件的寄信人有身份認證資料(經由ISP連線的POP3或IMAP使用者通常都有身份認證資料)的話,就不作外來郵件的轉送控管檢查。

圖三所示欄位如有異動,儲存後必須下達伺服器主控台命令>Tell SMTP UPDATE CONFIG或>Restart TASK SMTP,所做的修改才能生效。

 

新增『網路黑名單(public black-hole lists) 』的支援機制

 

為防止垃圾信件在網路上的不當流竄,已有某些機構去主動的偵測﹑紀錄與確認網路上有哪些伺服器在協助散發垃圾信件,並將確認後的發信源頭IP位址記錄在自己的黑名單資料庫中(有些機構在偵測到某伺服器是可能的”嫌疑犯”後,會主動通知此伺服器的管理者,保留一段時間讓對方可以申訴或改善。如果沒有回應或寬限期過後對方仍依然故我,就會將其打入黑名單中)。地點設在美國加州RedWood市的Mail Abuse Prevention System LLC (MAPS)就是這樣的一個非營利組織。ISP(比如說國內的Hinet或Seednet)或企業的郵件系統管理者可以與這些組織連線,即時存取其黑名單資訊(IP位址清單),將得到的黑名單當成是拒絕垃圾信件的依據。這種網路黑名單的機制對郵件管理者而言解決了長期以來的煩惱:”如何找到有效的過濾規則來識別寄信方是否在散發垃圾信件!”有了上述性質的各類組織,黑名單的識別﹑維護由它們負責,郵件系統管理者只需與其連線使用其服務,並管好自己的伺服器﹑善盡不要轉發垃圾信件的管理責任。不過在您考慮運用這套機制作為伺服器上防堵垃圾信件的可能方法之一時,筆者要提醒您必須慎重的考慮您所選用的這些組織是否是以很嚴謹的態度來做黑名單的查證工作(您可以連線到該組織的首頁,去查看它的黑名單認列政策來確認此組織的作業程序)。某個IP被列名在某個組織的黑名單中並不意味著該IP一定在散播垃圾信件。輕信一個草率行事亂列黑名單的組織,有可能會讓您將合法對象(可能是您的重要客戶)的來信誤認為垃圾而拒絕接收。若因此而引發後續影響時,系統管理人員能夠以”那是某組織的作業不小心…”而因此卸責嗎?
 



【圖四 ND6『網路黑名單(public black-hole lists) 』的支援機制】
 


ND6用圖四所示,公用通訊錄內架構文件中的四個欄位來支援網路黑名單的機制(圖四中的欄位在修改儲存後,需下達伺服器主控台命令>Tell SMTP UPDATE CONFIG或>Restart TASK SMTP,所做的修改才能生效)。

 















圖四的第一個欄位DNS Blacklist filters,其可用選項為:











Enabled:選用此選項代表對外來郵件要做網路黑名單的比對。
Disabled:選用此選項代表對外來郵件不做網路黑名單的比對。

 

圖四的第二個欄位DNS Blacklist sites:您在此欄位中輸入提供網路黑名單組織的網址。當您經由前一個欄位啟用網路黑名單的比對功能後,對每一個外來的SMTP連線要求,Domino都會對列名於此欄位的每一個網址發出黑名單的查詢要求(依由左而右的順序,若已由前面的網址得知對方為”垃圾主機”,Domino就不再向下一個網址查問)。為了效能考量,您應避免在此欄位中輸入過多網址。

 

圖四的第三個欄位Desired action when connecting host is found in a DNS Blacklist,其可用選項為:














Log:若偵測到外來郵件的送信主機列名於黑名單時,此選項仍接收這封有可能為垃圾信件的郵件,並在伺服器主控台上顯示送信主機的名稱﹑IP位址以及將此主機列入黑名單的組織網址(在Notes日誌檔中也會留存相同的記錄)。
Log and tag message:此選項與除了採取與前述Log選項相同的作業方式外,再加一個額外的動作:在被處理的郵件上多加一個名為$DNSBLSites的欄位,在此欄位內儲存將此連線主機列入黑名單的組織網址。
Log and reject message:若偵測到外來郵件的送信主機列名於黑名單時,拒絕對方的連線(不會在mail.box中留下dead mail),並將錯誤訊息(由下一個欄位設定)回傳給該連線主機。

 

圖四的第四個欄位Custom SMTP error response for rejected messages:當偵測到對方列名於黑名單而拒絕對方連線時,您在此欄位中輸入要回傳給被拒主機的錯誤訊息。預設值會回應傳被拒主機的IP位址與將對方列為黑名單的組織網址,再加上” the connection was denied for policy reasons”。您可以在此欄位中自訂回應訊息。自訂資訊中您可使用第一個%s來代表被拒主機的IP位址,第二個%s則代表將對方列名於黑名單的組織網址。以下為使用範例:

 


若您在本欄位中輸入”Your host %s was found in the DNS Blacklist at %s”。被拒主機所收到的錯誤訊息會是”Your host 127.0.0.2 was found in the DNS Blacklist at blackholes.mail-abuse.org”。
 

新增伺服器端的『郵件規則』(Server mail rules)


在外來郵件送達郵件伺服器時,系統管理人員可經由如圖五所設定的伺服器郵件規則來告訴路由器,對符合所設規則的外來郵件所應進行的處理方式(繼續傳送且將來信存於指定的資料庫;拒絕接收;停止傳送且將其刪除;停止傳送但將來信存於mail.box內)。舉例來說,您可以經由伺服器郵件規則來指定:如果來信的主旨包含特定字串﹑或來信附加檔的附檔名為.vbs,就將這些外來郵件如空中抓飛鳥般的刪除(若您在伺服器上安裝了Domino掃毒軟體,這些郵件規則發生在掃毒軟體還未作用前;換句話說,在掃毒軟體還不知道有這些郵件前,指定郵件就被郵件伺服器”一槍斃命”的處理完畢)。

您可在公用通訊錄內對應伺服器的架構文件中設定伺服器郵件規則((如圖五所示,儲存後需下達伺服器主控台命令>Tell SMTP UPDATE CONFIG或>Restart TASK SMTP,所做的修改才會生效)。



【圖五 ND6伺服器端的『郵件規則』】

 


在圖五的新增規則對話方塊中,系統提供下列內建規則(可選用的過濾條件):Sender, Subject, Body, Importance, Delivery priority, To, CC, BCC, To or CC, Body or subject, Internet domain, Size (in bytes), All documents, Attachment name, Number of attachments, Form, Recipient count, or Any recipient。對符合所設規則的外來郵件,系統提供下列可選用的內建動作:

 

Journal this message
當您經由郵件伺服器的架構文件啟用了此伺服器的”Mail Journaling”功能後(如圖五A所示);對符合所設規則的外來郵件,選用這個選項除了告訴系統依正常程序繼續作業外(也就是說,路由器繼續傳送或轉送這封暫存於伺服器的mail.box的郵件後,將處理完畢的郵件由伺服器的mail.box中刪除),還會將符合所設規則的外來郵件儲存到(圖五A的Database Name欄位)指定的資料庫中。



【圖五A 啟用ND6郵件伺服器的mail journaling功能】


 

Move to database
選用此選項時,系統會將符合所設規則的外來郵件自伺服器的mail.box中刪除,不再傳送轉送這封郵件;而且會將此郵件儲存到伴隨此選項而出現的欄位所指定的(事前已存在的)資料庫中


Don’t accept message
選用此選項時,系統不接收符合所設規則的外來郵件,不再傳送轉送這封郵件,將其自伺服器的mail.box中刪除,還會回傳”SMTP permanent error code”(錯誤代碼為5XX)給送信主機。


Don’t deliver message
選用此選項時,系統會接收符合所設規則的外來郵件,不再傳送轉送這封郵件,接著會根據伴隨此選項而出現的額外選項(Silently delete或Send NDR)來決定後續的動作。

 










Silently delete:將此郵件自伺服器的mail.box中刪除,不傳送任何訊息給寄件人與收件人。

Send NDR:將此郵件自伺服器的mail.box中刪除,將傳送失敗報告(NDR, Non-Delivery Report)回給寄件人。

 

Change routing state
選用此選項時,系統接收符合所設規則的外來郵件,不再傳送轉送這封郵件,將此郵件留存於伺服器的mail.box中,根據伴隨此選項而出現的額外選項(Mark as held或Mark as dead)來決定此郵件在mail.box內的狀態(之後就靜待系統管理人員來決定這些留存在mail.box中的郵件後續該如何處理)。

 










Mark as held:將郵件的RoutingState欄位設為”HOLD”。

Mark as dead:將郵件的RoutingState欄位設為”DEAD”。

 

新增『驗證寄給內部網域郵件的收件人地址必須出現於公用通訊錄』的功能

此項功能的目的是:當寄給內部網域的收件人地址不存在於公用通訊錄時,讓Domino回應550錯誤碼(表示來信的收件人為未知的使用者)給送信主機,同時將來信由伺服器的mail.box內刪除。
您可在公用通訊錄內對應伺服器的架構文件中設定此功能(如圖六所示,儲存後需下達伺服器主控台命令>Tell SMTP UPDATE CONFIG或>Restart TASK SMTP,所做的修改才會生效)。



【圖六 ND6驗證寄給內部網域郵件的收件人地址必須出現於公用通訊錄】

筆者在2002年8月台灣的電腦專業媒體上看到微軟所刊登的一頁廣告,雖其原本訴求是電腦病毒,但也很適切的陳述了垃圾信件對企業的威脅。筆者摘述如下:『”I LOVE YOU”;只是一封情書,已經讓全球企業付出巨額代價。病毒從來不會預告,當你按下按鍵的瞬間,你永遠不知道只是打開檔案,還是同時為病毒開啟了大門。所以在下一場電子生化戰發生前,最好的做法是趁早鞏固你的防線。…』


根據IBM Lotus 訊息解決方案副總經理Ken Bisconti表示:『每個企業用戶平均一年會收到約一千五百封垃圾信件;ND6的新增功能會協助郵件系統管理者,在垃圾信件還沒送到使用者郵件檔前,先行於郵件伺服器上就將垃圾信件殲滅。』


筆者希望經由這篇文章,讓有興趣吸收新知的Notes工程師於繁忙工作之餘,能一探即將上市的新版ND6的部分功能(二千多個新增或強化功能中的個位數)。垃圾信件危害之烈,已成為企業必須正視並向其宣戰的網路公害。除非您不與網際網路連線,否則找到有效的垃圾信件解決方案必然是IT部門的焦點任務之一。希望本文介紹防制垃圾信件的ND6新功能,已讓您看到烏雲背後所透出的曙光。