Oracle相关命令操作总结

1.通过EXP或者IMP导出导入数据
    导出数据:
    exp btfb/ustcinfo@orcl_133.64.36.252 file=C:\Users\asus\Desktop\cust_res_cloud.dmp tables=cust_res_cloud
    导入数据:
    imp custres/custres2016@orcl ignore=y full=y file=C:\Users\asus\Desktop\cust_res_ip_system.dmp  log=C:\Users\asus\Desktop\1.txt

2.大批量导入数据:
    sqlldr userid=CustRes/CustRes2016@orcl control=d:\test_cloud.ctl log=d:\demo.log

3.oracle 创建用户并授予dba权限
    1.grant connect,resource,dba to zabbix;

4.Oracle如何终止存储过程
    1.查询正在执行的存储过程:
        select *  from v$db_object_cache  where locks > 0 and pins > 0 and type='PROCEDURE';  
    2.在V$ACCESS视图中找到要停止进程的SID:
        举例:存储过程名:CRH_ENTRY
        SELECT t.* FROM V$ACCESS t WHERE t.object='CRH_ENTRY';
    3.在V$SESSION视图中查找到查出SID和SERIAL#
        SELECT SID,SERIAL# FROM V$SESSION WHERE SID='1314';  
    4.杀掉查找出来的进程
        alter system kill session 'SID,SERIAL#'
        alter system kill session '1314,63759';  

    
5.查询后台运行程序的sid,serial,然后kill该程序
    select object_name as 对象名称,s.sid,s.serial#,p.spid as 系统进程号 from v$locked_object l,dba_objects o ,v$session s,v$process p
    where l.object_id=o.object_id and l.session_id=s.sid and s.paddr=p.addr;
    
    alter system kill session '996,1427';

    
6.Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?本文我们主要就介绍一下这部分内容。
    (1)锁表查询的代码有以下的形式:
        select count(*) from v$locked_object;
        select * from v$locked_object;
    (2)查看哪个表被锁
        select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;
    (3)查看是哪个session引起的
        select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;
    (4)杀掉对应进程
        执行命令:alter system kill session'1025,41';
        其中1025为sid,41为serial#.


7.Oracle查看用户表空间大小
    (1).查看具体用户用的是那个表空间
        select username,default_tablespace from dba_users;  -- 查看所用用户所使用的表空间大小
        select username,default_tablespace from dba_users  where username='ZABBIX';   -- 查看指定用户所使用的表空间大小
    (2).查看所有的表空间大小
        SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size
        FROM dba_tablespaces t, dba_data_files d
        WHERE t.tablespace_name = d.tablespace_name             --and t.TABLESPACE_NAME = 'TBS_ZABBIX'作为查询指定的用户
        GROUP BY t.tablespace_name;     
    (3).查看表空间物理文件的名称及大小
        SELECT tablespace_name,file_id,file_name,round(bytes / (1024 * 1024 * 1024), 2) total_space FROM dba_data_files ORDER BY tablespace_name;     
    (4).查看用户所使用的表空剩余大小
        select a.tablespace_name,
        a.tablespace_size * b.block_size / 1024 / 1024 / 1024 "totalmsize(m)",
        a.used_space * b.block_size / 1024 / 1024 / 1024 "usedmsize(m)",
        round(a.used_percent, 2) "usedrate(%)"
        from dba_tablespace_usage_metrics a, dba_tablespaces b
        where a.tablespace_name = b.tablespace_name;
    (5).这样就可以查看oracle数据库的表空间数据文件位置了。
        select t1.name,t2.name from v$tablespace t1,v$datafile t2 where t1.ts# = t2.ts#;
    (6).查看指定文件或者指定目录的地址
        文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。可以使用某种文件名模式来匹配文件,
        记住要用引号将文件名模式引起来。  不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*.log的文件,使用~作为 'pathname'参数,波浪号~代表了你的$HOME目录。
            find ~ -name "*.log" -print  
        想要在当前目录及子目录中查找所有的‘ *.log‘文件,可以用:
            find . -name "*.log" -print  
        想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:  
            find . -name "[A-Z]*" -print  
        想要在/etc目录中查找文件名以host开头的文件,可以用:  
            find /etc -name "host*" -print  
        想要查找$HOME目录中的文件,可以用:  
            find ~ -name "*" -print 或find . -print  
        要想让系统高负荷运行,就从根目录开始查找所有的文件。  
            find / -name "*" -print  
        如果想在当前目录查找文件名以一个个小写字母开头,最后是4到9加上.log结束的文件:  
        命令:
            find . -name "[a-z]*[4-9].log" -print


