Oracle利用数据泵进行数据迁移

Oracle数据迁移

前言

现在公司有一个场景,需要进行Oracle-Oracle进行数据库用户数据迁移,之前也迁移过,但是发现并没有一个很规整的一个操作步骤,所以想整理出来一个完整的操作实践,方便后续迁移后进行实操。

实现步骤

第一步:创建表空间

sql 复制代码
-- 查询当前数据库中所有的表空间
select * from dba_tablespaces;
-- 查看表空间文件,重点看文件名称,区分单机与rac方式
-- 如果单机,为本地路径,如果是rac,则为ASM地址
select * from dba_data_files;
-- 查询结果,目前新数据库为RAC方式
-- +DATA/HNJSDB/DATAFILE/system.260.1208633371
-- +DATA/HNJSDB/DATAFILE/sysaux.261.1208633373
-- +DATA/HNJSDB/DATAFILE/undotbs1.262.1208633373
-- +DATA/HNJSDB/DATAFILE/undotbs2.264.1208633381
-- +DATA/HNJSDB/DATAFILE/users.265.1208633381
-- +DATA/HNJSDB/DATAFILE/hnjs_data.269.1208551939
​
-- 创建表空间,开始阶段可以先创建出30G的空间
create tablespace SJJS_DATA
DATAFILE '+DATA/HNJSDB/DATAFILE/sjjs_data001.dbf' -- 注意这个路径的写法
size 30G
autoextend on next 500M maxsize unlimited
extent management local autoallocate
segment space management auto;

第二步:创建用户

sql 复制代码
-- 需要创建出所需的用户
drop user sjjs cascade; -- 如有需要则执行
create user sjjs identified by "Sjjs2024" default tablespace sjjs_data;
grant dba,resource,connect to sjjs;
grant create table to sjjs;
grant create view to sjjs;
grant create tablespace to sjjs;
grant unlimited tablespace to sjjs;
grant unlimited tablespace to sjjs;
grant select any table to sjjs;
grant select any dictionary to sjjs;
grant exp_full_database to sjjs;

第三步:创建目录

bash 复制代码
-- 查看已有的目录
select * from dba_directories;
​
1   SYS DMP_DIR /home/oracle/dmp    0
2   SYS SDO_DIR_WORK        0
3   SYS SDO_DIR_ADMIN   /u01/app/oracle/product/18.3.0/db_1/md/admin    0
4   SYS XMLDIR  /u01/app/oracle/product/18.3.0/db_1/rdbms/xml   0
5   SYS XSDDIR  /u01/app/oracle/product/18.3.0/db_1/rdbms/xml/schema    0
6   SYS ORACLE_OCM_CONFIG_DIR2  /u01/app/oracle/product/18.3.0/db_1/ccr/state   0
7   SYS ORACLE_OCM_CONFIG_DIR   /u01/app/oracle/product/18.3.0/db_1/ccr/state   0
8   SYS OPATCH_INST_DIR /u01/app/oracle/product/18.3.0/db_1/OPatch  0
9   SYS DATA_PUMP_DIR   /u01/app/oracle/product/18.3.0/db_1/rdbms/log/  0
10  SYS OPATCH_SCRIPT_DIR   /u01/app/oracle/product/18.3.0/db_1/QOpatch 0
11  SYS OPATCH_LOG_DIR  /u01/app/oracle/product/18.3.0/db_1/rdbms/log   0
12  SYS ORACLE_BASE /u01/app/oracle 0
13  SYS ORACLE_HOME /u01/app/oracle/product/18.3.0/db_1 0
​
create directory DMP_DIR as '/home/oracle/dmp'; -- 创建本地路径
grant read,write on directory DMP_DIR to sjjs; -- 需要授权给这个用户

因为我现在选用的方式是通过DBLINK的方式,将数据迁移出来的。

sql 复制代码
-- 这一步需要进入到新创建的用户下执行
create database link sjjs84 
connect to sjjs
identified by Sjjs2024
using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS  = (PROTOCOL = TCP)(HOST = 10.170.1.84)(PORT = 1521)))(CONNECT_DATA = (SERVER=deicated)(SERVICE_NAME = fkpdb)))'
-- 验证一下,如出现问题,请按照报错信息进行解决
select * from zcpt_sjjs_kzb@sjjs84

第五步:导出数据

