分享

oracle数据库开发的一些经验积累(二)

 fan_tao 2006-12-27
oracle数据库开发的一些经验积累(二)
2005-3-28 7:33:42  作者:模板天下收集整理  来源:未知 网友评论 0 条 论坛 4560
  

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_HOME\sysman\config目录下,修改
# 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的登录问题,用户名和密码。

可以直接输入:
    internal/oracle@serivce_name
  sys/change_on_install@serivce_name
  system/manager@serivce_name
  scott/tiger@serivce_name
注意:
9i中没有internal/oracle
如果选择典型安装则有 scott用户
如果自定义可以不安装  scott用户
如果是本机则可以省略@serivce_name

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:\WINNT\Temp→c:\temp\systmp,重新启动机器就ok了)

41、如何修改INTERNAL的口令
 
以下是oracle8的8i你可以仿照来做

(1)、进入DOS下

(2)、默认internal密码文件在c:\orant\database下,是隐藏属性,文件名称与数据库实例名有关

  如默认ORACLE实例名为ORCL,则internal密码文件名为pwdorcl.ora

(3)、建立新的internal密码文件,起个新名字为pwdora8.ora

  orapwd80 file=pwdora8.ora password=B entries=5     --注:password项一定要用大写,并且不要用单引号

(4)、拷贝pwdora8.ora文件到c:\orant\database目录下

(5)、运行regedit,修改口令文件指向

(6)、找到HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE项

  定位ORA_ORCL_PWFILE子项,改变其值为c:\orant\database\pwdora8.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;


例子:
VARIABLE 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了

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多