如何更改Oracle数据库表的表空间?

5个月前 (10-16 08:52)阅读4回复0
dyyh
dyyh
  • 管理员
  • 注册排名7
  • 经验值141615
  • 级别管理员
  • 主题28323
  • 回复0
楼主

  在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认证测验站。

0
回帖

如何更改Oracle数据库表的表空间? 期待您的回复!

取消