Oracle数据库迁移
Oracle数据库迁移有exp/imp,expdp/impdp等神器,但是各自也都有各自的限制(也可能是自己研究不到位)。
exp要求用户和表空间一致,expdb要求用户名一致。但是如果新库和老库的表空间和用户名都不一致如何做迁移呢?
本文介绍借助pl/sql实现数据库的迁移。
1、导出建表结构
通过Tables->右键"Export data"->选择"SQL INSERTS"->选择"Create tables"
注意一定要"where clause处填写wherw 1=2表表示此处只选择表结构不导出数据。
2、创建触发器
该步骤比较复杂:需要先创建一个"GET_VIEW_TEXT"函数来将user_triggers的
trigger_body转换为varchar2类型
CREATE OR REPLACE FUNCTION GET_VIEW_TEXT(tri_name varchar2) return varchar2 is
var_var varchar2(4000);
long_var long;
begin
BEGIN
SELECT trigger_body
INTO long_var
FROM user_triggers
WHERE trigger_name = tri_name
and rownum < 2;
var_var := substr(long_var, 1, 4000);
END;
return var_var;
end GET_VIEW_TEXT;
通过SQL获取触发器的创建语句
select 'create or replace trigger ' ||description ||
GET_VIEW_TEXT(trigger_name)
from user_triggers
3、视图
可以按昭3的方法来生成视图的创建语句,需要修改SQL语句。
SELECT * FROM user_views
4、dblink
按照老库的dblink在新库重建。在新库需要创建一个老库的dblink用于导数据使用。
5、其他对象
通过如下SQL检查是否遗漏对象。
SELECT OBJECT_type,COUNT(*) FROM user_objects
GROUP BY OBJECT_type
ORDER BY object_type
6、根据时间导入数据
选择数据完整的一个时间点,根据user_tables生成导入数据的SQL。
6、新建Sequence
可通过如下SQL语句获取需要创建Sequence的语句。
SELECT 'create sequence ' || SEQUENCE_NAME ||
' MINVALUE 1 MAXVALUE 999999999999999999999999999 start with ' ||
LAST_NUMBER || ' INCREMENT BY ' || INCREMENT_BY || ' CACHE ' ||
CACHE_SIZE||';'
FROM USER_SEQUENCES
WHERE SEQUENCE_NAME<>'AA'