您的位置:首页 > 数据库

迁移orcle数据库,从生产环境迁移到测试环境(涉及表多个空间合一,千万级数据的迁移)

2016-08-01 00:00 465 查看
摘要: 主要是处理多个表空间合一,千万级数据的迁移

1,先将生产环境的老库做备份,很大的话,最好在linux上直接导出,再移到u盘,现在是在本地的dos命令下进行的。

exp old/old@ip地址:1521/orcl file=f:\old.dmp

2,如果有几个表的数据量太大,比如千万级,可以先将库的结构导出来,用以下命令:

imp old/old@orcl file=f:\old.dmp  indexfile=d:\old.idx rows=n full=y

说明:old/old为用户名和密码,old.dmp是从生产库里别分出来的dmp,然后用本地的orcle做此操作。
3,如果要修改表空间tablespace,可以将导出来的old.idx改为old.sql将里面的表空间全部替换成自己的唯一表空间例如:new_space。然后用以下命令在本地新建用户和表空间:

-- 如果存在此用户和表空间则drop掉
drop user old cascade;
DROP TABLESPACE old_space INCLUDING CONTENTS AND DATAFILES;
-- 新建新的表空间(此表空间名要和刚刚替换的空间名一致)
create tablespace OLD_SPACE datafile 'D:\oracle\oradata\orcl\old_space_dat'
size 512M autoextend on next 128m maxsize unlimited;

-- 创建一用户并赋予表空间和权限,用户名和密码都为old
CREATE USER old IDENTIFIED BY old DEFAULT TABLESPACE OLD_SPACE;
GRANT connect,resource to old;
GRANT insert any table to old;
-- 赋予创建dblink权限
GRANT create public database link,create database link to old;
GRANT create sequence to old;
GRANT UNLIMITED TABLESPACE TO old;
GRANT CREATE TABLE TO old;
GRANT CREATE VIEW TO old;
GRANT select any table TO old;
GRANT debug any procedure, debug connect session TO old;
GRANT delete any table TO old;
GRANT alter any table TO old;
GRANT update any table TO old;
GRANT select_catalog_role to old;
GRANT create public synonym TO old;
GRANT create synonym TO old;
GRANT create job to old;
GRANT manage scheduler to old;
-- 赋予dba权限
GRANT DBA TO old;
COMMIT;

4,在本地登录用old/old进入orcle,执行刚刚备份出来的old.sql表结构索引等脚本。

5,用命令将数据导入进本地新的库,但是要去除掉几个千万级别的表。命令如下:

imp old/old@orcl file=f:\old.dmp ignore=y tables=table1,table2

说明:table1,table2等为含有千万级别数据的表,所以数据展暂时不导入

6,这样新的表做好了

7,现在可以在本地验证你的脚本,验证成功后,需要将所有的表库导出这里有以一个少表和空表导出的缺陷问题。

8,解决本基地无法导出所有表问题如下:

-- 进入命令窗口
SQL> show parameter deferred_segment_creation
-- 看到如下:
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation            boolean     TRUE
-- 再修改为flase
SQL> alter system set deferred_segment_creation=false;
-- 再用上述命令查看,已经改为了false

-- 再使用下面的sql语句查询一下当前用户下的所有空表
select table_name from user_tables where NUM_ROWS=0;
-- 然后用一下SQL语句执行查询
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0
-- 假设我们这里有空表TBL_1,TBL_2,TBL_3,TBL_4,则查询结果如下:
alter table TBL_1 allocate extent;
alter table TBL_2 allocate extent;
alter table TBL_3 allocate extent;
alter table TBL_4 allocate extent;
-- 最后我们把上面的SQL语句执行就可以了。

再导出的dmp的话就是所有的全表了。

9,最后就可以将现在的新的dump导入到新的测试环境了。

10,感谢经理周老师的教导!:grin:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息