Oracle的常见问题

来源:互联网 发布:vb.net加载dll 编辑:程序博客网 时间:2024/05/01 09:47
一.Oracle中乱码问题
ORACLE修改数据库的字符集编码为UTF-8方法
 
1、查看数据库字符集 数据库服务器字符集select * from nls_database_parameters,其来源于props$,
是表示数据库的字符集。客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter,
表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表会 话字符集环境 select * from nls_session_parameters,
其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,
将与nls_instance_parameters一致。客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,
alter session>环境变量>注册表>参数文件字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,
则nls_lang可以是American_America.zhs16gbk。
 
2、修改Oracle的字符集,如下例把字符集GB2312修改为UTF-8步骤:
    1.在SQL*PLUS 中,以DBA登录conn 用户名 as sysdba
    2.执行转换语句:SHUTDOWN IMMEDIATE;STARTUP MOUNT EXCLUSIVE;
    ALTER SYSTEM ENABLE RESTRICTED SESSION;
    ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
    ALTER SYSTEM SET AQ_TM_PROCESSES=0;
    ALTER DATABASE OPEN;ALTER DATABASE NATIONAL CHARACTER SET UTF8;
    SHUTDOWN immediate;startup;
 
注意:如果没有大对象,在使用过程中进行语言转换没有什么影响,(切记设定的字符集必须是ORACLE支持,不然不能start)
 
按上面的做法就可以,但是可能会出现‘ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET whenNCLOB data exists’ 这样的提示信息
 
要解决这个问题有两种方法一个是,利用INTERNAL_USE 关键字修改区域设置,还有一个是利用re-create,但是re-create有点复杂,
所以请用internal_use,SHUTDOWN IMMEDIATE;STARTUP MOUNT EXCLUSIVE;ALTER SYSTEM ENABLE RESTRICTED SESSION;ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;ALTER SYSTEM SET AQ_TM_PROCESSES=0;ALTER DATABASE OPEN;ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;SHUTDOWN immediate;startup;
如果按上面的做法做,National charset的区域设置就没有问题 。
 
 
二、 pl/sql developer 中文字段显示乱码  
原因:因为数据库的编号格式和pl /sql developer的编码格式不统一造成的。
select userenv('language') from dual;
 
查询结果:
 
SIMPLIFIED CHINESE_CHINA.AL32UTF8
 
--修改oracle数据库字符集:(在SQL Plus中)
 
sql> conn / as sysdba;
 
sql> shutdown immediate;
 
database closed.
 
database dismounted.
 
oracle instance shut down.
 
sql> startup mount;
 
oracle instance started.
 
total system global area  135337420 bytes
 
fixed size                          452044 bytes
 
variable size                     109051904 bytes
 
database buffers              25165824 bytes
 
redo buffers                      667648 bytes
 
database mounted.
 
sql> alter system enable restricted session;
 
system altered.
 
sql> alter system set job_queue_processes=0;
 
system altered.
 
sql> alter system set aq_tm_processes=0;
 
system altered.
 
sql> alter database open;
 
database altered.
 
sql> alter database character set internal_use JA16SJIS;
 
sql> shutdown immediate;
 
sql> startup;
 
 
三、修改pl/sql developer 的编码格式:
 
在windows中创 建一个名为“NLS_LANG”的系统环境变量,设置其值为“SIMPLIFIED CHINESE_CHINA.ZHS16GBK”,
 
然后重新启动 pl/sql developer,这样检索出来的中文内容就不会是乱码了。如果想转换为UTF8字符集,可以赋予“NLS_LANG”为 “AMERICAN_AMERICA.UTF8”,然后重新启动 pl/sql developer。其它字符集设置同上
 
 
 
四.oracle正在初始化或未关闭
1.打开命令窗口,输入一下语句
C:Documents and SettingsAdministrator>sqlplus /nolog  
SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 5月 12 09:05:56 2010  
Copyright (c) 1982, 2005, Oracle. All rights reserved.
 idle>connect system/sys
 ERROR:ORA-01033: ORACLE 正在初始化或关闭   
idle>connect test/123 
ERROR:ORA-01033: ORACLE 正在初始化或关闭  
 idle>connect system/sys as sysdba
 已连接。 
