oracle导出导入数据库
Posted 聂啸辉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle导出导入数据库相关的知识,希望对你有一定的参考价值。
- 一.给空表分配空间:
这一步一定要做,否则空表不能导出.
首先连接你要导出的库,在该库上执行以下sql:
select \'alter table \'||table_name||\' allocate extent;\' from user_tables where num_rows = 0
执行结果是一连串的sql语句,类似alter table tablename allocate extent;选择所有结果,复制,在库里统一执行一下.
我在网上看好多人要在后面加一句 where num_rows = 0,意思我懂,就是只对数据条数为0的表生成要执行的sql语句,但是这样似乎仍然会有漏的表,我使用
select table_name,num_rows from user_tables 在库里执行一下发现num_rows的值有的为null,不是0,反正看需要选择加不加吧
当然后面不加where条件的话,就把所有的表都设置了一遍,事实上有数据的表时不需要设置的,如果不想这样,就加个where num_rows = 0 or num_rows is null,这样应该就没有遗漏的表了.
- 二.导出dmp文件
在cmd中执行一下命令导出dmp文件:
exp 用户名/密码@监听名 file=E:\\数据库名.dmp owner=(用户名) log=E:\\日志名.log indexes=n statistics=none
这里加了owner表示将该用户下所有表导出
注意@后的监听名,一般你的oracle安装目录下有个tnsnames.ora文件,玩过pl/sql应该知道,经常要改它的,在这个文件加入监听配置
经过一段时间后控制台会提示导出成功,取决于数据库大小.
- 三.创建表空间
- 1.先查看以往数据库对应的文件路径在哪里:
SELECT t1.name, t2.name FROM v$tablespace t1, v$datafile t2 WHERE t1.ts#=t2.ts# order by t1.name;
注意在本地执行该命令的用户需拥有dba权限,否则会提示该表不存在,可以登录sqlplus,使用 conn / as sysdba登录,然后GRANT "DBA" TO 用户; 或者直接在sysdba中执行该sql,查看结果.
- 2.创建表空间
create tablespace mytisjs datafile \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\mytisjs.dbf\' (mytisjs.dbf前面的路径为你之前查询出来的路径,其实这里路径可以写任何位置,只是和之前的数据库统一存放在同一位置比较好) size 2000m autoextend on next 500m maxsize 10096m extent management local;
- 3.创建临时表空间
create temporary tablespace mytisjs_temp tempfile \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\mytisjs_temp.dbf\' size 500m autoextend on next 500m maxsize 2048m extent management local;
- 4.创建用户
CREATE USER test IDENTIFIED BY test DEFAULT TABLESPACE "MYTISJS" (指定表空间为刚刚创建的表空间,注意表空间名称要大写) TEMPORARY TABLESPACE "MYTISJS_TEMP";
- 5.授予权限
GRANT "DBA" TO test; GRANT "CONNECT" TO test; GRANT "RESOURCE" TO test;
- 四.导入dmp文件
用imp命令导入
imp test/test@mytisjs file=E:\\tisjs.dmp log=E:\\tisjs.log full=y ignore=y
其中test/test是用户名/密码 mytisjs和之前一样,在tnsnames.ora文件加入对应的配置,如果我要导入本地,就HOST就为localhost,file后的路径就是你之前导出的dmp文件路径,log也一样.
等一段时间就会提示导入成功,数据库就可以使用了.
如果dmp文件在本地,导入到本地数据库,直接imp test/test file=E:\\tisjs.dmp log=E:\\tisjs.log full=y ignore=y就可以了,不用配置监听也可以
- 五.表空间相关说明:
- 1.查看数据库的表空间,包括临时表空间
select * from ( Select a.tablespace_name, to_char(a.bytes/1024/1024,\'99,999.999\') total_bytes, to_char(b.bytes/1024/1024,\'99,999.999\') free_bytes, to_char(a.bytes/1024/1024 - b.bytes/1024/1024,\'99,999.999\') use_bytes, to_char((1 - b.bytes/a.bytes)*100,\'99.99\') || \'%\' use from (select tablespace_name, sum(bytes) bytes from dba_data_files group by tablespace_name) a, (select tablespace_name, sum(bytes) bytes from dba_free_space group by tablespace_name) b where a.tablespace_name = b.tablespace_name union all select c.tablespace_name, to_char(c.bytes/1024/1024,\'99,999.999\') total_bytes, to_char( (c.bytes-d.bytes_used)/1024/1024,\'99,999.999\') free_bytes, to_char(d.bytes_used/1024/1024,\'99,999.999\') use_bytes, to_char(d.bytes_used*100/c.bytes,\'99.99\') || \'%\' use from (select tablespace_name,sum(bytes) bytes from dba_temp_files group by tablespace_name) c, (select tablespace_name,sum(bytes_cached) bytes_used from v$temp_extent_pool group by tablespace_name) d where c.tablespace_name = d.tablespace_name )
- 2. 查看当前用户的使用的表空间及默认表空间,如果结果太多可以自己添加where条件过滤到当前用户
select username,default_tablespace,temporary_tablespace from dba_users
- 3.临时表空间满了查询可能会报错,执行如下命令收缩临时表空间
ALTER TABLESPACE MYTISJS_TEMP SHRINK SPACE
其中MYTISJS_TEMP为要收缩的临时表空间名
- 4.删除用户及表空间
DROP USER TISJS5 CASCADE; drop tablespace MYTISJS5 including contents and datafiles; drop tablespace MYTISJS5_TEMP including contents and datafiles;
以上是关于oracle导出导入数据库的主要内容,如果未能解决你的问题,请参考以下文章