您的位置:首页 > 数据库 > Oracle

Oracle的常见问题

2015-08-25 18:58 447 查看
一.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

数据库装载完毕。

数据库已经打开。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: