Oracle随笔
一上午oracle报了各种的错- -
mark下 windows下每个进程最大占用2G内存 sga和pga如果未手动指定大小 会自行分配这两G
为了sga有更大的空间执行语句 所以要对pga进行手动的调整
查一下pga的大小:
SQL> show parameter pga_aggregate_target
NAME TYPE VALUE
------------------------------- ----------- --------
pga_aggregate_target big integer 91M
通过查询V$PGA_TARGET_ADVICE视图 取pga在被占用100%时的大小 将pga修改为这个大小
修改pga语句:alter system set pga_aggregate_target=64m scope=spfile;
不过将pga调小后 发现问题依然存在 只要tomcat一起动开oracle就报ora-04030的错误
上网查阅 说可以将sga继续放大 把sga放到3.4G pga放到1.2G
这时候致命的问题就来了 因为我误判这个服务器为64位的系统(因为我的电脑右键可以识别10G的内存) 所以我就按照网上说的 修改了。
重启以后发现oracle起不来了。。现象是服务可以启动 但是连接不上 提示实例未启动 我判断原因是因为32位的系统不支持独立进程占用太大内存(但连接不上实例也就没法改回sga)
然后经过高人指点 通过cmd连接到了plsql 虽然连接不上实例 但是可以在这里修改存放sga、pga配置的文件,虽然我知道这个配置文件在哪 但是这个文件经过转码 不支持直接打开修改,通过这个sql语句修改为可以用记事本打开的文件:
Create pfile='D:\oracle\product\10.2.0\db_1\dbs\SPFILEORCL.ORA' From spfile='D:\oracle\product\10.2.0\db_1\dbs\SPFILEORCL_pfile.ORA'
pfile的路径就是可以修改的文件,spfile的是oracle本身的
然后修改pfile中sga和pga的大小 通过这个新建的spfile启动oracle实例:
startup pfile='D:\oracle\product\10.2.0\db_1\dbs\SPFILEORCL_pfile.ORA'
再将spfile恢复到原pfile
最后再启动实例就可以了
最后解决04030的方案:查询tomcat启动后oracle的线程数,发现一旦超过某个固定的值 就会报这个错误(但并没有超出oracle本身的process)
我们用了1、优化代码 减少数据库查询次数,优化索引 2、限制同时在线人数 保证连接数个数
这样这个问题才告一段落
ps。
网上也有人说这个错误是oracle的bug 有一个补丁可以解决这个问题 但是由于系统已经上了生产 不敢直接拿来用
查process的语句:
select count(*) from v$session;
select count(*) from v$process;
Select count(*) from v$session where status='ACTIVE'