新手,故整理此篇,以备后用。
[b]先说原理:来自网上[/b]
1.为什么出现这样的需求?
[b]无论什么情况,现在我们一个用户的数据存在于多个表空间里,现在想把数据统一放在一个表空间里[/b]
2.如何统一数据表同一个表空间,并保证以后同一个用户的数据保存在一个表空间?
[b]分两步:表迁移、索引迁移。[/b]
------------------
1. 问题描述
目前,某服务系统数据库存在多个表空间,对数据库表的维护造成了一定的影响。
2. 问题解决方案
[b]解决方案:采用脚本来转移数据库表、索引及特殊字段(lob字段类型)[/b]
------------------------------------------------------------------------
连接数据库命令:
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。
[b]1 建立表空间[/b]
数据表空间: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;
[b]2 修改用户默认表空间,clob字段特索引[/b]
首先,创建用户并指定表空间
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);
[color=blue]//运行alter user两行代码后,再运行迁移CLOB的代码,会报错:[b]表或视图不存在[/b],可能是因为我们要修改的表找不到,加上数据库名即可,即:xxx.tablename。
若加上数据库名还没有的话,说明数据库中没有该表,可以从以前的测试库先把表都导过来。
但发现运行后,还是会报错,错误如下:
[b]ORA-01950:对表空间’BUSCARD_DATA’无权限[/b]
此时,需要对我们之前建的用户xxx用户进行授权,即:[color=red]grant resource to xxx;[/color]
-------------------
显示:授权成功!
再运行下列迁移的代码,显示:表已更改。
前面建好xxx用户,我们用xxx用户去登陆,发现会报错:
[b]ora-1045 user lacks create session privilege;logon denied xxx[/b]
这是因为我们建好的xxx用户不具有session权限,用sysdba登陆oracle,进行赋权:
[color=red]grant connect,resource to xxx;[/color]
--------------------
显示:授权成功!
xxx即可登陆数据库[/color]
[b]3 迁移数据[/b]
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;
[color=blue](对上一行的解析,这个命令就是将某张表迁移到某个表空间,为了行到所有要迁移的表,所以我们才要执行红色部分的代码,目的是为了得到所有需要迁移的表。)
目的是把表迁移到表空间:结合实际业务的代码如下:
SELECT 'alter table ' || table_name || ' move tablespace ' ||'BUSCARD_DATA;' as ddl,table_name as tbname
FROM user_tables
where TABLESPACE_NAME = 'BUSCARD_DATA';
[b]得到一堆结果集,执行结果集,即可迁移。[/b][/color]
迁移索引
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'
得到一堆结果集,(数量跟表差不多,是因为一个主键就是一个索引,所以索引大于等于表数量。),即可迁移。
-------------------------------------------------------------
[b]至此,表空间转换成功!
我对此的理解就是对我们第一步建的4个表空间的整理。
即:数据库空间,索引表空间,clob等大字段表空间,临时表空间。[/b]
---------
参考资料:
原文地址:http://tech.ccidnet.com/art/1105/20080122/1349975_1.html
[b]先说原理:来自网上[/b]
1.为什么出现这样的需求?
[b]无论什么情况,现在我们一个用户的数据存在于多个表空间里,现在想把数据统一放在一个表空间里[/b]
2.如何统一数据表同一个表空间,并保证以后同一个用户的数据保存在一个表空间?
[b]分两步:表迁移、索引迁移。[/b]
------------------
1. 问题描述
目前,某服务系统数据库存在多个表空间,对数据库表的维护造成了一定的影响。
2. 问题解决方案
[b]解决方案:采用脚本来转移数据库表、索引及特殊字段(lob字段类型)[/b]
------------------------------------------------------------------------
连接数据库命令:
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。
[b]1 建立表空间[/b]
数据表空间: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;
[b]2 修改用户默认表空间,clob字段特索引[/b]
首先,创建用户并指定表空间
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);
[color=blue]//运行alter user两行代码后,再运行迁移CLOB的代码,会报错:[b]表或视图不存在[/b],可能是因为我们要修改的表找不到,加上数据库名即可,即:xxx.tablename。
若加上数据库名还没有的话,说明数据库中没有该表,可以从以前的测试库先把表都导过来。
但发现运行后,还是会报错,错误如下:
[b]ORA-01950:对表空间’BUSCARD_DATA’无权限[/b]
此时,需要对我们之前建的用户xxx用户进行授权,即:[color=red]grant resource to xxx;[/color]
-------------------
显示:授权成功!
再运行下列迁移的代码,显示:表已更改。
前面建好xxx用户,我们用xxx用户去登陆,发现会报错:
[b]ora-1045 user lacks create session privilege;logon denied xxx[/b]
这是因为我们建好的xxx用户不具有session权限,用sysdba登陆oracle,进行赋权:
[color=red]grant connect,resource to xxx;[/color]
--------------------
显示:授权成功!
xxx即可登陆数据库[/color]
[b]3 迁移数据[/b]
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;
[color=blue](对上一行的解析,这个命令就是将某张表迁移到某个表空间,为了行到所有要迁移的表,所以我们才要执行红色部分的代码,目的是为了得到所有需要迁移的表。)
目的是把表迁移到表空间:结合实际业务的代码如下:
SELECT 'alter table ' || table_name || ' move tablespace ' ||'BUSCARD_DATA;' as ddl,table_name as tbname
FROM user_tables
where TABLESPACE_NAME = 'BUSCARD_DATA';
[b]得到一堆结果集,执行结果集,即可迁移。[/b][/color]
迁移索引
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'
得到一堆结果集,(数量跟表差不多,是因为一个主键就是一个索引,所以索引大于等于表数量。),即可迁移。
-------------------------------------------------------------
[b]至此,表空间转换成功!
我对此的理解就是对我们第一步建的4个表空间的整理。
即:数据库空间,索引表空间,clob等大字段表空间,临时表空间。[/b]
---------
参考资料:
原文地址:http://tech.ccidnet.com/art/1105/20080122/1349975_1.html