第一:一个连接可能产生多个session,一个session可能产生多个processes,同样,一个processes可能对应多个sessions(看到过一个processes只对应一个session?)
第二:会话sessions和进程processes的关系 每个DB login称为一个连接(connection),而每个连接,可以产生一个或多个会话,如果数据库运行在专用服务器方式, 一个会话对应一个服务器进程(process),如果数据库运行在共享服务器方式
第三:session & process的关系: sessions=1.1*processes + 5,修改processes和sessions值必须重启oracle服务器才能生效
第四:session状态解析(SELECT * FROM v$session WHERE username='***' ORDER BY status)
a. SPINED状态的session问题,根据@dbsnake大拿的意思,这种状态是Oralce自身判断需要kill -9干掉OS进城后的状态,但该session还在V$session,这时只能用alter system干掉该session。至于上述"SPID不是OS进程的ID么"的问题,则是因为Oracle内部已经用kill -9干掉该进程了,那当然提示no such process等错误。
b. KILL状态的session,是使用alter system从Oracle级干掉的session,等待事务回滚。
c. INACTIVE状态表示当前的这个session处于非活动状态,比如打开一个PLSQL但没有操作。
d.ACTIVE表示正处于active,例如当前在一个PLSQL的SQL Window。
1. 使用SQL命令行操作验证 sessions=1.1*processes + 5:
1. 1 打开sql命令行,接入数据库(cmd: conn username/password@db_username)
1.2 查看processes数量:150 (cmd: show parameter process)
1.3 查看session数量:170(cmd:show parameter session )
1.4 验证公式 1.1*150+5 = 170 (cmd: select 1.1*150+5 from dual;)
2.常用SQL语句
select * from v$resource_limit; --通过v$resource_limit视图可以查询/监控相关重要资源的限制值和使用情况:
select count(*) from v$process; --查询数据库当前进程的连接数:
select count(*) from v$session; --查看数据库当前会话的连接数:
select count(*) from v$session where status='ACTIVE'; --查看数据库的并发连接数:
select sid,serial#,username,program,machine,status from v$session; --查看当前数据库建立的会话情况:
select name,value from v$parameter where name in ('processes','sessions','open_cursors'); --查看当前DB中的进程、会话、游标的设置情况;
alter system set processes = 300 scope = spfile; --修改数据库允许的最大连接数:(需要重启数据库才能实现连接数的修改)
select osuser,a.username,cpu_time/executions/1000000||'s',sql_fulltext,machine
from v$session a,v$sqlarea b
where a.sql_address = b.address
order by cpu_time/executions desc; --查看当前有哪些用户正在使用数据:
3. 常用SQL命令行
启动oracle:su - oracle
进入sql: sqlplus system/pwd as sysdba
启动数据库: startup
启动监听:lsnrctl start
关闭数据库:shutdown immediate;
启动数据库:startup mount;
alter database open;