qmfsun 发表于 2013-01-22 11:08

Oracle 4

【Oracle】sqlplus / as sysdba无法登陆数据库解决办法
问题现象:

采用sqlplus / as sysdba;以及sqlplus /nolog connect / as sysdba;均登陆不进去
oracle@MSGDR2:/opt/oracle/oradb/home/network/admin> sqlplus / as sysdba;

SQL*Plus: Release 11.1.0.7.0 - Production on Sat Oct 29 09:55:12 2011

Copyright (c) 1982, 2008, Oracle.All rights reserved.

ERROR:
ORA-01031: insufficient privileges


Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied

Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied

SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus

oracle@linux-as:~/app/oracle/product/11.1.0/db_1/network/admin> sqlplus /nolog
SQL*Plus: Release 11.1.0.6.0 - Production on Thu Apr 12 09:07:40 2012
Copyright (c) 1982, 2007, Oracle.All rights reserved.
SQL> conn / as sysdba;
ERROR:
ORA-01031: insufficient privileges
可能的原因以及解决方法:
1)
可能是因为oracle用户不隶属于Oracle创建的oinstall、dba组,如下修改即可解决。
MSGDR2:/home/sysomc # usermod -g oinstall -G dba oracle
修改后如下:
oracle@MSGDR2:~> sqlplus / as sysdba;
SQL*Plus: Release 11.1.0.7.0 - Production on Sat Oct 29 10:21:38 2011
Copyright (c) 1982, 2008, Oracle.All rights reserved.
Connected to an idle instance.
SQL> exit

2)
oracle@linux-as:~/app/oracle/product/11.1.0/db_1/network/admin> cat sqlnet.ora
# sqlnet.ora Network Configuration File: /opt/oracle/app/oracle/product/11.1.0/db_1/network/admin/sqlnet.ora
# Generated by Oracle configuration tools.
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)
SQLNET.AUTHENTICATION_SERVICES = (NONE)
SQLNET.SEND_TIMEOUT = 180
SQLNET.RECV_TIMEOUT = 180
加黑部分,会导致sqlplus / as sysdba登陆不进去
注释掉后,sqlplus / as sysdba可以正常登陆

如果使用sqlplus / as sysdba;能够登陆后,但是使用sqlplus sys/sys@ora11g as sysdba;登陆不了的话
在确认用户和密码正确的前提下,参照如下方式处理试试,如下方式确保remote_login_passwordfile为EXCLUSIVE。

SQL> show parameter REMOTE_LOGIN_PASSWORDFILE;
NAME         TYPEVALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile      stringNONE
SQL> show parameter remote;
NAME         TYPEVALUE
------------------------------------ ----------- ------------------------------
remote_dependencies_mode      stringTIMESTAMP
remote_listener      string
remote_login_passwordfile      stringNONE
remote_os_authent       booleanFALSE
remote_os_roles      booleanFALSE
result_cache_remote_expiration      integer0
SQL> alter system set remote_login_passwordfile='EXCLUSIVE' scope=spfile;
System altered.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining,
Oracle Database Vault and Real Application Testing options
oracle@atae86:~> sqlplus / as sysdba;
SQL*Plus: Release 11.1.0.7.0 - Production on Fri Jun 15 12:28:48 2012
Copyright (c) 1982, 2008, Oracle.All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 1.2560E+10 bytes
Fixed Size      2171344 bytes
Variable Size   6912216624 bytes
Database Buffers5637144576 bytes
Redo Buffers      8601600 bytes
Database mounted.
Database opened.
SQL> exit

oracle@atae86:~> sqlplus sys/sys@ora11g as sysdba;
SQL*Plus: Release 11.1.0.7.0 - Production on Fri Jun 15 12:29:20 2012
Copyright (c) 1982, 2008, Oracle.All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining,
Oracle Database Vault and Real Application Testing options
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining,
Oracle Database Vault and Real Application Testing options

另一种可能是sys用户没有sysdba权限

在保证$ORACLE_HOME/dbs/目录下$ORACLE_SID密码是正确的前提下

sqlplus/ as sysdba;
grant sysdba to sys;
commit;

如果$ORACLE_HOME/dbs目录下没有$ORACLE_SID的密码的话,采用如下方式创建一个
oracle@test4_10:/oracle/app/product/11gR2/db/dbs> orapwd file="/oracle/app/product/11gR2/db/dbs/orapwora11g2" password=oracle entries=10force=y

杀掉oracle进程的方法
1.通常可以使用以下命令Kill进程:
ALTER SYSTEM kill SESSION 'sid,serial#';
2.获得SID
SELECT logon_time,username,action,program,terminal,machine,userfrom v$session WHERE terminal = 'CZYS'
SELECT spid FROM v$process WHERE addr IN
(SELECT paddr FROM v$session WHERE terminal ='CZYS'
andlogon_time <= TO_DATE('2006-2-17 16:28:56','yyyy-mm-ddhh24:mi:ss'));
PS:获取v$session、v$process的结构可以使用DESC

-------------------------------
为了更快速的释放资源,通常我们使用如下步骤来Kill进程:
1.首先在操作系统级kill进程
2.在数据库内部kill SESSION
这样通常可以快速中止进程,释放资源。

首先查询得到该SESSION对应的OS进程号:
SQL> SELECT 'kill -9 '||spid FROM v$process WHERE addr = (selectpaddr FROM v$session WHERE sid=&sid);
Enter VALUE FOR sid: 154
old 1: SELECT 'kill -9 '||spidfrom v$process WHERE addr = (SELECT paddr FROM v$session wheresid=&sid)
NEW 1: SELECT 'kill -9 '||spidfrom v$process WHERE addr = (SELECT paddr FROM v$session wheresid=154)

