select * from v$sql where sql_id in ( select sql_id from gv$session where paddr in ( select addr from gv$process where program = 'ORACLE.EXE (SHAD)' and spid = 188 )); 说明
Enter value for 1: PID(这里输入占用 CPU 最高的进程对应的 PID)
6.23. 检查占用CPU多的session select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,client_info,osuser,value/60/100 value from v$session a,v$process b,v$sesstat c where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by value desc; 6.24. 检查表空间的IO select df.tablespace_name name,df.file_name \\物理读次数\f.phyblkrd \物理读BLOCKS\物理写次数\物理写BLOCKS\from v$filestat f, dba_data_files df where f.file# = df.file_id order by df.tablespace_name; 说明
定期检查,发现并报告物理读、物理写特别大的表空间
6.25. 检查临时表空间IO SELECT se.username 用户名, se.sid, se.serial#, se.sql_address, se.machine, se.program, su.tablespace, su.blocks*8192/1024/1024 \FROM v$session se, v$sort_usage su WHERE se.saddr=su.session_addr; 说明
多次检查,发现并报告临时表空间使用过高的会话session的程序
6.26. 检查锁和等待 SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name, o.owner,o.object_name,o.object_type,s.sid,s.serial# FROM v$locked_object l,dba_objects o,v$session s WHERE l.object_id=o.object_id AND l.session_id=s.sid ORDER BY o.object_id,xidusn DESC; alter system kill session '&sid,&serial#'; 说明
多次检查,及早发现并报告锁与等待的对象,如果可能可以结束该进程。
7. 检查数据库安全性
在本节主要检查Oracle数据库的安全性,包含:检查系统安全信息,定期修改密码,总共两个部分。
7.1. 检查系统安全日志信息 [root@racdb1 ~]# grep -i accepted /var/log/secure Jan 21 14:36:00 racdb1 sshd[3455]: Accepted password for oracle from 192.168.137.1 port 56246 ssh2 说明 系统安全日志文件的目录在/var/log 下,主要检查登录成功或失败的用户日志信息。 检查登录成功的日志:
7.2. 检查登录失败的日志: [root@racdb1 ~]# grep -i inval /var/log/secure &&grep -i failed /var/log/secure 在出现的日志信息中没有错误(Invalid、refused)提示,如果没有(Invalid、refused)视为系统正常,出现错误提示,应作出系统告警通知。
8. 数据表空间日常维护
8.1. 查看数据库表空间是大表空间还是小表空间
select property_name,property_value from database_properties where property_name like '%TBS%';
8.2. 查看表空间的一些信息
1. 查看数据文件是否为自动增长
select file_name,tablespace_name,bytes,autoextensible,maxbytes from dba_data_files order by tablespace_name;
2. 察看表空间名称与文件名称对应关系
select t1.name,t2.name from v$tablespace t1,v$datafile t2 where t1.TS#=t2.TS#;
select tablespace_name,file_name,bytes from dba_data_files order by tablespace_name;
3. 查看表空间使用情况
SELECT UPPER(F.TABLESPACE_NAME) \表空间名\ D.TOT_GROOTTE_MB \表空间大小(M)\
D.TOT_GROOTTE_MB - F.TOTAL_BYTES \已使用空间(M)\
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' \使用比\ F.TOTAL_BYTES \空闲空间(M)\ F.MAX_BYTES \最大块(M)\
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES, ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES FROM SYS.DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F, (SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME ORDER BY 1;
4. 知道表的名称察看表空间
select tablespace_name,table_name from user_tables where table_name='EMP';
5. 察看一个表空间有多少表
select * from all_tables where tablespace_name='USERS';
8.3. 创建表空间 CREATE TABLESPACE \AUTOEXTEND ON NEXT 128M MAXSIZE 3000M LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO SQL> show parameter db_block_size NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_block_size integer 8192 说明 增加一个数据文件,文件路径和大小需要自己修改成适合的位置和大小。空间数据文件容量与DB_BLOCK_SIZE有关,在初始建库时,DB_BLOCK_SIZE要根据实际需要,设置为 4K,8K、16K、32K、64K等几种大小,ORACLE的物理文件最大只允许4194304个数据块(由操作系统决定),表空间单个数据文件的最大值为 4194304×DB_BLOCK_SIZE/1024M。
4k最大表空间为:16384M 8K最大表空间为:32768M 16k最大表空间为:65536M 32K最大表空间为:131072M 64k最大表空间为:262144M 8.4. 表空间扩容 ALTER TABLESPACE TEST ADD DATAFILE '/u01/app/oracle/oradata/racdb1/TEST02.dbf' SIZE 100M AUTOEXTEND ON NEXT 128M MAXSIZE 300M ; ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/racdb1/TEST01.dbf' RESIZE 1G; 说明
重新设置一个数据文件的大小,只能扩容,不能减少容量。
8.5. 创建大数据文件
CREATE BIGFILE TABLESPACE \DATAFILE '/u01/app/oracle/oradata/racdb1/bigdata01.dbf' SIZE 100M AUTOEXTEND ON NEXT 128M MAXSIZE 40G LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
SELECT tablespace_name, bigfile FROM dba_tablespaces 说明
bigfile tablespace是Oracle10g的新特性。Bigfile tablespaces包含1个最大4G个blocks 的datafile。因此,使用8KBdata blocks 的bigfile tablespace 最大可以达到32TB。因为Bigfile的Tablespace不能有多个文件,必须保证在同一个磁盘空间有足够的容量.BFT(bigfile tablespace)还受到操作系统的文件系统的限制。理论上我们可以创建最大 32T (4G*8K) 的表空间。经过测试linux 系统不建议超过2T, 大文件表空间(bigfile tablespace)应该和自动存储管理(Automatic Storage Management)或其他逻辑卷管理工具(logical volume manager)配合使用,这些工具应该能够支持动态扩展逻辑卷,也能支持striping(数据跨磁盘分布)或RAID。
文件系统(块) ext2/3 (4K) ext4 (4K)
单个文件大小限制文件系统大小限制 2T 16T 16TB 1EB
[root@racdb1 ~]# tune2fs -l /dev/sda1 Block size: 4096
8.6. 数据表空间文件迁移 SQL>selectfile_name,tablespace_name,bytes,autoextensible,maxbytes from dba_data_files order by tablespace_name; SQL> shutdown immediate; [oracle@racdb1 ~]$ mv /u01/app/oracle/oradata/data02.dbf /u01/app/oracle/oradata/racdb1/data02.dbf [oracle@racdb1 ~]$ mv /u01/app/oracle/oradata/data01.dbf/u01/app/oracle/oradata/racdb1/data01.dbf [oracle@racdb1 ~]$ mv /u01/app/oracle/oradata/TEST02.dbf/u01/app/oracle/oradata/racdb1/TEST02.dbf SQL>startup mount; SQL> alter database rename file '/u01/app/oracle/oradata/data02.dbf' to '/u01/app/oracle/oradata/racdb1/data02.dbf'; SQL> alter database rename file '/u01/app/oracle/oradata/data01.dbf' to '/u01/app/oracle/oradata/racdb1/data01.dbf'; SQL> alter database rename file '/u01/app/oracle/oradata/TEST02.dbf' to '/u01/app/oracle/oradata/racdb1/TEST02.dbf'; SQL> alter database open; select file_name,tablespace_name,bytes,autoextensible,maxbytes from dba_data_files order by tablespace_name; 说明
1. 查询当前数据表空间文件位置并关闭数据库实例 2. 关闭数据库
3. 移动数据库表空间文件的物理位置 4. 启动数据库到mount状态
5. 修改数据表空间文件在数据库中路径 6. 启动数据库
7. 查看修改过的表空间位置
8.7. 不停机移动表空间文件 alter tablespace DATASPACE offline; mv /u01/app/oracle/oradata/racdb1/data01.dbf /u01/app/oracle/oradata/data01.dbf SQL> alter tablespace DATASPACE rename datafile '/u01/app/oracle/oradata/racdb1/data01.dbf' to '/u01/app/oracle/oradata/data01.dbf'; alter tablespace DATASPACE online; 说明1. 2. 3. 4.
将表空间离线
移动数据文件到新位置
修改数据字典新数据文件位置 将表空间online
8.8. 检查用户修改密码 alter user USER_NAME identified by PASSWORD; 在数据库系统上往往存在很多的用户,如:第三方数据库监控系统,初始安装数据库时的演示用户,管理员用户等等,这些用户的密码往往是写定的,被很多人知道,会被别有用心的人利用来攻击系统甚至进行修改数据。需要修改密码的用户包括: 数据库管理员用户SYS,SYSTEM;其他用户。
登陆系统后,提示符下输入cat /etc/passwd,在列出来的用户中查看是否存在已经不再使用的或是陌生的帐号。若存在,则记录为异常
9. 存储过程管理
9.1. 找出特定用户的存储过程 SELECT DISTINCT NAME FROM dba_source WHERE TYPE = 'PROCEDURE' and OWNER='SCOTT'; SELECT * FROM DBA_OBJECTS WHERE OBJECT_TYPE='PROCEDURE' and OWNER='SCOTT'; 9.2. 通过表名找出存储过程 SELECT DISTINCT NAME FROM dba_source WHERE TYPE = 'PROCEDURE' AND upper(text) LIKE '%USERS%'; 9.3. 查看存储过程内容 SELECT * FROM ALL_SOURCE where TYPE='PROCEDURE' AND NAME ='BOB_PRO9'; select text from dba_source where owner= 'SCOTT' and name='BOB_PRO9' order by line;