C/C++教程

oracle数据库常见问题处理总结2

本文主要是介绍oracle数据库常见问题处理总结2,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1、 table_exists_action参数说明
使用imp进行数据导入时,若表已经存在,要先drop掉表,再进行导入。
而使用impdp完成数据库导入时,若表已经存在,有四种的处理方式:

1)  skip:默认操作
2)  replace:先drop表,然后创建表,最后插入数据
3)  append:在原来数据的基础上增加数据
4)  truncate:先truncate,然后再插入数据

2、oracle存储命名与schemas相同时报如下错误:

ORA-31626: 作业不存在
ORA-31637: 无法创建作业 SYS_EXPORT_SCHEMA_01 (用户 ZHANGRUN)
ORA-06512: 在 "SYS.DBMS_SYS_ERROR",line 95
ORA-06512: 在 "SYS.KUPV$FT", line 1193
ORA-39062: 创建主进程 DM00 时出错
ORA-39107: 主进程 DM00 违反了启动协议。主进程错误:
ORA-31631: privileges are required
ORA-06533: 下标超出数量

解决办法:重新创建新SID再还原并且部门制定规范oracle的存储命名与schemas的名称避免相同

3、强制关闭oracle数据库

$ sqlplus / as sysdba
SQL> shutdown abort

4、修改Oracle的memory_max_target和memory_target
系统内存16G Mem,想修改为3/4Mem: 16*3/4=12G=12288M

# vi /etc/sysctl.conf
kernel.shmmax = 12884901888
# sysctl -p
再修改ORACLE 参数
$ sqlplus / as sysdba
sql> show parameter target;
sql> alter system set memory_max_target=12288M scope=spfile;
sql> alter system set memory_target=12288M scope=spfile;

MEMORY_MAX_TARGET的设置不能超过/dev/shm的大小,在oracle11g中新增的内存自动管理的参数MEMORY_TARGET,它能自动调整SGA和PGA,这个特性需要用到/dev/shm共享文件系统,而且要求/dev/shm必须大于MEMORY_TARGET,如果/dev/shm比MEMORY_TARGET小就会报错。

# mount -o remount,size=13G /dev/shm
持久化修改
# vi /etc/fstab
tmpfs /dev/shm tmpfs  defaults,size=13G      0 0
sql> shutdown immediate
sql> startup;

5、ORA-39083: Object type TABLE:"TEST"."TEST_SS_NAME" failed to create with error:
ORA-00439: feature not enabled: Deferred Segment Creation
ORA-01658: unable to create INITIAL extent for segment in tablespace SRMENT_DATA
错误解析与解决方法
1)、错误:(1)当表为空时,不分配segment,以便节省空间,导致表在新库中是无法创建的。
(2)磁盘空间不足无法创建数据
2、解决方法:
(1)查看源库中deferred_segment_creation的状态:查看源库、目标库的deferred_segment_creation状态:

SQL> show parameter deferred_segment_creation;

(2)设置deferred_segment_creation状态为false,以便以后可以顺利导出导入空表:

sql> alter system set deferred_segment_creation=false scope=both;
sql> alter system set deferred_segment_creation=true scope=both;

(3)查看当前用户下所有的空表:

sql>select table_name from user_tables where NUM_ROWS = 0;  

(4)对空表进行数据添加删除的操作;
(5)重新导出、导入数据;

6、EXPDP ORA-31634 ---导出的错误
ORA-31634: job already exists(JOB已经存在)
ORA-31664: unable to construct unique job name when defaulted(采用默认方式,不能创建唯一JOB名)
解决方法:
第一步:查询生成清理DBA_DATAPUMP_JOBS的SQL语句

 SELECT 'DROP TABLE' || OWNER_NAME ||'.'|| JOB_NAME ||';' FROM DBA_DATAPUMP_JOBS WHERE   STATE='NOT RUNNING';
复制生成的处理SQL语句,进行对表DBA_DATAPUMP_JOBS进行清理,例句如下:
drop table CONOW.SYS_EXPORT_SCHEMA_06;
drop table CONOW.SYS_EXPORT_SCHEMA_40;
drop table CONOW.SYS_EXPORT_SCHEMA_07;
drop table CONOW.SYS_EXPORT_SCHEMA_82;

