当前位置: 编程技术>php
本页文章导读:
▪PHP也可以當成Shell Script
PHP 怎么这么红 最近 PHP(Personal Hypertext Preprocessor) 似乎已经成了这一两年来 Linux/Unix 上最广为大家所使用的网页处理语言﹐它的方便、强大功能与 OpenSource 的特性使.........
▪浅谈Windows下 PHP4.0与oracle 8的连接设置
PHP在Linux/Unix下连接oracle8是很容易的事,但在windows平台下实在不易,本人经过长久的摸索才找到可靠的方法,不敢独享, 现公布出来以飨大家。
笔者使用的开发环境:
window.........
▪Oracle 常见问题解答
以前搜集的一个Oracle比较常见问题的列表,忘记了是从哪来的关于 SELECT N 问题有感于一些网友多次咨询和讨论选取某些指定行数据的问题, 我写了下面这样的简单说明, 请.........
[1]PHP也可以當成Shell Script
来源: 互联网 发布时间: 2013-11-30
PHP 怎么这么红
最近 PHP(Personal Hypertext Preprocessor) 似乎已经成了这一两年来 Linux/Unix 上最广为大家所使用的网页处理语言﹐它的方便、强大功能与 OpenSource 的特性使得它正逐渐侵蚀到传统 CGI 甚至是 MicroSoft ASP(Active Server Page)的市场﹐几乎各大网站征招人才莫不以会 PHP 作为基本条件。
PHP 确实有这个资格可以这么红﹐原因有下面数点 :
PHP 是 OpenSource 软件﹐完全免费﹐可以自由散布﹐因此吸引了极多的人来使用﹐也因为如此﹐吸引到了商业公司为其发展更好的引擎与最佳化软件(请参考 http://www.zend.com/)。
PHP 本身非常简单易懂﹐浅显的指令语法﹐外加一些基本的对象导向处理能力﹐让新手足以在最短时间内学会。
PHP 提供了相当多的功能﹐包含了数学处理、字符串处理、网络相关功能、各种数据库的支持、影像处理功能、有为数众多的发展者正为 PHP 发展各式各样的新功能﹐扩充性极佳。
PHP 非常容易与 Apache 相结合﹐作为 Apache 的模块来使用﹐设定安装上相当简单﹐也因为 Apache 目前已经占据了 Web Server 全球 60% 的市场﹐PHP 自然而然成为 Apache 最佳搭配。
不过﹐这次要讲的主题不是 PHP 在网页设计上的应用﹐而是 PHP 在 Shell Script 上的应用﹐一般所知的 Shell Script 大约就是 tcsh、bash、perl 或是 python 这几类语言﹐我所要谈的就是将 PHP 当成 Shell Script 来使用。
PHP 执行档的安装
一般 PHP 作为网页处理语言都是要编译成 Apache 的模块﹐这里当然不么做﹐也因此编译起来很简单﹐只要以 root 的身分进行如下动作 :
解开 php-3.0.xx.tar.gz
cd php
configure
make
编译完之后﹐在 php 目录下有一个可执行档﹐档名为 php﹐将它 copy 到 /usr/local/bin 下即可。注意﹐如果档案太大﹐可以使用 strip 指令将 php 的方式将不必要的信息去除﹐这样档案就会小得多了。
第一个程序
开始撰写我们的第一个 PHP Shell Script 程序﹐这个例子印出 "Hello world !" :
#!/usr/local/bin/php -q
<?
echo "Hello, world !";
?>
注意到 PHP 原本是应用在网页应用的﹐因此它内定会送出 HTML 的 HEADER﹐但是在此我们是要将 PHP 用作 Shell Script﹐"-q" 就是表示不要送出 HEADER 的意思﹐你可以试试看不加上 -q 的显示结果。
在这个例子中﹐/usr/local/bin/php 是表示要执行 /usr/local/bin/ 下的 PHP﹐因为我们刚才将它装在该处。echo 指令将 "Hello, world !" 印出﹐其中的 "" 字符是换行字符。
注意到在将这个程序存成档案后﹐须将其 chmod 成为可执行属性(chmod +x 文件名)﹐然后才能执行喔。
进阶使用 I
有时候我们需要在程序执行时﹐送进一些参数﹐比如说 ls 这个指令﹐后面可以加上 -l 参数﹐PHP Shell Script 一样也有支持这样的用法﹐有两个特殊的变量 : $argc 记录着后面送入参数的个数﹐$argv[] 数组参数存着的则是参数的内容。比如说我现在要设计一个算两个数字总和的程序 :
#!/usr/local/bin/php -q
<?
$sum=0;
$sum=$sum+$argv[1]+$argv[2];
echo $sum;
?>
假设将此程序命名为 sum.php3﹐则执行 sum.php3 1 2 按下 enter 则会印出 3。
如果要算出不特定个数的参数和﹐那么就得要用到 $argc 这个特殊变量了 :
#!/usr/local/bin/php -q
<?
$sum=0;
for ($t=1;$t<=$argc;$t++)
$sum=$sum+$argv[$t];
echo $sum;
?>
假设将此程序命名为 bigsum.php3﹐则执行 bigsum.php3 1 2 3 4 5 按下 enter 则会印出 15﹐执行 bigsum.php3 1 2 3 4 5 6 按下 enter 则会印出 21。
有时候我们需要在程序执行中输入资料﹐但是 PHP 原本就是用于网页设计﹐而网页上的资料输入自然都是用 FORM 的方式来输入﹐所以这将 PHP 作为 Shell Script 时问题就来了﹐好在 PHP 有提供了开文件功能﹐而在 Linux/Uinx 之下﹐输入(input)这件事原本就可以用开档的方式来完成﹐我们要开启的是 /dev/stdin 这个设备档(stdin 是表示 standard input 的意思)﹐程序如下 :
#!/usr/local/bin/php -q
<?
$fp=fopen("/dev/stdin","r");
$inputstr=fgets($fp,100);
fclose($fp);
echo "\n----------------------\n";
echo $inputstr;
?>
其中的 fgets($fp,100) 是指从 $fp 这个档案(也就是 "/dev/stdin")中读取出 100 个 byte 的资料﹐程序执行到这行便会停下来等待我们的输入﹐当我们输入完按下 enter 之后﹐程序就会将刚才我们输入的资料给印出来了。
进阶使用 II
虽然已经可以处理输入﹐但是这样的功能显然还是太简单﹐无法应付更大的应用﹐比如说我需要一个功能是将一串资料流(data stream)中的 HTML 给去除﹐这时便需要完整地处理输出输入转向的能力﹐我们可以先设计程序如下 :
#!/usr/local/bin/php -q
<?
$fp=fopen("/dev/stdin","r");
while(!feof($fp)) {
$c=fgetc($fp);
$inputstr=$inputstr.$c;
};
fclose($fp);
echo $inputstr;
?>
假设将此程序命名为 filt.php3﹐如果你直接执行这个程序﹐它会一直等待你输入﹐直到你按下 Ctrl+D 后才会将你的输入资料给印出﹐我们可以这么执行它 :
more filt.php3 | filt.php3
这样的做法是将 filt.php3 这个程序用 more 给秀出并转向给 filt.php3 这个程序﹐filt.php3 会不断接受资料(事实上就是 filt.php3 程序代码本身)﹐最后将其印出。
我们可以在其中加上过滤 HTML 的功能 :
#!/usr/local/bin/php -q
<?
$fp=fopen("/dev/stdin","r");
while(!feof($fp)) {
$c=fgetc($fp);
$inputstr=$inputstr.$c;
};
fclose($fp);
$inputstr=ereg_replace("<([^<>]*)>","",$inputstr);
echo $inputstr;
?>
假设将此程序命名为 filt2.php3﹐如此一来便完成了过滤功能﹐不信请拿个 HTML 档来试试看 :
more xxx.html | filt2.php3
你便会看到删除了 HTML TAG 的文件了。
结论
PHP 拿来当 Shell Script 事实上相当地好用﹐原因是 PHP 本身很好学﹐而且它又支持了各种数据库﹐当你已经经常拿 PHP 来设计你的网站之后﹐绝对不太喜欢再使用其它的 Shell Script 语言来处理其它必须非网页的部份﹐这时候拿 PHP 来当做 Shell Script 的好处就会显现出来了﹐你可以以一贯的方式来发展整个系统﹐而不必一下要用 PHP一下又用 Perl/Python 或是 C。
国内的 PHP 风气已经相当兴盛﹐本站 LinuxFab 便是完全以 PHP 搭配 MySQL 发展起来的﹐事实上 PHP 的妙用还有很多﹐有机会日后再介绍﹐如果读者们需要 PHP 的相关信息﹐欢迎到本站上的 PHP 论坛 参与更多讨论。 (出处:Viphot)
[2]浅谈Windows下 PHP4.0与oracle 8的连接设置
来源: 互联网 发布时间: 2013-11-30
PHP在Linux/Unix下连接oracle8是很容易的事,但在windows平台下实在不易,本人经过长久的摸索才找到可靠的方法,不敢独享,
现公布出来以飨大家。 笔者使用的开发环境: windows 98 第二版 php4.04pl1 apache 1.3.14 window版 oracle 8.05客户端 PHP以CGI方式安装完毕测试成功后。以以下代码测试
<?php
$conn = OCILogon("cinmsiii","cinmsiii","(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.202)(PORT = 1521))(CONNECT_DATA = (SID = unicom)))");
//$conn=OCILogon("cinmsiii","cinmsiii","cinms");如果oracle客户端是8.1.6i的话可以这样用,参数照上 if($conn!=false)
{
echo "ok";
OCILogoff($conn);
}
else
echo "false";
?> 关于连接参数问题:
连接串设为以下:
(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.202)(PORT = 1521))(CONNECT_DATA = (SID = unicom))) PROTOCOL:为使用的网络协议 HOST:为数据库服务器主机名 SID:为数据库的实例号 这样作后一般没有任何问题。 如果你的oracle 8客户端为 8.1.6i企业版,可以把这些参数设在连接串中,用 oracle8的net easy config实用工具设置。
将设置后的连接串名称作为连接串传入。 推测oracle 7.x也可以用此方法,因没有环境,未作测试,如果你有兴趣可以试试。 (出处:Viphot)
[3]Oracle 常见问题解答
来源: 互联网 发布时间: 2013-11-30
以前搜集的一个Oracle比较常见问题的列表,忘记了是从哪来的
关于 SELECT N 问题
有感于一些网友多次咨询和讨论选取某些指定行数据的问题, 我写了下面这样的简单说明, 请大家指正.
这里描述的 SELECT N 包括这样几种情况:
1. 选取TOP N行记录
2. 选取N1-N2行记录
3. 选取FOOT N行记录
当然需要考虑是否有ORDER BY子句的情况, 下面试以系统视图CAT为例分别说明.
注: A. 为没有ORDER BY的情况
B. 有ORDER BY的情况
1. 选取 TOP N 行记录
A. SELECT * FROM CAT WHERE ROWNUM<=N
B. SELECT * FROM
( SELECT * FROM CAT ORDER BY TABLE_TYPE )
WHERE ROWNUM<=N
2. 选取N1-N2行记录
A. SELECT TABLE_NAME,TABLE_TYPE FROM
( SELECT ROWNUM ROWSEQ,TABLE_NAME,TABLE_TYPE FROM CAT )
WHERE ROWSEQ BETWEEN N1 AND N2;
或:
SELECT * FROM CAT WHERE ROWNUM<=N2
MINUS
SELECT * FROM CAT WHERE ROWNUM<N1
B. SELECT TABLE_NAME,TABLE_TYPE FROM
( SELECT ROWNUM ROWSEQ,X.* FROM (SELECT * FROM CAT ORDER BY TABLE_TYPE) X)
WHERE ROWSEQ BETWEEN N1+1 AND N2;
3. 选取FOOT N行记录
这里是说明不知道记录集的记录个数的情况, 如果已知, 用上面2的方法即可
A. SELECT TABLE_NAME,TABLE_TYPE FROM
( SELECT ROWNUM ROWSEQ,TABLE_NAME,TABLE_TYPE FROM CAT )
WHERE ROWSEQ > ( SELECT COUNT(*)-N FROM CAT )
B. SELECT TABLE_NAME,TABLE_TYPE FROM
( SELECT ROWNUM ROWSEQ,TABLE_NAME,TABLE_TYPE FROM CAT ORDER BY TABLE_TYPE)
WHERE ROWSEQ > ( SELECT COUNT(*)-N FROM CAT )
或
SELECT * FROM
( SELECT TABLE_NAME,TABLE_TYPE FROM CAT ORDER BY TABLE_TYPE DESC)
WHERE ROWNUM<=N
以上在ORACLE8.1.5 for Windows2000pro 上测试通过
-- end --
oracle FAQ(1) from chao_ping
1.快速整理破碎的表(在Oracle8i里边才可以这样使用)
ALTER TABLE table_name MOVE ( TABLESPACE XXX);
如何移动一张表所在的表空间
方法一:
1. Export 这张表
2. Drop这张表
3. Create table xxx tablespace xxx;
4. Imp Ignore=y
还要注意的一点是,所有要读取这张表的PL/SQL储存过程都会失效。需要重新编译。
1. SELECT * FROM DBA_OBJECTS WHERE STATUS = 'INVALID';
2. 对这些包,函数,过程重新编译。
方法二:
仅对Oracle8i适用。
使用下面的语句:
ALTER TABLE table_name MOVE
TABLESPACE new_tablespace;
这样的话,所有的约束、索引、触发器都不会受到影响。
但是需要rebuild这个标上的所有索引。
2.怎样直接进入sql*plus而不用输入用户名,密码:
sqlplus /nolog;
sqlplus username/password@connect_string
3.怎样快速重建索引:
alter index xxx rebuild storage();
alter index xxx coalesce;
4. 为什么我看不到dbms_output的结果?
SET SERVEROUTPUT ON
5. 进行一次大的事务以后,已经COMMIT了,但为什么我的回滚段还是那样大?
因为没有设置OPTIMAL的值,所以不会自动收缩。
可以用alter rollback segment shrink to Xm;来手工进行收缩。
6. 为什么要使用VARCHAR2,而不用CHAR?
A.CHAR只支持2000字节长,而VARCHAR2支持4000字节的长度,适用性更好
B. CHAR 占用更多的存储空间,定义多长,它就占用多长的空间,插入字符后面自动加空格填充;而VARCHAR2不论定义多长,都只使用实际插入的长度。
7. 为什么从不同的数据字典看,表/索引所占用的空间不一样?
SQL> select blocks , empty_blocks from dba_tables where table_name='表名';
BLOCKS EMPTY_BLOCKS
---------- ------------
1575 1524
SQL> select bytes,blocks,extents from dba_segments where segment_name='表名';
BYTES BLOCKS EXTENTS
---------- - --------- ----------
6348800 3100 1
这是因为第一个数据库视图DBA_TABLES的BLOCKS列是指实际上使用的BLOCK数目,还有一些BLOCK虽然被占用了,但是没有数据存在,不计入里边。而在DBA_SEGMENTS这个数据库视图里边,BLOCKS列是指这个表总共占用的BLOCK的数目,包括有数据和没有数据的BLOCK总量。如果把第一个视图里边的BLOCKS和EMPTY_BLOCKS地总和加起来,正好等于第二个视图的BLOCKS列的大小。
8. 怎样把数据库的一张,多张表存为一个普通的文本文件?
可以在SQL*Plus里边用SPOOL命令把选出来的数据保存在SPOOL指定的文件里边。
9. 怎样从一张表里删除重复的记录
SQL> SELECT * FROM EMP;
EMP_ID OFFICE_ID EMPNAME
305 12 ELLISON, GEORGE
305 12 MERCURIO, JASON
128 17 SIMPSON, LINDA
305 22 JACKSON, DREW
使用下面的SQL语句来识别那些重复的记录:
SQL> SELECT COUNT(*), EMP_ID, OFFICE_ID
FROM EMP
GROUP BY EMP_ID, OFFICE_ID
HAVING COUNT(*) > 1;
结果如下:
COUNT(*) EMP_ID OFFICE_ID
2 305 12
Table Example, with duplicate values:
SQL> SELECT * FROM EMP;
EMP_ID OFFICE_ID EMPNAME
305 12 ELLISON, GEORGE
305 12 MERCURIO, JASON
128 17 SIMPSON, LINDA
305 22 JACKSON, DREW
使用下面的语句来删除重复的记录:
SQL> DELETE FROM EMP A WHERE
(EMP_ID, OFFICE_ID, 2) IN
(SELECT EMP_ID, OFFICE_ID, decode(count(*),1,1,2)
FROM EMP B
WHERE A.EMP_ID=B.EMP_ID AND
A.OFFICE_ID = B.OFFICE_ID
GROUP BY EMP_ID, OFFICE_ID);
10. 怎样在SQL*PLUS里想数据库插入特殊字符?
可以使用CHR函数。
11. 怎样删除一个列?
在Oracle8i里边,可以直接Drop一个列。语法为alter table table_name drop column_name;
但是注意要在initsid.ora里边设定compatible=8.1.0以上。
12. 怎样重命名一个列?
1 alter table "table_name" add
(new_column_name data_type);
2 update table_name set new_column_name =
old_column_name where rowid=rowid;
3 alter table table_name drop column
old_column_name;
13. 怎样快速清空一张表?
Truncate table table_name;
14. 怎样为事务指定一个大的回滚段?
Set transaction use rollback segment rbs_name;
15. 怎样知道一张表上有那些权限赋予了哪些人,给他们了什么权限?
select * from dba_tab_privs where table_name='表名';
16. 怎么发现是谁锁住了你需要的一张表?
Select object_id from v$locked_object;
Select object_name, object_type from dba_objects where object_id='';
每次清空一张表的时候,(使用truncate),这张表的存储参数NEXT自动复位到最后被删除的那个extent的大小。同样,如果显式地从一张表里边释放空间,NEXT参数也会自动被设置成最后被释放的那个extent的大小。
在SQL*Plus里边可以为一个事务指定一个回滚段:这在有大的事务将要发生的话时候还是很有用的。使用下面的语句可以为这个事务指定一个回滚段:
SQL>SET TRANSACTION USE ROLLABCK SEGMENT 回滚段名称;
还可以在PL/SQL里边为一个事务指定一个回滚段(不使用动态sql语句)。这个需要使用Oracle提供的包:DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT(‘回滚段名称');
在有些平台上的Oracle,在启动的时候会自动生成一个sgadefSID.dbf,用这个文件是否存在就可以判断一个实例是否在运行。这个文件包含了SGA在内存中的地址。在数据库关闭的时候,Oracle会自动删除这个文件。但是在Oracle8i里边,这个文件不再存在了。需要使用新的判断方式来断定究竟某个实例是否在运行。比如PS命令。
在Oracle7里边,想要知道数据文件是否可以自动扩展,必须从sys.filext$这张表里边查取,但是在Oracle8里边,从dba_data_files里边就可以知道数据文件是否可以自动扩展了。
从Oracle8i开始,可以创建另一类数据库一级的触发器,比如数据库启动、关闭,用户登录、注销等事务,都可以触发这个事件的发生,从而作某些记录。在数据库一级定义的触发器会在所有用户相应事件发生的时候触发,而在Schema一级定义的触发器只有在某个特定用户的相应事件发生的时候才会触发。
从Oracle8i开始,多了一种关闭数据库的方式:SHUTDOWN TRANSACTIONAL。这种方式允许所有的用户提交它们的工作。但是一旦提交之后就马上被切断联接,等所有用户都完成了各自的事务,shutdown就开始了。
从Oracle8开始,可以创建临时表,这些表的定义对于所有该用户的会话都是可以看到的,但是每个会话查询、插入、删除的数据和别的会话查询、插入、删除的数据都是不相关的。就像每个会话都分别有这样一份表一样。
从Oracle8i开始,对于那些没有进行分区的表,可以不用IMP/EXP就可以快速重组。但是这需要两倍于该表容量的表空间。这个语句就是:
ALTER TABLE TB_NAME MOVE TABLESPACE TS_NAME;
在Oracle8i里边可以创建反序索引。(CREATE INDEX i ON t (a,b,c) REVERSE;)。由于反序索引的相邻键值不是存放在物理相邻的位置,因此只有全索引扫描或者通过单个列这一类语句才能够有效利用这些索引。这类反序索引在Oracle并行服务器上能够较好地协调不同实例对数据库的修改,可以在一定程度上提高系统性能。
从Oracle8开始,$instance视图可以查获许多有用的信息:比如主机名称,实例名,启动时间,版本号等。
临时表空间里边创建的临时段只有在shutdown地时候才会被释放。
但是在permanent表空间里边创建的临时段在一个事务结束之后就会被释放,有Smon进程来完成这个任务。
oracle FAQ(2) from chao_ping
关于OPTIMAL参数
optimal是用于限制回滚段大小的一个存储参数。在执行一个长的事务之后,那个事务所使用的回滚段会比较大,而设置了Optimal这个参数以后,一旦事务提交结束,回滚段自动收缩到Optimal所指定的大小。
如果你的系统中有许多长时间运行的事务的话,那么应该把回滚段的Optimal参数设置的比较大一点。这样有利于保持回滚段表空间的连续性。否则不断的扩张、收缩会使表空间更加破碎。
如果系统中主要的事务都是短时间的,那么应该把回滚段设置的比较小一些,这样有利于让回滚段里面的信息可以存储在SGA里边,以利于提高系统性能。
回滚段的Optimal参数可以在创建回滚段的时候指定,也可以用
ALTER ROLLBACK SEGMENT SEGMENT_NAME OPTIMAL XX M;这样来重新设定。
Oracle8i 里边的
ALTER SESSION SET CURRENT_SCHEMA=
可以用来更改当前的用户模式。
Oracle公司已经宣称,不再支持server manager,这个工具自从Oracle 6.0开始,就一直是管理Oracle数据库的主要工具。现在,SQL*Plus替代了Server Manager的地位,因此,Server Manager中相应的功能也都集成到了SQL*Plus之中。
SQL*Plus新增加的主要命令是startup, shutdown, archive log,和recover。当然,标准的SQL语法仍然是支持的了,比如一系列的CREATE, ALTER等语句。但是也对其中的一些有了一些改变,比如原来不支持的ALTER DATABASE OPEN,ALTER DATABASE MOUNT,ALTER DATABASE BACKUP 等句子。
对于SET命令,也多了一些新的选项,用来包含一些如自动恢复等。SHOW命令也开始可以用来直接显示参数SHOW PARAMETER ,SHOW SGA等。而这些,原来都只是在Server Manager里面才有的功能。
Oracle8i仍旧保留了尽人皆知的INTERNAL账户,但是要记住,这主要是为了向后兼容。INTERNAL账户的功能现在开始有SYSDBA,SYSOPER这两个角色来支持了。INTERNAL/SYS的口令可以用下面这个方法来进行修改:
O/S Prompt> orapwd password=<some password>
当数据库刚刚创建的时候,SYS的密码默认为change_on_install,而SYSTEM的密码是manager,而INTERNAL则根本就没有密码。因此,创建完数据库之后,第一件要做的事情就是改变以上三个用户的口令。INTERNAL的口令可以用前面提到过的方法来改变,而SYSTEM,SYS则可以直接用ALTER USER username IDENTIFIED BY password;来更改。注意,在Oracle8i开始,ALTER USER SYS IDENTIFIED BY password;同时也会更改INTERNAL的密码,如果你为INTERNAL设置了密码的话,同时,马上把SYSDBA,SYSOPER这两个角色授予负责管理这个数据库的用户。对于那些使用INTERNAL来连接数据库的脚本,也要相应的作一些修改。
启动和关闭数据库:
要从SQL*Plus里边启动数据库,请按照以下的步骤进行:
O/S Prompt>sqlplus /nolog
SQL> connect scott/tiger as SYSDBA
SQL> startup
如果希望用不同于默认得参数来启动数据库,可以使用下面代参数的启动命令:
SQL> startup PFILE=<init.ora file to be used>
有时候需要启动数据库,但是不让普通用户进入,比如为了平衡IO,需要移动一个数据文件的位置,这时候就需要改变默认得启动选项:
SQL> startup mount
当完成了维护任务之后,可以选择关闭数据库然后再重新按照正常方式打开,或者直接在SQL*Plus里边输入下面的命令,Oracle就可以开始正常运行了:
SQL> alter database open
有时候需要创建一个新的数据库,或者需要重建控制文件,就需要用下面的语句:
SQL> startup nomount
有时候,数据库难以正常启动,就可以考虑使用下面的办法来强迫启动:使用FORCE选项,STARTUP FORCE实际上相当于一个SHUTDOWN ABORT然后再STARTUP这样一个过程。
SQL> startup force
SHUTDOWN这个命令也有好几种参数可以选择:
正常关闭是等待所有用户都从系统退出以后,再正常关闭系统。这是一种最最理想的关闭数据库的方式。一般都应该使用这种方式来正常关闭数据库。
SQL> shutdown
在Oracle8i开始,新加了一个关闭选项:SHUTDOWN TRANSACTIONAL。这允许所有用户都完成它们的事务,一旦事务提交,马上被断开连接。这样既保证了用户不会丢失它们的事务,也保证了数据库可以及时关闭,进行必要的维护操作。这种方式关闭的话,下次系统启动之后,也不用进行实例一级的恢复。比下面提到的另外两种方式都要理想。
SQL> shutdown transactional
SHUTDOWN IMMEDIATE是马上中止用户的当前事务,并不等这些事务完成,回滚这些用户的当前事务。但是如果有一些事务很久没有提交的话,那么SHUTDOWN IMMEDIATE或许就不像说得那样IMMEDIATE了。可能也要花很多时间来回滚这些事务。
SQL> shutdown immediate
在Oracle8i里边最后一种关闭方式是SHUTDOWN ABORT。这种关闭方式和直接关闭计算机的电源其实没有太多的区别。任何当前连接的用户都被马上断开联接,在下次实例再次启动的时候,必须进行实例一级的恢复,用以回滚没有提交的事务。
SQL> shutdown abort
ALTER TABLE table_name MOVE之后,表上的索引标志为UNUSABLE?
在Oracle8i开始,可以直接使用alter table table_name move [tablespace tablespace_name];
来为一张表移动到另一个表空间,或者重新组织表的存储方式,以减少碎片。但是,这样使用过之后,所有这张表上的索引都将被标志为unusable。这是因为MOVE一张表之后,表中列对应的物理位置都改变了,就是所有行的ROWID都变化了,而这张表的索引就用到了其中行的ROWID。由于Oracle不会自动更新索引对应的ROWID,这时候,索引上的ROWID就指向了错误的地方。因此,索引被标志为UNUSABLE。这时候,你就需要手工重建索引。可以使用下面的语法来重建索引:
ALTER INDEX index_name REBUILD;当然,还可以为索引指定特定的合适的存储参数,来优化索引的存储。或许Oracle之所以没有自动维护索引,就是为了让你可以为索引指定合适的存储参数。
如何远程安装Oracle:
如果需要从PC机上的X-window客户端安装Unix上的Oracle系统,要注意下面这一点:Oracle8i使用的是Universal Installer,使用了Java技术,必须在图形界面下安装。如果是远程安装,必须设置一下什么地方来显示Universal Installer的图形界面:使用
$DISPLAY=workstation_name:0.0
$export DISPLAY
举一个例子,你的PC机的IP地址是150.150.4.128,机器名字叫做test,那么就可以使用下面的语法来进行为安装作准备工作:
$DSIPLAY=150.150.4.128:0.0
$export DISPLAY
或者使用下面的语法,但是必须这个test机器的信息写在hosts文件里边:
DSIPLAY=test:0.0
$export DISPLAY
最新技术文章: