oracle数据库经常会出现占用cpu100%的进程,然后系统就挂了,怎么找出引起这种故障的sql语句在故障发生时,尝试用下面的语句抓取数据库引起故障的点 。
/*********************************************************************************************/
在oracle中监控死锁
/*********************************************************************************************/
SELECT sn.username,
m.SID,
sn.SERIAL#,
m.TYPE,
DECODE(m.lmode,
0,
'None',
1,
'Null',
2,
'Row Share',
3,
'Row Excl.',
4,
'Share',
5,
'S/Row Excl.',
6,
'Exclusive',
lmode,
LTRIM(TO_CHAR(lmode, '990'))) lmode,
DECODE(m.request,
0,
'None',
1,
'Null',
2,
'Row Share',
3,
'Row Excl.',
4,
'Share',
5,
'S/Row Excl.',
6,
'Exclusive',
request,
LTRIM(TO_CHAR(m.request, '990'))) request,
m.id1,
m.id2
FROM v$session sn, v$lock m
WHERE (sn.SID = m.SID AND m.request != 0) --存在锁请求 , 即被阻塞
OR (sn.SID = m.SID --不存在锁请求,但是锁定的对象被其他会话请求锁定
AND m.request = 0 AND lmode != 4 AND
(id1, id2) IN (SELECT s.id1, s.id2
FROM v$lock s
WHERE request != 0
AND s.id1 = m.id1
AND s.id2 = m.id2))
ORDER BY id1, id2, m.request;
/*********************************************************************************************/
定位引起oracle死锁的sql
/*********************************************************************************************/
select sql_text from v$sql where hash_value in
(select sql_hash_value from v$session where sid in
(select session_id from v$locked_object))
/*********************************************************************************************/
下面的SQL查询可以用于确定锁住数据库对象的锁:
/*********************************************************************************************/
select
c.owner,
c.object_name,
c.object_type,
b.sid,
b.serial#,
b.status,
b.osuser,
b.machine
from
v$locked_object a ,
v$session b,
dba_objects c
where
b.sid = a.session_id
and
a.object_id = c.object_id;
/*********************************************************************************************/
显示哪些会话被锁住
/*********************************************************************************************/
/* showlock.sql */
COLUMN o_name format a10
COLUMN lock_type format a20
COLUMN object_name format a15
SELECT RPAD (oracle_username, 10) o_name, session_id SID,
DECODE (locked_mode,
0, 'None',
1, 'Null',
2, 'Row share',
3, 'Row Execlusive',
4, 'Share',
5, 'Share Row Exclusive',
6, 'Exclusive'
) lock_type,
object_name, xidusn, xidslot, xidsqn
FROM v$locked_object, all_objects
WHERE v$locked_object.object_id = all_objects.object_id;
/*********************************************************************************************/
显示所有的TM和TX锁
/*********************************************************************************************/
/* showalllock.sql */
SELECT SID, TYPE, id1, id2,
DECODE (lmode,
0, 'None',
1, 'Null',
2, 'Row share',
3, 'Row Exclusive',
4, 'Share',
5, 'Share Row Exclusive',
6, 'Exclusive'
) lock_type,
request, ctime, BLOCK
FROM v$lock
WHERE TYPE IN ('TX', 'TM');
/*********************************************************************************************/
在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为:
被kill掉的session,状态会被标记为killed,Oracle会在该用户下一次touch时清除该进程.
我们发现当一个session被kill掉以后,该session的paddr被修改 , 如果有多个session被kill , 那么多个session
的paddr都被更改为相同的进程地址:
/*********************************************************************************************/
alter system kill session 'sid,serial#' ;
/*********************************************************************************************/
在oracle中kill掉的进程有时还需要等待pmon回滚数据库已经占有的资源
有时候我们需要使用下面的脚本找出那些已经在oracle中kill掉的进程,在操作系统中在kill一次
/*********************************************************************************************/
select p.addr from v$process p where pid1
minus
select s.paddr from v$session s;
$ kill -9 paddr
oracle 开机启动进程主要是一些服务会启动 。比如 监听服务 , 数据库启动,sql*plus启动 等等 。这些自动启动会导致你开机很慢 。
WINDOWS你进入服务中,查找oracle的相关服务 , 你可以都改成“手动启动”。
你看看我截的图吧
oracle 启停及挂载新磁盘操作oracle启停
1.登录
登录linux系统怎么挂进程oracle,切换到oracle用户
# su oracle
2.连接
$ cd $ORACLE_HOME/bin
$ sqlplus /nolog
3.使用管理员权限
conn / as sysdba
4.关闭服务(启动)
shutdown immediate
startup
5.退出
quit
6.启动监听
$ lsnrctl start
===============================================
磁盘挂载
/oracle 下文件随着项目怎么挂进程oracle的扩大,目录空间已不够使用 , 需要挂载一个新的磁盘来负责存储
直接挂载会发现/oracle下变空了,这个原因是由于linux的VFS(虚拟文件系统)机制导致的,正常登录以后 , 所看到的各个目录,文件都是内核在加载时候构造在内存中的VFS目录树,而不是直接看到硬盘上的实际目录树 。当你挂载某个设备到一个VFS挂载点上时(比如/oracle),系统就把VFS中的这个挂载点/oracle指向你最后所挂载的那个设备上 。那么你现在访问该挂载点时,就会看到你最后挂载在此处的设备 。而之前所挂载的设备依然在那里,只不过挂载点/oracle已经不再指向之前的设备 。所以之前的数据是被隐藏了,但并没有删除,若umount挂载后,数据又重新回来了
基于这种情况,只能通过跳板的方式把原来的/oracle数据复制到新的/oracle分区下了 ,如何添加新硬盘,请查找相关资料
mkdir /new ###跳板目录
mount /dev/sdb1 /new ###首先挂载跳板目录
cp -R /oracle/* /new ###复制/oracle目录所有数据到/new先
mount /dev/sdb1 /oracle ###挂载/oracle 到新硬盘,此时你会神奇的发现之前的/oracle目录文件已经全部转移过来了,也许你会有点疑问,我并没有复制或移动/new文件到新挂载的/oracle目录啊,其实此时的/oracle目录相当于/new目录的硬链接,可以测试下mkdir /new/test 你会发现/oracle目录也存在test
umount /new ###解除挂载
rm -rf /new ###删除跳板目录
vi /etc/fstab
增加:/dev/sdb1 /oracle ext3 defaults 0 0
:wq怎么挂进程oracle!
--------------------------------------------------------------------------------------
挂载新盘后进行启动发现报错
------------
ORA-09925: Unable to create audit trail file
Linux Error: 13: Permission denied
Additional information: 9925
ORA-09925: Unable to create audit trail file
Linux Error: 13: Permission denied
Additional information: 9925
---------
是因为目录权限问题
解决方法
chown -R oracle.oinstall /oracle
再进行操作,一切正常
===================================================
可参考
Linux磁盘的挂载和卸载:
如何关闭ORACLE开机的进程?将oracle相关的服务改成手动就行了,想用的时候,再手动加载服务就可以了 。在Oracle服务中,有二个服务是必须启动的,oracleServiceaaa(aaa为数据库名,此服务为oracle主服务)oracleOraHome81TNSListener(此服务为oracle监听服务)
如何查找oracle进程Oracle数据库查看一个进程是如何执行相关的实际SQL语句
SELECT b.sql_text, sid, serial#, osuser, machine
FROM v$session a, v$sqlarea b
WHERE a.sql_address = b.address;
查询前台发出的SQL语句.
select user_name,sql_text
from v$open_cursor
where sid in
(select sid from (select sid,serial#,username,program from v$session where status='ACTIVE'));
根据SPID查询session
SELECT * FROM v$session WHERE paddr IN
(SELECT addr FROM v$process WHERE spid=spid);
根据SID查询process
SELECT * FROM v$process WHERE addr IN
(SELECT paddr FROM v$session WHERE sid=sid);
DBA如何查询其他用户所进行的操作
SELECT sql_text
FROM v$sql t1, v$session t2
WHERE t1.address = t2.sql_address
AND t2.sid = sid;
根据process查询sql语句
SELECTsql_text
FROM v$sqltext a
WHERE (a.hash_value, a.address) IN (
SELECT DECODE (sql_hash_value,0, prev_hash_value,sql_hash_value ),
DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.paddr = (SELECT addr
FROM v$process c
WHERE c.spid = '$processID'))
ORDER BY piece ASC;
其他
执行下列命令语句
sqlplus / as sysdba EOF
create tablespace testdatafile '/data/test01.dbf' size 10240M;
quit;
EOF
通过ps -ef|grep sqlplus命令得到上面所执行的命令的进程id为:12345
(1)关于v$process
执行下面的SQL是查不到相关的信息:
select * from v$process where spid='12345';
因为这个spid字段对应的并不是我们用ps命令从系统中查询到的进程id,而是这个进程执行的当前SQL的进程id,
也就是上面命令中的“create tablespace testdatafile '/data/test01.dbf' size 10240M;”所对应的进程id,如果想
通过用ps命令从系统中查询到的进程id查看对应的信息,那么必须使用下面语句:
select spid,sid,process,sql_address from v$session where process='12345'
上面sql中的process就是通过ps查看的进程id,而spid就是里面的sql语句所对应的进程id 。
还可以通过上面的sql_address 查看正在执行的SQL语句内容:
select sql_text from v$sqlarea s,v$session ses where s.address=ses.sql_address and ses.process='12345';
(2)关于v$session
在查询 v$session 视图的时候,我们根据command字段内部表示解码每一个字段 , 当我们需要快速找出他们的 Oracle 系统的内部情况时非常有用 。
select
substr(s.username,1,18) username,substr(s.program,1,15) program,p.spid,s.process,
decode(s.command,
0,'No Command',
1,'Create Table',
2,'Insert',
3,'Select',
6,'Update',
7,'Delete',
9,'Create Index',
15,'Alter Table',
21,'Create View',
23,'Validate Index',
35,'Alter Database',
39,'Create Tablespace',
41,'Drop Tablespace',
40,'Alter Tablespace',
53,'Drop User',
62,'Analyze Table',
63,'Analyze Index',
s.command||': Other') command
from
v$session s,
v$process p,
v$transaction t,
v$rollstat r,
v$rollname n
where s.paddr = p.addr
and s.taddr = t.addr ( )
and t.xidusn = r.usn ( )
and r.usn = n.usn ( )
order by username
(3)几个相关的SQL
--查看系统进程对应的信息
select se.saddr,se.sid,se.serial#,p.pid,se.paddr,s.sql_id,s.sql_text
from v$session se ,v$process p, v$sqlarea s
where se.paddr=p.addr and se.sql_address=s.address and se.process='1'
and se.username is not null
--查看所有的会话
select se.username,se.saddr,se.sid,se.serial#,se.process,s.sql_id
from v$session se,v$sqlarea s
where se.sql_address=s.address
--查看会话对应的sql内容
select se.username,se.process,s.sql_text
from v$session se,v$sqlarea s
where se.sql_address=s.address and s.sql_id='1'
oracle 启动必须开启什么进程1、startup nomount
非安装启动,这种方式启动下可执行怎么挂进程oracle:重建控制文件、重建数据库读取init.ora文件,启动instance,即启动SGA和后台进程,这种启动只需要init.ora文件 。
2、startup mount dbname
安装启动,这种方式启动下可执行:
数据库日志归档、
数据库介质恢复、
使数据文件联机或脱机,
重新定位数据文件、重做日志文件 。
执行“nomount”,然后打开控制文件 , 确认数据文件和联机日志文件怎么挂进程oracle的位置,但此时不对数据文件和日志文件进行校验检查 。
3、startup open dbname
先执行“nomount” , 然后执行“mount”,再打开包括Redo log文件在内的所有数据库文件 , 这种方式下可访问数据库中的数据 。
4、startup,等于以下三个命令
startup nomount
alter database mount
alter database open
5、startup restrict
约束方式启动
这种方式能够启动数据库,但只允许具有一定特权的用户访问
非特权用户访问时,会出现以下提示:
ERROR:
ORA-01035: ORACLE 只允许具有 RESTRICTED SESSION 权限的用户使用
6、startup force
强制启动方式,当不能关闭数据库时,可以用startup force来完成数据库的关闭,先关闭数据库,再执行正常启动数据库命令
7、startup pfile=参数文件名
带初始化参数文件的启动方式
先读取参数文件,再按参数文件中的设置启动数据库
例:startup pfile=E:\Oracle\admin\oradb\pfile\init.ora
8、startup EXCLUSIVE
【怎么挂进程oracle oracle挂载dbf】关于怎么挂进程oracle和oracle挂载dbf的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- jquery获取ul下所有li,jquery获取ul li的值
- 如何营销打造独立女性,如何做一个独立女性
- thinkphp代码加密解密,tp5代码加密
- vb.net建立目录 vb目录列表框在哪
- linux中expr命令,linux ex命令
- 三人联机动作游戏下载,仨人联机游戏
- oracle怎么解锁加锁 怎么解锁oracle被锁定的账户
- 嘉兴sap服务费,嘉兴二手房服务费几个点
- Go写妹子图爬虫,go语言写爬虫