需求描述
在AgilePLM的维护过程中随着用户数和应用数的增加会遇到一些数据库的问题,建议大家提前调整好数据库的参数,可以有效预防问题发生。避免对生产环境造成不必要的损失。
主要问题
- AgilePLM Oracle默认的链接数为150,需要根据并发用户数和应用数动态调整。
- AgilePLM Oracle的内存设置需要根据并发用户数以及物理内存动态调整。
解决思路
Oracle最大连接数
最大连接数的建议值和如下参数息息相关。
并发用户数
首先并发用户数最多,连接数就要调的越大。那什么是并发用户数?
并发用户数指的是同时登录系统的用户数。举个例子:一个企业的内部管理系统,总共的注册用户数是1000,这个叫潜在用户数。
这1000的注册用户可能只有500个用户会每天登录系统使用系统。那这个才是并发用户数。不使用系统的用户是不会占用数据库连接数的。
最大连接数应该要大于并发用户数。在上面的案例中,最大连接数最好要>=500。
应用数
应用数是指连在同一个Oracle数据库上的系统数量。在AgilePLM的实施过程中,往往会开发额外的系统来提供额外的功能。每个系统都会有自己的数据库连接池。例如:
- Agile应用(包含文件服务器)
- 数据同步系统(CRM,ERP,MES等)
- Web操作系统(给Agile提供外挂菜单或者执行定时任务的系统)
- 事件程序系统(有的事件程序会额外创建数据库链接)
需要链接数据库的应用数越多,最大连接数就要设置的越大。因为每个应用都要占用数据库连接数。在使用Web程序界面做业务时,可能后台要连中间库,Agile数据库,还会触发事件程序。相对直接使用Agile标准功能,会额外占用数据连接数。
例如:在并发用户数不变的情况下,如果之前连接数为150可以满足日常使用,那应用数如果像上面的例子中,有4个,那建议将最大连接数调整到600以上。
注意:更大的连接数需要更大的内存设置作为支撑,连接数如果调整的过大内存支撑不了,数据库会报错,还需要相应的调整内存设置。
内存设置
内存设置指的是Oracle的SGA,PGA,共享池等相关设置。可以单独调整每一个参数,也可以通过一些目标参数来自动调整这些明细参数。
每个明细参数之间也是有关系,如果调整的不合理也会出现新的问题,所以这里建议对数据库调优不是特别熟悉的人调整目标参数。那目标参数有哪些?
Oracle 9i引入pga_aggregate_target,可以自动对PGA相关参数进行调整;
Oracle 10g引入sga_target,可以自动对SGA相关参数进行调整;
Oracle 11g则对这两部分进行综合,引入memory_target,可以自动调整所有的内存相关参数,也就是说只要调整这个参数Oracle就会自动帮我们调整好所有内存相关参数。那么memory_target调整到多大合适?
memory_target
一般来说,将memory_target设置为物理内存的50%到80%是比较安全的。具体的设置应根据系统负载、被调整服务器其他应用程序的需求和内存使用情况进行调整。确保在设置后监控数据库性能,以便根据实际情况进行进一步的优化。
例如:
假设您的服务器有64GB的物理内存,您可以考虑以下设置:
- 保守设置:
MEMORY_TARGET = 32G
(50%) - 中等负载:
MEMORY_TARGET = 40G
(62.5%) - 高负载:
MEMORY_TARGET = 48G
(75%)
操作步骤
上面讲了很多的知识,这里给出实际的操作步骤。
注意事项
- 一旦用如下方式调整了数据库的参数,在windows操作系统中,如果使用系统服务的方式重启了数据库(或者断电自启)。参数是会重置的。这个时候需要用命令行的方式再重启一下,参数就会自动还原到服务重启前。知道怎么永久调整系统参数的小伙伴,也可以留言告知我。
- Agile数据库重启之后,还需要重启Agile应用以及所有关联应用。(文件服务器和Autovue可以不重启)
首先确保数据库使用spfile方式启动
--以下所有命令最好都在一个sqlplus命令行中执行。
-- 查看数据库是否亿spfile启动,如果values对应有值,表示是spfile启动的。否则就不是
show parameter spfile;
create spfile from pfile;
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 3.4360E+10 bytes
Fixed Size 4639064 bytes
Variable Size 3892315816 bytes
Database Buffers 3.0400E+10 bytes
Redo Buffers 62468096 bytes
数据库装载完毕。
数据库已经打开。
--------------------- 内存参数调整 ---------------------------
--查看共享池大小
show parameter shared;
--查看target大小
show parameter target;
show parameter sga;
--先将sga和pga,target调成0,否则会影响memory_target的设置
alter system set sga_target=0 scope=spfile;
alter system set pga_aggregate_target=0 scope=spfile;
--如果想要根据memory_target自动设置共享池大小,先将其设置为0
alter system set shared_pool_size=0 scope=spfile;
--memory_target会自动调整sga_target和pga_aggregate_target以及所有内存相关参数
alter system set memory_target=16g scope=spfile;
--------------------- 最大连接数调整 ---------------------------
-- 查看当前的连接数
select count(*) from v$process;
-- 查看最大连接数
show parameter processes;
show parameter session;
-- 修改最大连接数,session数会自动跟着调整
alter system set processes = 600 scope = spfile;
--------------------- 游标数调整 ---------------------------
--如果数据库报错ORA-01000: 超出打开游标的最大数
show parameter cursors;
alter system set open_cursors=1000 scope=both;
--重启让改动的设置生效
shutdown immediate;
startup;
问题解决
- 执行shutdown immediate命令关闭实例后,报错ORA-12514。
- 完整错误:ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
- 解决方案:在链接数据库之前在cmd中执行set ORACLE_SID=agile9
- 为什么服务器断电或重启之后,系统会变得很慢。
- 原因:上文有提到,windows系统有一个Oracle的数据库服务,断电或者重启之后,服务会重启。这个时候参数会还原到初始值。这个问题在linux上不会出现。因为linux基本都是通过命令行启动数据库实例的。
- 解决方案:使用命令行重启一下数据库实例,之前优化的参数就会还原了。