数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
如何在你的Linux机器上安装运行Oracle

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

开始行动

在RedHat上安装Oracle可以是相当轻而易举的,但要是完全跟着Oracle公司
的文档走就未必那么容易了 。最快的捷径是Tom Bisset的主页:
http://jordan.fortwayne.com/oracle。

如果您看了Tom的主页,那么您会注意到他漏了JDBC的安装。如果您准备使用
JDBC(对于跨平台的Oracle应用十分方便),只需在安装屏幕要求您选择组
件(components)时,加上该选项即可。当然,您应该先装好JDK。我个人使
用Blackdown的JDK 1.1.7。(译注:Redhat包括JDK)然后需要设置oracle
用户的ClassPath环境变量,最好的办法是在oracle用户目录的.bash_profile
或 .profile中加上一句:
CLASSPATH=/usr/lib/jdk/lib/classes.zip; export CLASSPATH
然后,如果您只需做Web Applet的话,在安装程序"Choose JDBC
Components"
的时候, 选择"JDK 1.1 JDBC Thin Driver",如果您需要做完整的Java应用,
选择"JDK 1.1 JDBC OCI Driver"。


另外请注意:安装程序让您输入各口令时,如果口令不符合规范,不会警告。
我第一次安装时,口令里加了".",这在UNIX中是允许的,Oracle就是另一码
事了。直到安装快结束时,程序才告诉我口令有问题。当时为保险
起见,我
从头做了一次安装。

安装程序的另一个问题是试图往还没有建立的目录里拷贝文件。有必要在安装

mkdir -p /u01/app/oracle/product/8.0.5/doc/server.805/install。这一
关过后万事大吉。

安装成功后,必须以ROOT身份登录,运行root.sh。我对root.sh作了以下改动:
· LBIN环境变量从/usr/lbin改成了/usr/local/bin
· 增加环境变量LOG=/tmp/oracle-root.sh.log
,这样脚本的运行结果会记录
下来

root.sh里说到,要想数据库作为一个服务器运行,必须先设定TWO_TASK变量;
但是,事实上如果从安装Oracle的机器上运行root.sh,就没有必要设这个变量。


Python和Oracle

我配置了一下python(译注:一种强大,快速的面向对象的脚本语言),以测
试Oracle的编程接口和网络接口 。在python中要连Oracle,需要
Digital Creation(Zope应用服务器的作者)的DCOracle模块。
您只需下载软件并按照指示照做就行。如果是DCOracle 1.1.0,使用
Setup-8.0.4的配置,从ORACLE_LIBS变量中删去-lsocket, -lnsl, -lgen,
-lelf, -laio, 和-lposix4即可,那些都是Solaris专用的。注意Redhat 5.2和
6.0中安装的 python设置不全,config目录和include目录被省略,无法编译
安装第三方的模块。您必须自己编译python或者下载一个合适的RPM。找
python的RPM,最好的去处可能是Oliver Andrich的 Python & Linux主页。
只要rpm -e --nodeps python, 然后 rpm -i python,python-dev和其他RPM
即可。
装好python后,我运行了以下的基本查询,访问Oracle。