idle>shutdown normal
 ORA-01109: 数据库未打开
 
 
3.建了个数据库(名:d0647073 sid:d0647073)  
在用户登录的过程中出现如下错误:  
Listener refused the connection with the following error: ORA-12514, TNS:listener does not currently know of service requested in connect descriptor The Connection descriptor used by the client was: (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=zsl)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=d0647073)))  
解决方式:把注册表的ORA_D0647073_AUTOSTART值改为true,然后重新启动数据库的服务。(此问题可能有其他原因引起,但是这是一种原因)  
 
在学习的过程中对这个问题有了进一步的认识:  
   其实它是数据库启动时,数据库的例程没有加载,也就说在注册表的ORA_D0647073_AUTOSTART值为FALSE在数据库启动时不自动加载例程。  
另一种解决方法:  
     进入命令行,以sys用户登录  
     然后执行以下命令:  
        startup nomount;  
        alter database mount;  
        alter database open
 
 
五.无法打开监听
解决:oracle无法启动监听

问题描述:
1.远程链接正常,可以使用pl/sql?developer链接到远程的数据库,但是本地数据库服务开启后无法链接
2.本地数据库监听打不开,在命令提示符方式下输入lsnrctl start;sqlplus /nolog
conn sys/[数据库用户名]i@orcl as sysdba;start;
可以打开本地库,但是使用pl/sql?developer无法链接到本地数据库,提示无监听,当在windows服务中启动
本地监听时,出现错误本地计算机上的
oracleoradb10g_home1TNslistener
 
服务启动后停止,意思为本地监听己经被占用 异常的地方:
1.打开windows服务,里边有好几个监听,这些监听在服务里显示是未启动。
2.打开注册表,找到
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/services/oracl******lister发现有好几个不同的监听.
 
试用过的解决方法:
1.查看网上资料,这种情况一般情况下都是配置文件信息不正确,监听不能正确读取本机的配置信息。

2.查看本地配置文件我的oracle是装在E:\oracle\product\10.2.0,查看安装路径下的配置文件E:\oracle\product\10.2.0\db_1\network\ADMIN
下的
listener.ora和tnsnames.ora的配置信息,并查看其下的host选项,都正确指向本机,其名称为localhost,或者是本机的计算机名,查询无故障,
 
但是依然链接不上 具体解决方法:
1.使用oracle自带工具netConfiguration?assistant工具删除本地计算机所有监听,然后再重新新建一个名为listener的新监听,监听指向本机数据库。

2.查看本地windows服务,启动刚建立的新监听,试着启动一下,如果无法启动新建立的监听,进入注册表里,
找到
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/services/oracl******lister,
把除了刚新建立的监听外的其它多余的监听全部删掉,然后重启电脑.启用本地数据库服务,启用本地监听,登录数据库,显示成功.问题解决
问题产生原因分析:

产生这种问题的原因是,本地启用了多个监听,导致本地监听开启的时候提示监听己经运行,并强制结束当前监听.分析过
后发现是以前使用远程数据库的时候,自己不小心多建立的监听,其时链接远程数据库的时候,只需要建立不同的服务就可以了,监听只需要
建立一个.现在网上贴出好多处理这种问题的贴子,总结起来不外乎以下几种

1.查看数据库配置文件listener.ora和tnsnames.ora中的host值是否正确指向本机.
2.查看注册表中的监听
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/services/oracl******lister下的imagePath是否有值,如果没
有添加其值,指向你的oracle数据库,比如我的本机值为E:\oracle\product\10.2.0\db_1\BIN\TNSLSNR
3.查看数据库环境变量是否配置
 
 
 
PL/SQL developer ORA-12514: TNS: 监听程序当前无法识别连接描述符
检查监听,发现未设置对服务名的监听(Oracle10g默认安装后不自动设置监听)。
当你的tnsnames.ora 文件中的SERVICE_NAME没有向你想要连接的数据库服务器中的注册的时候,就
 
会出现这个错误信息。如果你的客户端配置没有发生变化,那么数据库服务器配置就必须进行改变,否则你用
 