ini 复制代码
expdp sjjs/Sjjs2024 dumpfile=exp_sjjs20250808.dmp directory=DMP_DIR logfile=exp_sjjs20250808.log network_link='sjjs84' schemas=sjjs parallel=5 cluster=n

导出时出现问题,无权限导出,问题原因是:dblink的目标库的用户无导出权限导致的,登录到那个数据库dba用户进行赋权即可

css 复制代码
grant exp_full_database to sjjs;

再次运行,则可以正常导出

等待一段时间后,任务执行完毕

花费了44分钟,转储文件大小为:86G

导入数据

sql 复制代码
-- 需要有点准备工作
SELECT F.TABLESPACE_NAME ,
       F.TOTAL_BYTES/1024 free
FROM   (SELECT TABLESPACE_NAME,
               Round(Sum(BYTES) / ( 1024 * 1024 ), 2) TOTAL_BYTES,
               Round(Max(BYTES) / ( 1024 * 1024 ), 2) MAX_BYTES
        FROM   SYS.DBA_FREE_SPACE
        GROUP  BY TABLESPACE_NAME) F,
       (SELECT DD.TABLESPACE_NAME,
               Round(Sum(DD.BYTES) / ( 1024 * 1024 ), 2) TOT_GROOTTE_MB
        FROM   SYS.DBA_DATA_FILES DD
        GROUP  BY DD.TABLESPACE_NAME) D
WHERE  D.TABLESPACE_NAME = F.TABLESPACE_NAME; 
-- 查询表空间,应该只有一开始创建的30G,远远不够文件的86G大小,我们需要扩展表空间
alter tablespace SJJS_DATA add datafile '+DATA' size 30G
--我这边是扩展到150G左右,可以按需扩展
​
-- 执行导入操作
impdp sjjs/Sjjs2024@10.170.2.97/hnjsdb directory=DMP_DIR dumpfile=exp_sjjs20250808.dmp logfile=imp_sjjs20250808.log TABLE_EXISTS_ACTION=replace remap_tablespace=SJJS_DATA:SJJS_DATA schemas=sjjs
​

执行报错无日志文件,如果确定目录创建无问题,则有可能目录权限不够的原因

使用root用户登录,将目录权限chmod -R 777 /home/oracle/dmp,再次执行则可以

出现这个问题,也很常见,两个数据库的字符集不一致导致的

当前库的字符集AL32UTF8,可以通过select * from nls_database_parameters where PARAMETER = 'NLS_CHARACTERSET'进行查询。

然后迁移前的库的ZHS16GBK,问题原因是:ZHS16GBK在存放中文字符是需要3个长度,ZHS16GBK是AL32UTF8的超集,所以在字段长度固定的情况下,会出现长度不够的情况。

目前情况下,我这边并没有什么好的解决办法,因为我这个库表对象不多,我挨个调整下字段长度即可,但是实际大数据迁移的情况,这种方式,如果各位有什么好的解决办法,欢迎留言沟通,谢谢。

然后更改完毕字符长度后,又重新导入

bash 复制代码
impdp sjjs/Sjjs2024@10.170.2.97/hnjsdb directory=DMP_DIR dumpfile=exp_sjjs20250808.dmp logfile=imp_sjjs20250808.log TABLE_EXISTS_ACTION=truncate remap_tablespace=SJJS_DATA:SJJS_DATA schemas=sjjs
相关推荐
Java中文社群13 分钟前
说说内存泄漏的常见场景和排查方案?
java·后端·面试
货拉拉技术1 小时前
XXL-JOB参数错乱根因剖析:InheritableThreadLocal在多线程下的隐藏危机
java·分布式·后端
桃源学社(接毕设)1 小时前
基于Django珠宝购物系统设计与实现(LW+源码+讲解+部署)
人工智能·后端·python·django·毕业设计
鹿导的通天塔1 小时前
高级RAG 00:检索增强生成(RAG)简介
人工智能·后端
xuejianxinokok2 小时前
解惑rust中的 Send/Sync(译)
后端·rust
用户6757049885022 小时前
3分钟,手摸手教你用OpenResty搭建高性能隧道代理(附完整配置!)
后端
coding随想2 小时前
网络世界的“快递站”:深入浅出OSI七层模型
后端·网络协议
skeletron20112 小时前
🚀AI评测这么玩(2)——使用开源评测引擎eval-engine实现问答相似度评估
前端·后端
shark_chili3 小时前
颠覆认知!这才是synchronized最硬核的打开方式
后端