[uche@malatesta uche]$ python
Python 1.5.1 (#1, Sep 3 1998, 22:51:17) [GCC 2.7.2.3] on linux-i386
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> import DCOracle
>>> #connect to DB. scott/tiger are the test database username/password
>>> dbc=DCOracle.Connect("scott/tiger@sforza") #sforza is the local
Oracle
server
>>> c = dbc.cursor()
>>> c.execute("SELECT * FROM emp WHERE emp.deptno = 10")
>>> rows = c.fetchall()
>>> print rows
[(7782, 'CLARK', 'MANAGER', 7839, dbiDate('1981-06-09 00:00:00'), 2450.0,
None, 10),
(7839, 'KING', 'PRESIDENT', None, dbiDate('1981-11-17 00:00:00'), 5000.0,
None, 10),
(7934, 'MILLER', 'CLERK', 7782, dbiDate('1982-01-23 00:00:00'), 1300.0,
None, 10)]


开发工作站配置

我在数据库服务器以外的一台机器上编译安装了python和其他编程接口。最初,
看起来似乎我必须安装Oracle 的所有PRO*C/C++软件包。但要把Oracle安装程
序运行到那一步也够麻烦的,所以我不想那样办。于是我找出了
写程序所需
要的最小限量的头文件(include)、对象文件(object)和库文件(library):
$ORACLE_HOME/lib/*
$ORACLE_HOME/rdbms/demo/*
$ORACLE_HOME/rdbms/lib/*
我的机器上设ORACLE_HOME为/usr/local/oracle。
注意这些文件还不能让您可以在C程序中直接嵌入SQL语句,只有完整安装
PRO*C/C++后才行。如果要用JAVA的话,还得增加$ORACLE_HOME/jdbc/lib/*;
注意把这个目录加到ClASSPATH变量中。

JDBC连接


为测试JDBC连接,我作了一个小程序,在一个listbox内显示测试库中的所
有雇员名。下面的程序1是调用JDBC
的java Applet,程序2是调用JAVA程序的HTML超文本。如果您的JDBC已经安
装成功,将程序1拷贝为 JDBCTest.java,将程序2拷贝为JDBCTest.html,
然后:

javac JDBCTest.java
appletviewer JDBCTest.html

您就可以自己看看结果如何了:

程序1:

/*
Applet that reads in several rows from a remote Oracle database
and presents them in a listbox.
*/
import java.sql.*;
import java.awt.*;
import java.applet.*;
import java.lang.*;
public class JDBCTest extends Applet
{
//Single-select ListBox
private List employee_list = new List(5, false)
public void init()
{
setLayout(new BorderLayout());
try {
//Set up the Oracle JDBC driver
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
//Connect to an Oracle database on machine sforza, using username
//"scott" and password "tiger"
Connection DB_conn = DriverManager.getConnection
("jdbc:oracle:thin:@sforza:1521:ORCL", "scott", "tiger");
//Connection DB_conn = DriverManager.getConnection
("jdbc:oracle:thin:scott/tiger@sforza:1521:ORCL");
//Create a JDBC statement object
Statement statement_obj = DB_conn.createStatement();
//Execute a query to get the employee names from the test DB
ResultSet results = statement_obj.executeQuery ("select ENAME from
EMP");
//Populate the list box with all the employee names
while (results.next ()){
employee_list.add(results.getString(1));
}
} catch (SQLException e) {
throw new RuntimeException("SQL Exception " + e.getMessage());
}
add(employee_list);
}
}


程序2:


<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head> <title>Oracle JDBC driver test</title> </head>
<body>
<h1>Oracle JDBC driver test</h1>
<applet code="JDBCTest.class" width="200",
height="150"> Your
browser doesn't support Java. </applet>
<hr>
<address>
<a href="mailto:uche.ogbuji@linuxworld.com"></a>
</address>
<!-- Created: Sat Mar 6 18:53:23 MST 1999 -->
<!-- hhmts start -->
Last modified: Sat Mar 6 22:19:26 MST 1999
<!-- hhmts end -->
</body>
</html>

程序1的大部分都是与具体数据库无关的JDBC调用,依样画葫芦您也可以
访问PostgresQL,主要和Oracle相
关的部分是:

Connection DB_conn = DriverManager.getConnection
("jdbc:oracle:thin:@sforza:1521:ORCL", "scott", "tiger");


注意 Oracle thin JDBC driver中URI的格式:
jdbc:oracle:thin:@<server_name_or_IP>:<port>:<SID>
如果您想在URI中包括用户名和口令的话:
jdbc:oracle:thin:username/password@<server_name_or_IP>:<port>:
<SID>
同样的URI还有一个较长的格式:
"jdbc:oracle:thin:@(description=(address=(host=<server_name_or
_IP>)(protocol
=tcp)(port=<port>))(connect_data=(sid=<SID>)))"
注意ORCL是系统安装的缺省SID(System Identifier,系统标识符)。
如果您在安装时使用了其他的SID,
在URI里也用那个SID。$ORACLE_HOME/network/admin/tnsnames.ora包
括了Oracle服务器的端口和SID设置。
这是TNS Listener,Oracle网络连接进程的配置文件。如果您无法通过
网络连接数据库的话,首先应该检查
端口号和SID是否正确,TNS listner是否正常(译注:lsnrctl status,
或者tnsping)。JDBC并不是开发
SQL数据库应用的唯一手段,ANSI标准SQLJ允许在JAVA程序中直接嵌入
SQL语句。Oracle for Linux 8.0.5
并没有捆绑SQLJ,但可以作为另一个独立产品获得。SQLJ是100%的
JAVA,应该在Linux上运行没有问题,
事实上SQLJ在底层使用的就是JDBC,因此可以同任何SQL数据库互联,
并不限于Oracle。

