数据库导入、导出
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、导出的范例
- 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中
exp system/manager@TEST file=d:\daochu.dmp full=y
- 将数据库中system用户与sys用户的表导出
exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)
- 将数据库中的表table1 、table2导出
exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2)
- 将数据库中的表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. 数据泵的导入导出
- 连接到DBA用户
- 创建一个操作目录或查看操作目录
--创建操作目录
create directory dump_dir as ‘f:\dump_dir';--注意:f:\dump_dir必须是在磁盘F上存在此路径
--查看操作目录
select * from dba_directory;
- 对导出或导入文件目录授予读写权限
grant read,write on directory dump_dir to XXX;--注意:XXX 为需要导入/导出的用户
- 导出范例
- 按表导出 --参数 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\')\"
- 导入范例
- 按表导入 从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;//允许更改时间戳