oracle 常用语句

数据库导入、导出

1. 客户端导出

1、exp不会导出空表如何处理

注意点 11g新特性:从未分配过segment的空表,exp不会导出

方法一:设置deferred_segment_creation参数

SQL> show parameter deferred_segment_creation 
NAME                                 TYPE        VALUE 
------------------------------------ ----------- ------------------------
deferred_segment_creation            boolean     TRUE 
SQL> alter system set deferred_segment_creation=false; 
系统已更改。 
SQL> show parameter deferred_segment_creation 
NAME                                 TYPE        VALUE 
------------------------------------ ----------- -----------------------
deferred_segment_creation            boolean     FALSE

需注意的是:该值设置后对以前导入的空表不产生作用,仍不能导出,只能对后面新增的表产生作用。如需导出之前的空表,可以采用方法二

方法二:批量对空表分配segment

查询空表,将查询出来的结果复制出来

select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0

查询类似结果如下:

alter table TBL_1 allocate extent;
alter table TBL_2 allocate extent;
alter table TBL_3 allocate extent;
alter table TBL_4 allocate extent;

将结果复制粘贴到plsql的comment(命令窗口)中即可

2、导出的范例

  1. 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中
exp system/manager@TEST file=d:\daochu.dmp full=y
  1. 将数据库中system用户与sys用户的表导出
exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)
  1. 将数据库中的表table1 、table2导出
exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2)
  1. 将数据库中的表table1中的字段filed1以"00"打头的数据导出
exp system/manager@TEST file=d:\daochu.dmp tables=(table1) query=\" where filed1 like '00%'\"

返回

2. 客户端导入

  • 导入一个完整数据库
imp system/manager file=bible_db log=dible_db full=y ignore=y

ignore 有的表已经存在,对该表就不进行导入,在后面加上 ignore=y 就可以了

  • 导入一个或一组指定用户所属的全部表、索引和其他对象
imp system/manager file=seapark log=seapark fromuser=seapark 

imp system/manager file=seapark log=seapark fromuser=(seapark,amy,amyc,harold)
  • 将一个用户所属的数据导入另一个用户
imp system/manager file=tank log=tank fromuser=seapark touser=seapark_copy

imp system/manager file=tank log=tank fromuser=(seapark,amy) touser=(seapark1, amy1)
  • 导入一个表
imp system/manager file=tank log=tank fromuser=seapark TABLES=(a,b)
  • 从多个文件导入
imp system/manager file=(paycheck_1,paycheck_2,paycheck_3,paycheck_4) log=paycheck, filesize=1G full=y
  • 增量导入
imp system./manager inctype= RECTORE FULL=Y FILE=A

返回

3. 数据泵的导入导出

  1. 连接到DBA用户
  2. 创建一个操作目录或查看操作目录
--创建操作目录
create directory dump_dir as ‘f:\dump_dir';--注意:f:\dump_dir必须是在磁盘F上存在此路径
--查看操作目录
select * from dba_directory;
  1. 对导出或导入文件目录授予读写权限
grant read,write on directory dump_dir to XXX;--注意:XXX  为需要导入/导出的用户
  1. 导出范例
  • 按表导出 --参数 tables
expdp scott/tiger directory=dump_dir dumpfile=tab.dmp logfile=scott.log tables=dept,emp
  • 按用户导出 --参数 schemas
expdp scott/tiger directory=dump_dir dumpfile=dumpscott.dmp schemas=scott
  • 全库导出,且并行导出 --参数 parallel=4
expdp scott/tiger directory=dump_dir dumpfile=full.dmp parallel=4 full=y
  • 集群导出 --参数 CLUSTER=N
expdp scott/tiger directory=dump_dir dumpfile=full.dmp cluster=N
  • 固定分区表导出 --参数 tables
expdp scott/tiger directory=dump_dir dumpfile=full.dmp logfile=test.log tables=(cs_outsucc:partition(P_20180919),cs_outsucc:partition(P_20180929))
  • 固定表的筛选条件导出 --参数 query
expdp scott/tiger directory=dump_dir dumpfile=tab.dmp logfile=scott.log tables=(dept,emp) query=\"where 字段 like'2014-10%'\"
  • 去除固定表进行用户导出 --参数 exclude
