oracle数据库全库的导出导入实战手册

              Oracle数据库导入导出(expdp/impdb)

1、全库导出(expdp参考shell脚本)
#!/bin/bash
#导入环境变量
source /home/oracle/.bash_profile
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1/
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
export ORACLE_SID=p2pdb
#进入你需要备份的文件目录
cd /home/oracle/dump/
date=date "+%Y%m%d"
DATE1=date -d today +%Y%m
#执行导出命令
expdp 'system/"12345678"' dumpfile=dumpdir:ZJKD${date}.dmp SCHEMAS=zjkd
#打包
tar zcvf ZJKD${date}.tar.gz ZJKD${date}.dmp
mv /home/oracle/dump/ZJKD_${DATE1}01.tar.gz /home/oracle/dump_bak_1/
2、全库导入(impdb)
全新库导入准备:
1、原库表空间大小(相关查询脚本)
查看表空间的名称及大小 
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 
GROUP BY t.tablespace_name; 
发现即将导入的库的表空间大小就将近300G。
2、创建表空间,并设置与原库表空间差不多的大小

1、create tablespace ZJKD datafile 'D:\app\oradata\orcl\ZJKD01.dbf' size 30000M ;---连续创建10个类似的文件
2、设置为自动扩展和扩展大小的命令如下:
alter database datafile 'D:\app\oradata\orcl\ZJKD01.dbf' resize 1070M;
alter database datafile 'D:\app\zijinsuo\oradata\orcl\xwxd.dbf' autoextend on;
3、手动创建了用户
create user zjkd identified by zjkd default tablespace zjkd;
4、赋权限(system用户登录后赋权限)
sql>grant read,write on directory mydata to zjkd
#给用户表空间权限
sql>grant dba,resource,unlimited tablespace to zjkd
5、执行导库命令
1、找到指定的备份文件
create directory dpdata2 as 'D:\backup\ZJKD_20210101';
2、执行导入命令

impdp \"system/888888 as sysdba \" dumpfile=20210101.dmp directory=dpdata2 schemas=zjkd logfile=impdp.log table_exists_action=replace
6、查看执行日志
1、查看导入日志 impdp.log(文件在你备份文件指定目录)
2、查看系统日志,alert_orcl.log
执行 show parameter dump

遇到的问题处理:
问题一:
1、表空间不足,进行表空间的扩展;
问题二:
2、Thu Apr 30 09:52:29 2020
Thread 1 cannot allocate new log, sequence 12255
Private strand flush not complete
Current log# 2 seq# 12254 mem# 0: /data/oradata/eas/redo02.log
Thread 1 advanced to log sequence 12255 (LGWR switch)
Current log# 3 seq# 12255 mem# 0: /data/oradata/eas/redo03.log

很明显这是日志组被写满了,需要增加日志组:
解决方法:
select group#,sequence#,bytes,members,status from v$log; 查看每组日志的状态

alter database add logfile group 4 ('/opt/oradata/orclbj/redo04.log') size 200M;   增加1组 日志组 视情况而定增加日志组的大小。

alter database add logfile group 5 ('/opt/oradata/orclbj/redo05.log') size 200M;
alter database add logfile group 6 ('/opt/oradata/orclbj/redo06.log') size 200M;
3、重新导入数据时,建议重启下数据库
否则因为导库中断,报ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效---
在system登录的情况下执行如下操作:
1、查询被锁的会话ID:
select session_id from v$locked_object;
2.查询上面会话的详细信息:
SELECT sid, serial#, username, osuser FROM v$session where sid = 9;
3.将上面锁定的会话关闭:
ALTER SYSTEM KILL SESSION '9,99';

问题三:
创建索引的时间特别长,下一次导入的时候,如果没有变化,可以忽略索引的导入
追加:exclude=index,constraint

备注的sql:
1、索引查询:
SELECT segment_name, SUM (bytes) / 1024 / 1024 FROM dba_segments WHERE owner = 'XIEZQ' AND segment_name LIKE 'PK%' or segment_name like 'IDX%' group by segment_name;
2、表空间的使用率:
--1G=1024MB 
--1M=1024KB 
--1K=1024Bytes 
--1M=11048576Bytes 
--1G=102411048576Bytes=11313741824Bytes 
SELECT a.tablespace_name "表空间名", 
total "表空间大小", 
free "表空间剩余大小", 
(total - free) "表空间使用大小", 
total / (1024
1024 1024) "表空间大小(G)", 
free / (1024
1024 1024) "表空间剩余大小(G)", 
(total - free) / (1024
1024 1024) "表空间使用大小(G)", 
round((total - free) / total, 4)
100 "使用率 %" 
FROM (SELECT tablespace_name, SUM(bytes) free 
FROM dba_free_space 
GROUP BY tablespace_name) a, 
(SELECT tablespace_name, SUM(bytes) total 
FROM dba_data_files 
GROUP BY tablespace_name) b 
WHERE a.tablespace_name = b.tablespace_name 

猜你喜欢

转载自blog.51cto.com/12455018/2585469