第二步:清理后再次查询确认DBA_DATAPUMP_JOBS是否清理完毕

 SELECT OWNER_NAME, JOB_NAME, OPERATION, JOB_MODE,STATE, ATTACHED_SESSIONS FROM DBA_DATAPUMP_JOBS ORDER BY 1,2;

第三步:如果清理失败,则执行如下语句进行处理

 EXEC DBMS_DATAPUMP.STOP_JOB(DBMS_DATAPUMP_ATTACH(‘SYS_EXPORT_SCHEMA_02’,’OAK’));

7、关闭数据库或启动时报错

SQL> shutdown immediate
ORA-24324: service handle not initialized
ORA-01041: internal error. hostdef extension doesn't exist

处理方法:
在root下

vi  /etc/host
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1              localhost.localdomain localhost
::1            localhost6.localdomain6 localhost6

然后再操作关闭或启动

SQL> shutdown abort

8、报错误内容:
ORA-31684: Object type USER:"slwebtest" already exists
解决方法:
在导入语法中加入 exclude=user 忽略用户对象已经存在的错误

9、报错如下:ORA-31693: Table data object "SRMQYSJ"."B_IP_BUSINESSNOTICE" failed to load/unload and is being skipped due to error:
ORA-02354: error in exporting/importing data
ORA-01691: unable to extend lob segment SRMQYSJ.SYS_LOB0000077106C00006$$ by 8192 in tablespace SRMQYSJ_DATA
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
ORA-39083: Object type INDEX failed to create with error:
ORA-01652: unable to extend temp segment by 128 in tablespace SRMQYSJ_DATA
解决方法:
在导入语法中加入transform=segment_attributes:n

10、误删控制文件处理

$ cp /u01/oracle/fast_recovery_area/orcl/control02.ctl /u01/oracle/oradata/orcl/control01.ctl
SQL> shutdown immediate
SQL> startup

11、修改oracle的控制文件
方法一:

$ sqlplus / as sysdba
SQL> show parameter control
SQL> alter system set control_files='/backup/sink/control01.ctl','/backup/sink/control02.ctl' scope=spfile;
SQL> shutdown immediate
$ mv /u01/oracle/fast_recovery_area/sink/control02.ctl /backup/sink/control02.ctl
]$ mv /u01/oracle/oradata/sink/control01.ctl /backup/sink/control01.ctl
$ sqlplus / as sysdba
SQL>startup
SQL>show parameter control;

scope效果
memory 立即生效,直到数据库关闭,若数据库使用pfile启动,这是唯一可选值,也是通常所指的默认值
spfile会修改spfile参数,新设置只有在重新使用spfile(重启数据库的时候生效)
此外,若是修改静态参数(不能直接生效的参数),必须指定scope=spfile,如果指定memory或者both会报如下错误:
ORA-02095: specified initialization parameter cannot be modified
因为静态参数不能直接通过修改内存而生效,只能通过修改spfile,然后重启数据库生

both是以上两者的结合体,both—两者的意思,表示修改发生在内存上立即生效,并且修改spfile保证数据库重启后也生效

scope指定system修改的生效时间,scope=memory|spfile|both,其值取决于数据库使用pfile还是spfile启动
若数据库使用pfile启动,则scope=memory是默认值,也是唯一值
若数据库使用spfile启动, 则scope=both是默认值
静态参数,不能通过修改内存(默认scope值,scope=memory,both)来生效,要通过修改spfile重启数据库来生效
方法二:
查看数据库的实际状态

SQL>select status from v$instance;

查看controlfile的实际位置,明确目标路径的位置

SQL>show parameter control;

查看数据库以什么参数启动(是pfile,还是spfile)

SQL>show parameter spfile;

有spifle参数信息 表示数据库默认是以spfile参数文件启动的
无spfile参数信息 表示数据库默认是以pfile参数文件启动的
spifle是二进制文件不能直接文本编辑,所以以spfile创建pfile

SQL> create pfile from spfile;

若之前存在pfile ------- 然后又create pfile from spife 会覆盖之前的pfile文件。从pfile被修改的时间可以看出
若之前存在spife ------ 然后又create spfile from pfile 会覆盖之前的spfile文件,从spifle修改的时间可以看出
补充说明oracle启动阶段找参数文件的 顺序 和 方式
如果在startup里指定了pfile=''的话,Oracle将从你指定的文件作为启动参数文件,如果是没有指定pfile的话,Oracle会先去默认目录($ORACLE_HOME/)下找spfileSID.ora,如果没有找到,则找spfile.ora,如果还是没有,找initSID.ora,这个就是以前的静态参数文件了,如果没有则找init.ora;如果没有找到的话,这时候,启动就会有,找不到参数文件的错误,同时会动态注册实例名到监听服务里。

