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
相关推荐
李姆斯14 小时前
复盘上瘾症:到底什么时候该“复盘”,什么时候不需要“复盘”
前端·后端·团队管理
javachen__14 小时前
Spring Boot配置error日志发送至企业微信
spring boot·后端·企业微信
seabirdssss14 小时前
使用Spring Boot DevTools快速重启功能
java·spring boot·后端
OC溥哥99916 小时前
Flask论坛与个人中心页面开发教程完整详细版
后端·python·flask·html
迷知悟道18 小时前
java面向对象四大核心特征之抽象---超详细(保姆级)
java·后端
Aurora_NeAr18 小时前
对比Java学习Go——程序结构与变量
后端
AntBlack18 小时前
每周学点 AI:ComfyUI + Modal 的一键部署脚本
人工智能·后端·aigc
5大大大大雄19 小时前
docker容器日志处理
后端
我是哪吒19 小时前
分布式微服务系统架构第170集:Kafka消费者并发-多节点消费-可扩展性
后端·面试·github
Badman20 小时前
分布式系统下的数据一致性-Redis分布式锁
redis·分布式·后端