8.性能监控
    (1). 检测数据库中的事件和等待          
        SELECT event, total_waits, total_timeouts,time_waited, average_wait FROM v$system_event   
        
    (2). 查询会话中的事件和等待时间          
        select sid, event, total_waits,average_wait from v$session_event where sid=10;   
        
    (3). 查询等待进程          
        SELECT sid, seq#, event, wait_time, state FROM v$session_wait;   
        
    (4). 监控全局区的性能          
        select * from v$sgastat;   
        
    (5). 查询命中率          
        select gethitratio  from v$librarycache where namespace = 'SQL AREA';  
        
    (6). 当前 sql 语句        
        select sql_text, users_executing,executions, loads from v$sqlarea;  
        
    (7). 查询高速缓存中的命中率          
        select sum(pins) "Executions", sum(reloads) "Cache Misses",sum(reloads)/sum(pins) from v$librarycache;  
        
    (8). 查询全局字典中的有效装载次数          
        select namespace,pins,reloads,invalidations  from v$librarycache;
        
    (9). 采集Buffer Gets前十的不良sql
        select * from (select substr(sql_text, 1, 40) sql,buffer_gets,executions,buffer_gets / executions "Gets/Exec",hash_value,address
             from v$sqlarea where buffer_gets > 0 and executions > 0 order by buffer_gets desc) where rownum <= 10;
            
    (10).采集物理读前十的不良sql语句
        select * from (select substr(sql_text, 1, 40) sql,disk_reads,executions,disk_reads/executions "Reads/Exec",hash_value,address
             from v$sqlarea where disk_reads > 0 and executions > 0 order by disk_reads desc) where rownum <= 10;
            
    (11).采集执行次数前十的不良SQL语句
        select * from (select substr(sql_text, 1, 40) sql,rows_processed,executions,rows_processed/executions "Rows/Exec",hash_value,address
            from v$sqlarea where executions > 0 order by executions desc) where rownum <= 10;
            
    (12).采集PARSE与EXECUTIONS的比值的前十的不良SQL语句
        select * from (select substr(sql_text, 1, 40) sql,parse_calls,executions,hash_value,address
            from v$sqlarea where parse_calls > 0 order by parse_calls desc) where rownum <= 10;
            
    (13).采集占用shared memory前十的不良SQL语句
        select * from (select substr(sql_text, 1, 40) sql,sharable_mem,executions,hash_value,address
                 from v$sqlarea where sharable_mem > 1048576 order by sharable_mem desc) where rownum <= 10;
                
    (14).采集运行时间top10的不良sql
        select * from (select t.SQL_FULLTEXT,(t.LAST_LOAD_TIME - to_date(t.FIRST_LOAD_TIME,'yyyy-mm-dd hh24:mi:ss'))*24*60,
                t.DISK_READS,t.BUFFER_GETS,t.ROWS_PROCESSED,t.LAST_ACTIVE_TIME,t.LAST_LOAD_TIME,t.FIRST_LOAD_TIME
                from v$sqlarea t order by t.FIRST_LOAD_TIME desc) where rownum <= 10;