希望上面的这些例子能对您的编程有所帮助。可惜Oracle for Linux
的编程文档相当的少,要不就是隐藏得
十分深:) 也许在数据库编程得心应手之前,您得先啃它一两本书。

PL/SQL

对SQL的过程性语言扩展(PL/SQL)可能是Oracle最著名的特点。这种
强大的专业数据库管理语言允许您对
声明性的SQL加逻辑控制。一般,PL/SQL的存储过程(stored procedure)
用命令行的sqlplus,图形化的
Developer/2000(Linux上目前还没有)或其他工具开发,允许您从
Oracle众多的查询接口(Oracle Application Server, Python, Perl,
JDBC 或者C)访问。

程序3:

create or replace package stored_sample as
function get_annual_salary (emp_number in number) return number;
end stored_sample;
/
create or replace package body stored_sample as
function get_annual_salary (emp_number in number) return number
is
annual_salary number;
monthly_salary number;
begin
select sal into monthly_salary from emp where empno = emp_number;
annual_salary := monthly_salary * 24;
return (annual_salary);
end get_annual_salary;
end stored_sample;
/


上面的程序3是存储进程的一个小示范,它接受一个员工号,返回该员
工的年薪。相关的函数
get_annual_salary封装在PL/SQL包sample_package中。

如果把程序3拷贝到文件sample.sql,您可以通过sqlplus运行它,如下
所示:

[oracle@sforza demo]$ sqlplus

SQL*Plus: Release 8.0.5.0.0 - Production on Sun Mar 7 13:36:32
1999

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

Enter user-name: scott
Enter password:

Connected to:
Oracle8 Release 8.0.5.0.0 - Production
PL/SQL Release 8.0.5.0.0 - Production

SQL> @sample
Package created.

Package body created.

SQL> set serveroutput on
SQL> exec
dbms_output.put_line(stored_sample.get_annual_salary(7782))
58800

PL/SQL procedure successfully completed.

SQL>

通过其他的编程接口,也可以使用这个PL/SQL包。Python/DCOracle中,
参见Connection对象的procedures成员
JDBC中,参见java.sql.CallableStatement。

Oracle有众多的内置函数。事实上,大多数您以前用外部代码完成的
功能都可以通过PL/SQL高效地完成。如果您需要什么比较通常的功能,
请参考PL/SQL手册,看您需要的函数是否已经实现了。如果您准备做
大量的Oracle编程的话,经常翻阅PL/SQL手册以熟悉各种函数是大有
好处的。

管理Oracle for Linux

如果您已经习惯运行相对不那么复杂的数据库,那么在Oracle中完成
一些日常操作,例如建立新数据库或者性能调谐会显得相当复杂。有
一些关键的配置文件需要维护,如init.ora, config.ora和
tnsnames.ora。
一般有好几种办法指定一些关键参数,如当前的SID。可以在上述的
文件中声明,也可以在环境变量中声明,或者是通过oracle工具的运
行参数。这种灵活性是值得赞赏的,可惜有时搞清那一种设置优先也
很伤脑筋。

同Linux一样,Oracle提供的安全机制如果管理不当,就形同虚设。
花时间熟悉各种访问规则和设置,以及各种特殊Oracle用户帐号的角
色,还是值得的。

Oracle的性能调谐是一个非常大,也非常专的话题。调谐得当,可以
很大程度地提高性能。Oracle运行和CPU、内存、外存的关系是相当
复杂的,这些因素必须考虑。另外,PL/SQL包,存储过程,临时表空
间,表结构本身,所有这些都会随着使用而日趋复杂,保证数据库的
结构优化,没有垃圾,绝对比定期从cron运行vacuum复杂得多。

