oracle常见问题汇总

问题一

启动数据库报错
SQL> startup
ORA-27102:out of memory Linux-x86_64 Error: 12: Cannot allocate memory的处理

原因:服务器没有多余内存供oracle使用
排查:
因为是生产环境,服务器配置肯定没问题,首先排查了服务器内存使用情况:
free -mh,发现free剩余100M,
top后发现服务器内存使用率已达100%,
查看oracle的进程:ps -ef | grep oracle
手动杀掉进程:kill pid
再次查看内存使用率依旧100%,内存未释放,最后只能重启数据库服务器后查看,内存使用率已正常,启动数据库正常!

总结:主要原因是文件缓存高导致内存占用率过高,定时备份、拷贝任务等操作未正常执行释放都会导致此问题

问题二

启动数据库报错
SQL> startup
ORA-00845:MEMORY_TARGET not supported on this system

原因:/dev/shm的空间小于memory_target的值
解决:
1.查看MEMORY_TARGET配置的大小:默认路径:/u01/app/oracle/admin/实例名/init.ora.523413415452(查看此文件)
或 show parameter memory
2.查看tmpfs配置大小:df -h | grep /dev/shm	#/dev/shm 的大小默认为系统内存的一半
3.调整tmpfs配置大小:mount -o remount,size=32G /dev/shm
4.启动数据库:startup

注意:以上都是临时的,一旦重启linux就还原了,因此永久性的修改原配置如下:
[root@admin ~]# vi /etc/fstab
tmpfs /dev/shm tmpfs defaults,size=20G 0 0

在这里插入图片描述

问题三

数据库用户被锁,提示:the account is locked!

原因:数据库用户连续输入10次错误密码会导致该用户被锁
排查:
select username,account_status from dba_users; #查看数据库用户状态
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; #设置具体时间格式
select username,lock_date from dba_users where username='TEST'; #查看具体的被锁时间
select name, lcount from sys.user$ where name='TEST'; #查看已错误输入次数

查看是那个ip造成的test用户被锁:
查看$ORACLE_HOME/network/admin/log/listener.log日志
例:
10-MAR-2009 08:51:03 * (CONNECT_DATA=(SID=lhoms)(SERVER=DEDICATED)(CID=(PROGRAM=oracle)(HOST=omstestdb)(USER=oraoms))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.69.1.11)(PORT=49434)) * establish * lhoms * 0
10-MAR-2009 08:51:03 * (CONNECT_DATA=(SID=lhoms)(SERVER=DEDICATED)(CID=(PROGRAM=oracle)(HOST=omstestdb)(USER=oraoms))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.69.1.11)(PORT=49435)) * establish * lhoms * 0
综上可知:10.69.1.11的ip尝试多次失败登陆造成的被锁

解决:
使用system用户登录进行解锁:	
	alter user 用户名 account unlock; #解锁用户
	alter profile default limit FAILED_LOGIN_ATTEMPTS unlimited;(不推荐) #修改为无限次(为安全起见,不建议使用)
   

问题四

ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device Add

原因:
1、sga+pga分配太大导致内存不足
建议将sga_max_size、sga_target设置为物理内存的65%左右,pga_aggregate_target设置为物理内存的10%;参数设置完成后再启动数据库。

2、内存资源足够但是操作系统参数做了限制
修改/etc/sysctl.conf文件中参数kernel.shmmax和kernel.shmall

shmmax 可以设置为约服务器物理内存的90%,例如16G的物理内存,shmmax的值可设置为16*1024*1024*1024*90% = 15461882265   (取整数)

shmall 可以设置为shmmax除以操作系统页的大小,操作系统页的大小的大小可通过在root用户下执行getconf PAGESIZE获的
[root@db ~]# getconf PAGESIZE
4096
例如16G的物理内存,操作系统页的大小为4096,则shmall的值可以设置为        
15461882265/4096=3774873

sysctl -p	#修改完系统参数后重新加载使生效
startup		#重启数据库

**备注**

Oracle的kernel.shmmax和kernel.shmall设置

kernel.shmmax :是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值。设置应该足够大,能在一个共享内存段下容纳下整个的 SGA , 设置的过低可能会导致需要创建多个共享内存段,这样可能导致系统性能的下降。至于导致系统下降的主要原因为在实例启动以及 ServerProcess 创建的时候,多个小的共享内存段可能会导致当时轻微的系统性能的降低 ( 在启动的时候需要去创建多个虚拟地址段,在进程创建的时候要让进程对多个段进行“识别”,会有一些影响 ) ,但是其他时候都不会有影响。

官方建议值:

32 位 linux 系统:可取最大值为 4GB ( 4294967296bytes ) -1byte ,即 4294967295 。建议值为多于内存的一半,所以如果是 32 为系统,一般可取值为 429496729532 位系统对 SGA 大小有限制,所以 SGA 肯定可以包含在单个共享内存段中。

64 位 linux 系统:可取的最大值为物理内存值 -1byte ,建议值为多于物理内存的一半,一般取值大于 SGA_MAX_SIZE 即可,可以取物理内存 -1byte 。  

内存为 12G 时,该值为 12*1024*1024*1024-1 = 12884901887

内存为 16G 时,该值为 16*1024*1024*1024-1 = 17179869183

内存为 32G 时,该值为 32*1024*1024*1024-1 = 34359738367

内存为 64G 时,该值为 64*1024*1024*1024-1 = 68719476735

内存为 128G 时,该值为 128*1024*1024*1024-1 = 137438953471

kernel.shmall :该参数控制可以使用的共享内存的总页数。 Linux 共享内存页大小为 4KB, 共享内存段的大小都是共享内存页大小的整数倍。

一个共享内存段的最大大小是 16G ,那么需要共享内存页数是 16GB/4KB==4194304 (页),

当内存为 12G 时, kernel.shmall = 3145728

当内存为 16G 时, kernel.shmall = 4194304

当内次为 32G 时, kernel.shmall = 8388608

当内存为 64G 时, kernel.shmall = 16777216

当内存为 128G 时, kernel.shmall = 33554432
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值