expdp scott/tiger directory=dump_dir dumpfile=full.dmp logfile=test.log schemas=scott  exclude=table:\"in (\'ETL_PROCEDURE_LOG_DTL\',\'BI_SCHD_TASKQUEUE\',\'ECS_DECLARATION_0926\',\'CS_DECLARATION_0926C\',\'CS_DECLARATION_0924\',\'CS_OUTBILLFLOW\',\'CS_DECLARATION\',\'PT_INOUTFLOW\',\'CS_OUTSUCC\',\'PT_PTSERROR\')\"
  1. 导入范例
  • 按表导入 从scott到scott2 --参数 tables
impdp scott2/tiger directory=dump_dir dumpfile=tab.dmp tables=scott.dept,scott.emp remap_schema=scott:scott2
  • 按用户导入 从scott到scott2 --参数 remap_schema
impdp scott/tiger directory=dump_dir dumpfile=schema.dmp remap_schema=scott:scott2
  • 全库导入 --参数 full
impdp scott/tiger directory=dump_dir dumpfile=full.dmp full=y
  • 无落地文件的用户拷贝,需要建立dblink --参数 network_link
impdp scott/tiger directory=dump_dir network_link=remote_link remap_schema=scott:scott2
  • 表空间导入映射 --参数 remap_tablespace
impdp scott/tiger directory=dump_dir network_link=remote_link remap_schema=scott:scott2 remap_tablespace=TABSPACE01:NNC_DATA01

返回

表空间操作处理

1. 数据库表空间占用情况

select t.*
from (SELECT D.TABLESPACE_NAME,
             SPACE                                            "SUM_SPACE(M)",
             BLOCKS                                           SUM_BLOCKS,
             SPACE - NVL(FREE_SPACE, 0)                       "USED_SPACE(M)",
             ROUND((1 - NVL(FREE_SPACE, 0) / SPACE) * 100, 2) "USED_RATE(%)",
             FREE_SPACE                                       "FREE_SPACE(M)"
      FROM (SELECT TABLESPACE_NAME,
                   ROUND(SUM(BYTES) / (1024 * 1024), 2) SPACE,
                   SUM(BLOCKS)                          BLOCKS
            FROM DBA_DATA_FILES
            GROUP BY TABLESPACE_NAME) D,
           (SELECT TABLESPACE_NAME,
                   ROUND(SUM(BYTES) / (1024 * 1024), 2) FREE_SPACE
            FROM DBA_FREE_SPACE
            GROUP BY TABLESPACE_NAME) F
      WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
      UNION ALL
      SELECT D.TABLESPACE_NAME,
             SPACE                                      "SUM_SPACE(M)",
             BLOCKS                                     SUM_BLOCKS,
             USED_SPACE                                 "USED_SPACE(M)",
             ROUND(NVL(USED_SPACE, 0) / SPACE * 100, 2) "USED_RATE(%)",
             SPACE - USED_SPACE                         "FREE_SPACE(M)"
      FROM (SELECT TABLESPACE_NAME,
                   ROUND(SUM(BYTES) / (1024 * 1024), 2) SPACE,
                   SUM(BLOCKS)                          BLOCKS
            FROM DBA_TEMP_FILES
            GROUP BY TABLESPACE_NAME) D,
           (SELECT TABLESPACE,
                   ROUND(SUM(BLOCKS * 8192) / (1024 * 1024), 2) USED_SPACE
            FROM V$SORT_USAGE
            GROUP BY TABLESPACE) F
      WHERE D.TABLESPACE_NAME = F.TABLESPACE(+)) t
order by "USED_RATE(%)" desc;

返回

2. 新增表空间数据文件,并且允许数据文件自动增长

ALTER TABLESPACE NNC_DATA01 ADD DATAFILE --注意表空间名字
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP04.DBF' SIZE 50M  --注意路径的正确
AUTOEXTEND ON NEXT 5M MAXSIZE 100M;

返回

3. 扩充表空间大小

alter database datafile '表空间位置' resize 5000M

返回

4. 查看表空间的名字及文件所在位置

select tablespace_name,
       file_id,
       file_name,
       round(bytes / (1024 * 1024), 0) total_space