'KILL-9'||SPID
--------------------
kill -9 22702

SQL> !
在操作系统级kill该进程:
$ ps -ef|grep 22702
oracle 22702 1 0 Oct25? 00:00:02 oracledanaly (LOCAL=NO)
oracle 1208212063 0 11:12pts/1 00:00:00 grep 22702
$ kill -9 22702
$ ps -ef|grep 22702
oracle 1208812063 0 11:12pts/1 00:00:00 grep 22702
$ EXIT
EXIT

SQL> SELECT sid,username,status FROM v$session;

SIDUSERNAME STATUS
---------- ------------------------------ --------
...
154SCOTT KILLED
...

30 ROWS selected.

SQL> SELECT sid,serial#,username FROM v$session wheresid=154;

SID SERIAL#USERNAME
---------- ---------- ------------------------------
154 56090 SCOTT

再次在数据库中kill该SESSION,并指定IMMEDIATE选项:
SQL> ALTER SYSTEM kill SESSION '154,56090' IMMEDIATE;

SYSTEM altered.

SQL> SELECT sid,serial#,username FROM v$session wheresid=154;

no ROWS selected


此时该进程被迅速清除。

--------------------------------------------------------
查找锁定的SESSION
SELECT sn.username,m.SID,sn.SERIAL#, m.TYPE,
DECODE (m.lmode,
0, 'None',
1, 'Null',
2, 'Row Share',
3, 'Row Excl.',
4, 'Share',
5, 'S/Row Excl.',
6, 'Exclusive',
lmode, LTRIM (TO_CHAR (lmode, '990'))
) lmode,
DECODE (m.request,
0, 'None',
1, 'Null',
2, 'Row Share',
3, 'Row Excl.',
4, 'Share',
5, 'S/Row Excl.',
6, 'Exclusive',
request, LTRIM (TO_CHAR (m.request, '990'))
) request,
m.id1, m.id2
FROMv$session sn, v$lock m
WHERE (sn.SID = m.SID ANDm.request !=0) --存在锁请求,即被阻塞
OR ( sn.SID =m.SID --不存在锁请求,但是锁定的对象被其他会话请求锁定
AND m.request = 0
AND lmode != 4
AND (id1, id2) IN (
SELECT s.id1, s.id2
FROM v$lock s
WHERE request != 0 AND s.id1 = m.id1
AND s.id2 = m.id2)
)
ORDER BY id1, id2, m.request;
--------------------------------------------------------------
通过数据字典V$SESSION与V$LOCK来了解正在等待锁资源的用户
SELECT a.username,a.sid,a.serial#,b.id1 FROM v$session a ,v$lockb
WHERE a.lockwait = b.kaddr;
了解锁住其他用户的用户进程,方法如下:
SELECT a.username,a.sid,a.serial#,b.id1 FROM v$session a,v$lockb
WHERE b.id1 IN
(SELECT DISTINCT e.id1 FROM v$session d,v$lock e WHERE d.lockwait =e.kaddr)
AND a.sid = b.sid AND b.request =0;

在ORACLE SQL语句中,单引号和双引号的使用
在ORACLE SQL语句中,单引号和双引号的使用
/**在ORACLE中 双引号" 被当做一个普通的字符串来处理**/
SELECT '"' AS "字符串结果" FROM DUAL;
/**正常状态下,两个''包含的字符串被当做字面值**/
SELECT 'ziwen@163.com' FROM DUAL;
/**测试一下三个单引号的情况 : ORA-01756:引号内的字符串没有正确结束**/
SELECT ''' FROM DUAL;
/**测试一下四个单引号的情况 : 结果为一个 ' (单引号) **/
--说明 第二个单引号被ORACLE默认为是 转义字符
SELECT '''' FROM DUAL; www.2cto.com
/**验证一下第二个单引号是转义字符的推断,在第二个和第三个单引号之间增加一个空格**/
--提示错误:ORA-0092:未找到要求的FROM关键字 说明刚才的推论是对的
SELECT '' '' FROM DUAL;
/**在动态sql里面会经常用到单引号的,例如需要动态增加like,写一个测试的小例子**/
DECLARE
V_SQL VARCHAR2(200);
N_COUNT NUMBER(4);
V_NAME VARCHAR2(100);
BEGIN www.2cto.com
V_NAME := '名字';
V_SQL := 'SELECT COUNT(1) FROM T1 WHERE 1=1';
V_SQL := CONCAT(V_SQL,' AND T1.NAME LIKE ''%'||V_NAME||'%''');
EXECUTE IMMEDIATE V_SQL INTO N_COUNT;
DBMS_OUTPUT.PUT_LINE('N_COUNT'||'==>'||N_COUNT);
END;
/**总结:
1、在ORACLE中,双引号是被当做一个普通的字符串来处理的。
2、在一对单引号包含的语句中,必须有一对相邻的单引号表示一个单引号
3、两个相邻的单引号的作用,第一个是用来表示转义字符,后面一个表示真正的单引号
**/

ORACLE忘记管理员密码
方法一:进入后台,直接使用sqlplus /as sysdba登陆,执行SQL:alter user sys identified by newpasswd;
方法二:系统可能不支持使用本地系统用户认证的方式,执行时会报错ORA-01031: insufficient privileges。解决方法:进入$ORACLE_HOME/dbs目录,找到密码文件,名称一般为orapw+$ORACLE_SID,例如:orapwora11gutf。执行命令orapwd file=orapwora11gutfforce=Y,按照提示输入新的密码newpasswd,原来的密码文件会被覆盖掉。sqlplus /nolog;connect sys/newpasswd as sysdba,然后执行你的命令就OK 了。

doni 发表于 2013-01-22 11:11

回复 1# qmfsun


    请去除文中的广告链接
页: [1]
查看完整版本: Oracle 4