为了一些大量基础数据的测试案例,IMP导入数据速度太慢,则使用下面方法可以对当前数据库中个某个表空间数据快速备份恢复;下面的方法也适合两个数据库(必须相同操作系统,相同数据库版本,相同字符集)之间的数据表空间移植。
实验环境:
source:192.168.1.249 tablespace: anenjoy
Target:192.168.1.248 tablespace:anenjoy02
步骤一:先确保你oracle运行的平台支持transport tablespace (基本上都是支持的,学习下查看平台的命令)
SQL> select * from v$transportable_platform; (查看当前oracle下支持的平台)
SQL> select platform_name from v$database;(查看当前oracle 运行的平台)
SQL> select d.platform_name,endian_format from v$transportable_platform tp , v$database d where tp.platform_name=d.platform_name; (查看oracle运行的平台是否在oracle 支持平台下,返回数据则为true)
步骤二:在source 上创建一个数据表空间和数据文件
SQL> create tablespace anenjoy datafile '/opt/oracle/oradata/test05/test05.dbf' size 50m extent management local autoallocate;
Tablespace created.
基于表空间创建表
SQL> create table test (name varchar2(15),work varchar2(10)) tablespace anenjoy; (两个字段name和work)
Table created.
插入一些数据,
insert into test (name,work) values ('frank','IT');
SQL> select * from test;
NAME WORK
------------------------------ --------------------
frank IT
alex caiwu
leon yanfa
步骤三:Pick a Self-Contained Set of Tablespaces (查看是不是自含,也就是说需要传输的表空间是独立的)
execute dbms_tts.transport_set_check('anenjoy',true);
如果你有多个表空间的话呢,用逗号隔开如:’anenjoy01,anenjoy02‘
输出日志:
PL/SQL procedure successfully completed.
执行命令,检查下是否存在不能传输的表空间
SQL> select * from transport_set_violations; 如果有返回行,则需要处理后才可以传输
步骤四:生成传输字符集
首先要先将源表空间置于只读状态,以防表空间数据的修改
SQL> alter tablespace anenjoy read only;
接下来就是数据的导出步骤了(重要)
执行导入操作。导入操作应该与导出操作相对应,若是以exp导出的,需要以imp导入,若是以expdp导出的,需要以impdp导入,参考使用官方的expdp和impdp
Host expdp system dumpfile=expdat.dmp directory=data_pump_dir transport_tablespaces='anenjoy' logfile=tts_export.log;
中间会提示输入system的密码,如果你忘记这个密码的话呢,可以参考上篇文章,学习下如何更改密码
提示点一:这里使用的是system的用户,如果你使用的是你自己定义的用户,那么你需要在target 主机上创建此用户
提示点二:命令行directory 参数data_pump_dir的路径是在/opt/oracle/admin/test05/dpdump下,test05是数据库名,这个目录在oracle database安装好之后就会创建的
可以通过SQL命令查看data_pump_dir 路径
select * from dba_directories;
日志输出为:
Job "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully completed at 13:36:16
步骤五:copy数据到target 主机上
Transport both the datafiles and the export (dump) file of the tablespaces to a place that is accessible to the destination database.
scp test05.dbf oracle@192.168.1.248:/opt/oracle/oradata/test02/ (到target database 下)
scp -r dpdump/ oracle@192.168.1.248:/home/oracle/ (这个是export files)
然后呢,再将dpdump的文件copy到target 相应的data_pump_dir下,也就是你/opt/oracle/admin/ORALE_SID/dpdump
步骤六:数据导入
impdp system dumpfile=expdat.dmp directory=data_pump_dir transport_datafiles='/opt/oracle/oradata/test02/test05.dbf' logfile=tts_import.log
正常的日志输出:
Job "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" successfully completed at 00:41:33
之后,更改源和目标主机上的表空间属性
Alter tablespace anenjoy read write; (两台server上都去执行下)
验证阶段:
在target上,通过SQL 命令查看是否同步过来表空间anenjoy
SQL> select * from v$tablespace;
TS# NAME INCLUD BIGFIL FLASHB ENCRYP
6 ANENJOY YES NOYES
查看表空间anenjoy下的表数据
SQL> select * from test;
NAME WORK
------------------------------ --------------------
frank IT
alex caiwu
leon yanfa
现在就可以向表test中插入数据,也可以再target anenjoy 表空间下创建新的数据表和索引
一:查看表大小:
有两种含义的表大小。一种是分配给一个表的物理空间数量,而不管空间是否被使用。可以这样查询获得字节数:
1.列如我们查看特定表大小占用表空间大小
select sum(bytes)/1024/1024 Mbytes from user_segments where segment_type='TABLE' and segment_name='TEST01';
查看所有表大小
select segment_name, bytes from user_segments where segment_type = 'TABLE';
这里注意:where 条件查询的参数都要大写,否则就会查询不到符合的数据
2.查看表当前使用的空间
analyze table test01 compute statistics; 分析表
select num_rows * avg_row_len from user_tables where table_name = 'TEST01'; 查询表
二:查看表空间大小
命令一:先查看当前库下所有的user表空间
select * from user_tablespaces
命令二:查看当前库下所有表空间的free情况
select tablespace_name,sum(nvl(bytes,0)) from dba_free_space group by tablespace_name;
函数nvl用法:
Nvl(a,b),就是用户判断a的值,如果查询的结果a的值为null,则返回b的值,如果a的值不为null,则返回a的值
命令学习三:查看当前库下的数据文件
select tablespace_name,sum(bytes) from dba_data_files group by tablespace_name;
这个值会查看到oracle 表空间的总大小
命令学习四:描述数据库的表空间
select tablespace_name,contents,extent_management from dba_tablespaces
根据上面四个常用的命令,来创建一个视图,查看表空间的利用情况
select
a.a1 tab_name, (表空间名称)
c.c2 tab_type,(表类型)
c.c3 table_management, (表管理)
b.b2/1024/1024 tab_space_M, (表空间大小,总)
a.a2/1024/1024 free_space_M,(剩余表空间大小)
(b.b2-a.a2)/1024/1024 USED_SPACE_M,( 表使用大小)
substr((b.b2-a.a2)/b.b2*100,1,5) use_ratio(表的利用率)
from
(select tablespace_name a1,sum(nvl(bytes,0)) a2 from dba_free_space group by tablespace_name) a,
(select tablespace_name b1,sum(bytes) b2 from dba_data_files group by tablespace_name) b,
(select tablespace_name c1,contents c2,extent_management c3 from dba_tablespaces) c
where a.a1=b.b1 and c.c1=b.b1;
我后面中文是起到一个标识的作用,在实际的oracle sql developer工具或者PL/SQL中,都尽量不要带有中文,很容易造成SQL 语句不能识别
查询结果显示如图:
三:如果想要查看到表空间的datafile文件名,需要更改视图:
1. 查看当前库下所有表空间的free情况
select tablespace_name,sum(nvl(bytes,0)) from dba_free_space group by tablespace_name;
2. 查看表空间所属的数据文件,测试环境下,一般都是一个表空间下只有一个数据文件,而在实际的环境中,一个表空间下有多个数据文件,而一个数据文件只能属于一个表空间
select file_name,tablespace_name from dba_data_files;
可以为一个表空间添加数据文件
alter tablespace myspace add datafile '/opt/oracle/oradata/test05/mytb02.dbf' size 20M autoextend on next 2m maxsize 100m;
创建视图,查看file_name,tablespace_name,如下
select
b.file_name phy_file_name, (物理文件名)
b.tablespace_name tablespace_name,(表空间名)
b.bytes/1024/1024 tabspace_bytes,(表空间大小 MB)
(b.bytes-sum(nvl(a.bytes,0)))/1024/1024 USEED_SPACE,(使用表空间大小)
substr((b.bytes-sum(nvl(a.bytes,0)))/(b.bytes) * 100,1,5) use_ratio (利用率)
from dba_free_space a , dba_data_files b
where a.file_id=b.file_id
group by b.tablespace_name,b.file_name,b.bytes
order by b.tablespace_name
查询结果如图所示:
四:如果想查看特定的表所在的表空间以及所在的物理文件上
select a.table_name,a.tablespace_name,b.file_name from user_tables a , dba_data_files b
where a.tablespace_name=b.tablespace_name and a.table_name='TEST01';
五:查询和表空间的相关查询命令(知识点)
1. 查询默认的数据表空间和临时表空间
select property_name,property_value from database_properties where property_name in ('DEFAULT_PERMANENT_TABLESPACE',
'DEFAULT_TEMP_TABLESPACE'); (针对USER的默认数据表空间和临时表空间)
2. 更改数据库的默认表空间
Alter database default tablespace tablespace_name;(数据表空间)
Alter database temporary tablespace tablespace_name;(临时数据表空间)