Oracle DBA(database adminstrator,数据库管理员)是电脑专业人
员中一个著名的亚文化。这并不奇怪。Oracle的强大功能和灵活性,
也同时意味着多得让人发疯的各种小秘密、小技巧、小陷阱,这方面
的特点它绝不比任何人少--包括Linux在内。您在征服Linux时可能
已经发现,O'Reilly的动物园(译注:所有O'Reilly and Associate
出版的书都以动物作封面)是一个很好的去处。如果您需要在Oracle
上完成许多工作,找找黄封面的O'Reilly Oracle专辑。那里,你会
找到比Oracle拜占庭迷宫式文档好的多的信息来源。

Oracle for Linux vs. Oracle for NT

NT上的Oracle (译注:Oracle在NT上的销量超过了SQL SERVER,是NT
第一大数据库)为许多管理功能提供了图形界面,类似的功能在UNIX
/Linux上只能通过sqlplus访问。这样的图形界面,设计得与NT控制
面板的其他部分颇为相似。Linux DBA必须熟悉sqlplus。NT的问题是,
许多管理任务要求用户在主控台(机器屏幕前)完成,如果想远程管
理就需要昂贵的第三方软件(或者Oracle Enterprise Manager?)。
UNIX上的Oracle管理可以从任何经过授权的远地进行,效果同在机器
主控台一样。

NT上的Oracle使用一个进程内的多个进程,而UNIX/Linux上的Oracle
使用多个独立的,使用相互独立的内存空间(译注:UNIX上也有多线
程的部分:Multithreaded Server,MTS,相当于前文提到的listener
的多线程版本。)NT上的实现方式避免了进程间通信,有小小的性能
优势,但UNIX上的实现方式提供了高得多的可靠性和数据完整性,因
为一个Oracle进程不可能污染另一个Oracle进程的地址空间。(译注:
在NT和VMS上,创建一个新的进程比创建一个新的线程昂贵得多,而且
NT的进程间切换很慢,因此微软建议程序员只要有可能就使用多线程。
在UNIX上,建立新进程是比较高效的。而在Linux上,建立新进程和新
的内核线程,kernel thread都使用同一个基本系统调用,效率相当高。)

在32位的硬件系统上,Linux的ext2文件系统的限制是最大文件为2G,
NT为4G。这并不太影响Oracle的用户,因为表空间tablespace可以扩
展到多个文件上,但还是有小小的效率问题。当然,64位的Linux
(Alpha,Ultra-Sparc, PA-RISC)会消除这些限制,64位的Solaris
(Solaris 7)也一样。(译注:这里其实有一些问题,待我查明再向
各位看官交代)。


一些好工具/结束语

Oracle同时发布了Oracle Application Server (OAS)的Linux版本。
对OAS的深入探讨在本文范围之外,但它确实是连接后端Oracle数据
库,建立Internet或Intranet应用的一个强有力的工具。OAS提供
JAVA开发能力,可以将HTTP和IIOP与OCI网络接口串在一起,具备
友好的界面以便设计WEB表单和报表,还有其他方便的工具。

Oracle如此流行,自然也有相应的一批开源软件(Open Source)
工具。其中的OWS killer 是一个基于JAVAServlet的可以替代OAS
的WEB接口工具,与Apache WEB服务器、Apache的Jserv JAVA Servelet
模块集成,提供对Oracle数据库的访问。(译注:OWS, Oracle Web
Server是Oracle Application Server早期版本的名称)。
您可以在Matt's House 找到更多的工具以管理Oracle的存储过程、
提供快速的报表功能。

掌握Oracle可不是举手之劳的事,但也没有必要望而却步。确实,
世上有许多更容易管理的数据库,但如果您需要高级的SQL,或者
PL/SQL的功能,或者trigger,或者各种扩展,或者先进的交易管
理,或者必须和Oracle系统共存,您会发现Linux是一个极佳的
Oracle平台。您已经在Linux的世界中探索了这样远,一定也能应
付Oracle的挑战。




相关文章

相关软件