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
因为我现在选用的方式是通过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