SQL> shutdown immediate
$ mv /u01/oracle/oradata/sink/control01.ctl /backup/sink/control01.ctl
$ mv /u01/oracle/fast_recovery_area/sink/control02.ctl /backup/sink/control02.ctl

到$ORACLE_HOME/dbs路径下vim编辑控制文件路径 然后 :wq 保存退出(w 保存 q 退出 q! 强制退出)

cd /u01/oracle/product/11.2.0/dbhome_1/dbs
$ vim initsink.ora
*.audit_file_dest='/u01/oracle/admin/sink/adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='/backup/sink/control01.ctl','/backup/sink/control02.ctl'
*.db_block_size=8192
*.db_create_file_dest='+DATA'

刚我们修改了pfile但是spfile还没有改动,所以先指定使用pfile启动数据库

SQL>startup pfile=$ORACLE_HOME/dbs/initsink.ora

查看此时的controlifle的路径信息

SQL>select name from v$controlfile;

用pfile生成spifle,因为pfile成功了,但是spifle还没有被修改,还没有生效,默认以spfile启动,所以此操作合理

SQL>create spfile from pfile;

PS : 如果数据库以spfile启动,然后你在执行 create spfile from pfile 则会报错
ORA-32002: cannot create SPFILE already being used by the instance
数据库正常关闭,然后,startup

SQL> shutdown immediate
SQL>startup

启动后,查询控制文件路径,发现成功转移,故修改控制文件路径成功

SQL> select name from v$controlfile;

12、连接报ORA-00020: maximum number of processes (500) exceeded

添加参数-prelim登录
SQL> sqlplus -prelim / as sysdba
$ps -ef|grep "oracleXXXX (LOCAL=NO)" #XXXX为数据库实例
[root@oracle 11g ~]$ps -ef|grep "oracleXXXX (LOCAL=NO)"|grep -v grep|awk '{print $2}'|xargs kill -9
SQL> show parameter processes;
SQL> alter system set processes=1000 scope=spfile;
SQL> alter system set sessions=1055 scope=spfile;

13、查看当前正在执行的sql语句

select a.program, b.spid, c.sql_text,c.SQL_ID
from v$session a, v$process b, v$sqlarea c
where a.paddr = b.addr
and a.sql_hash_value = c.hash_value
and a.username is not null;

14、Ora-39126:Worker unexpected fatal error in KUPW$WORKER.PUT_DDLS
解决方法:添加去除统计参数
EXCLUDE=STATISTICS

15、ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
有锁表,要杀掉
查看锁表:

select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_time;

解锁:

alter system kill session '1152, 848';

16、expdp:ORA-31634: job already exists
解决方法:

  1. 在备份时指定一个在dba_datapump_jobs中没有不存在的一个job_name
  2. 清理dba_datapump_jobs表
    1)查询可以清理的master table并生成SQL
 select 'drop table ' || owner_name || '.' || job_name || ';'
 from dba_datapump_jobs
 where state = 'NOT RUNNING'

2)清理后再次dba_datapump_jobs确认清理成功

SELECT owner_name, job_name, operation, job_mode,
state, attached_sessions
FROM dba_datapump_jobs
ORDER BY 1,2;

若不成功,按下面的方法再次清理

sqlplus oak/oak
exec dbms_datapump.stop_job(dbms_datapump_attach(‘SYS_EXPORT_TABLE_01’,’OAK’));

3)如果还不行,就用下面的方法:

select 'drop table system.sys_export_schema_'||lpad(level,2,'0')||';' from dual connect by level<=99;

该语句会生成一些sql语句,直接粘贴这些新生成的语句就可以了

17、oracle startup启动数据库报cannot mount database in EXCLUSIVE mode
解决方法:
1)、停止数据库

SQL> shutdown immediate

2)、删除lk<sid>文件

[oracle@localhost ~]$ cd $ORACLE_HOME/dbs
[oracle@localhost dbs]$ ls lk
lkDATAPOWE  lkEII       lkHARMONYC  lkSRMDGT    lkSRMENT    lkSRMJC     lkSRMSTD    lkSRMWL     lkSRMZXHJ   
[oracle@localhost dbs]$ rm lk*

