本文介绍了Oracle数据库的EXPDP/IMPDP备份与恢复数据的过程,包括术语解释、导出前的准备工作、导出与导入的具体步骤以及数据导入后的统计分析。准备工作包括查看表空间大小,导出时可通过指定schemas、directory、dumpfile等参数进行操作,并可排除特定表或统计分析信息。导入时则需设置环境变量,创建必要的表空间和临时表空间,然后使用impdp命令导入数据。若导出与导入的用户名或表空间名不同,可使用REMAP_SCHEMA和REMAP_TABLESPACE参数进行转换。最后,提供了数据导入成功后进行统计分析的SQL脚本。
EXPDP/IMPDP备份与恢复数据:
名词术语解释:
Schemas:方案名,即EAS的账套名,也就是数据上的一个用户名。
Directory: 虚目录,即只是一个名称,对应备份文件所存放的真实目录名。
dumpfile:备份文件名称
Logfile:备份时产生的日志文件,记录备份明细内容与相关报错信息。
Tables:如果要单独导表,则为表名,多表中间用逗号隔开。
Excludes:排除,即排除某些表不用导出。
Parallel:并行,即导出或导入数据时用的并行线程或CPU个数。
Remap_schema:重定向方案,即导入的方案名称与导出的不一样时进行转换处理。
Remap_tablespace:重定向表空间,即导入的表空间名称与导出的不一样时转换处理。
一、expdp导出数据前做的准备工作:
备份前的准备工作(查原库的默认永久表空间、临时表空间以及对应表空间的大小,便于在导入库中也建相同的表空间及对应大小的数据文件):
用sys用户登陆原数据库,即要导出EAS账套的数据库有些客户如EAS账套名权限较大,也可以用EAS账套名登录。
1.查看EAS账套名称对应的默认数据表空间与临时表空间:
select default_tablespace,temporary_tablespace from dba_users where username=upper('EAS75') --EAS75为EAS账套名,最好写成大写
2.查看导入原账套数据表空间名称及占用大小:
select f.tablespace_name,a.total,u.used,f.free,round((u.used/a.total)*100) "% used",
round((f.free/a.total)*100) "% Free"
from
(select tablespace_name, sum(bytes/(1024*1024)) total
from dba_data_files group by tablespace_name) a, (select tablespace_name, round(sum(bytes/(1024*1024))) used
from dba_extents group by tablespace_name) u,
(select tablespace_name, round(sum(bytes/(1024*1024))) free
from dba_free_space group by tablespace_name) f
WHERE a.tablespace_name = f.tablespace_name
and a.tablespace_name = u.tablespace_name;
3.查看导入原账套临时表空间名称及占用大小:
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(%)",nvl(free_space,0) "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_name,round(Sum(bytes_used)/(1024*1024),2) used_space,round(Sum(bytes_free)/(1024*1024),2) free_space
From v$temp_space_header Group By tablespace_name) f
Where d.tablespace_name=f.tablespace_name(+)
order by 5 desc;
二、expdp导出数据:
1.设置客户端环境变量:
windows操作系统先运行:
C:\>set NLS_LANG=AMERICAN_AMERICA.UTF8
非WINDOWS操作系统先运行:
$export NLS_LANG=AMERICAN_AMERICA.UTF8
2.用sys用户登陆数据库创建数据库虚目录tempdir(备份文件存放在如:E:\backup 目录下,建一个实际存在的目录,以现场所建的为准),并给虚目录进行赋权:
sql>create directory tempdir as 'E:\backup';
sql>grant read,write on directory tempdir to system;
3.对eas75账套数据进行数据泵导出(排除VT表与统计分析信息不导出):
c:\> expdp system/kdlsys schemas=eas75 directory=tempdir dumpfile=easexp_20140516.dmp logfile=easexp_20140516.log
exclude=table:\"like \'VT%\'\",statistics parallel=2
三、impdp导入数据:
1.在要导入EAS账套的库中新建表空间:
--如果以下表空间已存在,则不用创建(以下表空间跟导入原库表空间名一样)
--a)新建表空间
新建永久表空间即EAS账套默认的永久数据表空间(如果只要一个数据件<最大为32G>,则'D:\ORACLE11G\ORADATA\ORACLE11G\EAS_D_EAS75_STANDARD02.ora' SIZE 20G
AUTOEXTEND ON NEXT 200M MAXSIZE UNLIMITED这段可以删掉):
CREATE TABLESPACE "EAS_D_D0023_C_STANDARD" LOGGING DATAFILE 'D:\ORACLE11G\ORADATA\ORACLE11G\EAS_D_EAS75_STANDARD01.ora' SIZE 20G AUTOEXTEND
ON NEXT 200M MAXSIZE UNLIMITED,'D:\ORACLE11G\ORADATA\ORACLE11G\EAS_D_EAS75_STANDARD02.ora' SIZE 20G AUTOEXTEND
ON NEXT 200M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
如果现场有后缀为TEMP2表空间,则新建VT表存放永久表空间:
CREATE TABLESPACE "EAS_D_EAS75_TEMP2" LOGGING DATAFILE 'D:\ORACLE11G\ORADATA\ORACLE11G\EAS_D_EAS75_TEMP2.ora' SIZE 20G AUTOEXTEND
ON NEXT 200M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
如果现场有后缀为INDEX表空间,则新建索引永久表空间:
CREATE TABLESPACE "EAS_D_EAS75_INDEX" LOGGING DATAFILE 'D:\ORACLE11G\ORADATA\ORACLE11G\EAS_D_EAS75_INDEX.ora' SIZE 20G AUTOEXTEND
ON NEXT 200M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
--b)新建临时表空间
CREATE TEMPORARY TABLESPACE "EAS_T_EAS75_STANDARD" TEMPFILE 'D:\ORACLE11G\ORADATA\ORACLE11G\EAS_T_EAS75_STANDARD.ora' SIZE 20G AUTOEXTEND
ON NEXT 200M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL UNIFORM SIZE 5M
2.设置客户端环境变量:
windows操作系统先运行:
C:\>set NLS_LANG=AMERICAN_AMERICA.UTF8
非WINDOWS操作系统先运行:
$export NLS_LANG=AMERICAN_AMERICA.UTF8
3.对eas75账套数据进行数据泵导入:
c:\>impdp system/kdlsys schemas=eas75 directory=tempdir dumpfile=easexp_20140516.dmp logfile=easimp_20140516.log parallel=2
通过以上操作后导入结束。
备注:
*导出与导入用户名一样、表空间名一样impdp导入数据方法:
c:\>impdp system/kdlsys schemas=eas75 directory=tempdir dumpfile=easexp_20140516.dmp
logfile=easimp_20140516.log parallel=2
*导出与导入用户名不一样、表空间名不一样impdp导入数据方法(REMAP_SCHEMA=easuser_old:easuser_new,其中easuser_old原用户,easuser_new为新的用户):
c:\>impdp system/kdlsys DIRECTORY=tempdir dumpfile=easexp_20140516.dmp
REMAP_SCHEMA=easuser_old:easuser_new remap_tablespace=oldtablespace:newtablespace
logfile=impdb.log
四、数据导入成功后,对导入的EAS账套做全采样统计分析:
begin
dbms_stats.gather_schema_stats(
ownname=> '"EAS75"' , --改为现场EAS账套名称,要为大写名称
cascade=> TRUE,
estimate_percent=> null,
degree=> 2, --根据现场CPU个数情况更改此值,一般CPU个数减2
no_invalidate=> DBMS_STATS.AUTO_INVALIDATE,
granularity=> 'AUTO',
method_opt=> 'FOR ALL COLUMNS SIZE AUTO',
options=> 'GATHER');
end;
/
其中: ownname改为现场的eas账套名,如果在SQL>下执行,则最后要加上“/”,如果在PL/SQL DEVELOPER工具的SQL WINDOW中执行,则不要最后的“/”。
推荐阅读