来进行连接的SERVICE_NAME就永远不会注册到
 
    注册的SERVICE_NAME 是由数据库实例的service_names 参数来决定的。查看参考指南中的服务器
 
文档来找到有关当这个参数没有设置的时候,它的默认值是如何设置的详细信息。你可以通过明确地对其进行
 
设置,来避免它被另一个参数的变化所影响。
 
   你还有可能是遇到了定时的问题。如果服务被重新启动,那么数据库实例就必须向它重新注册。通常情况
 
下,每60秒就会出现这样的问题。如果你迫不及待,那么就以数据库管理员的身份登录到数据库服务器,并且
 
运行“更改系统注册器”,这样就可以强制它立即注册。  
—————————————————————————————————————————  
解决办法:  
——————  
1. 打开文件"<OracleHome>/network/admin/listener.ora" ,你将看到如下的内容:  
    SID_LIST_LISTENER =  
    (SID_LIST =  
      (SID_DESC =  
        (SID_NAME = PLSExtProc)  
        (ORACLE_HOME = D:/oracle/product/10.2.0/db_1)  
        (PROGRAM = extproc)  
      )  
    )  
   2. 将下面的语句添加到上面的语句中去。  
        (SID_DESC =  
        (GLOBAL_DBNAME = ORACLE)  
        (ORACLE_HOME = D:/oracle/product/10.2.0/db_1)    
        (SID_NAME = ORACLE)  
       )  
   3. 文件的内容则变成了如下所示:  
     SID_LIST_LISTENER =  
    (SID_LIST =  
      (SID_DESC =  
        (SID_NAME = PLSExtProc)  
        (ORACLE_HOME = D:/oracle/product/10.2.0/db_1)  
        (PROGRAM = extproc)  
      )  
      (SID_DESC =  
        (GLOBAL_DBNAME = ORACLE)  
        (ORACLE_HOME = D:/oracle/product/10.2.0/db_1)    
        (SID_NAME = ORACLE)  
       )  
    )  
   4. 保存文件,然后lsnrctl restart listener  重新启动监听服务TNSListener    就可以了 !
 
 
问题解决
----------------------
主动跟被动的关系
1.是让listener主动加载服务
原因是 添加
    (SID_DESC =
      (SID_NAME = orcl)
      (ORACLE_HOME = /data/cache1/oracleDB/oracle/product/10.2.0/db_2)
    )
后,在使用lsnrctl start监听程序时会将listener的服务注册到进程监视器(pmon)中
2.listener被动加载服务
如果没有该内容,那么由实例的pmon进程在listener中注册服务,对listener来讲,就是被动了。
这也就是为什么先启动监听后启动数据库能够正常连接的,反之不行的原因了。
 
 
----------------------------------------------------
ORA-12519, TNS:no appropriate service handler found The Connection descriptor used by the client was: 110.16.1.17:1521:orcl
 解决方案:  
Java代码   
数据库上当前的连接数目已经超过了它能够处理的最大值。   
   
select count(*) from v$process --当前的连接数   
select value from v$parameter where name = 'processes' --数据库允许的最大连接数   
修改最大连接数:   
alter system set processes = 300 scope = spfile;   
   
重启数据库:   
shutdown immediate;   
startup;    www.2cto.com   
   
--查看当前有哪些用户正在使用数据   
SELECT osuser, a.username,cpu_time/executions/1000000||'s', sql_fulltext,machine   
from v$session a, v$sqlarea b   
where a.sql_address =b.address order by cpu_time/executions desc;   
 
注意点:如果提示没有shutdown 权限 可以使用  
conn /as sysdba dba  
 
Java代码   
SQL> conn/as sysdba;   
已连接。   
SQL> alter system set processes = 300 scope = spfile;   
   
系统已更改。   
   
SQL> shutdown immediate;   
数据库已经关闭。   
已经卸载数据库。   
ORACLE 例程已经关闭。   
   
SQL> startup;   
ORACLE 例程已经启动。   
    www.2cto.com   
Total System Global Area  599785472 bytes   
Fixed Size                  1288820 bytes   
Variable Size             176162188 bytes   
Database Buffers          419430400 bytes   
Redo Buffers                2904064 bytes   
 
数据库装载完毕。   
数据库已经打开。

0 0