数据由一个表空间转换到另一个表空间

新手,故整理此篇,以备后用。

先说原理:来自网上

1.为什么出现这样的需求?
无论什么情况,现在我们一个用户的数据存在于多个表空间里,现在想把数据统一放在一个表空间里
2.如何统一数据表同一个表空间,并保证以后同一个用户的数据保存在一个表空间?
分两步:表迁移、索引迁移。
------------------
1. 问题描述
目前,某服务系统数据库存在多个表空间,对数据库表的维护造成了一定的影响。
2. 问题解决方案
解决方案:采用脚本来转移数据库表、索引及特殊字段(lob字段类型)


------------------------------------------------------------------------
连接数据库命令:
sqlplus /nolog
conn /as sysdba

操作之前请先备份数据库 | 命令模式
运行步骤:

select a.tablespace_name,a.table_name from user_tables a;
select index_name, table_name, tablespace_name from user_indexes; 
xxx:内容自定义 | 若是window下,将路径改为xxx\xxx\xxx。
1 建立表空间
数据表空间:create tablespace xxx_data logging datafile '/xxx/xxx/xxx_data01.dbf' size 32m autoextend on next 32m maxsize unlimited extent management local;
索引表空间:create tablespace xxx_index logging  datafile '/xxx/xxx//xxx_index01.dbf' size 32m autoextend on next 32m maxsize unlimited extent management local;
clob等大字段表空间:create tablespace xxx_clob logging  datafile '/xxx/xxx/xxx_clob01.dbf' size 32m autoextend on next 32m maxsize unlimited extent management local;
临时表空间:create temporary tablespace xxx_temp tempfile '/xxx/xxx/xxx_temp01.dbf' size 32m autoextend on next 32m maxsize 4096m extent management local;

2 修改用户默认表空间,clob字段特索引
首先,创建用户并指定表空间
create user /username/ identified by /password/ 
default tablespace xxx_data 
temporary tablespace xxx_temp; 

--------------
alter user xxx temporary tablespace xxx_temp;    
alter user xxx default   tablespace xxx_data;

迁移clob字段数据
ALTER TABLE /tablename/ MOVE  TABLESPACE xxx_clob LOB (CONTENT) STORE AS (TABLESPACE xxx_clob);
ALTER TABLE /tablename/ MOVE  TABLESPACE xxx_clob LOB (MESSAGE) STORE AS (TABLESPACE xxx_clob);

//运行alter user两行代码后,再运行迁移CLOB的代码,会报错:表或视图不存在,可能是因为我们要修改的表找不到,加上数据库名即可,即:xxx.tablename。
若加上数据库名还没有的话,说明数据库中没有该表,可以从以前的测试库先把表都导过来。
但发现运行后,还是会报错,错误如下:
ORA-01950:对表空间’BUSCARD_DATA’无权限
此时,需要对我们之前建的用户xxx用户进行授权,即:[color=red]grant resource to xxx;

-------------------
显示:授权成功!
再运行下列迁移的代码,显示:表已更改。

前面建好xxx用户,我们用xxx用户去登陆,发现会报错:
ora-1045 user lacks create session privilege;logon denied xxx
这是因为我们建好的xxx用户不具有session权限,用sysdba登陆oracle,进行赋权:
grant connect,resource to xxx;
--------------------
显示:授权成功!
xxx即可登陆数据库[/color]


3 迁移数据
SELECT 'alter table ' || table_name || ' move tablespace ' ||'xxx_DATA;' as ddl,table_name as tbname
      FROM user_tables
     where TABLESPACE_NAME  = 'USERS';
执行得到的语句 alter table table_name move tablespace xxx_DATA;
(对上一行的解析,这个命令就是将某张表迁移到某个表空间,为了行到所有要迁移的表,所以我们才要执行红色部分的代码,目的是为了得到所有需要迁移的表。)

目的是把表迁移到表空间:结合实际业务的代码如下:
SELECT 'alter table ' || table_name || ' move tablespace ' ||'BUSCARD_DATA;' as ddl,table_name as tbname
FROM user_tables
where TABLESPACE_NAME  = 'BUSCARD_DATA';
得到一堆结果集,执行结果集,即可迁移。


迁移索引
SELECT 'alter index ' || index_name || ' rebuild tablespace ' ||'xxx_index' as ddl,table_name as tbname
      FROM user_indexes
     where TABLESPACE_NAME =  'USERS'

执行得到的语句 alter index index_name rebuild tablespace xxx_INDEX;(解析同上。)

目的是把索引迁移到表空间:结合实际业务的代码如下:
SELECT 'alter index ' || index_name || ' rebuild tablespace ' ||'buscard_index;' as ddl,table_name as tbname
FROM user_indexes
where TABLESPACE_NAME =  'BUSCARD_DATA'
得到一堆结果集,(数量跟表差不多,是因为一个主键就是一个索引,所以索引大于等于表数量。),即可迁移。


-------------------------------------------------------------
至此,表空间转换成功!
我对此的理解就是对我们第一步建的4个表空间的整理。
即:数据库空间,索引表空间,clob等大字段表空间,临时表空间。


---------
参考资料:
原文地址:http://tech.ccidnet.com/art/1105/20080122/1349975_1.html

猜你喜欢

转载自angelbill3.iteye.com/blog/1860296