原始出处:未知
系统环境如下:
1. 硬件环境
服务器:Dell PowerEdge 1300 (CPU:PⅢ 550MHz 内存:512MB 硬盘:36GB)
2. 软件环境
操作系统:linux9.0
数据库: Oracle 8.1.6 for Unix 企业版,SID:ora816
Oracle安装路径:/home/oracle
备份文件:所有数据库文件、控制文件、初始化文件、数据库备份以来的所有归档日志文件。
二、恢复步骤
下面根据从用户处带回来的备份数据,在一台新的服务器重建Oracle数据库。其详细步骤如下:
1. 创建数据库恢复使用的环境
在新的Dell服务器上,安装与原来的数据库服务器相同的操作系统linux9.0;然后安装与原数据库相同版本的Oracle 8.1.6 for Unix 企业版。
2. 删除新服务器上的Oracle实例
启动新数据库服务器上的Oracle,在sqlplus中,查找到数据库文件的路径,并保存在当前路径下的文件file_name.txt中:
$ sqlplus system/manager
SQL> spool file_name.txt
SQL> select file_name from sys.dba_data_files;
SQL> spool end
SQL>exit
关闭新服务器的Oracle,然后根据文件file_name.txt中的路径,删除新装的Oracle实例的所有数据库文件。
注:从本步开始所有操作都是用Oracle用户登录操作系统(Unix)后进行。文中所有的黑色粗体5号字符(标题除外)的语句可以直接执行,黑色倾斜粗体5号字符的语句需要修改后执行。
3. 恢复数据库文件
把备份的所有数据库文件用Ftp上传新的数据库服务器中的相同路径下。如果原来的路径已不存在,可以拷贝到其他路径下,恢复时详细处理方法见步骤7中<2>。
4. 恢复初始化参数文件
把备份的initSID.ora文件用Ftp上传到新数据库服务器中Oracle实例的initSID.ora文件位置,覆盖之。其位置一般在$ORACLE_HOME/dbs目录下。
5. 恢复控制文件
把备份的ControlFile.bak文件用Ftp上传到新数据库服务器中Oracle实例的各个镜像路径下,并按初始化参数文件initSID.ora中的该项的位置和名称命名。
control_files = ("/home/oracle/app/oracle/oradata/ora816/control01.ctl", "/home/oracle/app/oracle/oradata/ora816/control02.ctl","/home/oracle/app/oracle/oradata/ora816/control03.ctl")
其路径如有变动,在初始化参数文件initSID.ora中修改如上内容的路径和名称,使其实际路径与该参数的路径一致。
6. 恢复归档日志文件
把数据库备份后的归档日志用Ftp上传到新数据库服务器的相同路径下。路径如有变动可以根据初始化参数文件initSID.ora中如下位置进行修改,使其实际路径与该参数的路径一致。
log_archive_dest_1 = "location=/home/oracle/app/oracle/admin/ora816/arch"
7. 恢复数据库
经过以上6个步骤,把所有的备份文件已经上传到了新数据库服务器中。下面开始根据这些文件恢复并启动数据库,先在操作系统的提示符下做如下操作:
$svrmgrl
SVRMGR>connect internal
SVRMGR>startup mount
<1> 创建口令文件
如果原来的数据库配置了口令文件,并且在mount数据库时报如下错误:
ORA-01990: error opening password file '/home/oracle/app/oracle/product/8.1.6/dbs/orapw'
可以到/home/oracle/app/oracle/product/8.1.6/dbs/路径下,用以下命令创建口令文件:
orapwd
其用法如下:
Usage: orapwd file=
where
file - name of password file (mand),(口令文件的命名方式为:orapwSID)
password - password for SYS and INTERNAL (mand),
entries - maximum number of distinct DBA and OPERs (opt),
There are no spaces around the equal-to (=) character.
例如: orapwd file=orapwora816 password=manager
然后重新执行如下语句mount数据库:
SVRMGR>startup mount。
<2> 修改数据库文件的路径
如果在上述的步骤3中修改了恢复的数据库文件的路径,可以用如下语句对数据库文件重新命名 :
alter database rename file 'old_file' to 'new_file';
如把原来路径/home/oracle/app/oracle/oradata/ora816下的文件system01.dbf改到了/u21/oracle/app/oracle/oradata/ora816下:
SVRMGR>alter database rename file
'/home/oracle/app/oracle/oradata/ora816/system01.dbf'
to '/u21/oracle/app/oracle/oradata/ora816/system01.dbf';
按照上面的方法把所有修改路径的数据库文件重新命名。
<3> 根据控制文件和归档日志文件恢复数据库
下面开始用控制文件和归档日志文件恢复数据库:
SVRMGR>recover database using backup controlfile until cancel;
出现如下提示:
ORA-00279: change 50971 generated at 08/23/2002 09:21:27 needed for thread 1
ORA-00289:suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_399.arc
ORA-00280: change 50971 for thread 1 is in sequence #399
Specify log: {
auto
如果有如下提示,则表示成功。
ORA-00279: change 51007 generated at 08/23/2002 11:23:13 needed for thread 1
ORA-00289:suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_400.arc
ORA-00280: change 51007 for thread 1 is in sequence #400
ORA-00278: log file '/home/oracle/app/oracle/admin/ora8/arch/arch_1_399.arc' no
Log applied.
意外处理:如果其它提示可能是需要的日志文件不存在,检查ORA-00289中该文件是否存在。
直到出现如下提示:
ORA-00279: change 51011 generated at 08/23/2002 11:23:45 needed for thread 1
ORA-00289:suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_401.arc
ORA-00280: change 51011 for thread 1 is in sequence #401
ORA-00278: log file '/home/oracle/app/oracle/admin/ora8/arch/arch_1_400.arc' noy
ORA-00308: cannot open archived log '/home/oracle/app/oracle/admin/ora8/arch
/arch_1_401.arc'
ORA-27037: unable to obtain file status
Intel SVR4 UNIX Error: 2: No such file or directory
Additional information: 3
<4> 重置日志
SVRMGR>alter database open resetlogs;
意外处理:如果提示创建日志的路径不存在,按提示路径创建目录。然后再重置日志。
<5> 重启数据库,完成恢复
SVRMGR>shutdown immediate
SVRMGR>startup
ORACLE instance started.
Total System Global Area 123437040 bytes
Fixed Size 69616 bytes
Variable Size 106418176 bytes
Database Buffers 16777216 bytes
Redo Buffers 172032 bytes
Database mounted.
Database opened.
数据库正常打开,数据库重建恢复成功。
February 2006 Archives
问题描述:
这是一个回滚段表空间数据文件丢失或损坏的情景,这时oracle不能识别相应的数据文件。当你试图startup数据文件时会报ORA-1157,ORA-1110,并且可能会伴随着标识操作系统级别的错误,比如ORA-7360。当你试图以shutdown normal或shutdown immediate模式关闭数据库时会导至ORA-1116,ORA-1110,并可能伴随标识操作系统级别的错误,比如ORA-7368,有时以正常方式shutdown数据库根本shutdown不下来。
警告:
文章中所提及的步骤是供oracle的全球技术支持使用的。特别是步骤6中的_corrupted_rollback_segments参数,使用后需要重建数据库,在使用这个参前请观察一下所有其它的选项。
解决方法解释:
如下的解决方法取于检测问题出现时数据库所处于状态:
I. 数据库是处于关闭状态的。
试图打开数据库时报ORA-1157和ORA-1110错误,这时的解决方法取于数据库是否是正常shutdown的(使用normal或immediate选项。
I.A.数据库是正常shutdown的
如果数据数据库是正常shutdown的,最简单的解决方法是以offline drop选项删除丢失或损坏的数据文件,以restriceted模式打个数据库,删除并重建这个数据文件所属的那个回滚表空间。如果数据库是以shutdown abort或自己崩溃掉的则不要遵循这个过程。
步骤如下:
1、确认数据库是正常shutdown的。可以检查alter.log这个文件,定位到最后几行看是否可以看到如下的信息:
"alter database dismount
Completed: alter database dismount"
这当然也包括以正常方式shutdown,接然试图启动数据库确失败的状况。如果最近一次你是以shutdown abort方式关闭数据库的或数据库是自己crashed掉的,你应用使用下面的I.B的方法。
2、在init<sid>.ora中把属于丢失数据文件的回滚段从ROLLBACK_SEGMENTS参数中去掉。如果你不能确信是哪个回滚段,可以简单的把ROLLBACK_SEGMENTS这个参数注释掉。
3、以restricted模式mount数据库
STARTUP RESTRICT MOUNT;
4、Offline drop丢失或损坏的那个数据文件。
ALTER DATABASE DATAFILE '<full_path_file_name>' OFFLINE DROP;
5、打开数据库
ALTER DATABASE OPEN;
如果返回"Statement processed"这条信息,转到第7步.
如果得到ORA-604,ORA-376,和ORA-1110错误,转到第6步。
6、因为打开数据库失败,shutdown掉数据库并且编辑int<SID>.ora这个文件。注释掉ROLLBACK_SEGMENTS这个参数,并且在init<SID>.ora文件中加入如下一行:
_corrupted_rollback_segments = (<rollback1>,...,<rollbackN>)
这个参数应当包含ROLLBACK_SEGMENTS中所有的回滚段。
需要注意的是这个参数只能在指定的情况下或在oracle的全球持术支持的指导下才应使用,然后以restricted模式打开数据库:
STARTUP RESTRICT
7、删除掉那个文件所属的回滚段表空间。
DROP TABLESPACE <tablespace name> INCLUDING CONTENTS;
8、重建回滚段表空间及回滚段,创建完后使它们online.
9、使数据库所有用户都可用。
ALTER SYSTEM DISABLE RESTRICTED SESSION;
10、在init<SID>.ora中把你重新创建的回滚段再一次包括进来,如果你使用了第6步则移除掉CORRUPTED_ROLLBACK_SEGMENTS这个参数。
I.B.数据库不是正常shutdown的
这种情况,数据库最近一次是用shutdown abort或crashed掉关闭,回滚段中几乎一定包含着活动的事务。因此,坏的那个数据文件不能脱机(offline)或是drop掉,你必需从备份恢复这个文件。如果数据为是处于非归档模式的,只有最近的一些事务日志还没有被重写掉的情况你才能成功恢复这个文件。如果这个文件的备份也是无效的,联系一下oracle的技术支持吧。
步骤如下:
1、从备份中恢复丢失的那个数据文件.
2、mount 上数据库
3、执行如下的查询:
SELECT FILE#,NAME,STATUS FROM V$DATAFILE;
如果数据文件的状态是offline的,你必需先把它联机了:
ALTER DATABASE DATAFILE '<full_path_file_name>' ONLINE;
4、执行如下的查询:
SELECT V1.GROUP#, MEMBER, SEQUENCE#, FIRST_CHANGE#
FROM V$LOG V1, V$LOGFILE V2
WHERE V1.GROUP# = V2.GROUP# ;
这将列出所有的联机的重做日志和他们的序号及首次改变号(first change numbers).
5、如果这个数据库是非归档模式的,执行如下的查询:
SELECT FILE#, CHANGE# FROM V$RECOVER_FILE;
如果其中的CHANG#比4中的最小的那个FIRST_CHANGE#大的话,用联机日志就可以完成恢复。
6、如果CHANG#比4中的最小的那个FIRST_CHANGE#小,则数据库是不能恢复的,可以联系一下oracle的技术支持。
译者插入:如果你真是非归档方式且这个文件的备份也是无效的,如果你认为可以丢失回滚段中的那事务,你可以用I.A中从第6步的方法,这时可以打开数据库,应立即做一个备份,因为库中的数据有些不一致。
RECOVER DATAFILE '<full_path_file_name>'
7、确认所有的日志都被恢复,只到你收到"Media recovery complete"信息。
8、打开数据库
II. 数据库是启动着的
如果你检测到丢失或损坏了回滚段表空间的数据文件,并且数据库是运行着的,不要把它down掉。在很多情况下,数据库是启着的比关闭着解决问题更容易些。
这种情况的两种可能的解决方法:
A)使丢失的那个数据文件offline,并从备份中恢复它,这种情况适用于数据库是处于归档方式的。
B)另一个方法是offline掉所有的那个文件所属表空间的回滚段,drop那个表空间,然后得建它们。你可能不得不杀掉那些使用着回滚段的进程,以便使它offline.
方法II.A:从备份恢复那个数据文件
这个方法只有你的库是在归档方式下才能使用。
1、脱机(offline)那个丢失的数据文件。
ALTER DATABASE DATAFILE '<full_path_file_name>' OFFLINE;
提示:其于目前数据库的事务量,你可能需要建一个临时的回滚表空间和一些临时的回滚段以备正常业务运行。
2、从备份中恢复(restore)那个数据文件。
3、执行如下命令
SELECT V1.GROUP#, MEMBER, SEQUENCE#
FROM V$LOG V1, V$LOGFILE V2
WHERE V1.GROUP# = V2.GROUP# ;
这将列出所有的联机的重做日志和他们的序号及首次改变号(first change numbers).
4、得用联机日志及归档日志恢复那个文件
RECOVER DATAFILE '<full_path_file_name>'
5、确认所有的日志都被恢复,只到你收到"Media recovery complete"信息。
6、使这个数据文件online
ALTER DATABASE DATAFILE '<full_path_file_name>' ONLINE;
方法II.B:重建回滚表空间
这种方法不必考虑数据库是否是归档模式的。
步骤如下:
1、试图脱机所有的丢失或损坏数据文件所在回滚表空间中所包含的回滚段。
ALTER ROLLBACK SEGMENT <rollback_segment> OFFLINE;
重复执行这个命令直到所包含的回滚段都脱机.
2、检查回滚段的状态。
在drop掉它们之前它们必需是offline状态的。
SELECT SEGMENT_NAME, STATUS FROM DBA_ROLLBACK_SEGS
WHERE TABLESPACE_NAME = '<TABLESPACE_NAME>';
3、删除掉所有脱机的c。
DROP ROLLBACK SEGMENT <rollback_segment>;
4、处理那些保持online状态的回滚段
重复执行2一下的命令,如果回滚段在执行1中命令仍保扭亏为盈"ONLINE"状态,意味着它之中有活动的事务,你可以用如下的查询来确认一下:
SELECT SEGMENT_NAME, XACTS ACTIVE_TX, V.STATUS
FROM V$ROLLSTAT V, DBA_ROLLBACK_SEGS
WHERE TABLESPACE_NAME = '<TABLESPACE_NAME>' AND SEGMENT_ID = USN;
如果这个查询没有结果返回,意味着没有事务在这些回滚段中了。哪果有结果返回,那些不能offline的回滚段的状态应为"PENDING OFFLINE"。可以用5中的方法把这些事务杀掉。
5、强制使有活动事务的回滚段脱机
执行如下查询,看这些"PENDING OFFLINE"的回滚段包含哪些事务。
SELECT S.SID, S.SERIAL#, S.USERNAME, R.NAME "ROLLBACK"
FROM V$SESSION S, V$TRANSACTION T, V$ROLLNAME R
WHERE R.NAME IN ('<PENDING_ROLLBACK_1>', ... , '<PENDING_ROLLBACK_N>')
AND S.TADDR = T.ADDR AND T.XIDUSN = R.USN;
用ALTER SYSTEM KILL SESSION '<SID>, <SERIAL#>';语句杀掉这些事务,重复执行上面的查询,直到没有事务存在,这时运行一下2中的查询,确认这些回滚段己经处于offline状态,并用3中的语句把它们drop掉。
6、删除这个回滚表空间。
DROP TABLESPACE <tablespace_name> INCLUDING CONTENTS;
如果语句执行失败,请与oracle技术支持联系,否则转向7
7、重建回滚段表空间。
8、重建回滚段,并使它们联机(online)。
译者按:
回滚段表空间的数据文件丢失或损坏在实际中是比较棘手和常见的,产生这种问题 的原回很多的,比如介质的损坏、人为的误操作、机器的突然的断电等等。
建议没实践过这种操作的oracle的爱好者可以模拟一下这种故障,实际实测一下,注意一定要在测试库,我模拟的方法如下:
1、单独建了一个rbs表空间,并在这个表空间建了一个回滚段rbs_test。
2、指定一个transaction 用这个回滚段
sql>set transaction use rollback segment rbs_test;
sql>insert into test values ('2');
sql>insert into test values('3');
3、另开一个telnet窗口telnet至主机,执行如下命令:
sqlplus /nolog
sql>conn / as sysdba
sql>shutdown abort
4、把新加的那个回滚段表空间的数据文件更个名。
全文完
出处:http://epub.itpub.net/3/4.htm
隔离级别(isolation level)
l 隔离级别定义了事务与事务之间的隔离程度。
l 隔离级别与并发性是互为矛盾的:隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好。
l ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别:
l 未提交读(read uncommitted)
l 提交读(read committed)
l 重复读(repeatable read)
l 序列化(serializable)
l 通过一些现象,可以反映出隔离级别的效果。这些现象有:
l 更新丢失(lost update):当系统允许两个事务同时更新同一数据是,发生更新丢失。
l 脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。
l 非重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。(A transaction rereads data it has previously read and finds that another committed transaction has modified or deleted the data. )
l 幻像(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。(A transaction reexecutes a query returning a set of rows that satisfies a search condition and finds that another committed transaction has inserted additional rows that satisfy the condition. )
l 下面是隔离级别及其对应的可能出现或不可能出现的现象
| Dirty Read | NonRepeatable Read | Phantom Read |
Read uncommitted | Possible | Possible | Possible |
Read committed | Not possible | Possible | Possible |
Repeatable read | Not possible | Not possible | Possible |
Serializable | Not possible | Not possible | Not possible |
ORACLE的隔离级别
l ORACLE提供了SQL92标准中的read committed和serializable,同时提供了非SQL92标准的read-only。
l read committed:
l 这是ORACLE缺省的事务隔离级别。
l 事务中的每一条语句都遵从语句级的读一致性。
l 保证不会脏读;但可能出现非重复读和幻像。
l serializable:
l 简单地说,serializable就是使事务看起来象是一个接着一个地顺序地执行。
l 仅仅能看见在本事务开始前由其它事务提交的更改和在本事务中所做的更改。
l 保证不会出现非重复读和幻像。
l Serializable隔离级别提供了read-only事务所提供的读一致性(事务级的读一致性),同时又允许DML操作。
l 如果有在serializable事务开始时未提交的事务在serializable事务结束之前修改了serializable事务将要修改的行并进行了提交,则serializable事务不会读到这些变更,因此发生无法序列化访问的错误。(换一种解释方法:只要在serializable事务开始到结束之间有其他事务对serializable事务要修改的东西进行了修改并提交了修改,则发生无法序列化访问的错误。)
l If a serializable transaction contains data manipulation language (DML) that attempts to update any resource that may have been updated in a transaction uncommitted at the start of the serializable transaction, (并且修改在后来被提交而没有回滚),then the DML statement fails. 返回的错误是 ORA-08177: Cannot serialize access for this transaction。(Sky 注:这里指的资源被修改是指两个事务更新相同的行,如果不是相同的行,不会有任何影响,各自更新自己的数据,如果是相同的行,且其他事务已经 commit,则产生错误 ORA-08177,如过其他事务还没有完成,serializable 事务会等待其他事务 commit 或者 rollback,如果 commit 返回 错误 ORA-08177,如果 rollback,则可以更新该行。)
l ORACLE在数据块中记录最近对数据行执行修改操作的N个事务的信息,目的是确定是否有在本事务开始时未提交的事务修改了本事务将要修改的行。具体见英文:Oracle permits a serializable transaction to modify a data row only if it can determine that prior changes to the row were made by transactions that had committed when the serializable transaction began. To make this determination efficiently, Oracle uses control information stored in the data block that indicates which rows in the block contain committed and uncommitted changes. In a sense, the block contains a recent history of transactions that affected each row in the block. The amount of history that is retained is controlled by the INITRANS parameter of CREATE TABLE and ALTER TABLE. Under some circumstances, Oracle may have insufficient history information to determine whether a row has been updated by a "too recent" transaction. This can occur when many transactions concurrently modify the same data block, or do so in a very short period. You can avoid this situation by setting higher values of INITRANS for tables that will experience many transactions updating the same blocks. Doing so will enable Oracle to allocate sufficient storage in each block to record the history of recent transactions that accessed the block.
l The INITRANS Parameter:Oracle stores control information in each data block to manage access by concurrent transactions. Therefore, if you set the transaction isolation level to serializable, you must use the ALTER TABLE command to set INITRANS to at least 3. This parameter will cause Oracle to allocate sufficient storage in each block to record the history of recent transactions that accessed the block. Higher values should be used for tables that will undergo many transactions updating the same blocks.
l read-only:
l 遵从事务级的读一致性,仅仅能看见在本事务开始前由其它事务提交的更改。
l 不允许在本事务中进行DML操作。
l read only是serializable的子集。它们都避免了非重复读和幻像。区别是在read only中是只读;而在serializable中可以进行DML操作。
l Export with CONSISTENT = Y sets the transaction to read-only.
l read committed 和 serializable 的区别和联系:
l 事务1先于事务2开始,并保持未提交状态。事务2想要修改正被事务1修改的行。事务2等待。如果事务1回滚,则事务2(不论是 read committed 还是 serializable 方式)进行它想要做的修改。如果事务1提交,则当事务 2 是 read committed 方式时,进行它想要做的修改(Sky 注:此时应该也不是马上修改,而是等其他事务 commit 或 rollback 之后,因为其他事务更新时会加上行级排他锁);当事务 2 是 serializable 方式时,失败并报错“Cannot serialize access”,因为事务2看不见事务1提交的修改,且事务2想在事务一修改的基础上再做修改。具体见英文:Both read committed and serializable transactions use row-level locking, and both will wait if they try to change a row updated by an uncommitted concurrent transaction. The second transaction that tries to update a given row waits for the other transaction to commit or roll back and release its lock. If that other transaction rolls back, the waiting transaction (regardless of its isolation mode) can proceed to change the previously locked row, as if the other transaction had not existed. However, if the other (blocking) transaction commits and releases its locks, a read committed transaction proceeds with its intended update. A serializable transaction, however, fails with the error "Cannot serialize access", because the other transaction has committed a change that was made since the serializable transaction began.
l read committed 和 serializable 可以在 ORACLE 并行服务器中使用。
l 关于SET TRANSACTION READ WRITE:read write和read committed 应该是一样的。在读方面,它们都避免了脏读,但都无法实现重复读。虽然没有文档说明read write在写方面与read committed一致,但显然它在写的时候会加排他锁以避免更新丢失。在加锁的过程中,如果遇到待锁定资源无法锁定,应该是等待而不是放弃。这与read committed一致。
l 语句级的读一致性
l ORACLE保证语句级的读一致性,即一个语句所处理的数据集是在单一时间点上的数据集,这个时间点是这个语句开始的时间。
l 一个语句看不见在它开始执行后提交的修改。
l 对于DML语句,它看不见由自己所做的修改,即DML语句看见的是它本身开始执行以前存在的数据。
l 事务级的读一致性
l 事务级的读一致性保证了可重复读,并保证不会出现幻像。
l 设置隔离级别
l 设置一个事务的隔离级别
l SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
l SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
l SET TRANSACTION READ ONLY;
l 设置增个会话的隔离级别
l ALTER SESSION SET ISOLATION_LEVEL SERIALIZABLE;
l ALTER SESSION SET ISOLATION_LEVEL READ COMMITTED;
Sky 总结:
Oracle 的隔离级别为四种:
SET TRANSACTION ISOLATION LEVEL {SERIALIZABLE | READ COMMITTED};
SET TRANSACTION READ {ONLY | WRITE};
在读方面,READ ONLY 和 SERIALIZABLE 相同,都是读取 SET TRANSACTION 语句开始之前所有事务 commit 之后的状态;READ WRITE 和 READ COMMITTED 相同,读取其他任何事务 Commit 之后的数据。
在写方面,READ ONLY 不能执行除 SELECT 之外的 DML 语句,否则会产生 ORA-01456 错误;SERIALIZABLE 能更新,但如果和其他事务更新相同的行,如果其他事务 Commit,则 SERIALIZABLE 事务产生 ORA-08177 错误,如果其他事务回滚,则可以更新(因为 SERIALIZABLE 事务开始之后对其他事物的更改是不可见的);READ WRITE 和 READ COMMITTED 也应该一样(默认应该也是这两种事务之一),更新数据的时候会加上行级锁,防止其他事务更新,当更新其他事务在更新的行时,就等待其他事务 Commit 或者 Rollback,如果其他事务 rollback,那么可以更新该行,如果其他事务 Commit 则不会产生错误。
另外,sysdba 不能使用 SERIALIZABLE 事务,否则会产生 ORA-08178 错误。
Tom 回答的关于事务一致性和隔离级别的问题:
http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:7636765105002
SET TRANSACTION Statement:
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96624/13_elems47.htm#36199
cpio命令详细用法
cpio - 存取归档包中的文件
语法 Syntax
cpio -o [ -aBLuvV ] [ -C bufsize ] [ -c | -H format ][ -K volumesize ] [ [ -O file [, file ... ] ] [ -M message ] ] [ -Pifd,ofd ]
cpio -i [ -6AbBcdfkmnqrsStTuvV ] [-C bufsize ] [ [ -I file [, file ... ] ]
[ -M message ] ] [ -Pifd,ofd ] [ pattern ... ]
cpio -p [ -adlLmruvV ] [ -Pifd,ofd ] directory
描述(DEscriptION)
cpio 可以从 cpio 或 tar 格式的归档包中存入和读取文件, 归档包是一种包含其他文件和有关信息的文件。 有关信息包括:文件名, 属主, 时标(timestamp), 和访问权限。 归档包可以是磁盘上的 其他文件, 也可以是磁带或管道。
cpio 有三种操作模式:
在copy-out模式中, cpio 把文件复制到归档包中。它从标准输入获得文件名列表 (一行一个), 把归档包写到标准输出。生成文件名列表的典型方法是使用find 命令; 你可能要在 find 后面用上 -depth选项, 减少因为进入没有访问权限的目录而引起的麻烦。
在copy-in模式中, cpio 从归档包里读取文件, 或者列出归档包里的内容。它从标准输入读入归档包。任何不是选项的命令行参数被视为shell的通配符模式串 (globbing pattern); 在归档包中, 只有文件名匹配这些模式串的文件才能复制出来。 和 shell 中不一样, 文件名起始处的 '.' 可以匹配模式串起始处的通配符, 文件名中的 '/' 也可以匹配通配符。 如果没有给出模式串, 那么将读出所有文件。
在copy-pass模式中, cpio把文件从一棵目录树复制到另一棵, 它结合了 copy-in 和 copy-out 的操作, 但不使用归档包。 cpio从标准输入读取欲复制的文件名列表; 目标目录作为非选项的命令行参数给出。
cpio支持下列的归档格式: binary, old ASCII, new ASCII, crc, HPUX binary, HPUX old ASCII, old tar, 和 POSIX.1 tar。
"binary"格式是过时格式, 因为它保存文件信息的方法无法应用在不同体系的机器间移植。"old ASCII" 格式可以跨平台使用, 但是不能用于超过 65536 个 i 节点的文件系统中。 "new ASCII" 格式可以跨平台使用, 也适用于任意大小的文件系统, 但不是所有版本的 cpio 都支持; 目前只有 GNU 和 System VR4 的 cpio 支持。"crc" 格式 类似于 "new ASCII" 格式, 同时对每个文件计算校验和。cpio 在创建归档包时算出校验和, 解开文件时进行校验。 "HPUX" 格式用于兼容 HP UNIX 的 cpio, 它用了独特的方法来保存设备文件。
"tar" 格式用以兼容 tar 程序。它不能归档文件名超过 100 个字符的文件, 也不能归档特殊文件 (块设备或字符设备)。 "POSIX.1 tar" 格式不能归档文件名超过 255 个字符的文件(小于, 除非文件名的最右边有一个 "/")。
缺省情况下, cpio 为了兼容老式的 cpio 程序, 创建 "binary" 格式的归档包。当展开归档包时, cpio 能够自动识别归档包的格式, 而且可以读取在其他字节顺序的机器上创建的归档包。
cpio 的某些选项只能用在对应的操作模式上; 参见总览小节, 里面列出了什么选项可以用在什么模式上。
选项 (OPTIONS)
-0, --null 在copy-out 和 copy-pass 模式中, 认为输入的文件名以 null字符结尾,而不是换行符, 这样即使文件名中包含换行符, 也不影响归档。 GNU find 是生成 null 结尾文件名列表的方法之一。
-a, --reset-access-time 读取完文件后重置文件的访问时间, 这样看上去就象没被访问过一样。
-A, --append 追加到已经存在的归档包中。仅用于 copy-out模式。该归档包必须是用 -O 或 -F (--file) 选项指定的磁盘文件。
-b, --swap 在 copy-in 模式中, 颠倒数据中字中的半字和半字中的字节顺序。 相当于 -sS 使用这个选项,可以在大端数和小端数机器之间转换 32 位整数。
-B 把 I/O 块大小设置成 5120 字节,最初的块大小是 512 字节。
--block-size=BLOCK-SIZE
设置 I/O 块 大小 为 BLOCK-SIZE * 512 字节。
-c 使用老式的跨平台 (ASCII) 归档格式。
-C IO-SIZE, --io-size=IO-SIZE 设置 I/O 块大小为 IO-SIZE 字节。
-d, --make-directories 在需要的地方创建开始目录。
-E FILE, --pattern-file=FILE 在 copy-in 模式中, 从 FILE 中读取用于匹配文件名的模式串, FILE 中的内容就象 cpio 的非选项参数一样看待。
-f, --nonmatching 只复制那些不匹配任何给定的模式串的文件。
-F, --file=archive 使用归档文件名, 而不是标准输入或输出。 如果把其他机器上的磁带机作成归档文件使用, 文件名要用 "HOSTNAME:" 开始。 主机名前面可以加上用户名和一个 '@', 作为访问远程磁带机的用户 (如果你有这样的权限, 一般在用户的 ~/.rhosts 文件中会有这么一项)。
--force-local 和 -F, -I, 或 -O, 一起用, 即使文件名中含有一个冒号,也把归档文件看作本地文件, 一般说来冒号指出一个远程主机名字。
-H FORMAT, --format=FORMAT 使用归档格式 FORMAT。 有效的格式在下面列出, 大小写均可. "copy-in" 模式的缺省动作是自动检测归档格式, "copy-out" 的缺省格式是 "bin"。
in 老式的 binary 格式。
odc 老式的 (POSIX.1) 跨平台格式。
ewc 新型 (SVR4) 跨平台格式, 支持大于 65536 i节点的文件系统。
crc 新型 (SVR4) 跨平台格式, 并且计算校验和。
tar 老式的 tar 格式。
ustar POSIX.1 tar 格式, 也能识别 GNU tar 归档文件, 它们相似但不全相同。
hpbin HP UNIX 上的 cpio 使用的老式的 binary 格式。(用独特的方法储存设备文件)
hpodc HP UNIX 上的 cpio 使用的跨平台格式。 (用独特的方法储存设备文件)
-i, --extract 进入 copy-in 模式。
-I archive 使用归档文件名, 而不是标准输入。 如果把其他机器上的磁带机作成归档文件, 文件名要用 "HOSTNAME:" 开始。主机名前面可以加上用户名和一个 '@', 作为 访问远程 磁带机的用户 (如果你有这样的权限, 一般在用户的 ~/.rhosts 文件中会有这么一项)。
-k 无效操作; 只是用来兼容其他版本的 cpio。
-l, --link 如果有可能, 连接文件, 而不是复制。
-L, --dereference 解除符号连接的关联 (复制符号连接指向的 文件, 而不是连接本身)。
-m, --preserve-modification-time 当创建文件时, 保留以前的文件修改时间。
-M MESSAGE, --message=MESSAGE当备份介质(例如 磁带或软盘) 到达卷尾时, 显示一条消息, 提醒用户插入下一卷。如果 MESSAGE 包含字符串 "%d", 它被替换成当前卷号 (从 1 开始)。
-n, --numeric-uid-gid 以详细方式 (verbose) 显示内容时, 用数字显示 UID 和 GID, 而不是翻译成名称。
--no-absolute-filenames 在copy-in模式中, 即使它们在归档包中有绝对路径名。也在当前目录中创建所有相关文件,
--no-preserve-owner 在 copy-in 和 copy-pass 模式中, 不改变文件的属主关系 (译注: 疑为不保留); 使它们属于展开它们的用户。这是普通用户的缺省行为, 因此 System V 的用户不致于无意中把文件泄露(give away)。
-o, --create 进入 copy-out 模式。
-O archive 使用归档文件名, 而不是标准输出。 如果把其他机器上的磁带机作成归档文件, 文件名要用 "HOSTNAME:" 开始。主机名前面可以加上用户名和一个 '@', 作为访问远程磁带机的用户 (如果你有这样的权限, 一般在用户的 ~/.rhosts 文件中会有这么一项)。
--only-verify-crc 当在 copy-in 模式读入 CRC 格式的归档包时, 不展开里面的文件, 而只是测试文件的 CRC 码。
-p, --pass-through 进入 copy-pass 模式。
--quiet 不显示复制的块数。
-r, --rename 交互式文件改名。
-R [user][:.][group], --owner [user][:.][group] 在 copy-out 和 copy-pass 模式中, 把所有文件的属主设置为指定的用户和/或用户组。 无论用户还是用户组都必须存在。 如果省略用户组, 但是给出了分隔符 ":" 或 "。', 则使用给定用户登录时的用户组。 只有超级用户能够改变文件的属主。
--sparse 在 copy-out 和 copy-pass 模式中, 把大块数据 0 的文件写成稀疏文件 (sparse file)。
-s, --swap-bytes 在 copy-in 模式中, 交换文件中每一个半字(字节对) 中的字节。
-S, --swap-halfwords 在 copy-in 模式中, 交换文件中每一个字(4字节) 中的半字。
-t, --list 显示输入归档包的内容。
-u, --unconditional 替换所有文件, 不再提问是否用旧文件替换已经存在的新文件。
-v, --verbose 列出处理的文件, 加上 -t 选项可以列出一个 'ls -l' 风格的列表。在一个归档包内容的详细列表 (verbose) 中, 如果本地系统不存在归档文件的用户和用户组名称, 它们将被替换成其数字 UID和GID 对应于本地系统的用户和用户组名称。
-V --dot 每处理一个文件, 显示一个 "."。
--version 显示 cpio 程序的版本号, 然后退出。
系统环境:
1、操作系统:Windows 2000 Server,机器内存128M
2、数据库: Oracle 8i R2 (8.1.6) for NT 企业版
3、安装路径:D:\ORACLE
建库步骤:
1、手工创建相关目录
D:\Oracle\admin\test
D:\Oracle\admin\test\adhoc
D:\Oracle\admin\test\bdump
D:\Oracle\admin\test\cdump
D:\Oracle\admin\test\create
D:\Oracle\admin\test\exp
D:\Oracle\admin\test\pfile
D:\Oracle\admin\test\udump
D:\Oracle\oradata\test
D:\Oracle\oradata\test\archive
2、手工创建初始化启动参数文件:D:\Oracle\admin\test\pfile\inittest.ora,内容:
3、手工创建D:\Oracle\Ora81\DATABASE\inittest.ora文件,
内容:IFILE='D:\Oracle\admin\test\pfile\inittest.ora'
4、使用orapwd.exe命令,创建D:\Oracle\Ora81\DATABASE\PWDtest.ora
命令:D:\Oracle\Ora81\bin\orapwd file=D:\Oracle\Ora81\DATABASE\PWDtest.ora password=ORACLE entries=5
5、通过oradim.exe命令,在服务里生成一个新的实例管理服务,启动方式为手工
set ORACLE_SID=test
D:\Oracle\Ora81\bin\oradim -new -sid test -startmode manual -pfile "D:\Oracle\admin\test\pfile\inittest.ora"
6、生成各种数据库对象
D:\>svrmgrl
--创建数据库
connect INTERNAL/oracle
startup nomount pfile="D:\Oracle\admin\test\pfile\inittest.ora"
CREATE DATABASE test
LOGFILE 'D:\Oracle\oradata\test\redo01.log' SIZE 2048K,
'D:\Oracle\oradata\test\redo02.log' SIZE 2048K,
'D:\Oracle\oradata\test\redo03.log' SIZE 2048K
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXLOGHISTORY 1
DATAFILE 'D:\Oracle\oradata\test\system01.dbf' SIZE 58M REUSE AUTOEXTEND ON NEXT 640K
MAXDATAFILES 254
MAXINSTANCES 1
CHARACTER SET ZHS16GBK
NATIONAL CHARACTER SET ZHS16GBK;
控制文件、日志文件在上面语句执行时生成
connect INTERNAL/oracle
--修改系统表空间
ALTER TABLESPACE SYSTEM DEFAULT STORAGE ( INITIAL 64K NEXT 64K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 50);
ALTER TABLESPACE SYSTEM MINIMUM EXTENT 64K;
--创建回滚表空间
CREATE TABLESPACE RBS DATAFILE 'D:\Oracle\oradata\test\rbs01.dbf' SIZE 256M REUSE
AUTOEXTEND ON NEXT 5120K
MINIMUM EXTENT 512K
DEFAULT STORAGE ( INITIAL 512K NEXT 512K MINEXTENTS 8 MAXEXTENTS 4096);
--创建用户表空间
CREATE TABLESPACE USERS DATAFILE 'D:\Oracle\oradata\test\users01.dbf' SIZE 128M REUSE
AUTOEXTEND ON NEXT 1280K
MINIMUM EXTENT 128K
DEFAULT STORAGE ( INITIAL 128K NEXT 128K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0);
--创建临时表空间
CREATE TABLESPACE TEMP DATAFILE 'D:\Oracle\oradata\test\temp01.dbf' SIZE 32M REUSE
AUTOEXTEND ON NEXT 640K
MINIMUM EXTENT 64K
DEFAULT STORAGE ( INITIAL 64K NEXT 64K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0) TEMPORARY;
--创建工具表空间
CREATE TABLESPACE TOOLS DATAFILE 'D:\Oracle\oradata\test\tools01.dbf' SIZE 64M REUSE
AUTOEXTEND ON NEXT 320K
MINIMUM EXTENT 32K
DEFAULT STORAGE ( INITIAL 32K NEXT 32K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0);
--创建索引表空间
CREATE TABLESPACE INDX DATAFILE 'D:\Oracle\oradata\test\indx01.dbf' SIZE 32M REUSE
AUTOEXTEND ON NEXT 1280K
MINIMUM EXTENT 128K
DEFAULT STORAGE ( INITIAL 128K NEXT 128K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0);
--创建回滚段
CREATE PUBLIC ROLLBACK SEGMENT RBS0 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS1 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS2 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS3 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS4 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS5 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS6 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS7 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS8 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS9 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS10 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS11 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS12 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS13 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS14 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS15 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS16 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS17 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS18 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS19 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS20 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS21 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS22 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS23 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS24 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
--使回滚段在线
ALTER ROLLBACK SEGMENT "RBS0" ONLINE;
ALTER ROLLBACK SEGMENT "RBS1" ONLINE;
ALTER ROLLBACK SEGMENT "RBS2" ONLINE;
ALTER ROLLBACK SEGMENT "RBS3" ONLINE;
ALTER ROLLBACK SEGMENT "RBS4" ONLINE;
ALTER ROLLBACK SEGMENT "RBS5" ONLINE;
ALTER ROLLBACK SEGMENT "RBS6" ONLINE;
ALTER ROLLBACK SEGMENT "RBS7" ONLINE;
ALTER ROLLBACK SEGMENT "RBS8" ONLINE;
ALTER ROLLBACK SEGMENT "RBS9" ONLINE;
ALTER ROLLBACK SEGMENT "RBS10" ONLINE;
ALTER ROLLBACK SEGMENT "RBS11" ONLINE;
ALTER ROLLBACK SEGMENT "RBS12" ONLINE;
ALTER ROLLBACK SEGMENT "RBS13" ONLINE;
ALTER ROLLBACK SEGMENT "RBS14" ONLINE;
ALTER ROLLBACK SEGMENT "RBS15" ONLINE;
ALTER ROLLBACK SEGMENT "RBS16" ONLINE;
ALTER ROLLBACK SEGMENT "RBS17" ONLINE;
ALTER ROLLBACK SEGMENT "RBS18" ONLINE;
ALTER ROLLBACK SEGMENT "RBS19" ONLINE;
ALTER ROLLBACK SEGMENT "RBS20" ONLINE;
ALTER ROLLBACK SEGMENT "RBS21" ONLINE;
ALTER ROLLBACK SEGMENT "RBS22" ONLINE;
ALTER ROLLBACK SEGMENT "RBS23" ONLINE;
ALTER ROLLBACK SEGMENT "RBS24" ONLINE;
--修改sys用户的临时表空间为TEMP
alter user sys temporary tablespace TEMP;
--创建数据字典表
@D:\Oracle\Ora81\Rdbms\admin\catalog.sql;
@D:\Oracle\Ora81\Rdbms\admin\catexp7.sql
@D:\Oracle\Ora81\Rdbms\admin\catproc.sql
@D:\Oracle\Ora81\Rdbms\admin\caths.sql
connect system/manager
@D:\Oracle\Ora81\sqlplus\admin\pupbld.sql
connect internal/oracle
@D:\Oracle\Ora81\Rdbms\admin\catrep.sql
exit
--生成SQL*Plus帮助系统
sqlplus SYSTEM/manager
@D:\Oracle\Ora81\sqlplus\admin\help\helpbld.sql helpus.sql
exit
--修改system用户默认表空间和临时表空间
svrmgrl
connect internal/oracle
alter user system default tablespace TOOLS;
alter user system temporary tablespace TEMP;
exit
7、将test实例启动服务设置成自动启动方式
D:\Oracle\Ora81\bin\oradim -edit -sid test -startmode auto
在linux下一些常用的关机/重启命令有shutdown、halt、reboot、及init,它们都
可以达到重启系统的目的,但每个命令的内部工作过程是不同的,通过本文的介绍,希
望你可以更加灵活的运用各种关机命令。
1.shutdown
shutdown命令安全地将系统关机。 有些用户会使用直接断掉电源的方式来关闭linux,
这是十分危险的。因为linux与windows不同,其后台运行着许多进程,所以强制关机可能
会导致进程的数据丢失﹐使系统处于不稳定的状态﹐甚至在有的系统中会损坏硬件设备。
而在系统关机前使用shutdown命令﹐系统管理员会通知所有登录的用户系统将要关闭。
并且login指令会被冻结﹐即新的用户不能再登录。直接关机或者延迟一定的时间才关机
都是可能的﹐还可能重启。这是由所有进程〔process〕都会收到系统所送达的信号〔signal〕
决定的。这让像vi之类的程序有时间储存目前正在编辑的文档﹐而像处理邮件〔mail〕和
新闻〔news〕的程序则可以正常地离开等等。
shutdown执行它的工作是送信号〔signal〕给init程序﹐要求它改变runlevel。
Runlevel 0被用来停机〔halt〕﹐runlevel 6是用来重新激活〔reboot〕系统﹐
而runlevel 1则是被用来让系统进入管理工作可以进行的状态﹔这是预设的﹐假定没有-h也
没有-r参数给shutdown。要想了解在停机〔halt〕或者重新开机〔reboot〕过程中做了哪些
动作﹐你可以在这个文件/etc/inittab里看到这些runlevels相关的资料。
shutdown 参数说明:
[-t] 在改变到其它runlevel之前﹐告诉init多久以后关机。
[-r] 重启计算器。
[-k] 并不真正关机﹐只是送警告信号给每位登录者〔login〕。
[-h] 关机后关闭电源〔halt〕。
[-n] 不用init﹐而是自己来关机。不鼓励使用这个选项﹐而且该选项所产生的后果往
往不总是你所预期得到的。
[-c] cancel current process取消目前正在执行的关机程序。所以这个选项当然没有
时间参数﹐但是可以输入一个用来解释的讯息﹐而这信息将会送到每位使用者。
[-f] 在重启计算器〔reboot〕时忽略fsck。
[-F] 在重启计算器〔reboot〕时强迫fsck。
[-time] 设定关机〔shutdown〕前的时间。
2.halt----最简单的关机命令
其实halt就是调用shutdown -h。halt执行时﹐杀死应用进程﹐执行sync系统调用﹐
文件系统写操作完成后就会停止内核。
参数说明:
[-n] 防止sync系统调用﹐它用在用fsck修补根分区之后﹐以阻止内核用老版本的超
级块〔superblock〕覆盖修补过的超级块。
[-w] 并不是真正的重启或关机﹐只是写wtmp〔/var/log/wtmp〕纪录。
[-d] 不写wtmp纪录〔已包含在选项[-n]中〕。
[-f] 没有调用shutdown而强制关机或重启。
[-i] 关机〔或重启〕前﹐关掉所有的网络接口。
[-p] 该选项为缺省选项。就是关机时调用poweroff。
3.reboot
reboot的工作过程差不多跟halt一样﹐不过它是引发主机重启﹐而halt是关机。它
的参数与halt相差不多。
4.init
init是所有进程的祖先﹐它的进程号始终为1﹐所以发送TERM信号给init会终止所有的
用户进程﹑守护进程等。shutdown 就是使用这种机制。init定义了8个运行级别(runlevel),
init 0为关机﹐init 1为重启。关于init可以长篇大论﹐这里就不再叙述。另外还有
telinit命令可以改变init的运行级别﹐比如﹐telinit -iS可使系统进入单用户模式﹐
并且得不到使用shutdown时的信息和等待时间。
一、安装
命令格式:
rpm -i ( or --install) options file1.rpm ... fileN.rpm
参数:
file1.rpm ... fileN.rpm 将要安装的RPM包的文件名
详细选项:
-h (or --hash) 安装时输出hash记号 (``#'')
--test 只对安装进行测试,并不实际安装。
--percent 以百分比的形式输出安装的进度。
--excludedocs 不安装软件包中的文档文件
--includedocs 安装文档
--replacepkgs 强制重新安装已经安装的软件包
--replacefiles 替换属于其它软件包的文件
--force 忽略软件包及文件的冲突
--noscripts 不运行预安装和后安装脚本
--prefix <path> 将软件包安装到由 <path> 指定的路径下
--ignorearch 不校验软件包的结构
--ignoreos 不检查软件包运行的操作系统
--nodeps 不检查依赖性关系
--ftpproxy <host> 用 <host> 作为 FTP代理
--ftpport <port> 指定FTP的端口号为 <port>
通用选项
-v 显示附加信息
-vv 显示调试信息
--root <path> 让RPM将<path>指定的路径做为"根目录",这样预安装程序和后安
装程序都会安装到这个目录下
--rcfile <rcfile> 设置rpmrc文件为 <rcfile>
--dbpath <path> 设置RPM 资料库存所在的路径为 <path>
二、删除
命令格式:
rpm -e ( or --erase) options pkg1 ... pkgN
参数
pkg1 ... pkgN :要删除的软件包
详细选项
--test 只执行删除的测试
--noscripts 不运行预安装和后安装脚本程序
--nodeps 不检查依赖性
通用选项
-vv 显示调试信息
--root <path> 让RPM将<path>指定的路径做为"根目录",这样预安装程序和后安装
程序都会安装到这个目录下
--rcfile <rcfile> 设置rpmrc文件为 <rcfile>
--dbpath <path> 设置RPM 资料库存所在的路径为 <path>
三、升级
命令格式
rpm -U ( or --upgrade) options file1.rpm ... fileN.rpm
参数
file1.rpm ... fileN.rpm 软件包的名字
详细选项
-h (or --hash) 安装时输出hash记号 (``#'')
--oldpackage 允许"升级"到一个老版本
--test 只进行升级测试
--excludedocs 不安装软件包中的文档文件
--includedocs 安装文档
--replacepkgs 强制重新安装已经安装的软件包
--replacefiles 替换属于其它软件包的文件
--force 忽略软件包及文件的冲突
--percent 以百分比的形式输出安装的进度。
--noscripts 不运行预安装和后安装脚本
--prefix <path> 将软件包安装到由 <path> 指定的路径下
--ignorearch 不校验软件包的结构
--ignoreos 不检查软件包运行的操作系统
--nodeps 不检查依赖性关系
--ftpproxy <host> 用 <host> 作为 FTP代理
--ftpport <port> 指定FTP的端口号为 <port>
通用选项
-v 显示附加信息
-vv 显示调试信息
--root <path> 让RPM将<path>指定的路径做为"根目录",这样预安装程序和后安装程序都会安装到这个目录下
--rcfile <rcfile> 设置rpmrc文件为 <rcfile>
--dbpath <path> 设置RPM 资料库存所在的路径为 <path>
四、查询
命令格式:
rpm -q ( or --query) options
参数:
pkg1 ... pkgN :查询已安装的软件包
详细选项
-p <file>(or ``-'') 查询软件包的文件
-f <file> 查询<file>属于哪个软件包
-a 查询所有安装的软件包
--whatprovides <x> 查询提供了 <x>功能的软件包
-g <group> 查询属于<group> 组的软件包
--whatrequires <x> 查询所有需要 <x> 功能的软件包
信息选项
<null> 显示软件包的全部标识
-i 显示软件包的概要信息
-l 显示软件包中的文件列表
-c 显示配置文件列表
-d 显示文档文件列表
-s 显示软件包中文件列表并显示每个文件的状态
--scripts 显示安装、卸载、校验脚本
--queryformat (or --qf) 以用户指定的方式显示查询信息
--dump 显示每个文件的所有已校验信息
--provides 显示软件包提供的功能
--requires (or -R) 显示软件包所需的功能
通用选项
-v 显示附加信息
-vv 显示调试信息
--root <path> 让RPM将<path>指定的路径做为"根目录",这样预安装程序和后安装程序都会安装到这个目录下
--rcfile <rcfile> 设置rpmrc文件为 <rcfile>
--dbpath <path> 设置RPM 资料库存所在的路径为 <path>
五、校验已安装的软件包
命令格式:
rpm -V ( or --verify, or -y) options
参数
pkg1 ... pkgN 将要校验的软件包名
软件包选项
-p <file> Verify against package file <file>
-f <file> 校验<file>所属的软件包
-a Verify 校验所有的软件包
-g <group> 校验所有属于组 <group> 的软件包
详细选项
--noscripts 不运行校验脚本
--nodeps 不校验依赖性
--nofiles 不校验文件属性
通用选项
-v 显示附加信息
-vv 显示调试信息
--root <path> 让RPM将<path>指定的路径做为"根目录",这样预安装程序和后安装程序都会安装到这个目录下
--rcfile <rcfile> 设置rpmrc文件为 <rcfile>
--dbpath <path> 设置RPM 资料库存所在的路径为 <path>
六、校验软件包中的文件
语法:
rpm -K ( or --checksig) options file1.rpm ... fileN.rpm
参数:
file1.rpm ... fileN.rpm 软件包的文件名
Checksig--详细选项
--nopgp 不校验PGP签名
通用选项
-v 显示附加信息
-vv 显示调试信息
--rcfile <rcfile> 设置rpmrc文件为 <rcfile>
七、其它RPM选项
--rebuilddb 重建RPM资料库
--initdb 创建一个新的RPM资料库
--quiet 尽可能的减少输出
--help 显示帮助文件
--version 显示RPM的当前版本
rpm命令参数列表
1.安装一个包
# rpm -ivh
2.升级一个包
# rpm -Uvh
3.移走一个包
# rpm -e
4.安装参数
--force 即使覆盖属于其它包的文件也强迫安装
--nodeps 如果该RPM包的安装依赖其它包,即使其它包没装,也强迫安装。
5.查询一个包是否被安装
# rpm -q < rpm package name>
6.得到被安装的包的信息
# rpm -qi < rpm package name>
7.列出该包中有哪些文件
# rpm -ql < rpm package name>
8.列出服务器上的一个文件属于哪一个RPM包
#rpm -qf
9.可综合好几个参数一起用
# rpm -qil < rpm package name>
10.列出所有被安装的rpm package
# rpm -qa
11.列出一个未被安装进系统的RPM包文件中包含有哪些文件?
# rpm -qilp < rpm package name>
查看表空间的名称及大小:
SQL>select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size
from dba_tablespaces t, dba_data_files d where t.tablespace_name = d.tablespace_name group by t.tablespace_name;
查看表空间物理文件的名称及大小:
SQL>select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name;
查看回滚段名称及大小:
SQL>select segment_name, tablespace_name, r.status,
(initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent,
max_extents, v.curext CurExtent From dba_rollback_segs r, v$rollstat v
Where r.segment_id = v.usn(+) order by segment_name;
如何查看某个回滚段里面,跑的什么事物或者正在执行什么sql语句:
SQL>select d.sql_text,a.name
from v$rollname a,v$transaction b,v$session c,v$sqltext d
where a.usn=b.xidusn and b.addr=c.taddr and c.sql_address=
d.address and c.sql_hash_value="/oblog4/d.hash_value"
and a.usn=1;
(备注:你要看哪个,就把usn=?写成几就行了)
查看控制文件:
SQL>select * from v$controlfile;
查看日志文件:
SQL> col member format a50
SQL>select * from v$logfile;
如何查看当前SQL*PLUS用户的sid和serial#:
SQL>select sid, serial#, status from v$session where audsid=userenv('sessionid');
如何查看当前数据库的字符集:
SQL>select userenv('language') from dual;
SQL>select userenv('lang') from dual;
怎么判断当前正在使用何种SQL优化方式:
用explain plan产生EXPLAIN PLAN,检查PLAN_TABLE中ID=0的POSITION列的值。
SQL>select decode(nvl(position,-1),-1,'RBO',1,'CBO') from plan_table where id=0;
如何查看系统当前最新的SCN号:
SQL>select max(ktuxescnw * power(2,32) + ktuxescnb) from x$ktuxe;
在ORACLE中查找TRACE文件的脚本:
SQL>select u_dump.value || '/' || instance.value || '_ora_' ||
v$process.spid || nvl2(v$process.traceid, '_' || v$process.traceid, null ) || '.trc'"Trace File" from v$parameter u_dump cross join v$parameter instance cross join v$process join v$session on v$process.addr = v$session.paddr where u_dump.name = 'user_dump_dest' and
instance.name = 'instance_name' and v$session.audsid=sys_context('userenv','sessionid');
SQL>select d.value || '/ora_' || p.spid || '.trc' trace_file_name
from (select p.spid from sys.v_$mystat m,sys.v_$session s,
sys.v_$process p where m.statistic# = 1 and
s.sid = m.sid and p.addr = s.paddr) p,(select value from sys.v_$parameter where name ='user_dump_dest') d;
如何查看客户端登陆的IP地址:
SQL>select sys_context('userenv','ip_address') from dual;
如何在生产数据库中创建一个追踪客户端IP地址的触发器:
SQL>create or replace trigger on_logon_trigger
after logon on database
begin
dbms_application_info.set_client_info(sys_context('userenv', 'ip_address'));
end;
查询当前日期:
SQL> select to_char(sysdate,'yyyy-mm-dd,hh24:mi:ss') from dual;
查看所有表空间对应的数据文件名:
SQL>select distinct file_name,tablespace_name,AUTOEXTENSIBLE from dba_data_files;
查看表空间的使用情况:
SQL>select sum(bytes)/(1024*1024) as free_space,tablespace_name
from dba_free_space group by tablespace_name;
SQL>SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
(B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;
SQL>column tablespace_name format a18;
SQL>column Sum_M format a12;
SQL>column Used_M format a12;
SQL>column Free_M format a12;
column pto_M format 9.99;
SQL>select s.tablespace_name,ceil(sum(s.bytes/1024/1024))||'M' Sum_M,ceil(sum(s.UsedSpace/1024/1024))||'M' Used_M,ceil(sum(s.FreeSpace/1024/1024))||'M' Free_M, sum(s.UsedSpace)/sum(s.bytes) PTUSED
from (select b.file_id,b.tablespace_name,b.bytes,
(b.bytes-sum(nvl(a.bytes,0))) UsedSpace,
sum(nvl(a.bytes,0)) FreeSpace,(sum(nvl(a.bytes,0))/(b.bytes)) * 100 FreePercentRatio from sys.dba_free_space a,sys.dba_data_files b
where a.file_id(+)=b.file_id group by b.file_id,b.tablespace_name,b.bytes
order by b.tablespace_name) s group by s.tablespace_name order by sum(s.FreeSpace)/sum(s.bytes) desc;
查看数据文件的hwm(可以resize的最小空间)和文件头大小:
SQL>SELECT v1.file_name,v1.file_id,
num1 totle_space,
num3 free_space,
num1-num3 "USED_SPACE(HWM)",
nvl(num2,0) data_space,
num1-num3-nvl(num2,0) file_head
FROM
(SELECT file_name,file_id,SUM(bytes) num1 FROM Dba_Data_Files GROUP BY file_name,file_id) v1,
(SELECT file_id,SUM(bytes) num2 FROM dba_extents GROUP BY file_id) v2,
(SELECT file_id,SUM(BYTES) num3 FROM DBA_FREE_SPACE GROUP BY file_id) v3
WHERE v1.file_id=v2.file_id(+)
AND v1.file_id=v3.file_id(+);
查看数据文件大小及头大小:
SQL>SELECT v1.file_name,v1.file_id,
num1 totle_space,
num3 free_space,
num1-num3 Used_space,
nvl(num2,0) data_space,
num1-num3-nvl(num2,0) file_head
FROM
(SELECT file_name,file_id,SUM(bytes) num1 FROM Dba_Data_Files GROUP BY file_name,file_id) v1,
(SELECT file_id,SUM(bytes) num2 FROM dba_extents GROUP BY file_id) v2,
(SELECT file_id,SUM(BYTES) num3 FROM DBA_FREE_SPACE GROUP BY file_id) v3
WHERE v1.file_id=v2.file_id(+)
AND v1.file_id=v3.file_id(+);
(运行以上查询,我们可以如下信息:
Totle_pace:该数据文件的总大小,字节为单位
Free_space:该数据文件的剩于大小,字节为单位
Used_space:该数据文件的已用空间,字节为单位
Data_space:该数据文件中段数据占用空间,也就是数据空间,字节为单位
File_Head:该数据文件头部占用空间,字节为单位)
数据库各个表空间增长情况的检查:
SQL>select A.tablespace_name,(1-(A.total)/B.total)*100 used_percent
From (select tablespace_name,sum(bytes) total from dba_free_space group by tablespace_name) A,(select tablespace_name,sum(bytes) total from dba_data_files group by tablespace_name) B where A.tablespace_name=B.tablespace_name;
SQL>SELECT UPPER(F.TABLESPACE_NAME) "表空间名",
D.TOT_GROOTTE_MB "表空间大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)", TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100, 2), '990.99') "使用比", F.TOTAL_BYTES "空闲空间(M)",
F.MAX_BYTES "最大块(M)" FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 4 DESC;
查看各个表空间占用磁盘情况:
SQL>col tablespace_name format a20;
SQL>select b.file_id file_ID,
b.tablespace_name tablespace_name,
b.bytes Bytes,
(b.bytes-sum(nvl(a.bytes,0))) used,
sum(nvl(a.bytes,0)) free,
sum(nvl(a.bytes,0))/(b.bytes)*100 Percent
from dba_free_space a,dba_data_files b
where a.file_id=b.file_id
group by b.tablespace_name,b.file_id,b.bytes
order by b.file_id;
数据库对象下一扩展与表空间的free扩展值的检查:
SQL>select a.table_name, a.next_extent, a.tablespace_name
from all_tables a,(select tablespace_name, max(bytes) as big_chunk
from dba_free_space group by tablespace_name ) f where f.tablespace_name = a.tablespace_name and a.next_extent > f.big_chunk
union select a.index_name, a.next_extent, a.tablespace_name
from all_indexes a,(select tablespace_name, max(bytes) as big_chunk
from dba_free_space group by tablespace_name ) f where f.tablespace_name = a.tablespace_name and a.next_extent > f.big_chunk;
Disk Read最高的SQL语句的获取:
SQL>select sql_text from (select * from v$sqlarea order by disk_reads)
where rownum<=5;
查找前十条性能差的sql:
SQL>SELECT * FROM (SELECT PARSING_USER_ID
EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,
sql_text FROM v$sqlarea ORDER BY disk_reads DESC)
WHERE ROWNUM<10 ;
等待时间最多的5个系统等待事件的获取:
SQL>select * from (select * from v$system_event where event not like 'SQL%' order by total_waits desc) where rownum<=5;
查看当前等待事件的会话:
SQL>col username format a10
SQL>set line 120
SQL>col EVENT format a30
SQL>select SE.Sid,s.Username,SE.Event,se.Total_Waits,SE.Time_Waited,SE.Average_Wait
from v$session S,v$session_event SE where S.Username is not null and SE.Sid=S.Sid
and S.Status='ACTIVE' and SE.Event not like '%SQL*Net%';
SQL>select sid, event, p1, p2, p3, wait_time, seconds_in_wait, state from v$session_wait where event not like '%message%' and event not like 'SQL*Net%' and event not like '%timer%' and event != 'wakeup time manager';
双绞线在网络中的接线标准有以下几种:
(1)一一对应接法。即双绞线的两端芯线要一一对应,即如果一端的第1脚为绿色,另一端的第1脚也必须为绿色的芯线,这样做出来的双绞线通常称之为“直连线”。但要注意的是4个芯线对通常不分开,即芯线对的两条芯线通常为相邻排列,这个,由于太简单且随意,图上未标出。
这种网线一般是用在集线器或交换机与计算机之间的连接。
(2)1-3、2-6交叉接法。虽然双绞线有4对8条芯线,但实际上在网络中只用到了其中的4条,即水晶头的第1、第2和第3、第6脚,它们分别起着收、发信号的作用。这种交叉网线的芯线排列规则是:网线一端的第1脚连另一端的第3脚,网线一端的第2脚连另一头的第6脚,其他脚一一对应即可。这种排列做出来的通常称之为“交叉线.
例如,当线的一端从左到右的芯线顺序依次为:
白绿、绿、白橙、蓝、白蓝、橙、白棕、棕时,
另一端从左到右的芯线顺序则应当依次为:
白橙、橙、白绿、蓝、白蓝、绿、白棕、棕。
这种网线一般用在集线器(交换机)的级连、服务器与集线器(交换机)的连接、对等网计算机的直接连接等情况下。经常用于两台电脑直接互连传送数据!
(3)100M接法。这是一种最常用的网线制作规则。所谓100M接法,是指它能满足100M带宽的通讯速率。它的接法虽然也是一一对应,但每一脚的颜色是固定的,
具体是:第1脚——橙白、第2脚——橙色、第3脚——绿白、第4脚——蓝色、第5脚——蓝白、第6脚——绿色、第7脚——棕白、第8脚——棕色,
从中可以看出,网线的4对芯线并不全都是相邻排列,第3脚、第4脚、第5脚和第6脚包括2对芯线,但是顺序已错乱。
这种接线方法也是应用于集线器(交换机)与工作站计算机之间的连接,也就是“直连线”所应用的范围。

