eygle.com   eygle.com
eygle.com  
 

« October 25, 2006 | Blog首页 | October 27, 2006 »



October 26, 2006

Oracle10.2.0.2强制性补丁发布通知

作者:eygle

出处:http://blog.eygle.com

刚刚收到Oracle的一个强制性补丁发布通知,该补丁用来修正10.2.0.2中的一个严重Bug。
如果不应用这个补丁,后续的Patch将无法生效:
邮件转载如下:

Dear Valued Customer,

You are being sent this email because you have downloaded the 10.2.0.2 RDBMS server patchset for Sun Sparc Solaris 64-bit from www.metalink.com.

Please note that Patch 5117016 is a MANDATORY PATCH required to be installed and run immediately AFTER installation of the 10.2.0.2 Patch Set on Sun Sparc Solaris 64-bit. This patch fixes a known issue in 10.2.0.2 Patch Set on Sun Sparc Solaris where the libserver10.a library is installed incorrectly into $ORACLE_HOME/rdbms/lib instead of into $ORACLE_HOME/lib.

Any patches applied without Patch 5117016 installed must be backed out, Patch 5117016 must be applied and then the patches reinstalled.

Not applying the patch can cause subsequent problems such as:

Applying patches on top of 10.2.0.2 may have no effect.
Changing the DBA user or SGA attach address may have no effect
Further details on this issue can be found in ALERT Note 394933.1

Thank you,
Oracle Support Services


P.S. Please do not reply to this email as this email account is not monitored. If you require further assistance, please use MetaLink, https://metalink.oracle.com, to submit a Service Request.

这个邮件中存在太多显而易见的错误,例如 www.metalink.com 根本不是Oracle公司的网址,这些错误差点让我以为这是封钓鱼邮件,还好在Metalink上找到了相关说明

看来Oracle公司写邮件也太不严格。

-The End-

Posted by eygle at 12:03 PM | Comments (1)


UTL_INADDR包获取ip地址的内部原理

作者:eygle

出处:http://blog.eygle.com

今天有朋友在MSN上问我如何获得已经连接用户的IP地址。

我们知道,通过SYS_CONTEXT函数可以获得这部分信息,当前用户的ip等信息可以通过如下命令轻易获取:

SQL> select sys_context('userenv','host') from dual;

SYS_CONTEXT('USERENV','HOST')
--------------------------------------------------------------------------------
WORKGROUP\GQGAI

SQL> select sys_context('userenv','ip_address') from dual;

SYS_CONTEXT('USERENV','IP_ADDR
--------------------------------------------------------------------------------
172.16.34.20

可是如果我们希望获取其它session的地址信息等,通过SYS_CONTEXT函数就只能通过LOGON触发器来完成。

而如果没有触发器记录,则我们可以通过UTL_INADDR Package来实现。
我们看一下UTL_INADDR包获取ip等信息的实现原理。

我们在数据库中进行如下查询:

[oracle@jumper oracle]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Wed Oct 25 11:24:22 2006

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


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production

SQL> !
[oracle@jumper oracle]$ ps -ef|grep sql
oracle 14700 14663 1 11:24 pts/0 00:00:00 sqlplus
oracle 14732 14702 0 11:24 pts/0 00:00:00 grep sql
[oracle@jumper oracle]$ ps -ef|grep LO
oracle 14701 14700 0 11:24 ? 00:00:00 oracleeygle (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 14734 14702 0 11:24 pts/0 00:00:00 grep LO
[oracle@jumper oracle]$ exit
exit

SQL> SELECT UTL_INADDR.get_host_address('www.anysql.net') from dual;

UTL_INADDR.GET_HOST_ADDRESS('WWW.ANYSQL.NET')
---------------------------------------------------------------------
208.113.151.109

在Linux中我们通过strace跟踪这个进程,可以得到以下堆栈信息:

[oracle@jumper oracle]$ strace -p 14701
Process 14701 attached - interrupt to quit
read(7, "\0\313\0\0\6\0\0\0\0\0\3^\10a\200\0\0\0\0\0\0@\342\22\10"..., 2064) = 203
gettimeofday({1161746697, 269895}, NULL) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 30000}, ru_stime={0, 10000}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 10000}, ...}) = 0
gettimeofday({1161746697, 270542}, NULL) = 0
gettimeofday({1161746697, 270670}, NULL) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 10000}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 10000}, ...}) = 0
gettimeofday({1161746697, 271614}, NULL) = 0
gettimeofday({1161746697, 271748}, NULL) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 10000}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 10000}, ...}) = 0
gettimeofday({1161746697, 272347}, NULL) = 0
gettimeofday({1161746697, 272699}, NULL) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 10000}, ...}) = 0
gettimeofday({1161746697, 272989}, NULL) = 0
gettimeofday({1161746697, 273140}, NULL) = 0
gettimeofday({1161746697, 273273}, NULL) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 10000}, ...}) = 0
gettimeofday({1161746697, 273771}, NULL) = 0
gettimeofday({1161746697, 275526}, NULL) = 0
getpid() = 14701
open("/etc/resolv.conf", O_RDONLY) = 12
fstat64(12, {st_mode=S_IFREG|0644, st_size=46, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6fba000
read(12, "search hurray.com.cn\nnameserver "..., 4096) = 46
read(12, "", 4096) = 0
close(12) = 0
munmap(0xb6fba000, 4096) = 0
socket(PF_UNIX, SOCK_STREAM, 0) = 12
connect(12, {sa_family=AF_UNIX, path="/var/run/.nscd_socket"}, 110) = -1 ENOENT (No such file or directory)
close(12) = 0
open("/etc/host.conf", O_RDONLY) = 12
fstat64(12, {st_mode=S_IFREG|0644, st_size=17, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6fba000
read(12, "order hosts,bind\n", 4096) = 17
read(12, "", 4096) = 0
close(12) = 0
munmap(0xb6fba000, 4096) = 0
futex(0xb71a1a20, FUTEX_WAKE, 2147483647) = 0
open("/etc/hosts", O_RDONLY) = 12
fcntl64(12, F_GETFD) = 0
fcntl64(12, F_SETFD, FD_CLOEXEC) = 0
fstat64(12, {st_mode=S_IFREG|0644, st_size=175, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6fba000
read(12, "# Do not remove the following li"..., 4096) = 175
read(12, "", 4096) = 0
close(12) = 0
munmap(0xb6fba000, 4096) = 0
open("/opt/oracle/product/9.2.0/lib/libnss_dns.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/tls/libnss_dns.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/i686/libnss_dns.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/libnss_dns.so.2", O_RDONLY) = 12
read(12, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240\16"..., 512) = 512
fstat64(12, {st_mode=S_IFREG|0755, st_size=18632, ...}) = 0
old_mmap(NULL, 17100, PROT_READ|PROT_EXEC, MAP_PRIVATE, 12, 0) = 0xb6fb6000
old_mmap(0xb6fba000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 12, 0x3000) = 0xb6fba000
close(12) = 0
open("/opt/oracle/product/9.2.0/lib/libresolv.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/tls/libresolv.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/i686/libresolv.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/libresolv.so.2", O_RDONLY) = 12
read(12, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\320(\0"..., 512) = 512
fstat64(12, {st_mode=S_IFREG|0755, st_size=76508, ...}) = 0
old_mmap(NULL, 73604, PROT_READ|PROT_EXEC, MAP_PRIVATE, 12, 0) = 0xb6fa4000
old_mmap(0xb6fb3000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 12, 0xf000) = 0xb6fb3000
old_mmap(0xb6fb4000, 8068, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb6fb4000
close(12) = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 12
connect(12, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("208.113.151.109")}, 28) = 0
send(12, "\324#\1\0\0\1\0\0\0\0\0\0\3www\5anysql\3com\0\0\1\0\1", 31, 0) = 31
gettimeofday({1161746697, 286025}, NULL) = 0
poll([{fd=12, events=POLLIN, revents=POLLIN}], 1, 5000) = 1
ioctl(12, FIONREAD, [74]) = 0
recvfrom(12, "\324#\201\200\0\1\0\1\0\1\0\0\3www\5anysql\3com\0\0\1\0"..., 1024, 0,
{sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("208.113.151.109")}, [16]) = 74
close(12) = 0
gettimeofday({1161746697, 290245}, NULL) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 20000}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 20000}, ...}) = 0
gettimeofday({1161746697, 291553}, NULL) = 0
write(10, "\2\275\0\0\6\0\0\0\0\0\20\31\266\344\217\3700\320\341S"..., 701) = 701
read(7, "\0\215\0\0\6\0\0\0\0\0\3^\t@\0\0\0\1\0\0\0\0\0\0\0\0\0"..., 2064) = 141
gettimeofday({1161746697, 294898}, NULL) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 20000}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 20000}, ...}) = 0
gettimeofday({1161746697, 295496}, NULL) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 20000}, ...}) = 0
gettimeofday({1161746697, 295847}, NULL) = 0
gettimeofday({1161746697, 295981}, NULL) = 0
lseek(9, 1024, SEEK_SET) = 1024
read(9, "\30\0$\0007\0@\0J\0V\0`\0i\0t\0~\0\232\0\245\0\320\0\330"..., 512) = 512
lseek(9, 47104, SEEK_SET) = 47104
read(9, "\f\0^\5\0\0P\0x\5\0\0\214\0y\5\0\0\250\0z\5\0\0\313\0{"..., 512) = 512
gettimeofday({1161746697, 297024}, NULL) = 0
write(10, "\0\202\0\0\6\0\0\0\0\0\4\1\0\0\0\1\1\0\0\0{\5\0\0\0\0\1"..., 130) = 130
read(7,
Process 14701 detached

在这个信息中,我们注意到Oracle顺序访问了如下文件来完成地址定位:

open("/etc/resolv.conf", O_RDONLY) = 12
open("/etc/host.conf", O_RDONLY) = 12
open("/etc/hosts", O_RDONLY) = 12

首先获取域名解析服务器,在根据host.conf文件确定解析顺序,因为缺省hosts文件优先,又继续读取/etc/hosts文件。

如果hosts文件存在解析关系,则返回信息;如果不存在,则继续问询DNS服务器,获得解析地址,如果不能解析,则会出错:

SQL> select UTL_INADDR.get_host_address('www.a.com') from dual;
select UTL_INADDR.get_host_address('www.a.com') from dual
*
ERROR at line 1:
ORA-29257: host www.a.com unknown
ORA-06512: at "SYS.UTL_INADDR", line 35
ORA-06512: at "SYS.UTL_INADDR", line 40
ORA-06512: at line 1

也就是说,UTL_INADDR的数据获取已经不依赖于数据库信息了,而SYS_CONTEXT的信息获取仍然来自数据库内部。

这就是UTL_INADDR包的工作原理。

-The End-

Posted by eygle at 11:30 AM | Comments (2)



CopyRight © 2004-2008 eygle.com, All rights reserved.