在Oracle数据库办理系统中,创建库表(table)时要分配一个表空间(tablespace),若是未指定表空间,则利用系统用户确省的表空间。
在Oracle现实应用中,我们可能会碰到如许的问题。处于性能或者其他方面的考虑,需要改动某个表或者是某个用户的所有表的表空间。
凡是的做法就是起首将表删除,然后从头建表,在新建表时将表空间指定到我们需要改动的表空间。若是该用户已经保留了大量数据,那种法子就就显得不是很便利,因为有大量数据需要提早备份出来。下面介绍一种操纵数据库的导出/导入功用来实现从头组织数据库表空间的办法。
下面是一个简单的例子,假定要将用户oa下的全数表从表空间A转换到表空间B,详细步调(在Oracle 9i for linux情况)如下:
1。1。 导出db_zgxt下的所有表(Dos控造台下) 导出db_zgxt下的所有表(Dos控造台下)1。
导出db_zgxt下的所有表(Dos控造台下)
EXP oa/password@pararmount_server FILE=d:\10_27_oa。dmp LOG=d:\10_27_oa。LOG
2。 删除oa下的所有表(在SQL/PLUS中)
能够接纳批处置的体例删除掉db_zgxt下的所有表,生成批处置的语句如下:
--此中set head off将表头信息去掉
SET HEAD OFF
SPOOL c:\drop_tables。
sql
select 'drop table '||table_name||';' from user_tables;
spool off;
@c:\drop_tables。sql;
sql >@drop_tables。sql
3。
接纳导入参数 INDEXFILE导入oa用户下的所有表(Dos控造台下)
把建表和索引的语句导出到文件,此中建表语句是加正文的,并没有现实导入
IMP oa/password@paramount_server FULL=Y FILE=d:\10_27_oa。
dmp INDEXFILE=d:\altertablespace_table_index。SQL LOG=d:\altertablespace。LOG
此中,指定参数INDEXFILE后,系统就将创建表和索引的语句写到一个文件,那里是altertablespace_table_index。
SQL 中。该文件中包罗了所有创建索引(CREATE INDEX)语句和创建表(CREATETABLE)语句,但是那里所有创建表的语句均加了正文标记。在任何文本编纂器中翻开并编纂该文件,去掉所有创建表语句的正文标记,将所有的表空间名称由A替代为B,同时对所有的创建索引语句加上正文标记。
那些工做做完以后,在SQL/PLUS中运行该脚本文件,那些表就被创建,其表空间由A变成B。
接纳导入参数INDEXES=N 和IGNORE=Y将db_zgxt用户的表数据导入库中(Dos控造台下)
4。 接纳导入参数INDEXES=N 和IGNORE=Y将oa用户的表数据导入库中(Dos控造台下)
IMP oa/password@paramount_server FULL=Y INDEXES=N FILE=d:\10_27_oa。
dmp IGNORE=Y LOG=d:\altertablespace。LOG
此中,参数INDEXES=N是指将数据导入数据库中时不加索引。IGNORE=Y是指在导入数据过程中,忽略表已经存在(table already exists)的错误。
如许Oralce就将数据和一些约束前提导入到第3步创建的表中。
5。 创建索引
在文本编纂器中从头翻开在第3步中创建的altertablespace_table_index。SQL 脚本文件,此次,将所有创建表(CREATE TABLE)的语句加上正文标记,然后将所有的创建索引(CREATE INDEX)语句去掉正文标记。
在SQL/PLUS中再次运行该脚本文件。
至此,我们就胜利完成了将oa用户下的全数表从表空间A转换到表空间B的工做。当然你能够只导入一部门表。
更多Oracle认证材料请存眷测验大Oracle认证测验站。