bash-2.05# more oradb
ORACLE_HOME=/home/oracle/OraHome/
ORACLE_SID=test
ORACLE_OWNER=oracle
PATH=$PATHORACLE_HOME/bin
export ORACLE_HOME
export ORACLE_SID
export PATH
su - oracle<< EOF
. ~/.profile
lsnrctl start
sqlplus /nolog
conn / as sysdba
startup
exit
EOF
select dbms_flashback.get_system_change_number from dual;
select count(*) from hjm_tb_test01 as of scn &scn;
insert into hjm_tb_test01_recov select * from hjm_tb_test01 as of scn 4788350;
学习并测试了一下Oracle数据库在开启Archive Log模式下的恢复.
系统是Win2K Server+Oracle 8.1.7.
注意,养成一个好的习惯非常重要.在开始恢复之前,以及恢复完成后,都要做一个系统全备份.
首先,要开启Archive Log归档日志模式
1. 关闭数据库
2. 修改initSID.ora文件.这个文件通常在$ORACLE_HOME/admin/$ORACLE_SID目录下或是在$ORACLE_HOME/database目录下.
log_archive_start = true
log_archive_dest_1 = "location=F:\oracle\archive"
log_archive_format = "ORA_%S.arc"
注意通常Windows版和Unix/Linux版的一些参数写法有差异,请参照各自版本的技术文档.
3. 启动数据库到mount状态
startup mount
这样加载了数据库文件,但是不打开数据库.
4. 检查当前的Archive Log归档日志模式
archive log list
显示的信息是:
Database log mode No Archive Mode
Automatic archival Disabled
这时用下面的命令开启数据库的Archive Log模式
alter database archivelog
再次用"archive log list"显示信息,应该是:
Database log mode Archive Mode
Automatic archival Enabled
再用命令alter database open来打开数据库.
上面的工作完了以后,然后,我们可以来进行测试
在表中删除重复记录
delete test where rowid not in(select max(rowid) from test group by id)
在表中找到重复记录
select id,count(*) from test group by id having count(*)>1
在oracle开发和管理方面的经验
=============================================================================
1、不安装Oracle客户连接Oracle 8的方法
请将以下文件拷贝到运行文件所在目录
一、ODBC动态库 :
ctl3d32.dll msvcrt40.dll odbc16gt.dll odbc32.dll odbc32gt.dll odbccp32.dll odbccr32.dll odbcint.dll
二、建立EXTRA子目录,将MSVCRT.DLL文件拷贝到该子目录下
EXTRAMSVCRT.DLL
三、ORACLE动态库及配置文件
Tnsnames.ora CORE35O.DLL NASNSNT.DLL NAUNTSNT.DLL NCRNT.DLL Nlnt.dll NLSRTL32.DLL Nnfdnt.dll NNFNNT.DLL NSNT.DLL NTNT.DLL NTTNT.DLL CIW32.DLL Ora73.dll OTRACE73.DLL Sqlnet.ora Sqltnsnt.dll CORE35.DLL
四、PB动态库
pbvm70.dll pbdwe70.dll Pbo7370.dll PBO8470.DLL pbodb70.dll libjcc.dll
Oracle的客户端不安装让pb连上,我记得以前有帖子的,你可以搜索一下。
具体步骤。
(1).先在某机器上安装好客户端(最好安装在c盘);
(2).复制此客户端oracle目录下的所有文件作为独立的oracle安装文件;
(3).搜索注册表,找到 HKey_Local_machinesoftwareoracle,把此项目及分支全部导出。
(4).打包好你的pb程序,并独立打包好oracle客户端和注册表导出文件。
(5).到干净的客户端,解开两个包,导入注册表文件,然后加入路径支持:
path=%path%;"c:Ora817bin"
这样处理,应该没有问题,因为我就是这样快速处理了几十个机器。
若不想搞注册表,你可以在程序中自己写注册表,构成Oracle客户端必要的注册表支持,至于路径,手工添加应该不难。
至于Oracle客户端那些文件不需要,这个不好说,你可以把那些bin目录下的所有exe删除,Oracle Document删除(7x兆)
至于定义Oracle服务,找到 Ora817net80adminTnsName.ora,参照格式,程序中生成一个也不麻烦。
=======================================================
2、在ORACLE中返回游标结果集
你需要写到一个包中:
create or replace package pag_cs_power as
type c_Type is ref cursor;
FUNCTION FUN_CS_GETDICTLIST(
v_DictIndex in varchar2) return c_Type;
end pag_cs_power;
函数代码:
FUNCTION FUN_CS_GETDICTLIST(
v_DictIndex in varchar2) return c_Type
as
c_cursor c_Type;
begin
open c_cursor for
select DICTID,DICTNAME FROM SYS_DICT WHERE DICTINDEX = v_DictIndex;
return c_cursor;
end FUN_CS_GETDICTLIST;
----------------------------------------------------------------------
3、P4机器安装ORACLE
(1)、将ORACLE安装软件拷贝到硬盘。
(2)、将 硬盘目录文件stageComponentsoracle.swd.jre1.1.7.30/1
DataFilesExpandedjrewin32binsymcjit.dll的文件改名为symcjit.old
(3).再运行SETUP.exe 文件进行安装。
-----------------------------------------------------------------------
4、单引号的插入问题
SQL> insert into a values('i''m good'); --两个''可以表示一个'
SQL> insert into a values('i'||chr(39)||'m good'); --chr(39)代表字符'
SQL> insert into a values('a'||'&'||'b');
-----------------------------------------------------------------------
5、全数据库的导入与导出
exp username/password full=y file=yourdata.dmp grants=y rows=y
imp username/password full=y ignore=y file=yourdata.dmp grants=y
6、exp与imp的具体用法
exp username/password full=y file=yourdata.dmp grants=y rows=y
imp username/password full=y ignore=y file=yourdata.dmp grants=y
(1)
exp参数:
关键字 说明(默认)
----------------------------------------------
USERID 用户名/口令
FULL 导出整个文件 (N)
BUFFER 数据缓冲区的大小
OWNER 所有者用户名列表
FILE 输出文件 (EXPDAT.DMP)
TABLES 表名列表
COMPRESS 导入一个范围 (Y)
RECORDLENGTH IO 记录的长度
GRANTS 导出权限 (Y)
INCTYPE 增量导出类型
INDEXES 导出索引 (Y)
RECORD 跟踪增量导出 (Y)
ROWS 导出数据行 (Y)
PARFILE 参数文件名
CONSTRAINTS 导出限制 (Y)
CONSISTENT 交叉表一致性
LOG 屏幕输出的日志文件
STATISTICS 分析对象 (ESTIMATE)
DIRECT 直接路径 (N)
TRIGGERS 导出触发器 (Y)
FEEDBACK 显示每 x 行 (0) 的进度
FILESIZE 各转储文件的最大尺寸
QUERY 选定导出表子集的子句
imp参数:
关键字 说明(默认)
----------------------------------------------
USERID 用户名/口令
FULL 导入整个文件 (N)
BUFFER 数据缓冲区大小
FROMUSER 所有人用户名列表
FILE 输入文件 (EXPDAT.DMP)
TOUSER 用户名列表
SHOW 只列出文件内容 (N)
TABLES 表名列表
IGNORE 忽略创建错误 (N)
RECORDLENGTH IO 记录的长度
GRANTS 导入权限 (Y)
INCTYPE 增量导入类型
INDEXES 导入索引 (Y)
COMMIT 提交数组插入 (N)
ROWS 导入数据行 (Y)
PARFILE 参数文件名
LOG 屏幕输出的日志文件
CONSTRAINTS 导入限制 (Y)
DESTROY 覆盖表空间数据文件 (N)
INDEXFILE 将表/索引信息写入指定的文件
SKIP_UNUSABLE_INDEXES 跳过不可用索引的维护 (N)
ANALYZE 执行转储文件中的 ANALYZE 语句 (Y)
FEEDBACK 显示每 x 行 (0) 的进度
TOID_NOVALIDATE 跳过指定类型 id 的校验
FILESIZE 各转储文件的最大尺寸
RECALCULATE_STATISTICS 重新计算统计值 (N)
(2)
一、建立一个expdata.sql文件
USERID=RMTAFIS/3 这里写你的用户名和密码
BUFFER=32768
OWNER=RMTAFIS 这里写导出的用户
FILE=E:ExpRMTAFIS.DMP 导出的文件,可以是相对路径
ROWs=Y
GRANTS=Y
COMPRESS=Y
CONSISTENT=Y
二、建立一个expdata.bat
exp parfile=expdata.sql
如果是805
exp80 parfile=expdata.sql
双击expdata.bat就导出数据了
关于全数据库的导入与导出
==========================================================================
(1)“完全”增量导出(Complete)
即备份整个数据库,比如:
exp system/manager inctype=complete file=990702.dmp
(2)“增量型”增量导出
备份上一次备份后改变的数据。比如:
exp system/manager inctype=incremental file=990702.dmp
(3)“累计型”增量导出(Cumulative)
累计型导出方式只是导出自上次“完全” 导出之后数据库中变化了的信息。比如:
exp system/manager inctype=cumulative file=990702.dmp
数据库管理员可以排定一个备份日程表,用数据导出的三个不同方式合理高效地完成。比如数据库的备份任务可作如下安排:
?星期一:完全导出(A)
?星期二:增量导出(B)
?星期三:增量导出(C)
?星期四:增量导出(D)
?星期五:累计导出(E)
?星期六:增量导出(F)
?星期日:增量导出(G)
如果在星期日,数据库遭到意外破坏,数据库管理员可按以下步骤来恢复数据库:
第一步:用命令CREATE DATABASE重新生成数据库结构;
第二步:创建一个足够大的附加回段。
第三步:完全增量导入A:
imp system./manager inctype= RECTORE FULL=Y FILE=A
第四步:累计增量导入E:
mp system/manager inctype= RECTORE FULL=Y FILE =E
第五步:最近增量导入F:
imp system/manager inctype=RESTORE FULL=Y FILE=F
=====================================================================================
7、如果在like的变量中,是以‘%’开头的话,是不会使用index的。反之,不是以‘%‘开头,而又有相应的index,是会使用index的。具体可以用plain plan来看一下。
8、复制空表结构
create table new_table
as select * from old_table where 1=2;
复制表(含记录)
create table new_table
as select * from old_table ;
9、把一个用户下的表导入到另一个用户下,但需要改名
先用exp导出所有的表;
用imp将导出的表导入到新用户;
在新用户下,执行
select 'RENAME TABLE '||tname||' TO NEW_'||tname||';'
from tab
where tabtype='TABLE';
将上面的查询结果保存到一个sql文件中,处理后执行就可以了。
10、审计步骤
修改参数文件init.ora,参数audit_trail值为true;
重新启动数据库;
打开审计audit session; (audit session by username)
执行登录操作;
察看审计结果:
select * from dba_audit_session;
select * from sys.aud$;
select * from dba_audit_trail;
select * from dba_audit_exists;
关于审计:
为了使oracle8i的审计功能可用,必须在数据库参数文件中修改audit_trail初始参数,而这个修改并不支配oracle8i把生成的审计记录记入审计痕迹中,
由于状态,特权和模式对象已被修改,因而审计的默认值不可用,其参数应设置为none.下面列出了audit_trail 可用的参数
db_使数据库审计和全部直属审计记录到数据库审计的痕迹中
os_是数据库审计依据直属审计记入到操作系统的审计很集中
none_不可用
11、BFILE的用法
(1)、create or replace directory
BFILE_TEST
as
'/oracle/oradata/bfiles';
(2)、grant read on directory BFILE_TEST to SCOTT;
(3)、host ls -l /oracle/oradata/bfiles/1.TXT
(4)、connect SCOTT/TIGER
create table BFILES (ID number, TEXT bfile );
(5)、insert into BFILES values ( 1,
bfilename ( 'BFILE_TEST', '1.TXT' ) );
12、如何在Windows 2000下将Oracle完全卸载?
一、系统环境:
(1)、操作系统:Windows 2000 Server,机器内存128M
(2)、数据库: Oracle 8i R2 (8.1.6) for NT 企业版
(3)、安装路径:D:ORACLE
二、卸载步骤:
(1)、开始->设置->控制面板->管理工具->服务
停止所有Oracle服务。
(2)、开始->程序->Oracle - OraHome81->Oracle Installation Products->Universal Installer
卸装所有Oracle产品
(3)、运行regedit,选择HKEY_LOCAL_MACHINESOFTWAREORACLE,按del键删除这个入口。
(4)、运行regedit,选择HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices,滚动这个列表,删除所有Oracle入口
(5)、从桌面上、STARTUP(启动)组、程序菜单中,删除所有有关Oracle的组和图标
(6)、重新启动计算机,重起后才能完全删除Oracle所在目录
(7)、删除与Oracle有关的文件,选择Oracle所在的缺省目录C:Oracle,删除这个入口目录及所有子目录,
并从Windows 2000目录(一般为C:WINNT)下删除以下文件
ORACLE.INI、oradim80.INI
(8)、WIN.INI文件中若有[ORACLE]的标记段,删除该段
--------------------------------------------------------------------
13、如何使用SQLPLUS和SVRMGRL运行脚本
(1)、用sqlplus调用:
c:script.txt的内容
startup;
命令行:sqlplus internal/oracle @c:script.txt
(2)、用svrmgrl调用:
c:script.txt的内容
connect internal/oracle;
startup;
命令行:svrmgrl @c:script.txt
--------------------------------------------------------------------
14、ORACLE的临时表
CREATE GLOBAL TEMPORARY TABLE TABLENAME (
COL1 VARCHAR2(10),
COL2 NUMBER
) ON COMMIT PRESERVE(DELETE) ROWS ;
这种临时表不占用表空间,而且不同的SESSION之间互相看不到对方的数据
在会话结束后表中的数据自动清空,如果选了DELETE ROWS,则在提交的时候即清空数据,PRESERVE则一直到会话结束
----------------
在Oracle8i中,可以创建以下两种临时表:
(1)会话特有的临时表
CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>)
ON COMMIT PRESERVE ROWS;
(2)事务特有的临时表
CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>)
ON COMMIT DELETE ROWS;
CREATE GLOBAL TEMPORARY TABLE MyTempTable
所建的临时表虽然是存在的,但是你试一下insert 一条记录然后用别的连接登上去select,记录是空的,明白了吧,我把下面两句话再贴一下:
--ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)
--ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。
冲突的问题更本不用考虑.
临时表只是保存当前会话(session)用到的数据,数据只在事务或会话期间存在。
通过CREATE GLOBAL TEMPORARY TABLE命令创建一个临时表,对于事务类型的临时表,
数据只是在事务期间存在,对于会话类型的临时表,数据在会话期间存在。
会话的数据对于当前会话私有。每个会话只能看到并修改自己的数据。DML锁不会加到
临时表的数据上。下面的语句控制行的存在性。
● ON COMMIT DELETE ROWS 表名行只是在事务期间可见
● ON COMMIT PRESERVE ROWS 表名行在整个会话期间可见
可以对临时表创建索引,视图,出发器,可以用export和import工具导入导出表的
定义,但是不能导出数据。表的定义对所有的会话可见。
例如:
CREATE GLOBAL TEMPORARY TABLE TEMP_TAB1(
table_name VARCHAR2(20),
primary_key VARCHAR2(100),
field VARCHAR2(1000))
ON COMMIT PRESERVE ROWS;
CREATE GLOBAL TEMPORARY TABLE TEMP_TAB2(
table_name VARCHAR2(20),
primary_key VARCHAR2(100),
field VARCHAR2(1000))
ON COMMIT DELETE ROWS;
15、如何使用OEM
先启数据库服务,再启oracle manager服务。
否则重建档案资料库
如果还不行就把ORACLEHOMENETWORKsqlnet.ora文件的内容
sqlnet.authentication_services=(NTS)
改成sqlnet.authentication_services=(NONE)
登录 sysman/oem_temp
16、TNS:没有监听器的问题。
(1)查一下监听服务是否启动,
如果没有启动,则运行lsnrctrl start。
(2)查看一下 LISTENER.ORA内监听的服务器名、服务器IP、数据库名是否正确。
(3)查看一下 TNSNAMES.ORA内服务器名、服务器IP、数据库名是否正确。
17、LINUX、UNIX下自动启动ORACLE服务
(1)
!/bin/sh
# chkconfig: 345 51 49
# description: starts the oracle dabase deamons
#
ORA_HOME=/u01/app/oracle/product/8.1.7
ORA_OWNER=oracle
case "$1" in
'start')
echo -n "Starting Oracle8i: "
su - $ORA_OWNER -c $ORA_HOME/bin/dbstart
touch /var/lock/subsys/oracle8i
echo
;;
'stop')
echo -n "Shutting down Oracle8i: "
su - $ORA_OWNER -c $ORA_HOME/bin/dbshut
rm -f /var/lock/subsys/oracle8i
echo
;;
'restart')
echo -n "Restarting Oracle8i: "
$0 stop
$0 start
echo
;;
*)
echo "Usage: oracle8i { start | stop | restart }"
exit 1
esac
exit 0
我仿照su - $ORA_OWNER -c $ORA_HOME/bin/dbshut 的形式
添加su - $ORA_OWNER -c $ORA_HOME/bin/lsnrctl start
但是在系统启动的时候listener启动不了
(2)
/etc/rc.local
改成如下就可以了
touch /var/lock/subsys/local
#echo 2147483648 > /proc/sys/kernel/shmmax
echo -n "Starting Oracle Database:"
date +"%D %T %a"
su - oracle -c "lsnrctl start"
#su - oracle -c "sqlplus /nolog @startmaster.sql"
echo -n "Oracle Database Started:"
date +"%D %T %a"
-------------
第一个#是改共享内存大小的
第二个#是启动数据库的。
(3)ftp://ftp.rpmfind.net/linux/rhcontrib/7.1/i386/oraclerun9i-1.0-1.i386.rpm
下载这个软件包并安装。
里面每个文件都有一些要修改的地方。配置完成之后,就可以在系统服务配置中找到它,选中它就可能以自启动了。
18、回滚段不够的处理方法
(1)、先使回滚段脱机一个,
如果不好用,则再脱机一个。直至好用。
ALTER rollback segment rollbackname offline;
(2)、增加回滚段数据文件的大小
alter database datafile 'datafile' resize 200M;
19、WINNT向WIN2000移植
不用EXP和IMP的
停掉数据库的服务后,可以做一个数据库的全备份。
在WIN2000上建一个同名的数据库,随便建,越小越好,可以缩短时间。
把WINNT下的数据库备份恢复到WIN2000的数据库上就可以了。但建库的目录
必须一样。(也可以不一样,但需要更改数据文件的连接)
我曾多次为用户这样移植数据,万无一失的。
注意:因为数据很重要,所以建议你先EXP备份一下。这是我们的习惯。
20、ORACLE SQL PLUS Worksheet乱码问题。
dbappscfg.properties,修改该文件即可解决上述问题。$ORACLE_HOMEsysmanconfig目录下,修改
# SQLPLUS_NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
为SQLPLUS_NLS_LANG=AMERICAN_AMERICA.ZHS16GBK。
对于Windows操作系统,还需要修改一项
#SQLPLUS_SYSTEMROOT=c:WINNT40
为SQLPLUS_SYSTEMROOT=C:WINNT
如操作系统的主目录在C盘的Winnt下
对于后面一项的修改只对Windows操作系统进行,对UNIX操作系统则不需要。如果在Windows操作系统中不修改该项,在Oracle Enterprise Manager中,连接系统时,会提示如下的错误:
ORA-12560 TNS:protocol adapter error
或者
ORA-12545 Connect failed because target host or object does not exist
重新连接SQL PLUS Worksheet
21、DROP掉名字是小写的表(用双引号括起来)。
drop table "tablename"
select * from "tablename"
22、日期的显示格式
注意:SIMPLIFIED CHINESE(简体中文需要" "括起来)
别的国家不用" " 例如:ENGLISH
select to_char(sysdate,'DAY','NLS_DATE_LANGUAGE=''SIMPLIFIED CHINESE''') from dual;
------------
星期四
------------
23、一个从ORACLE中读表信息的存储过程
可以在vc下调用存储过程来实现
例子:
先修改init.ora
例如:
utl_file_dir=/usr //路径为 oracle所在的盘:/usr
此过程将用户TEMP的P1过程的代码保存到ORACLE安装盘下/USR/TEXT.TXT中
create or replace procedure TEST
is
file_handle utl_file.file_type;
STOR_TEXT VARCHAR2(4000);
N NUMBER;
I NUMBER;
begin
I:=1;
SELECT MAX(LINE) INTO N FROM ALL_SOURCE WHERE OWNER='TEMP' AND NAME='P1';
file_handle:=utl_file.fopen('/usr','test.txt','a');
WHILE I<=N LOOP
SELECT TEXT INTO STOR_TEXT FROM ALL_SOURCE WHERE OWNER='TEMP' AND NAME='P1' AND LINE= I;
I:=I+1;
utl_file.put_line(file_handle,stor_text);
END LOOP;
utl_file.fclose(file_handle);
commit;
end TEST;
/
24、关于修改ORACLE的列宽
(1)、不论如何都要备份数据。
(2)、如果没有数据,则可以修改宽度。比如NUMBER,CHAR,VARCHAR2
(3)、如果有数据,则可以增加宽度。比如NUMBER,CHAR,VARCHAR2
注意:不可以减小宽度。
(4)、语法:alter talbe tablename modify columnname columntype not null;
25、如何查看用户的存储过程和函数
select name,text from user_source where name= Procedurename and type = 'PROCEDURE' order by line;
26、在批处理中自动启动ORACLE服务(win2000)
编一个批处理文件
net start OracleServiceSID
OracleServiceSID是ORACLE的实例名称
27、对行加锁时,只对tb1加锁
select tb1.r1 from tb1, tb2 where tb1.r2 = tb2.r2 and tb2.r1 = xxx for update of tb1.r1 nowait
28、得到列的信息
desc tablename
select cname from col where tname='TABLENAME';
select column_name from user_tab_columns where table_name='TABLENAME';
select column_name from ALL_tab_columns where table_name='TABLENAME';
select column_name from dba_tab_columns where table_name='TABLENAME';
select column_name from user_col_comments where table_name='TABLENAME';
select column_name from all_col_comments where table_name='TABLENAME';
select column_name from dba_col_comments where table_name='TABLENAME';
29、使触发器无效(login_on)
svrmgrl
connect internal/oracle
alter trigger login_on disable;
使触发器为无效alter trigger yourtriggername disable
如果是对于某一个表的所有的触发器:
alter table yourtablename disable all triggers
30、如在SQLPLUS中何调用存储过程和函数。
call只能调用存储过程后面加上括号就可以了
call 存储过程名();
exec procedurename;(可以不加())
调用函数用sql语句
select 函数名(参数) from dual;
31、函数中如果调用DML语句就不可以调用SELECT语句
32、REDO LOG BUFFER 什么时候写到REDO LOGFILE中
(1)、在COMMIT的时候
(2)、重做日志缓冲区1/3满的时候
(3)、重做日志缓冲区大于1M的时候
(4)、它写信息必须是在数据写进程前调用
(5)、一般CHECKPOINT在日志组切换的时候进行或者由初始化参数设定
在CHECKPOINT的时候需要调用数据写进程
33、ORACLE的http server 把原有的WEB server冲掉,如何解决?
(1).如果你原来的http server是用IIS等其他发布工具做的,那么可以在服务中停掉 oracle http server服务,并且改为手动启动。
(2).如果原来的http server是用apache发布,则可以改变http.conf中的参数
34、关于创建重建查看索引
创建索引:
CREATE INDEX IND_NAME ON TABLE_NAME(COL1,COL2,...);
重建索引:
ALTER INDEX IND_NAME REBUILD;
查看索引:
SELECT * FROM USER_INDEXES WHERE INDEX_NAME='IND_NAME';
35、ORACLE如何查杀用户的进程
一|根据用户的应用程序和SQL语句,在DBA STUDIO找到用户的SESSION并断开其连接
二、
(1)、要杀掉一个session应先应知道其sid和serial#,假设你已经知道。
(2)、select paddr from v$session where sid=v_sid and serial#=v_serial#
select spid from v$process where addr=paddr(以上语句所查出的);
(3)、使用ALTER SYSTEM KILL SESSION 'v_sid,v_serial#' immediate; 试一试如不行转
三、LINUX和UNIX下
转到操作系统下执行:kill -9 spid (以上语句所查出的)
36、ORACLE中检查表是否被锁的语句
SELECT A.OWNER,
A.OBJECT_NAME,
B.XIDUSN,
B.XIDSLOT,
B.XIDSQN,
B.SESSION_ID,
B.ORACLE_USERNAME,
B.OS_USER_NAME,
B.PROCESS,
B.LOCKED_MODE,
C.MACHINE,
C.STATUS,
C.SERVER,
C.SID,
C.SERIAL#,
C.PROGRAM
FROM ALL_OBJECTS A,
V$LOCKED_OBJECT B,
SYS.GV_$SESSION C
WHERE ( A.OBJECT_ID = B.OBJECT_ID )
AND (B.PROCESS = C.PROCESS )
ORDER BY 1,2
杀掉:alter system kill session 'sid, serial#'
37、ORACLE的登录问题,用户名和密码。
oem:(ORACLE ENTERPRISE MANAGER)
sysman/oem_temp
38、修改表的列名
Oracle9i:
alter table xxx rename column xx to yy;
Oracle8i & lower version
connect sys/passed;
update col$ set name=xx where obj#=对象id and name = 字段
(一般不要这样用,会造成意想不到的结果)
注:最好是删除再建立新的列
39、把用户模式对象所在的表空间移到新的表空间
(1). create the new tablesapce
(2). alter user test default tablespace test_data;
(3). alter user test quota unlimited on test_data;
(4). alter table the_table_name move tablespace test_data;
生成脚本:
select 'alter table'||tname||' move tablespace test_date;'
from tab
where tabtype='TABLE'
(5). rebuild the indexes;
40、使用OEM备份或者EXP的步骤
WIN2000下:
(1). 控制面板――>管理工具―― >计算机管理――>本地用户和组――>用户――>新建用户sys和sysman(sys和sysman 的帐号要和登陆数据库的帐号相同);
(2).控制面板――>管理工具―― >本地安全策略――>本地策略――>用户权利指派――>
作为批处理作业登陆――>添加sys和sysman两个帐号。
(3).使用Enterprise Manager配置辅助工具
开始→程序→Oracle - OraHome81→Enterprise Manager→Configuration Assistant
a、使用Configuration Assistant工具来创建一个新的资料档案库。
(4).控制面板――>管理工具―― > 服务,查看OracleOraHome81ManagementServer是否启动,如果没有启动,则手动启动该服务。
(5).以sysman/oem_temp(default)登陆DBA Studio
(第二个选项:登陆到Oracle Management Server),立即修改密码为你刚才在NT下建的用户sysman的密码。
(6). 以sysman/ *** (bluesky) 从开始→程序→Oracle - OraHome81→Console 登陆到 控制台。
在 系统→首选项→首选身份证明(我的首选身份设置如下:)
DEFAULT节点:name:sysman
DEFAULT数据库:name:sys
(7). 在搜索/添加结点后,以sysman/ *** 登陆到该结点,以sys/ *** as sysdba登陆数据库(也就是在首选身份设置的结果)。
(8). 在工具→备份管理→向导→预定义备份策略(自定义备份策略)→提交备份计划
(9).从开始→程序→Oracle - OraHome81→Console 登陆到 控制台,查看活动(历史记录)可以看到你的备份是否成功,如果不成功,可以点击备份看明细。(我第一次也没成功,后来我修改系统的临时目录C:WINNTTemp→c:tempsystmp,重新启动机器就ok了)
41、如何修改INTERNAL的口令
以下是oracle8的8i你可以仿照来做
(1)、进入DOS下
(2)、默认internal密码文件在c:orantdatabase下,是隐藏属性,文件名称与数据库实例名有关
如默认ORACLE实例名为ORCL,则internal密码文件名为pwdorcl.ora
(3)、建立新的internal密码文件,起个新名字为pwdora8.ora
orapwd80 file=pwdora8.ora password=B entries=5 --注:password项一定要用大写,并且不要用单引号
(4)、拷贝pwdora8.ora文件到c:orantdatabase目录下
(5)、运行regedit,修改口令文件指向
(6)、找到HKEY_LOCAL_MACHINESOFTWAREORACLE项
定位ORA_ORCL_PWFILE子项,改变其值为c:orantdatabasepwdora8.ora
(7)、关闭ORACLE数据库,重新启动
(8)、进入svrmgr30服务程序,测试internal密码是否更改成功
42、凭证检索失败的决绝方法。
原因: 由于Oracle不能应用OS认证而导致凭证检索失败
解决办法:
(1).打开network/admin下的sqlnet.ora
修改SQLNET.AUTHENTICATION _SERVICES=(NONE)。
(2).启动Net8 configuration assistant-->选第三项本地网络服务名配置
-->删除...(删除原来的本地网络服务名)
(3).重复第二步
-->添加.. (新建本地网络服务名)
(4).restart oracle
注意:NTS是WinNT的认证方式
43、命令行编译存储过程
ALTER PROCEDURE procedure_name COMPILE;
44、关于如何建立数据库链接(DBlink)
可以通过建立客户机数据库网络服务名的办法,将服务器的名字或是IP地址设置为你需要连接的那个机器就行
如果你要在一个应用中连接它,现在做好上步工作,然后按如下处理
建立数据库连接
CREATE DATABASE LINK DBaseLinkName CONNECT TO UserName IDENTIFIED BY Password USING 'NetServiceName';
DBaseLinkName 是建立的数据连接名称
UserName 是可以连接到的用户名
Password 是可以连接到的用户的密码
NetServiceName 是可以连接的数据库网络服务名或是数据库名
查询建立数据连接的表实例
Select * From TableName@ DBaseLinkName;
注意:如果在CREATE DATABASE LINK DBaseLinkName CONNECT TO UserName IDENTIFIED BY Password USING 'NetServiceName';中NetServiceName 是数据库名修改init.ora中:global_names = true
否则global_names = false
init.ora中:global_names = false
45、Object Browser7.0中文版的破解方法
到OBJECT BROWSER的目录里,找到DeIsL1.isu文件,用记事本打开,看到的是乱码吧?没关系,将Stirling Technologies ,Inc 这个字符串前面的乱码去掉(如果有的话),让后在Stirling之前加一个空格(一定要加的),保存,退出,重新运行一下看看,虽然还有提示输入验证信息,但是不用管他,直接确定就行。是不是可以用了呢?保证好使。
46、错误号ORA-01536:space quota exceeded for table space 'ALCATEL'的解决办法
三个解决办法,任你选择:
(1) alter user USERNAME quota 100M on TABLESPACENAME;
(2) alter user USERNAME quota unlimited on TABLESPACENAME;
(3) grant unlimited tablespace to USERNAME;
47、如何在Oracle中捕获到SQL语句的全部操作内容
SELECT osuser, username, sql_text from v$session a, v$sqltext b
where a.sql_address =b.address order by address, piece;
48、ORACLE中如何实现自增字段:
(1)第一种方法
ORACLE一般的做法是同时使用序列和触发器来生成一个自增字段.
CREATE SEQUENCE SEQname
INCREMENT BY 1
START WITH 1
MAXVALUE 99999999
/
CREATE TRIGGER TRGname
BEFORE INSERT ON table_name
REFERENCING
NEW AS :NEW
FOR EACH ROW
Begin
SELECT SEQname.NEXTVAL
INTO :NEW.FIELDname
FROM DUAL;
End;
(2)第二种方法:
CREATE OR REPLACE TRIGGER TR1
BEFORE INSERT ON temp_table
FOR EACH ROW
declare
com_num NUMBER;
BEGIN
SELECT MAX(ID) INTO COM_NUM FROM TEMP_TABLE;
:NEW.ID:=COM_NUM+1;
END TR1;
49、job的使用:
修改initsid.ora参数
job_queue_processes = 4 8i,9i (允许同时执行的JOB数)
job_queue_interval = 10 8i
job_queue_keep_connections=true 8i
DBMS_JOB.SUBMIT(:jobno,//job号
'your_procedure;',//要执行的过程
trunc(sysdate)+1/24,//下次执行时间
'trunc(sysdate)+1/24+1'//每次间隔时间
);
删除job:dbms_job.remove(jobno);
修改要执行的操作:dbms_job.what(jobno,what);
修改下次执行时间:dbms_job.next_date(job,next_date);
修改间隔时间:dbms_job.interval(job,interval);
停止job:dbms.broken(job,broken,nextdate);
启动job:dbms_job.run(jobno);
注意:修改后一定要COMMIT;
例子:
declare jobno number;
begin
DBMS_JOB.SUBMIT(jobno,
'Procdemo;',//Procdemo为过程名称
SYSDATE, 'SYSDATE + 1/720');
commit;
end;
50、如何配置mts
修改初始化参数文件
增加以下内容:
mts_dispatchers = "(protocol=TCP)(disp=2)(con=1000)"
mts_max_dispatchers = 50
mts_servers = 20
mts_max_servers = 50
51、取出一个表的最后一条记录
select * from (select rownum id,tname.* from tname) a where a.id=(select count(*) from a);
52、重做日志(Redolog)被删掉,通过什么方法才能恢复!
先mount数据库,然后再目录下建同名文件redo01.log、redo02.log、redo03.log
然后执行alter databse clear logfile group n
对于current的group,执行alter databse clear unarchived logfile group n
然后,再open,就ok了
53、Oracle常见服务
几个主要的:
OracleOraHome81TNSListener 监听服务
OracleServiceSID ORACLE服务
OracleOraHome81Agent 智能代理服务
OracleOraHome81CMan 连接管理服务
OracleOraHome81HTTPServer APACHE WEB 服务
OracleOraHome81ManagementServer ORACLE 企业管理器服务
OracleOraHome81Names ORACLE命名服务
剩下的也不常用。
54、ORACLE的热备份
在不关闭数据库的时候进行ORACLE的备份。
原理停复杂的,你去找本书看看吧。
举个简单的例子:备份表空间USERS
ALTER TABLESPACE USERS BEGIN BACKUP
COPY USERS TABLESPACE 的数据文件到备份目录
ALTER TABLESPACE USERS END BACKUP
55、导致索引不起作用的解决办法
你的问题我刚处理过,是由optimizer_mode参数引起的,该参数的默认值为choose,即为如表有statis则查询走基于cost的方式,否则走基于rule的方式,因些你可以有以下几个解决方法。
(1)、简单的在init<sid>.ora中设optimizer_mode=rule,重起数据库。
(2)、使用analyze table table_name(索引基表) delete statistics;
(3)、最后一个万能办法,将表和索引drop掉,重建。
56、关于数据库进程的问题。
(1).查看相关进程在数据库中的会话
Select a.sid,a.serial#,a.program, a.status ,
substr(a.machine,1,20), a.terminal,b.spid
from v$session a, v$process b
where a.paddr=b.addr
and b.spid = &spid;
(2).查看数据库中被锁住的对象和相关会话
select a.sid,a.serial#,a.username,a.program,
c.owner, c.object_name
from v$session a, v$locked_object b, all_objects c
where a.sid=b.session_id and
c.object_id = b.object_id;
(3).查看相关会话正在执行的SQL
select sql_text from v$sqlarea where address =
( select sql_address from v$session where sid = &sid );
57、查看IP地址
select SYS_CONTEXT('USERENV','IP_ADDRESS') from dual;
58、运行SQLPLUS时不用输入用户名和密码,进入之后使用CONNECT
SQLPLUS /NOLOG
SQL>CONNECT SCOTT/TIGER
59、查看当前会话
userenv() 函数
select userenv('language') from dual 字符集
select userenv('isdba') from dual 是否DBA
select userenv('sessionid') from dual sessionid
select userenv('TERMINAL') from dual 客户端名字
select userenv('INSTANCE') from dual 实例数
SYS_CONTEXT() 函数
select SYS_CONTEXT('USERENV','CURRENT_SCHEMA') from dual; 当前模式
select SYS_CONTEXT('USERENV','CURRENT_SCHEMAID') from dual; 当前模式ID
select SYS_CONTEXT('USERENV','CURRENT_USER') from dual; 当前用户
select SYS_CONTEXT('USERENV','DB_NAME') from dual; 数据库
select SYS_CONTEXT('USERENV','HOST') from dual; 主机
..........
60、删除重复列的方法
(1) DELETE FROM table_name A WHERE ROWID > (
SELECT min(rowid) FROM table_name B
WHERE A.key_values = B.key_values);
(2) create table table2 as select distinct * from table1;
drop table1;
rename table2 to table1;
(3) Delete from mytable where rowid not in(
select max(rowid) from mytable
group by column_name );
(4) delete from mytable t1
where exists (select 'x' from my_table t2
where t2.key_value1 = t1.key_value1
and t2.key_value2 = t1.key_value2
...
and t2.rowid > t1.rowid);
61、ORA-12571: TNS:packet writer failure(包写入程序失败)
(1) 这个错误在客户端遇到过,通常重新连接一下服务器就好了。
服务器重新启动的时候,在client也会遇到该错误。
这个错误你是在server还是client上遇到的?最常用的办法就是加上跟踪,查看一下 跟踪记录,分析分析错误的原因。
网络问题也会出现该错误,比如网络路由没有配置好。
(2) 安装的杀毒软件导致的
(3) 服务器端的IP是否被改动
(4) 最后不行的话,重新创建监听器
62、ORACLE服务不能自动启动的解决办法
把ORACLEHOMEnetworkADMINsqlnet.ora
文件中的 sqlnet.authentication_service=(nts)
注释掉就可以了
63、不完全的时间点恢复
shutdown immediate
copy 备份文件到需要恢复的目录下
startup mount
recover database until time '2002-12-26 09:00:00'
alter database open resetlogs
自己仔细检查一下,不会发生这样的问题的。
64、oracle如何设置查询超时
select /*+ timeout 30*/ * from veryLargeTable
65、修改字符集
(1)、ALTER DATABAE CHARACTER SET SIMPLIFIED CHINESE_CHINA.ZHS16GBK ;
(2)、update props$ set value$='ZHS16CGB231280'
where name='NLS_CHARACTERSET';
update props$ set value$='ZHS16CGB231280'
where name='NLS_NCHAR_CHARACTERSET';
建议不使用(2)
注意:
(1)、执行ALTER DATABASE CHARACTER SET必须有SYSDBA权限,并且在STARTUP RESTRICT模式下执行
(2)、原字符集必须是目标字符集的一个真子集(就是浪子所说的只能从WE8ISO8859P1转到ZHS16GBK的原因)
(3)、CLOB字段装换可能有问题,建议在转换以前把有CLOB字段的表导出后DROP,转换以后再导回
(4)、该转换不可逆,所以在做这个操作以前建议做数据库全备份
66、修改数据库名字
(1)、启动svrmgrl,以文本方式备份控制文件
oracle>svrmgrl
svrmgrl>connect internal
svrmgrl>alter system backup controlfile to trace
(2)、编辑产生的跟踪文件,在udump目录下
改CREATE CONTROLFILE REUSE DATABASE "CTC" NORESETLOGS ARCHIVELOG
中的REUSE为SET
然后把create controlfile这段语句拷出
(3)、正常宕库,后启动到nomount下
svrmgrl>shutdown immediate
svrmgrl>startup nomount
(4)、执行create controlfile那段语句
(5)、打开数据库
svrmgrl>alter database open
如提示用resetlogs选项则使用
svrmgrl>alter database open resetlogs
(8)、相应修改初始化参数
67、rownum的用法
select * from (select t.*,rownum id from dept t)
where id between 1 and 20
68、oracle的内部参数
SELECT a.ksppinm NAME,
b.ksppstdf default_val,
a.ksppdesc DESCRIPTION
FROM x$ksppi a,
x$ksppcv b
WHERE a.indx=b.indx
AND substr(a.ksppinm,1,1)='_'
ORDER BY a.ksppinm
69、9i安装时报areasqueries错误的解决办法
包括IAS 和 IDS
把安装源文件目录全部改为英文字母或数字
注意:不能是中文的路径
70、我如何知道一个表空间还有多少可以用
(1)、
SELECT upper(f.tablespace_name) 表空间名,
d.Tot_grootte_Mb "表空间大小(M)",
d.Tot_grootte_Mb - f.total_bytes "已使用空间(M)",
round((d.Tot_grootte_Mb - f.total_bytes) / d.Tot_grootte_Mb * 100,2) "使用比",
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
(2)、select tablespace_name,round(sum(bytes)/1024/1024,2) "M" from dba_free_space
group by tablespace_name
71、creck pl/sql developer 的方法
(1)、安装pl/sql developer
(2)、用UltraEdit将程序PLSQLDev.exe打开
(3)、将UltraEdit设置为16进制模式
(4)、查找串:BA 1E 00 00 00 2B D0
修改:2B D0 为:4A 90
(5)、存盘退出
(6)、运行PLSQLDev.exe,如果提示你还有29天的时间可用,那就恭喜你了!
72、使索引无效
ALTER INDEX idx UNUSABLE;
ALTER INDEX idx_acctno DISABLE;(only to a function based index)
73、在SQLPLUS中给指定用户进行 set autotrace on/off
以SCOTT用户为例:
SQL>CONNECT scott/tiger
connected.
SQL>@$ORACLE_HOME/RDBMS/ADMIN/UTLXPLAN.SQL
Table created.
SQL>CONNECT / AS SYSDBA
connected.
SQL>@$ORACLE_HOME/SQLPLUS/ADMIN/PLUSTRCE.SQL
drop role plustrace;
Role dropped.
create role plustrace;
Role created.
.
grant plustrace to dba with admin option;
Grant succeeded.
SQL>GRANT PLUSTRACE TO SCOTT;
Grant succeeded.
SQL>CONNECT SCOTT/TIGER
connected.
SQL>set autotrace on
SQL>
74、关于约束的四种状态
Disabled novalidate:当约束使不能时,约束的规则不能强制在列
(包含在约束中)的数据之上。但约束的定义保存在数据字典中。
在执行数据仓库卷起(rollup)或装载且要加快装载过程时该方式
是有用的。
Enabled novalidate:是能无效,该状态的表可以包含非法
的数据,但不可能加入新的非法数据。
Enabled validate:使能有效,一个使能的约束是强制的,表的数据检查
有效
75、在SQLPLUS中调用存储过程
SET SERVEROUTPUT ON
declare
out_param varchar2(100);
begin
your_proc(1,out_param);
dbms_output.put_line(out_param);
end;
/
SET SERVEROUTPUT OFF
declare a varchar2(100);
b number(2);
c date;
begin
pkg_test.sp_test1('123',2,sysdate,a,b,c);
dbms.output.put_line(a || to_char(b)||to_char(sysdate,'yyyy-mm-dd'));
end;
/
75、生成系统表和系统包及存储过程的三个文件。
cat*.sql
dbms*.sql
utl*.sql
76、JOB中日期的使用
每个月1号:
last_day(sysdate)+1
每个季度的第一天:
to_date(decode(to_char(sysdate,'q'),'1',to_char(sysdate,'yyyy')||'0101',
'2',to_char(sysdate,'yyyy')||'0401','3',to_char(sysdate,'yyyy')||'0701',
'4',to_char(sysdate,'yyyy')||'1001'),'yyyymmdd')
每天:
sysdate+1
每个星期几:
decode(to_char(sysdate,'w'),'1',sysdate+7,
to_char(sysdate,'w'),'2',sysdate+6,to_char(sysdate,'w'),'3',sysdate+5,
to_char(sysdate,'w'),'4',sysdate+4,to_char(sysdate,'w'),'5',sysdate+3,
to_char(sysdate,'w'),'6',sysdate+2,to_char(sysdate,'w'),'7',sysdate+1)
每个星期x下午三点:interval(21, 'next_day(trunc(sysdate),x+1)+15/24');
每个季度的第一个星期x:
interval(21, 'next_day(trunc(sysdate,''Q''),3),5)');
77、使用execute immediate 的问题
8i以上才支持execute immediate
8.05只能用dbms_sql
最好使用execute immediate
78、ORACLE9i中删除表空间中数据文件的方法
drop tablespace tbsname including contents
79、找出串中的数字
SELECT TRANSLATE('2KRW229',
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ','0123456789')
"Translate example"
FROM DUAL
/
2229
--全是数字的:
select * from 你的表 where translate(你的列,'0123456789',' ')='';
select * from 你的表 where trim(ltrim(rtrim(replace(col_name,'0123456789',' ')))) is null
80、分析表
analyze table mzbs.db_code ESTIMATE STATISTICS SAMPLE 20 PERCENT;
81、表空间管理和用户管理
--查看表空间和数据文件
select file_name,tablespace_name,autoextensible from dba_data_files;
--数据表空间
CREATE TABLESPACE USER_DATA
LOGGING
DATAFILE 'D:ORACLEORADATAORCLtest.DBF' SIZE 50m REUSE ,
'c:USERS01112.DBF' SIZE 50m REUSE
AUTOEXTEND
ON NEXT 1280K MAXSIZE 16383M EXTENT MANAGEMENT LOCAL
--临时表空间
CREATE TEMPORARY
TABLESPACE USER_DATA_TEMP TEMPFILE 'D:TEMP0111.DBF'
SIZE 50M REUSE AUTOEXTEND
ON NEXT 1024K MAXSIZE 16383M EXTENT MANAGEMENT LOCAL UNIFORM
SIZE 1024K
--增加数据文件
ALTER TABLESPACE USER_DATA
ADD DATAFILE 'c:USERS01113.DBF' SIZE 50M;
ALTER TABLESPACE USER_DATA
ADD DATAFILE 'c:USERS01114.DBF' SIZE 50M
AUTOEXTEND ON
;
--删除表空间
DROP TABLESPACE USER_DATA INCLUDING CONTENTS;
--修改数据文件大小
ALTER DATABASE
DATAFILE 'c:USERS01113.DBF' RESIZE 40M;
--创建用户、赋予权限
CREATE USER USER_DATA PROFILE DEFAULT IDENTIFIED BY USER_DATA
DEFAULT
TABLESPACE USER_DATA TEMPORARY
TABLESPACE USER_DATA ACCOUNT UNLOCK;
GRANT CONNECT TO USER_DATA;
GRANT RESOURCE TO USER_DATA;
alter user hr account lock/unlock; 锁用户/解锁
--把表移到另一个表空间
ALTER TABLE TABLENAME MOVE TABLESPACE TABLESPACENAME;
--创建索引
CREATE INDEX INDEXNAME ON TABLENAME(COLUMNNAME);
CREATE INDEX INDEXNAME ON TABLENAME(COLUMNNAME) TABLESPACE TABLESPACENAME;
--重新建立索引
ALTER INDEX INDEXNAME REBUILD TABLESPACE TABLESPACE;
--创建表
CREAE TABLE TABLENAME
(COLUMN1 COLUTYPE DEFAULT(VALUE) NOT NULL)
(COLUMN2 COLUTYPE DEFAULT(VALUE) NOT NULL);
--建表的索引存储分配
CREATE TABLE summit.employee(id NUMBER(7) CONSTRAINT employee_id_pk PRIMARY KEY DEFERRABLE USING INDEX STORAGE(INITIAL 100K NEXT 100K)
TABLESPACE indx,
last_name VARCHAR2(25) CONSTRAINT employee_last_name_nn NOT NULL,
dept_id NUMBER(7))
TABLESPACE data;
--建立主键
ALTER TABLE TABLENAME
ADD CONSTRAINT CONSTRAINTNAME PRIMARY KEY(COLUMN1,COLUMN2)
--使约束无效
ALTER TABLE TABLENAME ENABLE NOVALIDATE CONSTRAINT CONSTRANAME;
ALTER TABLE TABLENAME ENABLE VALIDATE CONSTRAINT CONSTRANAME;
--删除约束
ALTER TABLE TABLENAME DROP CONSTRAINT constraintname;
DROP TABLE TABLENAEM CASCADE CONSTRAINTS;(删除表后将所用的外键删除)
--给表增加列
ALTER TABLE TABLENAME
ADD COLUMN COLUTYPE DEFAULT(VALUE) NOT NULL;
--给列增加缺省值
ALTER TABLE TABLENAME
MODIFY COLUMNNAME DEFAULT(VALUE) NOT NULL;
--给表增加外键
ALTER TABLE TABLENAME
ADD CONSTRAINT CONSTRAINTNAME
FOREIGN KEY(COLUMN) REFERENCES TABLE1NAME(COLUMN1);
1、分析表
完全分析:analyze table table_name compute statistics
抽样分析:analyze table mzbs.db_code ESTIMATE STATISTICS SAMPLE 20 PERCENT;
2、表空间管理和用户管理
--查看表空间和数据文件
select file_name,tablespace_name,autoextensible from dba_data_files;
--数据表空间
CREATE TABLESPACE USER_DATA
DATAFILE 'D:ORACLEORADATAORCLtest.DBF' SIZE 50m REUSE ,
'c:USERS01112.DBF' SIZE 50m REUSE
AUTOEXTEND
ON NEXT 1280K MAXSIZE 16383M EXTENT MANAGEMENT LOCAL
--修改表空间数据文件的路径
ALTER TABLESPACE app_data
RENAME
DATAFILE '/DISK4/app_data_01.dbf'
TO '/DISK5/app_data_01.dbf';
ALTER DATABASE
RENAME FILE '/DISK1/system_01.dbf'
TO '/DISK2/system_01.dbf';
--临时表空间
CREATE TEMPORARY
TABLESPACE USER_DATA_TEMP TEMPFILE 'D:TEMP0111.DBF'
SIZE 50M REUSE AUTOEXTEND
ON NEXT 1024K MAXSIZE 16383M EXTENT MANAGEMENT LOCAL UNIFORM
SIZE 1024K
--增加数据文件
ALTER TABLESPACE USER_DATA
ADD DATAFILE 'c:USERS01113.DBF' SIZE 50M;
ALTER TABLESPACE USER_DATA
ADD DATAFILE 'c:USERS01114.DBF' SIZE 50M
AUTOEXTEND ON
;
--删除表空间
DROP TABLESPACE USER_DATA INCLUDING CONTENTS;
DROP TABLESPACE USER_DATA INCLUDING CONTENTS AND DATAFILES;
--修改表空间的存储参数
ALTER TABLESPACE tablespacename
MINIMUM EXTENT 2M;
ALTER TABLESPACE tablespacename
DEFAULT STORAGE (
INITIAL 2M
NEXT 2M
MAXEXTENTS 999 );
ALTER DATABASE DATAFILE 'DATAFILENAME' SIZE 200M
AUTOEXTEND ON NEXT 10M MAXSIZE 500M;
--表空间联机/脱机/只读
ALTER TABLESPACE tablespacename OFFLINE/ONLINE/READ ONLY;
--修改数据文件大小
ALTER DATABASE
DATAFILE 'c:USERS01113.DBF' RESIZE 40M;
--创建用户、赋予权限
CREATE USER USER_DATA PROFILE DEFAULT IDENTIFIED BY USER_DATA
DEFAULT
TABLESPACE USER_DATA TEMPORARY
TABLESPACE USER_DATA ACCOUNT UNLOCK;
GRANT CONNECT TO USER_DATA;
GRANT RESOURCE TO USER_DATA;
3、表的管理
--创建表
CREAE TABLE TABLENAME
(COLUMN1 COLUTYPE DEFAULT(VALUE) NOT NULL)
(COLUMN2 COLUTYPE DEFAULT(VALUE) NOT NULL);
--建表的索引存储分配
CREATE TABLE summit.employee(id NUMBER(7) CONSTRAINT employee_id_pk PRIMARY KEY DEFERRABLE USING INDEX STORAGE(INITIAL 100K NEXT 100K)
TABLESPACE indx,
last_name VARCHAR2(25) CONSTRAINT employee_last_name_nn NOT NULL,
dept_id NUMBER(7))
TABLESPACE data;
--修改表的存储分配
ALTER TABLE tablename
PCTFREE 30
PCTUSED 50
STORAGE(NEXT 500K
MINEXTENTS 2
MAXEXTENTS 100);
ALTER TABLE tablename
ALLOCATE EXTENT(SIZE 500K
DATAFILE '/DISK3/DATA01.DBF');
--把表移到另一个表空间
ALTER TABLE TABLENAME MOVE TABLESPACE TABLESPACENAME;(无LOB)
ALTER TABLE TABLENAME MOVE
TABLESPACE tbsname1
LOB(lobsegname1,lobsegname2) STORE AS (TABLESPACE tbsname1); (有LOB类型)
ALTER TABLE TABLENAME MOVE
LOB(lobsegname1,lobsegname2) STORE AS (TABLESPACE tbsname1); (只有LOB类型)
(移动后可能需要重新分析表和重新建立索引)
--回收空闲的空间(回收到High-water mark)
全部回收需要TRUNCATE TABLE tablename
ALTER TABLE tablename
DEALLOCATE UNUSED;
--删除表(连同所用constraint)
DROP TABLE tablename
CASCADE CONSTRAINTS;
--给表增加列
ALTER TABLE TABLENAME
ADD COLUMN COLUTYPE DEFAULT(VALUE) NOT NULL;
--删除表中的列
ALTER TABLE tablename
DROP COLUMN columnname;
ALTER TABLE tablename
DROP COLUMN columnname
CASCADE CONSTRAINTS CHECKPOINT 1000;
--标记列不可用
ALTER TABLE tablename
SET UNUSED COLUMN columnname
CASCADE CONSTRAINTS;
--删除标记为不可用的列
ALTER TABLE tablename
DROP UNUSED COLUMNS CHECKPOINT 1000;
--继续删除列选项
ALTER TABLE tablename
DROP COLUMNS CONTINUE CHECKPOINT 1000;
--把表放到BUFFER_POOL中去
ALTER TABLE tablename
STORAGE (BUFFER_POOL RECYCLE);
--避免动态分配EXTENT
ALTER TABLE tablename ALLOCATE EXTENT;
--把表放到CACHE中去
ALTER TABLE tablename ALLOCATE CACHE/NOCACHE;
4、索引管理
--创建索引
CREATE INDEX indexname ON TABLENAME(COLUMNNAME);
CREATE INDEX indexname ON TABLENAME(COLUMNNAME) TABLESPACE TABLESPACENAME;
--重新建立索引
ALTER INDEX indexname REBUILD TABLESPACE TABLESPACENAME; (普通类型,有LOB类型不可以)
ALTER INDEX indexname REBUILD ONLINE TABLESPACE TABLESPACENAME; (普通类型,有LOB类型不可以)
ALTER TABLE TABLENAME MOVE
LOB(lobsegname) STORE AS (TABLESPACE newts); (有LOB类型)
--索引分配参数
ALTER INDEX indexname
STORAGE(NEXT 400K
MAXEXTENTS 100);
--释放索引空间
ALTER INDEX indexname
ALLOCATE EXTENT (SIZE 200K
DATAFILE '/DISK6/indx01.dbf');
ALTER INDEX indexname
DEALLOCATE UNUSED;
--重新整理索引表空间碎片
ALTER INDEX indexname COALESCE;
--分析索引
ANALYZE INDEX indexname VALIDATE STRUCTURE
--鉴别不用的索引
ALTER INDEX indexname MONITORING USAGE
ALTER INDEX indexname NOMONITORING USAGE
--删除索引
DROP INDEX indexname
--把索引放到BUFFER_POOL中
ALTER INDEX cust_name_idx
REBUILD
STORAGE (BUFFER_POOL KEEP);
5、约束管理
--建立主键
ALTER TABLE TABLENAME
ADD CONSTRAINT CONSTRAINTNAME PRIMARY KEY(COLUMN1,COLUMN2)
--使约束无效
ALTER TABLE TABLENAME ENABLE NOVALIDATE CONSTRAINT constraintname;
ALTER TABLE TABLENAME ENABLE VALIDATE CONSTRAINT constraintname;
--删除约束
ALTER TABLE tablename DROP CONSTRAINT constraintname;
DROP TABLE tablename CASCADE CONSTRAINTS;(删除表后将所用的外键删除)
--给列增加缺省值
ALTER TABLE TABLENAME
MODIFY columnname DEFAULT(value) NOT NULL;
--给表增加外键
ALTER TABLE tablename
ADD CONSTRAINT constraintname
FOREIGN KEY(column) REFERENCES table1name(column1);
6、安全策略
--加密传输
把客户端环境变量ora_encrypt_login设为true
把服务器端参数dblink_encypt_login设为true
--数据库管理员安全策略
a、建库后立即修改SYS/SYSTEM的口令(9.2后必须修改其口令)
b、只有数据库管理员才能以SYSDBA登录系统
c、建立不同角色的管理员,分配不同的权限
比如:对象创建于维护
数据库的调整与维护
创建用户分配角色
启动关闭
恢复备份
--应用开发者的安全策略
a、开发者的特权只能在测试开发的数据库中赋予权限
b、自由开发者、受控开发者
自由开发者:create tableindexprocedurepackage
受控开发者:没有以上权限
7、日志文件管理
--切换日志文件
ALTER SYSTEM SWITCH LOGFILE;
--增加日志文件
ALTER DATABASE ADD LOGFILE
('/DISK3/log3a.rdo',
'/DISK4/log3b.rdo') size 1M;
--增加日志成员
ALTER DATABASE ADD LOGFILE MEMBER
'/DISK4/log1b.rdo' TO GROUP 1
'/DISK4/log2b.rdo' TO GROUP 2;
--删除日志文件
ALTER DATABASE DROP LOGFILE GROUP 3;
--删除日志成员
ALTER DATABASE DROP LOGFILE MEMBER '/DISK4/log2b.dbf';
--清除日志文件内容
ALTER DATABASE CLEAR LOGFILE '/DISK3/log2a.rdo';
ALTER DATABASE CLEAR LOGFILE GROUP 1
8、UNDO 表空间管理(9i)
--创建
CREATE UNDO TABLESPACE undo1
DATAFILE 'undo1sb01name.dbf' SIZE 20M
ALTER TABLESPACE undotbs
ADD DATAFILE 'undotbs2.dbf' SIZE 30M
AUTOEXTEND ON;
9、验证数据文件是否损怀
dbv FILE = e:USERS01.DBF BLOCKSIZE = 8192
流水帐
1、修改sqlplus中日期的格式
SQL> set feedback off
SQL> alter session set nls_date_format='YYYY-MM-DD';
SQL> set feedback on
2、设置oracle为archivelog模式
修改初始化参数文件
8i:
log_archive_start = true
log_archive_dest = /local/oracle/oradata/ORCL/archivelog #需建好目录
log_archive_format = arch%t_%s.arc
9i:
log_archive_dest_1='LOCATION=/home/oracle/ora9/oradata/ORCL/archive' #需建好目录
log_archive_dest_1='LOCATION=D:oracleoradataoradbarchivelog'
log_archive_format=%t_%s.arc
log_archive_start=true
alter system set log_archive_format =%T_%S.arc
alter system set log_archive_dest_1='LOCATION=D:oracleoradataoradbarchivelog' scope = spfile
alter system set log_archive_format ='arch%T_%S.arc' scope = spfile
alter system set log_archive_start=true scope = spfile
数据库到mount
alter database archivelog
alter database noarchivelog
alter database open
######################################
第一步 建立归档日志目录
D:oracleoradataoradbarchivelog
第二步 使用sysdba用户登录,执行命令
alter system set log_archive_dest_1='LOCATION=D:oracleoradataoradbarchivelog' scope = spfile
alter system set log_archive_format ='arch%%t_%s.arc' scope = spfile
alter system set log_archive_start=true scope = spfile
第三步 关闭数据库
shutdown immediate
第四步 启动数据库到mount模式
alter database archivelog
第五步 打开数据库
alter database open
#####################################################################
3、如果在like的变量中,是以‘%’开头的话,是不会使用index的。反之,不是以‘%‘开头,而又有相应的index,是会使用index的。具体可以用plain plan来看一下。
4、复制空表结构
create table new_table
as select * from old_table where 1=2;
复制表(含记录)
create table new_table
as select * from old_table ;
5、把一个用户下的表导入到另一个用户下,但需要改名
先用exp导出所有的表;
用imp将导出的表导入到新用户;
在新用户下,执行
select 'RENAME TABLE '||tname||' TO NEW_'||tname||';'
from tab
where tabtype='TABLE';
将上面的查询结果保存到一个sql文件中,处理后执行就可以了。
6、审计步骤
修改参数文件init.ora,参数audit_trail值为true;
重新启动数据库;
打开审计audit session; (audit session by username)
执行登录操作;
察看审计结果:
select * from dba_audit_session;
select * from sys.aud$;
select * from dba_audit_trail;
select * from dba_audit_exists;
关于审计:
为了使oracle8i的审计功能可用,必须在数据库参数文件中修改audit_trail初始参数,而这个修改并不支配oracle8i把生成的审计记录记入审计痕迹中,
由于状态,特权和模式对象已被修改,因而审计的默认值不可用,其参数应设置为none.下面列出了audit_trail 可用的参数
db_使数据库审计和全部直属审计记录到数据库审计的痕迹中
os_是数据库审计依据直属审计记入到操作系统的审计很集中
none_不可用
7、BFILE的用法
(1)、create or replace directory
BFILE_TEST
as
'/oracle/oradata/bfiles';
(2)、grant read on directory BFILE_TEST to SCOTT;
(3)、host ls -l /oracle/oradata/bfiles/1.TXT
(4)、connect SCOTT/TIGER
create table BFILES (ID number, TEXT bfile );
(5)、insert into BFILES values ( 1,
bfilename ( 'BFILE_TEST', '1.TXT' ) );
8、oracle9i的spfile
9、在创建oracle数据库时,不要使用windows客户端终端连接进行建库
创建不成功,在建立oracle数据库时,使任何的终端断开连接。
否则TNS出错。
10、限制特定IP访问数据库
在9i中真正起作用的是sqlnet.ora文件,我们修改sqlnet.ora其实是最好最快的方法。
在sqlnet.ora中增加如下部分
-----------------------------
#### 来自 protocol.ora 的属性 ####
tcp.validnode_checking=yes
#允许访问的IP
tcp.invited_nodes=(ip1,ip2……)
#禁止访问的IP
tcp.excluded_nodes=(ip1,ip2……)
之后重新启动监听器即可
需要注意的地方:
1、tcp.invited_nodes与tcp.excluded_nodes都存在,以tcp.invited_nodes为主
2、一定要许可或不要禁止服务器本机的IP地址,否则通过lsnrctl将不能启动或停止监听,因为该过程监听程序会通过本机的IP访问监听器,而该IP被禁止了,但是通过服务启动或关闭则不影响。
3、修改之后,一定要重起监听才能生效,而不需要重新启动数据库
4、任何平台都可以,但是只适用于TCP/IP协议
11、在SQL*PLUS用UltraEdit或别的编辑器别的取代NotePad成为默认编辑环境
在%oracle_home%sqlplusglogin.sql中
DEFINE_EDITOR = NOTEPAD --记事本
DEFINE_EDITOR = "程序路径"
DEFINE_EDITOR="D:Program FilesUltraEditUEDIT32.EXE"
12、一种新的连接方法
13、查找正在热备份的表空间
select 'alter tablespace ' || ts.name || ' end backup;'
from sys.ts$ ts
where ts.ts# in (select f.ts#
from sys.file$ f,
v$backup b
where f.file# = b.file#
and b.status = 'ACTIVE');
14、PL/SQL中一些莫名其妙的错误原因可能是其中有保留字的出现
15、创建简单快照及手动刷新
create snapshot 快照名 refresh next round(sysdate+0.5)+96/144
as SQL语句;
说明:快照更新时间:每天下午16:00
round(sysdate+0.5)语句的目的是确保快照在第二天开始执行刷新
手动刷新 exec dbms_snapshot.refresh('快照名')
16、参数无法用alter system语句动态修改
select name,value ,ISSYS_MODIFIABLE from v$parameter
注:如果ISSYS_MODIFIABLE 返回的是false,说明该参数无法用alter system语句动态修改,需要重启数据库
17、编译所有的无效的对象
set feedback off
set heading off
set linesize 1000
set pagesize 0
set pause off
set trimspool on
set verify off
spool tmp.sql;
select 'alter '||object_type||' '||owner||'.'||object_name||' compile;'
from dba_objects
where status = 'INVALID'
and object_type in ('FUNCTION','JAVA SOURCE','JAVA CLASS','PROCEDURE','PACKAGE','TRIGGER');
select 'alter package '||owner||'.'||object_name||' compile body;'
from dba_objects
where status = 'INVALID'
and object_type = 'PACKAGE BODY';
spool off;
@tmp
18、显示了数据库里每个对象对数据缓冲区的使用情况(9i)
column c0 heading 'Owner' format a15
column c1 heading 'Object|Name' format a30
column c2 heading 'Number|of|Buffers' format 999,999
column c3 heading 'Percentage|ofData|Buffer' format 999,999,999
select
owner c0,
object_name c1,
count(1) c2,
(count(1)/(select count(*) from v$bh)) *100 c3
from
dba_objects o,
v$bh bh
where
o.object_id = bh.objd
and
o.owner not in ('SYS','SYSTEM','AURORA$JIS$UTILITY$')
group by
owner,
object_name
order by
count(1) desc
;
19、select count(1) from table ........
select count(rowid) from table ........
比select count(*) from table ........ 速度快
20、获得exp/imp的帮助
exp help=y
exp -help
获得操作系统命令的帮助 help 命令
21、如何使用9i的isqlplus
(1).先确定httpserver服务已启动
(2).http://机器名:7778/isqlplus
22、关于视图和表的同义词
视图和表的同义词是实时随着表数据的修改而变化的。
当表结构变化时,同义词的结构实时发生变化
而视图需要访问一次,结构才发生变化
23、to_char函数中毫秒的日期格式(9i以上版本)
select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ssxff') time1,
to_char(current_timestamp) time2 from dual;
24、ORACLE中的BITOR和BITXOR
很多人都有一个疑问:ORACLE中为什么只有BITAND而没有BITOR, BITXOR
原因是,有了BITAND, 很容易实现BITOR和BITXOR
BITOR(x,y) = (x + y) - BITAND(x, y);
BITXOR(x,y) = BITOR(x,y) - BITAND(x,y) = (x + y) - BITAND(x, y) * 2;
1、在UNIX下使用的导出为日期.DMP备份的用法
exp system/manager inctype=complete file=home/study/`date +%Y%m%d%k%M%S`.dmp
2、在linux下自动启动数据库ora-01092错误解决办法。
是初始化参数指定的回滚段问题
3、自动启动linux下的oracle数据库
(1)、 修改Oracle系统配置文件/etc/oratab
/etc/oratab 格式为: SID:ORACLE_HOME:AUTO
把AUTO域设置为Y(大写),只有这样,oracle 自带的dbstart和dbshut才能够发挥作用。我的为:
ora9i:/home/oracle/ora/products/9.2.0:Y
(2)、修改dbstart和dbshut脚本
(3)、建立startdb,stopdb,并cp到etc/init.d/
su - oracle -c "lsnrctl start"
su - oracle -c "dbstart"
su - oracle -c "lsnrctl stop"
su - oracle -c "dbshut"
(4)、建立连接
启动:
ln -s /etc/init.d/startdb /etc/rc.d/rc2.d/S99oracle
ln -s /etc/init.d/startdb /etc/rc.d/rc3.d/S99oracle
ln -s /etc/init.d/startdb /etc/rc.d/rc4.d/S99oracle
关闭:
ln -s ../init.d/stopdb /etc/rc.d/rc0.d/K99oracle
重新启动:
ln -s ../init.d/stopdb /etc/rc.d/rc6.d/K99oracle
4、oracle10g管理控制台
192.168.102.89 主机名
emctl status dbconsole
5、LOAD数据
(1).loading data using direct_load insert
sql> insert /*+append */ into emp nologging
select * from emp_old;
( 2).parallel direct-load insert
sql> alter session enable parallel dml;
sql> insert /*+parallel(emp,2) */ into emp nologging
select * from emp_old;
6、BFILE的用法
(1)、create or replace directory
BFILE_TEST
as
'/oracle/oradata/bfiles';
(2)、grant read on directory BFILE_TEST to SCOTT;
(3)、host ls -l /oracle/oradata/bfiles/1.TXT
(4)、connect SCOTT/TIGER
create table BFILES (ID number, TEXT bfile );
(5)、insert into BFILES values ( 1,
bfilename ( 'BFILE_TEST', '1.TXT' ) );
7、获得服务器和客户端的IP(8i以上版本)
select utl_inaddr.get_host_address from dual; 服务器
select sys_context('userenv','ip_address') from dual; 客户端
8、怎么样在过程中暂停指定时间
DBMS_LOCK包的sleep过程
如:dbms_lock.sleep(5);表示暂停5秒。
9、怎么样设置自治事务
8i以上版本,不影响主事务
pragma autonomous_transaction;
……
commit|rollback;
10 、如何提高IMP的速度
(1)不建议使用commit参数,因为当imp失败的时候,会导致很多后续的麻烦事儿
(2)增大buffer参数值,以便于一次读进更大的array
(3)设置较大的初始化参数sort_area_size,以加快创建索引时候的排序速度
(4)增大重作日志的大小,以减少log switch的次数,也就是减少checkpoint次数,减少写磁盘的次数
(5)如果要往已经存在的表中追加数据,那么有些情况下,比如表中存在位图索引,那么最好先删除索引,再导入。否则更新索引时会产生大量等待。
(6)使用indexfile和indexes参数,再导入数据之后再手工创建索引。
(7)、可以把表设置成nologging方式
11、关联更新
Update t_a a
Set a.point=a.point+(select b.point from t_b b where b.id=a.id)
Where exists (select 1 from from t_ b b where b.id=a.id)
Update test a
Set a.b=(select b.b from test1 b where b.a=a.a)
Where exists (select 1 from test1 b where b.a=a.a)
12、使用SQL*PLUS构建完美excel或html输出
oracle@jumper utl_file]$ more main.sql
set linesize 200
set term off verify off feedback off pagesize 999
set markup html on entmap ON spool on preformat off
spool tables.xls
@get_tables.sql
spool off
exit
[oracle@jumper utl_file]$ more get_tables.sql
select owner,table_name,tablespace_name,blocks,last_analyzed
from all_tables order by 1,2;
13、计算log block size
select max(lebsz) from x$kccle;
14、SQL*PLUS环境输入'&字符'的方法
我们知道在SQL*PLUS默认环境里会把'&字符'当成变量来处理.
有些时候我们也需要在SQL>的符号下输入'&字符', 只需要改变SQL*PLUS下一个环境变量define即可.
SQL> set define off;
是把默认的&绑定变量的功能取消, 可以把'&字符'当成普通字符处理
SQL> set define on;
打开&绑定变量的功能, &后面的字符串当变量使用.
SQL> show define;
查看当前SQL*PLUS的define状态
举例说明:
---------------------------------------------------------------
SQL> CREATE TABLE TEST3 (
ID NUMBER (2) PRIMARY KEY,
NAME VARCHAR2 (20));
SQL> show define;
define "&" (hex 26)
SQL> insert into test3 values(1,'sgs&a&n');
Enter value for a: abc
Enter value for n: 456
old 1: insert into test3 values(1,'sgs&a&n')
new 1: insert into test3 values(1,'sgsabc456')
1 row created.
SQL> commit;
Commit complete.
SQL> set define off;
SQL> insert into test3 values(2,'sgs&a&n');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from test3;
ID NAME
-- --------------------
1 sgsabc456
2 sgs&a&n
15、oracle9i快速闪回(flashback)
设置参数undo_retention integer 10800
execute dbms_flashback.enable_at_time('24-5月 -05:01:30');
select * from tablename
execute dbms_flashback.disable()
16、改变Oracle XDB的ftp和http端口
使用sys登录Oracle,利用dbms_xdb修改端口设置
call dbms_xdb.cfg_update(updateXML(
dbms_xdb.cfg_get()
, '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()'
, 8081))
修改FTP端口从2100到2111
call dbms_xdb.cfg_update(updateXML(
dbms_xdb.cfg_get()
, '/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()'
, 2111))
17、
sql*net 在8i 以前的版本中有,在8i 变为了net8,在9i中变成了ORACLE NET SERVERICE。它是配置客户端与服务器连接的一种工具。
Oracle7 --------SQL * Net
Oracle8 --------NET8
Oracle8I --------NET8I
Oracle9I --------ORACLE NET SERVERICE
18、使数据库处于沉寂状态,其他用户dml操作,只有管理员可以操作数据库 (9i)
(1) 资源管理器设置
show parameter RESOURCE_MANAGER_PLAN
(2) 沉寂状态
ALTER SYSTEM QUIESCE RESTRICTED;
(3) 解除沉寂状态
ALTER SYSTEM UNQUIESCE;
19、得到对象的DDL语句 (9i)
SQL> select dbms_metadata.get_ddl('TABLE','TEST') FROM DUAL;
DBMS_METADATA.GET_DDL('TABLE','TEST')
-------------------------------------------------------------------
CREATE TABLE "HR"."TEST"
( "A" VARCHAR2(20),
"B" VARCHAR2(10)
) PCTF
20、
1、varchar2类型在创建表时必须指定宽度,char默认宽度是1
2、ODBMS与DBMS的区别。DBMS allows objects to store data and related processes
3、inventory.inventory1:=12 A record will be assigned a value.
4、定义游标时,变量不需要定义长度。
5、隐式光标和显示光标的区别。
6、日期型在WHERE字句后 例 WHERE SDERDATE > 'SYSDATE' 不用TO_DATE()
7、在打开CURSOR时 %rowcount = 0 不等于NULL
8、not in = !=all
9、alter table tablename drop column columnname
10、PL/SQL中定义变量时没有赋予初始值时的默认值是NULL
11、CREATE SESSION 权限允许用户修改自己的密码
12、NVL函数需要类型匹配 NVL2(COMM,1,0) COMM IS NULL RETURN 0 ELSE 1
SELECT EMPNO,ENAME,SAL,COMM,NVL2(COMM,1,0) COMMPRE FROM EMP ORDER BY EMPNO
13、隐式CURSOR与显示CURSOR的区别
14、变量的定义问题,不同的块中可以有相同名字的变量
15、表名不能超过30个字符,变量也是
16、隐式游标只处理单个结果行,多个结果行应用显示游标
17、游标定义的参数是IN参数,是只读的
18、oracle数据库的日期
select to_char(sysdate,'yyyy') from dual; --年
select to_char(sysdate,'Q' from dual; --季
select to_char(sysdate,'mm') from dual; --月
select to_char(sysdate,'dd') from dual; --日
ddd 年中的第几天
WW 年中的第几个星期
W 该月中第几个星期
D 周中的星期几
hh 小时(12)
hh24 小时(24)
Mi 分
ss 秒
19、十进制到十六进制:
select to_char(10,'00x') from dual;
select to_char(10,'xxxxx') from dual;
十六进制到十进制:
select to_number('12','XXX') from dual;
20、把表CACHE到内存中
ALTER TABLE TABLE_NAME CATCH
ALTER TABLE TABLE_NAME NOCATCH
21、oracle9i中可以改变列名
alter table tablename rename col1 col2
oracle8i和以前版本中不可以改变列名,只能先删除后创建
22、ORACLE子过程的事物回滚
只有当子过程是自治的(autonomous),子过程的commit和rollback才不影响父过程
Autonomous 指在调用main transaction的上下文之外执行某些 SQL 操作组,比如你的子进程,提交或回滚这些操作并返回给调用main transaction的上下文,而不会丢失早先在主transaction中的工作.
23、SQL/PLUS里
SET TIMING ON
SELECT * FROM DUAL;
00:00:00 455
455 是百分之一秒为单位
24、回滚段太小的解决方法
(1)、或者增大回滚段文件的大小。
alter database datafile 'datafilename' resize 200m;
(2)、给事务指定回滚段。
set transaction use rollback segment rollname;
(3)、删除一个ROLLBACK SEGMENT
DROP ROLLBACK SEGMENT rollname;
(4)、回滚段的问题及解决方法
问题一:事务要求的回滚段空间不够,表现为表空间用满(ORA-01560错误),回滚 段扩展到达参数MAXEXTENTS的值(ORA-01628)。
解决方法:向回滚段表空间添加文件或使已有的文件变大;增加MAXEXTENTS的值。
问题二:读一致性错误(ORA-01555 SNAPSHOT TOO OLD)
解决方法:增加MINEXTENTS的值,增加区段(EXTENT)的大小,设置一个高的OPTIMAL 值。
25、列约束和表约束的区别
一般不需要约束。
(1)、列制约都可以用表制约来实现,但是限制多列的子句必然是表约束。
(2)、列约束好象是无法指定约束名称,而对大型应用来说,最好用表约束来指定名称,方便维护。
(3)、这两种约束的唯一区别就是建表时定义的位置不同。
26、ORACLE取随机数的方法
(1)、执行脚本$ORACLEHOMERDBMSADMINcatoctk.sql
(2)、select ceil(dbms_random.value(1,4)) from dual;
(3)、select * from scott.emp where rownum=trunc(dbms_random.value(1,50));
(从表中选择随机行)
27、ALL_COL_PRIVS_RECD 数据字典视图用途
28、<ANY 小于最大的 >ANY 大于最小的 =ANY相当于 IN
<ALL 小于最小的 >ALL 小于最大的 =ALL相当于 IN
29、子查询返回NULL则主查询返回为NULL
30、SQLPLUS中定义变量时重用变量是&& &&一定要写在&的前面
用UNDEFINE释放变量
31、SELECT INTO 只能查询数据库中的一条记录。否则将捕获TOO_MANY_ROWS exception
32、grant update on tablename to user with grant option
只有一个对象权限授予用户user
33、用RAISE_APPLICATION_ERROR to issue a user-defined error message
34、assign a value to an uninitialized object 将handle an error
oracle predefined exception is ACCESS_INTO_NULL
35、DELETE 和 UPDATE语句能够包含WHERE CURRENT OF 子句
36、当列为NULL时才能减少列的宽度,增加没有关系。(字符型和数字型)
37、GRANT ALL ON TABLENAME TO USER (ALL所有对象权限包括INDEX和REFERENCES)
38、当ORDER BY ASC的时候NULL值显示在最后,DESC时NULL显示在最前面 NULL为最大处理
39、SET LINESIZE 50 是SETS THE NUMBER OF CHARACTERS PER LINE TO 50 FOR REPORTS
40、缺省创建SENQUENCE时CATCH(KEEP IN MEMORY)选项默认20
41、LOOP....END LOOP; 中间使用EXIT WHEN 条件 退出循环
42、唯一索引与主键的区别。
(1).可以使用alter table add constraint pkname primary key (columnname);
注意:如果有重复的数据或者NULL值,你是建立不上的。
(2). 设置成主键就自动创建唯一性索引。补充一下,在建立唯一性约束的时候也自动建立唯一性索引
(3).主键是一种约束,是数据库为了实现完整性的机制。而唯一索引是一种索引,是数据库为了加快查询速度的机制。
(4)、也只能讲这些了。
43、求出一个月的第一天与最后一天。
SQL> SELECT TRUNC(SYSDATE, 'MM'), LAST_DAY(SYSDATE) FROM DUAL;
44、查找有'_'或者'%'特殊字符的SELECT语句
SELECT * FROM tablename
WHERE columnname LIKE 'TAA/_%' ESCAPE '/'
45、限制用户登录:创建一个概要文件
create profile CLERK_PROFILE limit
session_per_user 1 #用户可拥有的会话次数
idle_time 10 #进程处于空闲状态的时间(10分钟)
然后就可以将该概要文件授予一个用户
alter user A profile CLERK_PROFILE;
46、限制用户的连接时间使用CONNECT_TIME 参数。
是在profile中。
47、删除所有视图、表
sqlplus:
sql>spool c:aaa.sql
sql>select 'drop view '||VIEW_NAME||' from user_views
sql>select 'drop table '||table_name||' from user_tables
sql>spool off
把没有用的去掉,然后运行脚本就可以了。
sql>@aaa.sql
48、CLOB字段可以select,但select时不可以使用where -----?
49、ORACLE中对文件的操作
设置初始化参数
UTL_FILE_DIR = "d:oracleoradatawpdbfile"
PROCEDURE create_file
(loc_in IN VARCHAR2, file_in IN VARCHAR2, line_in IN VARCHAR2 := NULL)
IS
file_handle UTL_FILE.FILE_TYPE;
BEGIN
/*
|| Open the file, write a single line and close the file.
*/
file_handle := UTL_FILE.FOPEN (loc_in, file_in, 'W');
IF line_in IS NOT NULL
THEN
UTL_FILE.PUT_LINE (file_handle, line_in);
ELSE
UTL_FILE.PUT_LINE
(file_handle, 'I make my disk light blink, therefore I am.');
END IF;
UTL_FILE.FCLOSE (file_handle);
END;
50、查看表空间中数据文件的大小
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;
51、数据库变慢的可能原因
(1).init配置文件,新机器上的配置文件是否已经按照你的机器资源的状况作过调整,你可以使用旧机器上的配置文件做对比,甚至可以直接使用旧机器的配置文件做测试。
(2).sga区域的划分,建议你将sga的大小设定为内存的一半或一半略大一些,sga的其他内存分区也要做相应的调整。
(3).新机器的表空间的大下,特别是rollback表空间和system表空间的大小,此外你的业务数据是否单独建立了自己的表空间,这是很重要的。
(4).检查你的template表空间是否与system表空间和业务数据表空间分开了,对于大量数据处理的复杂查询需要一个独立的template表空间。
(5).检查你的rollabck segment的大小和个数的设置,如果rollback segment太小,会出现速度很慢的情况。
(6).新机器的索引是否全部建立,检查你的数据库设计文档或旧机器的数据库,那里应该有你的数据库全部索引,对应他们分别创建起来。
(7).如果数据量比较大,数据修改频率较高,需要为索引单独建立表空间,这样会提高效率。
(8).如果上述都不能起作用,建议你在sqlplus中单步执行你的复杂的查询,以确定引起速度缓慢的具体原因和具体的表,如果有必要,可以重新导入某个表(此表需要先导出)。我曾遇到过由于oracle内部错误导致的上述问题,但那是由于将低版本的数据导入高版本时产生的
52、使用了表的别名就应该始终使用。不能混合使用。
53、取出时间的毫秒值。9i可以。
select systimestamp from dual