9.相关表,空间的查询语句
    (1).查看数据库表的索引占用空间
        select segment_name ,sum(bytes)/1024/1024 from user_segments where segment_type ='INDEX' group by segment_name;

    (2)查看数据库表的表占用的空间大小
        select segment_name, sum(bytes)/1024/1024 Mbytese from user_segments where segment_type='TABLE' group by segment_name;

    (3)查看数据库表的分区表占用空间
        select segment_name,sum(bytes)/1024/1024 Mbytes from user_segments where segment_type='TABLE PARTITION' group by segment_name;

    (4)查看zabbix数据库占用的后台空间大小
        SELECT tablespace_name,file_id,file_name,round(bytes / (1024 * 1024), 0) total_space FROM dba_data_files where tablespace_name = 'TBS_ZABBIX' ORDER BY tablespace_name;

    (5)查看用户表的索引和表空间大小联合
        Select Segment_Name "段名",Segment_Type "段类型",TableSpace_Name "表空间",Sum(bytes)/1024/1024/1024 "空间占用(G)" From User_Extents
        Group By Segment_Type,Segment_Name,TableSpace_Name order by Sum(bytes)/1024/1024 desc

10.Oracle的相关工具语句
    (1).Oracle回收站操作(通常$字符为开头的字符串表示是垃圾数据,要及时回收,表空间数据才能释放)
        select * from user_recyclebin;
        purge user_recyclebin;
        
        show recyclebin;
        purge recyclebin;
        
    (2).查看数据的版本
        select * from v$version;
    
15.oracle中常用的正则表达式
(1).截取表中字段中的字母(即去除中文,只留英文)
    select regexp_substr(t.mainframe_type,'[A-Z|a-z]+',1) from ci_host t where t.operate_system is null;
    
    截取指定字符串前后的信息
    select name,substr(name,1,instr(name,'-')-1) 前,substr(name,instr(name,'-')+1,length(name)-instr(name,'-')) 后 from test;
    
    select p.res_name,p.id,p.zb_name,SUBSTR(p.zb_name,instr(p.zb_name,'.',1,3)+1,4)  from idc_res_relation p , ci_host t  where t.id = p.id
    and  t.name = p.res_name and p.table_code = 'CI_HOST' and p.zb_id is not null and instr(p.res_name,SUBSTR(p.zb_name,instr(p.zb_name,'.',1,3)+1,4))=0;
    