3)、清理oracle的信号量

[root@localhost ~]# ipcs -s
------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
0x506ce918 753674     oracle     660        154
[root@localhost ~]# ipcrm -s 753674
[root@localhost ~]# ipcs -s

4)、查看并关闭oracle的PID进程,最后启动数据库

[root@localhost ~]# ps -ef|grep ora_
将ora_dbw0_SID进程杀掉
oracle    3038     1  0 16:02 ?        00:00:00 ora_dbw0_SID
[root@localhost ~]# kill -9 3038
[oracle@localhost ~]# dbstart

18、sqlplus "/ as sysdba"报错ORA-01031: insufficient privileges
排查步骤:
(1)、oracle的安装目前可能权限被更改为非oracle用户的dba组与oinstall组
(2)、查看cat /etc/group组文件信息,查看oracle的信息

usermod -g oinstall -G dba oracle

19、Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
解决办法:
(1)由于实例没有注册到监听服务中去,于是注册实例

SQL> alter system register;

(2)查看监听配置是否有问题
(3)查看日志 $ tail -30 /u01/app/diag/tnslsnr/localhost/listener/alert/log.xml
(4)查看hosts文件

# more /etc/hosts

(5)重启监听程序

$ lsnrctl
LSNRCTL> stop
LSNRCTL> start
LSNRCTL> status

20、expdp时报错:
ORA-39001: invalid argument value
ORA-01775: looping chain of synonyms
解决办法:
删除SYS_EXPORTSCHEMA* 相关的同义词
(1)查询相关同义词:

select owner, object_name, object_type, status from dba_objects where object_name like '%SYS_EXPORT_SCHEMA_%' and OBJECT_TYPE='SYNONYM';

(2)删除查询到的同义词

drop public synonym SYS_EXPORT_SCHEMA_03;

21、ORA-01658: 无法为表空间space中的段创建 INITIAL 区;
或者:ORA-01658: unable to create INITIAL extent for segment in tablespace string。
或者:ORA-01659:无法分配超出 4 的 MINEXTENTS (在表空间XXX中) 。
解决方法:也就是说表空间大小不够,增加表空间即可

22、导入报错ORA-39083: Object type USER failed to create with error:
ORA-31625: Schema SYSTEM is needed to import this object, but is unaccessible
ORA-01031: insufficient privileges
解决方法:

grant IMP_FULL_DATABASE to USERNAME;

23、ORA-23515: materialized views and/or their indices exist in the tablespace
解决办法:
-- 首先删掉该表空间下的的物化视图

select 'drop materialized view '||owner||'.'||segment_name||' ;' from dba_segments where segment_name in (select mview_name from dba_mviews) and tablespace_name = 'SRMJSC_DATA';

依次执行输出结果:

 'DROPMATERIALIZEDVIEW'||OWNER||'.'||SEGMENT_NAME||';'
--------------------------------------------------------------------------------
drop materialized view SRMJSC.V_UNDELIVERYPURCHASEORDER ;
drop materialized view SRMJSC.V_PURCHASEORDERREPORT ;
drop materialized view SRMJSC.V_PURCHASEORDERAMOUNT ;
  • 然后删除该表空间下的其他表空间下物化视图在本表空间下创建的索引
select * from dba_segments where tablespace_name = 'SRMJSC_DATA' and segment_name in (select index_name from dba_indexes where table_name in (select mview_name from dba_mviews));

24、设置ORACLE的会话连接超时
(1)IDLE_TIME是对于空闲时间超过了它的配置时间就会去强制终止会话,如果该会话中存在事务,但是inactive时间超过了IDLE_TIME配置时间,数据库依然会强制终止会话,并且回滚事务。
查询方法:

SELECT dp.profile,RESOURCE_NAME, LIMIT
  FROM DBA_PROFILES DP, DBA_USERS DU
 WHERE DU.PROFILE = DP.PROFILE
   AND DU.USERNAME = USER
   AND DP.RESOURCE_NAME = 'IDLE_TIME';

修改方法:单位为分钟
--查询resource_limit的配置值:

select name,value from gv$parameter where name='resource_limit';
 --启用resource_limit 
alter system set resource_limit=true;
ALTER PROFILE DEFAULT LIMIT IDLE_TIME 10;
ALTERPROFILEDEFAULTLIMIT IDLE_TIME UNLIMITED;