from dba_data_files
order by tablespace_name

返回

oracle基本语句

1. 赋权操作

  • 会话赋权

    GRANT SELECT ON V_$SESSION TO username;
    
  • 单一表的增删改查赋权

    GRANT SELECT,DELETE,UPDATE,INSERT ON user.tablename TO testuser;
    
  • 某用户任何表的创建和查看赋权

    GRANT CREATE ANY TABLE TO username;
    GRANT SELECT ANY TABLE TO username;
    
  • 某用户存储过程执行的赋权

    GRANT EXECUTE ON procname TO username;
    

返回

2. 表或列添加注释

--添加表注释:
COMMENT ON table tablename IS '个人信息';
--添加字段注释:
comment on column tablename.id  is 'id';
comment on column tablename.name is '姓名';
comment on column tablename.age is '年龄';

返回

3. NC表字段注释查看 限NC6.x版本

select c.name, c.id, c.displayname
  from md_table t
  left join md_column c
    on t.id = c.tableid
 where t.name = 'sim_zyshg'--表名(小写)

返回

4. 字符串聚合

select a.name, --聚合字符串的维度列
       LISTAGG(a.adder, ',') WITHIN GROUP(ORDER BY a.ts) as columnname --字符串聚合的列名
  from tablename a
 group by a.name;
 --以上语句含义是:根据name汇总adder列的文本内容,adder文本汇总的结果排序顺序根据ts正序排列

返回

5. oracle表分区操作

  • 根据表名查询对应分区的名称
select partition_name from user_tab_partitions where table_name='T_RANGE';
  • 查询分区表固定分区的数据
select *
  from t_test partition(t_test_2014) --表名 分区名
 where add_date_time >=
       TO_DATE('2014-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss');
  • 删除分区
alter table t_test drop partition t_test_2014;

注:drop partition时,该分区内存储的数据也将同时删除,如你的本意是希望删除掉指定的分区但保留数据,你应该使用merge partition,执行该语句会导致glocal索引的失效需要重建全局索引

  • 表分区重命名
alter table tablename rename partition SYS_P21 to p_2014_02_01; --分区名由SYS_P21改为p_2014_02_01

返回

6. job创建、查看及设置

  • job创建
declare
  job number;
begin
  sys.dbms_job.submit(job,
                      'declare data_date varchar2(10) := to_char(sysdate, ''YYYY-MM-DD'');
                      is_reset  INTEGER := ''0'';
                      IRETURN varchar2(10);
                      begin
                        pkg_etl.proc_etl_control(data_date,is_reset,IRETURN);
                      end;', ---存储过程名称
                      TO_DATE('20-01-2016 03:00:00',
                              'DD-MM-YYYY HH24:MI:SS'), ---首次运行时间
                      'TRUNC(SYSDATE + 1) + (3*60)/(24*60)'); --- 间隔多久再次运行 此参数代表早3点
  commit;
end;
  • job查看
select * from user_jobs; --当前用户的job
select * from dba_jobs; --全数据库的job
  • job运行情况
select * from dba_jobs_running;  ---正在运行的JOB
  • 运行job
begin
  dbms_job.run(26); ---括号内的数字是 select * from user_jobs; 中的job字段对应的编号
  commit;
end;
  • 删除job
begin
  dbms_job.remove(110); --括号内的数字是 select * from user_jobs; 第一个字段的对应的编号
  commit;
end;
  • job定时参数设置

每分钟执行
Interval => TRUNC(sysdate,’mi’) + 1 / (24*60)

每天定时执行
例如:每天的凌晨2点执行
Interval => TRUNC(sysdate) + 1 +2 / (24)

每周定时执行
例如:每周一凌晨2点执行
Interval => TRUNC(next_day(sysdate,2))+2/24 --星期一,一周的第二天

每月定时执行
例如:每月1日凌晨2点执行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+2/24

每季度定时执行
例如每季度的第一天凌晨2点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24

每半年定时执行
例如:每年7月1日和1月1日凌晨2点
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24

每年定时执行
例如:每年1月1日凌晨2点执行
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+2/24

返回

7. 20位主键序列创建

create sequence ETL_SEQ
minvalue 1
maxvalue 99999999999999999
start with 1
increment by 1
nocache;