16.AWR报告的性能报告
    Oracle中的AWR,全称为Automatic Workload Repository,自动负载信息库。它收集关于特定数据库的操作统计信息和其他统计信息,Oracle以
    固定的时间间隔(默认为1个小时)为其所有重要的统计信息和负载信息执行一次快照,并将快照存放入AWR中。这些信息在AWR中保留指定的时间
    (默认为1周),然后执行删除。执行快照的频率和保持时间都是可以自定义的。
    
    导出步骤:
        1.登陆oracle用户,sudo sqlplus / as sysdba;    (可能sudo权限不能用,要在root权限下visudo添加上授权的用户)
        2.conn / as sysdba; 进行连接
        3.@?/rdbms/admin/awrrpt.sql  进入oracle报告选项中
        4.Enter value for report_type: 这个显示的意思是打印一个报告是以什么格式打印的,要么输入html,要么输
          入text,如果直接默认回车,这里是html
        5.Enter value for num_days: 这里的提示是让我们输出几天的报告
        6.Enter value for begin_snap: 出入起始的快照ID,这里指的是打印出来的snap id,后面有snap started开始的时间
        7.Enter value for report_name: 输入一个报告的名字    
    
    AWR报告中各个标识的含义:
    (1)Sessions
        表示采集实例连接的会话数。这个数可以帮助我们了解数据库的并发用户数大概的情况。这个数值对于我们判断数据库的类型有帮助。
    (2)Cursors/session
        每个会话平均打开的游标数。
    (3)Elapsed
        通过Elapsed/DB Time比较,反映出数据库的繁忙程度。如果DB Time>>Elapsed,则说明数据库很忙。
    (4)DB Time
        表示用户操作花费的时间,包括CPU时间和等待事件。通常同时这个数值判读数据库的负载情况。
        具体含义
        db time = cpu time + wait time(不包含空闲等待)(非后台进程)
        *db time就是记录的服务器花在数据库运算(非后台进程)和等待(非空闲等待)上的时间。对应于V$SESSION的elapsed_time字段累积。

    
    AWR报考中各个性能分析:
    1. SQL ordered by Elapsed Time
        记录了执行总和时间的TOP SQL(请注意是监控范围内该SQL的执行时间总和,而不是单次SQL执行时间 Elapsed Time = CPU Time + Wait Time)。
        Elapsed Time(S): SQL语句执行用总时长,此排序就是按照这个字段进行的。注意该时间不是单个SQL跑的时间,而是监控范围内SQL执行次数的总和时间。单位时间为秒。Elapsed Time = CPU Time + Wait Time
        CPU Time(s): 为SQL语句执行时CPU占用时间总时长,此时间会小于等于Elapsed Time时间。单位时间为秒。
        Executions: SQL语句在监控范围内的执行次数总计。
        Elap per Exec(s): 执行一次SQL的平均时间。单位时间为秒。
        % Total DB Time: 为SQL的Elapsed Time时间占数据库总时间的百分比。
        SQL ID: SQL语句的ID编号,点击之后就能导航到下边的SQL详细列表中,点击IE的返回可以回到当前SQL ID的地方。
        SQL Module: 显示该SQL是用什么方式连接到数据库执行的,如果是用SQL*Plus或者PL/SQL链接上来的那基本上都是有人在调试程序。一般用前台应用链接过来执行的sql该位置为空。
        SQL Text: 简单的sql提示,详细的需要点击SQL ID。
    2.SQL ordered by CPU Time
        记录了执行占CPU时间总和时间最长的TOP SQL(请注意是监控范围内该SQL的执行占CPU时间总和,而不是单次SQL执行时间)。
    3.SQL ordered by Gets
        记录了执行占总buffer gets(逻辑IO)的TOP SQL(请注意是监控范围内该SQL的执行占Gets总和,而不是单次SQL执行所占的Gets)。
    4.SQL ordered by Reads:
        记录了执行占总磁盘物理读(物理IO)的TOP SQL(请注意是监控范围内该SQL的执行占磁盘物理读总和,而不是单次SQL执行所占的磁盘物理读)。
    5.SQL ordered by Executions:
        记录了按照SQL的执行次数排序的TOP SQL。该排序可以看出监控范围内的SQL执行次数。

