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
解决方法:
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 '密码'; ----不用换新密码