返回

8. DBlink创建

create database link dblink_name
  connect to 用户名 identified by "密码"
--目标数据库的监听内容;如已配置监听,直接填写监听名称;建议填写监听内容,而非名称
  using '
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.137.128)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
 )
  ';

返回

关于死锁

1. 死锁查看

SELECT l.session_id sid,
       s.serial#,
       l.locked_mode 锁模式,
       l.oracle_username  登录用户,
       l.os_user_name登录机器用户名,
       s.machine 机器名,
       s.terminal 终端用户名,
       o.object_name 被锁对象名,
       s.logon_time 登录数据库时间
  FROM v$locked_objectl, all_objectso, v$sessions
 WHERE l.object_id = o.object_id
   AND l.session_id = s.sid
 ORDER BY sid, s.serial#;

返回

2. 死锁的进程spid查询

select spid, osuser, s.program
  from v$session s, v$process p
where s.paddr = p.addr
   and s.sid = 'sid';--通过上一个语句查看的sid号

返回

3. 操作系统kill进程方法

linux: kill -9 12345 #进程号是上一个语句的spid
win: orakill orcl 12345 ::进程号是上一个语句的spid

返回

八、关于oracle元数据信息查询

1. 正在执行的sql

select a.username, a.sid, b.SQL_TEXT, b.SQL_FULLTEXT
from v$session a,
     v$sqlarea b
where a.sql_address = b.address

返回

2. 执行过的sql

select b.SQL_TEXT,b.FIRST_LOAD_TIME,b.SQL_FULLTEXT
from v$sqlarea b
where b.FIRST_LOAD_TIME between '2009-10-15/09:24:47' and
'2009-10-15/09:24:47' order by b.FIRST_LOAD_TIME

返回

3. 查找前十条性能差的sql

SELECT *
  FROM (select PARSING_USER_ID,
               EXECUTIONS,
               SORTS,
               COMMAND_TYPE,
               DISK_READS,
               sql_text
          FROM v$sqlarea
         order BY disk_reads DESC)
 where ROWNUM < 10;

返回

4. 查看占io较大的正在运行的session

SELECT se.sid,
       se.serial#,
       pr.SPID,
       se.username,
       se.status,
       se.terminal,
       se.program,
       se.MODULE,
       se.sql_address,
       st.event,
       st. p1text,
       si.physical_reads,
       si.block_changes
  FROM v$session se, v$session_wait st, v$sess_io si, v$process pr
 WHERE st.sid = se.sid
   AND st. sid = si.sid
   AND se.PADDR = pr.ADDR
   AND se.sid > 6
   AND st. wait_time = 0
   AND st.event NOT LIKE '%SQL%'
 ORDER BY physical_reads DESC

返回

5. 数据库的连接数查询及更改

select count(*) from v$process; --当前的数据库连接数
select value from v$parameter where name ='processes';--数据库允许的最大连接数
alter system set processes = 300 scope = spfile;--修改最大连接数:

更改完连接数参数后需要重启数据库

返回

九、误删除数据的恢复

1. 通过scn恢复删除且已提交的数据

  • 获得当前数据库的scn号
select current_scn from v$database; --(切换到sys用户或system用户查询)

如查询到的scn号为:1499223

  • 查询当前scn号之前的scn
select * from 表名 as of scn 1499220; --(确定删除的数据是否存在,如果存在,则恢复数据;如果不是,则继续缩小scn号)
  • 恢复删除且已提交的数据
flashback table 表名 to scn 1499220;

返回

2. 通过时间恢复删除且已提交的数据

  • 查询当前系统时间
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
  • 查询删除数据的时间点的数据
select * from 表名 as of timestamp to_timestamp('2013-05-29 15:29:00','yyyy-mm-dd hh24:mi:ss');  --(如果不是,则继续缩小范围)

返回

3. 恢复删除且已提交的数据

flashback table 表名 to timestamp to_timestamp('2013-05-29 15:29:00','yyyy-mm-dd hh24:mi:ss');

注意: 如果在执行上面的语句,出现错误。可以尝试执行 alter table 表名 enable row movement;//允许更改时间戳

你可能感兴趣的:(oracle 常用语句)