17.Oracle的sql执行计划查看
    查看执行计划的方式有三种:
    EXPLAIN PLAN 、V$SQL_PLAN 、SQL*PLUS AUTOTRACE
    
    1.EXPLAIN PLAN:
        显示执行相应语句时可以使用的理论计划
        读取执行计划:按缩进量读取,缩进越多,越先执行;缩进量相同,先上后下。
        dbms_xplan 程序包里三种表函数
            display(理论并未真正执行)
            display_awr(真正执行)
            display_cursor(查询内存中执行过的执行计划)

        语法:
            EXPLAIN PLAN SET STATEMENT_ID = ' ' FOR
            要查看的SQL语句          -- 先进行解释
            
            输出:
            SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());  -- 在查看解释的结果

        display函数中的参数:
            table_name:指定计划表的名字,缺省值为‘PLAN_TABLE’。
            statement_id:SQL语句的ID号,是在生成执行计划时使用set statement_id,命令设置的值,默认值为NULL,当使用默认值时,将显示最近插入计划表中的执行计划。
            format:用于控制display函数输出内容,其常用值有:
                basic: 仅仅显示最少的信息。基本上包括操作和操作的对象
                typical:显示大部分信息。基本上包括除了别名,提纲和字段投 影外的所有信息,此为缺省值。
                serial: 类似于typical,但不显示并行操作
                all: 显示除提纲之外的所有信息
                advanced:显示所有信息

                相匹配的额外修饰符有:(需要某个修饰符使用“+”,不需要使用“-”,连接之间要有空格)
            alias:控制包含查询块与别名的显示部分
            bytes:控制执行计划表中字段bytes的显示,执行该步骤后返回的字节数
            cost:控制执行计划表中字段cost的显示,Oracle估计的该步骤的执行成本,用于说明SQL执行的代价,理论上越小越好(该值可能与实际有出入)
            note:控制包含注释信息的显示部分
            outline:控制包含提纲信息的显示部分
            parallel:控制包含并行处理信息的提示
            paration:控制并行处理信息的显示,尤其是执行计划表中字段TQ、IN-OUT、PQ Distrib的显示
            predicate:控制包含谓词filter和access显示部分
            peeked_binds:控制包含绑定变量窥探部分的显示。仅当生成执行计划时使用了绑定变量是可见
            projection:控制包含投影信息的显示部分
            remote:控制远程执行的SQL语句的显示
            rows: 控制执行计划表中字段rows的显示,Oracle估计的当前操作的返回结果集行数

        例如:
        EXPLAIN PLAN
        SET STATEMENT_ID = '192' FOR
        SELECT * FROM SCOTT.EMP;

        SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());

        Plan hash value: 3956160932

        --------------------------------------------------------------------------
        | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
        --------------------------------------------------------------------------
        |   0 | SELECT STATEMENT  |      |    14 |  1218 |     3   (0)| 00:00:01 |
        |   1 |  TABLE ACCESS FULL| EMP  |    14 |  1218 |     3   (0)| 00:00:01 |
        --------------------------------------------------------------------------

        Note
        -----
           - dynamic sampling used for this statement (level=2)
    
    
    2.v$sql_plan视图,即过DBMS_XPLAN.display_cursor方式查看:
        视图中包含一种方法,可以查询最近使用过的真正执行过的执行过的执行计划(VSQLPLANSTATISTICS提供了实际的执行统计信息,通
        过VSQL_PLAN_STATISTICS_ALL,可并列比较优化程序评估结果)
      
        语法:
        SELECT PLAN_TABLE_OUTPUT FROM
        TABLE(DBMS_XPLAN.DISPLAY_CURSOR('cfzo0...'));

        v$sql_plan查询结果中各列说明(部分):
            HASH_BALUE:库高速缓存中父语句的散列值
            ADDRESS:此游标的父游标的句柄地址
            CHILD_NUMBER:使用此执行计划的子游标编号
            POSITION:具有相同的PARENT_ID的操作的处理顺序
            PARENT_ID:操作当前步骤的输出的下一执行步骤的ID
            ID:执行计划中每个步骤所分配的编号

        案例:
        1.---在sys用户下执行了SQL语句:
            SELECT * FROM SCOTT.EMP;
            
        2.---通过SQL文本,在v$sql视图中查询SQL_ID:
            SELECT sql_text,sql_id from v$sql where sql_text like'%SCOTT.EMP%';
            
        3.---得到SQL_ID:
            SELECT * FROM SCOTT.EMP    4ay6mhcbhvbf2
            
        4.---查看执行计划:
            SELECT PLAN_TABLE_OUTPUT FROM
            TABLE(DBMS_XPLAN.DISPLAY_CURSOR('4ay6mhcbhvbf2'));

            SELECT * FROM SCOTT.EMP

            Plan hash value: 3956160932

            --------------------------------------------------------------------------
            | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
            --------------------------------------------------------------------------
            |   0 | SELECT STATEMENT  |      |       |       |     3 (100)|          |
            |   1 |  TABLE ACCESS FULL| EMP  |    14 |  1218 |     3   (0)| 00:00:01 |
            --------------------------------------------------------------------------

            Note
            -----
               - dynamic sampling used for this statement (level=2)

猜你喜欢

转载自blog.csdn.net/mengxin520520/article/details/82746574