1.1.1 ORA-01652:unabletoextendtempsegmentbynumintablespacename
产生原因:ORACLE临时段表空间不足,因为ORACLE总是尽量分配连续空间,一但没有足够的可分配空间或者分配不连续就会出现上述的现象
解决方法:我们知道由于ORACLE将表空间作为逻辑结构-单元,而表空间的物理结构是数据文件,数据文件在磁盘上物理地创建,表空间的所有对象也存在于磁盘上,为了给表空间增加空间,就必须增加数据文件。先查看一下指定表空间的可用空间,使用视图SYS.DBA_FREE_SPACE,视图中每条记录代表可用空间的碎片大小:
SQL>Selectfile_id,block_id,blocks,bytesfromsys.dba_free_spacewheretablespace_name=’’;
返回的信息可初步确定可用空间的最大块,看一下它是否小于错误信息中提到的尺寸,再查看一下缺省的表空间参数:
SQL>SELECTINITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,PCT_INCREASEFROMSYS.DBA_TABLESPACESWHERE
TABLESPACE_NAME=name;
通过下面的SQL命令修改临时段表空间的缺省存储值:
SQL>ALTERTABLESPACEnameDEFAULTSTORAGE(INITIALXXXNEXTYYY);
适当增大缺省值的大小有可能解决出现的错误问题,也可以通过修改用户的临时表空间大小来解决这个问题:
SQL>ALTERUSERusernameTEMPORARYTABLESPACEnew_tablespace_name;
使用ALTERTABLESPACE命令,一但完成,所增加的空间就可使用,无需退出数据库或使表空间脱机,但要注意,一旦添加了数据文件,就不能再删除它,若要删除,就要删除表空间。
1.1.2 其他用户登录SQLPLUS提示错误
使用ORACLE用户登录SQLPLUS 正常。
但使用其他用户登录SQLPLUS提示:
ORA-01034: ORACLE not available
ORA-27121: unable to determine size of shared memory segment
AIX Error: 13: Permission denied
主要是因为oracle安装程序没有给oracle这个可执行程序设置正确的setuid。
$ cd $ORACLE_HOME/bin
$ chmod 6751 oracle
$ ls -l $ORACLE_HOME/bin/oracle
-rwsr-s--x 1 oracle oinstall 23352783 Aug 14 2001 /home/oracle/app/oracle/product/8.1.6/bin/oracle
1.1.3 Oracle不能启动问题处理 ora- 16038 19502 00312
HP rx7640 Linux系统,Oralce 10g版本为10.2.0.3.0,某日Oracle数据库不能启动,出现错误提示如下:
SQL>startup
ORACLE instance started.
Total System Global Area 1.2767E+10 bytes
Fixed Size 2067656 bytes
Variable Size 5872038712 bytes
Database Buffers 6878658560 bytes
Redo Buffers 14696448 bytes
Database mounted.
ORA-16038: log 7 sequence# 11768 cannot be archived
ORA-19502: write error on file "", blockno (blocksize=)
ORA-00312: online log 7 thread 1: '/dev/raw/raw118'
SQL>
根据错误提示可知数据库能正常Mount,但不能Open,即能打开Oracle控制文件,但打不开控制文件中描述的实例。
1、原来在关闭Oracle时,用shutdown immediate关闭时,半天没响应,情急之下直接运行PC命令关闭服务器分区及服务器电源,随后重新开机后,数据库不能自动起动,人工起动出现上述错误提示。
2、根据提示中的错误号查找错误信息如下:
oracle@osssvr:~> oerr ora 16038
16038, 00000, "log %s sequence# %s cannot be archived"
// *Cause: An attempt was made to archive the named file, but the
// file could not be archived. Examine the secondary error
// messages to determine the cause of the error.
// *Action: No action is required.
oracle@osssvr:~> oerr ora 19502
19502, 00000, "write error on file \"%s\", blockno %s (blocksize=%s)"
// *Cause: write error on output file
// *Action: check the file
oracle@osssvr:~> oerr ora 00312
00312, 00000, "online log %s thread %s: '%s'"
// *Cause: This message reports the filename for details of another message.
// *Action: Other messages will accompany this message. See the
// associated messages for the appropriate action to take.
3、从以上错误信息可知log 7中的数据文件损坏或丢失了,推测可能由于现场工程师未正确关机所致。此时,需要重建该日志组。
4、查看V$log视图:
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ------------
7 11768 YES INACTIVE
8 11769 NO CURRENT
9 11770 YES INACTIVE
5、从以上可知,log 7并非当前日志,且已经归档,可以用CLEAR命令重建该日志,然后重新打开数据库
SQL> alter database clear logfile group 1;
Database altered.
SQL> alter database open;
Database altered.
6、在root用户下用ps -ef |grep ora |grep -v grep查看,发现Oracle启动成功。
如果在执行shutdown immediate时无响应,可按CTRL+C终止,然后重新执行该命令,若出现以下异常情况,可start force强行启动然后再shutdown immediate:
SQL> startup
ORA-01081: cannot start already-running ORACLE - shut it down first
SQL> shutdown immediate
ORA-24324: service handle not initialized
ORA-24323: value not allowed
ORA-01089: immediate shutdown in progress - no operations are permitted
SQL> connect / as sysdba
Connected to an idle instance.
SQL> startup force
ORACLE instance started.
1.1.4 ORA-01650:unable to extend rollback segment NAME by NUM intablespace NAME
上述ORACLE错误为回滚段表空间不足引起的。当用户在做一个非常庞大的数据操作导致现有回滚段的不足,使可分配用的回滚段表空间已满,无法再进行分配,就会出现上述的错误。
解决方式:使用“ALTER TABLESPACE tablespace_name ADD DATAFILE filename SIZE size_of_file”命令向指定的数据增加表空间,根据具体的情况可以增加一个或多个表空间。增加前请使用下列的语句先查询一下剩余的tablespace空间有多少:
Select user_name,sql_text from V$open_cursor where user_name=’<user_name>’;
如果多余的空间比较多,就可以适当追加一个大的回滚段给表空间使用,从而避免上述的错误。你也可以用以下语句来检测一下rollback segment的竞争状况:
Select class,count from V$waitstat where calss in(‘system undo header’,’system unblock’,’undoheader’,’undo block’);和
Select sum(value) from V$sysstat where name in (‘db_block_gets’,’consistents gets’);
如果任何一个class in count/sum(value)大于1%,就应该考虑增加rollback segment。
1.1.5 ORA-01652:unable to extend temp segment by num in tablespace name
ORACLE临时段表空间不足,因为ORACLE总是尽量分配连续空间,一但没有足够的可分配空间或者分配不连续就会出现上述的现象。
解决方法:我们知道由于ORACLE将表空间作为逻辑结构-单元,而表空间的物理结构是数据文件,数据文件在磁盘上物理地创建,表空间的所有对象也存在于磁盘上,为了给表空间增加空间,就必须增加数据文件。先查看一下指定表空间的可用空间,使用视图SYS.DBA_FREE_SPACE,视图中每条记录代表可用空间的碎片大小:
SQL>Select file_id,block_id,blocks,bytes from sys.dba_free_space where tablespace_name=’<users>’;
返回的信息可初步确定可用空间的最大块,看一下它是否小于错误信息中提到的尺寸,再查看一下缺省的表空间参数:
SQL>SELECT INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,PCT_INCREASE FROM SYS.DBA_TABLESPACES WHERE
TABLESPACE_NAME=name;
通过下面的SQL命令修改临时段表空间的缺省存储值:
SQL>ALTER TABLESPACE name DEFAULT STORAGE (INITIAL XXX NEXT YYY);
适当增大缺省值的大小有可能解决出现的错误问题,也可以通过修改用户的临时表空间大小来解决这个问题:
SQL>ALTER USER username TEMPORARY TABLESPACE new_tablespace_name;
使用ALTER TABLESPACE命令,一但完成,所增加的空间就可使用,无需退出数据库或使表空间脱机,但要注意,一旦添加了数据文件,就不能再删除它,若要删除,就要删除表空间
1.1.6 Oracle无法启动的处理过程ORA-01078: failure in processing system parameters
1、先修改默认ORACLE_SID
[root@localhost root]# su - oracle
[root@localhost root]export ORACLE_SID=USDP
2、登录数据库,启动数据库
[oracle@localhost oracle]$ sqlplus /nolog
SQL> conn / as sysdba
Connected.
SQL> startup;
出现错误:ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/oracle/product/9.2/dbs/initUSDP.ora'
3、创建initUSDP.ora文件
[oracle@localhost oracle]$vi '/oracle/product/9.2/dbs/initUSDP.ora
在文件里面输入:spfile=/oracle/product/9.2/dbs/spfileUSDP.ora
注意:一定要在oracle用户创建,要不然会出现权限不足(ORA-01031: insufficient privileges)的错误。
4、创建spfile文件
[oracle@localhost oracle]$ sqlplus /nolog
SQL> conn / as sysdba
Connected.
SQL> create spfile from pfile='/oracle/admin/USDP/pfile/init.ora';
创建后,在/oracle/product/9.2/dbs/生成spfileUSDP.ora
5、启动数据库
[oracle@localhost oracle]$ sqlplus /nolog
SQL> conn / as sysdba
Connected.
SQL> startup.
1.1.7 安装RAC时报ORA-00603,ORA-29702
故障现象
在安装RAC时,出现下列错误:
ORA-00603:ORACLE server session terminated by fatal error或
ORA-29702:error occurred in Cluster Group Service operation
原因分析
RAC的节点名出现在了/etc/hosts文件中的回送地址中xxxx
解决方法
如果机器名出现在回送地址条目中,如下所示:
127.0.0.1 rac1 localhost.localdomain localhost
需要灾回送地址中删除掉机器名,如下:
127.0.0.1 localhost.localdomain localhost
1.1.8 无法连接数据库ORA-12521,ORA-12505
故障现象
连接数据库时报错:
原因分析
客户端tnsnames.ora配置的连接串中,关于instance_name的设置不正确,这个错误类似ORA-12505: TNS:listener could not resolve SID given in connect descriptor
解决方法
检查数据库的instance_name:
select instance_name from v$instance;
修改客户端tnsnames.ora文件,设置正确的instance_name或SID
1.1.9 无法连接数据库ORA-12541
故障现象
连接数据库时报错:
ERROR:
ORA-12541: TNS:no listener
原因分析
可能原因一:客户端tnsnames.ora配置的连接串中,监听端口号设置不正确
可能原因二:数据库服务器监听没有启动
解决方法
检查客户端tnsnames.ora文件,设置正确的监听端口号
检查服务器上的监听是否正常启动
1.1.10 无法连接数据库ORA-12535
故障现象
连接数据库时报错:
ERROR:
ORA-12535: TNS:operation timed out
原因分析
可能原因:客户端tnsnames.ora中,服务器IP地址设置错误
可能原因:防火墙阻断了连接
解决方法
正确配置tnsnames.ora中的服务器IP地址
利用Tnsping connectstring,测试配置是否正确,如果不通,检查网络。
1.1.11 连接RAC数据库报ORA-12545
故障现象
当两个节点的RAC实例都起来的时候,使用RAC的TAF方式的连接数据库时,报ORA-12545的错误。
ora-12545:连接因对象主机或对象不存在而失败
解决
检查客户端的hosts文件(C:\WINDOWS\system32\drivers\etc\hosts文件配置,将数据服务器各个节点的VIP都配置进去,例如:
10.10.10.30 node1-vip
10.10.10.31 node2-vip
检查客户端的tnsnames.ora和hosts(C:\WINDOWS\system32\drivers\etc)文件配置,正确配置例子如下:
rac =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1528))
(ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip)(PORT = 1528))
(LOAD_BALANCE = yes)
(FAILOVER=ON)
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME =11grac)
(FAILOVER_MODE=
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES=20)
(DELAY=15)
)
)
检查数据库各节点的local_listener设置,确保其对应的IP地址是当前节点的VIP,如果不是,请按下面的方式修改:
alter system set local_listener='(ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip) (PORT = 1521))‘ scope=spfile sid=‘<sid1>’;
alter system local_listener='(ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip) (PORT = 1521))' scope=spfile sid=‘<sid2>’;
1.1.12 怎么查看数据库是32位还是64位?
问题
怎么查看数据库当前运行的是32位还是64位的?
解决
方法一:
用sqlplus “/ as sysdba”登陆数据库,连接信息中有“64bit”出现的,表示是64位数据库,如果没有出现,则表示是32bit数据库:
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
方法二:
以oracle用户执行:
file $ORACLE_HOME/bin/oracle,输出结果会显示32bit或64bit
1.1.13 怎么查看数据库的警告日志
问题
如何查看数据库的警告日志?
解决
对于11g以前版本,数据库日志alert<SID>.log默认存放在$ORACLE_BASE/admin/<SID>/bdump目录下
对11g,数据库日志alert<SID>.log默认存放在$ORACLE_BASE/diag/rdbms/<dbname>/<InstanceName>/trace目录下
也可以用adrci命令进行查看。
可以利用show parameter background_dump_dest,得到日志文件存放的目录位置
sqlplus “/ as sysdba”
show parameter background_dump_dest
1.1.14 怎么修改数据库的归档模式
问题
如何修改数据库的归档模式?
解决
情况1:非RAC数据库
Sqlplus “/ as sysdba”
alter system set log_archive_format=‘<dbname>_%t_%s.arc’ scope=spfile;(9i)
alter system set log_archive_format=‘<dbname>_%t_%s_%r.arc’ scope-spfile;(10g,11g)
Alter system set log_archive_start=true scope=spfile;(9i)
Alter system set log_archive_dest_1=‘location=/xx/xxx/xxx’ scope=spfile;
Shutdown immediate
Startup mount
Alter database archivelog;
Alter database open;
Archive log list;
情况2:RAC数据库
在节点1 上:Sqlplus “/ as sysdba”
在节点1 上:alter system set cluster_database=false scope=true;
在节点1上:alter system set log_archive_format=‘<dbname>_%t_%s.arc’ scope=spfile;(9i)
在节点1上: alter system set log_archive_format=‘<dbname>_%t_%s_%r.arc’ scope-spfile;(10g,11g)
在节点1上: Alter system set log_archive_start=true scope=spfile;(9i)
在节点1上: Alter system set log_archive_dest_1=‘location=/xx/xxx/xxx’ scope=spfile;
在所有节点上:Shutdown immediate
在节点1上: Startup mount
在节点1上: Alter database archivelog;
在节点1上: Alter database open;
在节点1上: alter system set cluster_database=true scope=true;
在节点1上:shutdown immediate
在所有节点上:startup
在所有节点上: archive log list
1.1.15 连接数据库报ORA-01031
故障现象
在windows平台下,用sqlplus连接数据库时报错:
01031, "insufficient privileges"
解决方法
找到oracle安装目录下的../network/admin/sqlnet.ora文件
将下面的设置注释掉:
#SQLNET.AUTHENTICATION_SERVICES=(NTS)
1.1.16 ORA-00838和ORA-00844
故障现象
修改memory_target参数时,报错:
ORA-00838: Specified value of MEMORY_TARGET is too small, needs to be at least
1280M
或者启动实例时,报错:
ORA-00844: Parameter not taking MEMORY_TARGET into account, see alert log for more information
原因分析
在Oracle11g中,引入了AMM功能,并且新加了memory_target参数,此参数要么或者等于0,或者要大于sga_target + pga_aggregate_target的值,否则就会出错
解决方法
设置合适的memory_target值
1.1.17 ORA-01555 caused by SQL statement below(Query Duration=14616 sec,SCN:0x0000.1e5294a0):
故障现象
用户进程执行一个sql失败,后台警告日志有报错:
ORA-01555 caused by SQL statement below(Query Duration=14616 sec,SCN:0x0000.1e5294a0):
原因分析
ORA-01555错误是生产库中常见的一个snapshot too old错误,oracle需要用到undo信息来保证SQL查询的一致性读,当一个SQL运行时间较长时,它用到的undo信息有可能由于其它DML事务的空间需求而被覆盖掉了,此时该SQL查询就会造成 ORA-01555的错误。
解决方法
方法一:最根本的解决办法,是优化SQL,减少SQL的逻辑和物理读
方法二:如果undo空间确实很小,可以考虑增大UNDO空间
方法三:增加undo_rentention值
方法四:如果是9i以上数据库,推荐使用Automatic undo management
1.1.18 ORA-04031unable to allocate 4096 bytes of shared memory
故障现象
数据库日志出现以下错误:
ORA-04031: unable to allocate 4096 bytes of shared memory
原因分析
当Oracle尝试在共享内存池分配大的连续内存失败时,就会报ORA-04031的错误,最常见的原因是shared pool的碎片过多
解决方法
碎片过多的原因多数是因为sql语句没有使用绑定变量,硬解析过多,因此调整SQL使用绑定变量是一个重要的方面
将经常使用的大SQL和PL/SQL常驻内存:
Dbms_shared_pool.keep(‘object_name’);
推荐使用ORACLE的ASMM功能
增加shared_pool_size和shared_pool_reserved_size大小
增加large_pool_size大小
1.1.19 ORA-19815 WARNING: db_recovery_file_dest_size of 2147483648 bytes is 100.00% used, and has 0 remaining bytes available.
故障现象
10g或11g数据库的警告日志出现错误:
ORA-19815: WARNING: db_recovery_file_dest_size of 2147483648 bytes is 100.00% used, and has 0 remaining bytes available.
原因分析
闪回恢复区定义大小是2147483648,已经被占满了,因此数据库报错,如果归档日志也放在这里的话,数据库就会hang住了。
解决方法
如果数据库hang住了,这时可以先临时增大闪回恢复区的大小,方法是:
alter system set db_recovery_file_dest_size=xxx ;
接下来需要释放recovery file area空间,有以下方法:
方法一:删除无用的归档日志
$rman target /
RMAN>Crosscheck archivelog all;
RMAN>delete expired archivelog all;
方法二:修改你的备份保留策略
如果你的备份放在闪回恢复区,修改备份保留策略,减少保留空间
方法三:调整你的归档保留策略
如果你使用了第三方备份软件备份到其它介质上,可以调整备份归档的策略,调整为备份完删除归档
如果你配置了dataguard,可以调整归档删除策略,调整为:
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON STANDBY;