操作步骤:

--创建profile,其idle_time为3分钟  
SQL> create profile app_user limit idle_time 3;

--修改profile,限制每个用户只能开一个session  
SQL> alter profile app_user limit sessions_per_user 1;

--将用户指派给特定的profile  
SQL> alter user scott profile app_user; 

如果在idle的时间内用户没有执行任何操作,会提示ORA-02396:exceeded maximum idle time, please connect again、
说明:
A:参数RESOURCE_LIMIT=TRUE用于启用数据库资源限制;
B:PROFILE用于实现资源的配置,创建或者修改已存在的PROFILE来调整各个具体资源的配置
D:被限制资源的状态变为sniped
E:被限制资源的session对应的server process并没有释放,需要结合sqlnet.expire_time来释放。
通过idle_time限制session idle 时间。session idle超过设置时间,状态为sniped (v$session).,然而OS下的process并不会释放,当session(user process) 再次与server process 通讯,将关闭相应的server process.数据库连接的客户端异常断开后,其占有的资源并没有被释放,从v$session数视图中依旧可以看到对应的session处于inactive状态,且对应的服务器进程也没有释放,导致资源长时间被占有。SQLNET.EXPIRE_TIME专门用于清理那些异常断开的情况:通过设定参数为非0值(单位为分钟)来发送探测包以检查客户端异常断开。一旦探测包找到了异常连接将返回错误,清楚对应的server process。

配置SQLNET.EXPIRE_TIME:对于SQLNET.EXPIRE_TIME的配置,需要修改sqlnet.ora,其路径为$ORACLE_HOME/network/admin下面。然后添加SQLNET.EXPIRE_TIME(缺省值为0,最小值0,建议值10)选项,之后重启监听。

#对于SQLNET.EXPIRE_TIME的配置,需要修改sqlnet.ora,然后添加SQLNET.EXPIRE_TIME项  
[oracle@orasrv admin]$ more sqlnet.ora  
sqlnet.expire_time = 10     #仅仅需要配置此项,后面的各项仅仅是为了生成跟踪日志,可省略  
TRACE_LEVEL_SERVER = 16   
TRACE_FILE_SERVER = SERVER  
TRACE_DIRECTORY_SERVER= /u01/app/oracle/network/trace   
TRACE_TIMESTAMP_ SERVER = ON   
TRACE_UNIQUE_SERVER = ON  
DIAG_ADR_ENABLED=OFF 

查看SQLNET.EXPIRE_TIME是否启用

[oracle@orasrv trace]$ cat -n server_29522.trc |grep dead  
[oracle@orasrv trace]$ cat -n server_29522.trc |grep timer

(2)profile的connect_time限制
默认是UNLIMITED,单位是分钟,用户在到达设置的时候后,不可以在继续操作,会提示ORA-02399: exceeded maximum connect time, you are being logged off
(3)sqlnet的expire_time限制:
expire_time主要是在指定的时间去探测客户端是否可以连通,如果可以的话重新计时,否则就会断开,通过设定参数为非零值(分钟)来发送探测包以检查客户端的异常断开。一旦探测包找到了异常的连接将返回错误,清除对应的server process
在执行rman的时候遇见:ORA-03135: connection lost contact,可以尝试将此值设置大些。(ID 729811.1)
(4)、sqlnet的inbound_connect_timieout_listener_name限制单位是秒,默认值是60

25、修改PROCESS的值

SQL> alter system set processes=400 scope = spfile; 
SQL> create pfile from spfile; 
SQL> shutdown immediate; 
SQL> startup
--当前的连接数
select count(*) from v$process;
--数据库允许的最大连接数  
select value from v$parameter where name = 'processes';

-–查询用户密码策略
select * from dba_profiles where profile='DEFAULT'
and resource_type='PASSWORD';

oracle数据库密码默认有效期
-- 查询用户的profile是否为默认
SELECT username,PROFILE FROM dba_users where username in ('MOBILE_SERVICE_CONTENT','MOBILE_SERVICE');

-- oracle 有效期  单位 :天
SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME';

-- 将密码有效期由默认的180天修改成“无限制“
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

--已经被提示的帐户必须再改一次密码
alter user 用户名 identified by '密码'; ----不用换新密码
这篇关于oracle数据库常见问题处理总结2的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!