```
#背景
旧库信息:版本Oracle19c,只有一个pdb(payprepdb),该pdb中有两个用户,分别为DATALOOK1和DATALOOKPR。
新库信息:版本Oracle19c,已创建payprepdb且表空间已创建,但用户未创建。
迁移目标:将DATALOOK1和DATALOOKPR都迁移到新库。
#--------------------------------------------------------------------------------------------------------------------------------------------------
【迁移准备工作及数据导出 --查询结果截图保存以便迁移后对比】
#1.查看字符集(19c可以只查看cdb的字符集)
select userenv('language') from dual;
#2.记录表空间状态、名称
col TABLESPACE_NAME for a15;
col FILE_NAME for a60;
select TABLESPACE_NAME,FILE_NAME from dba_data_files;
#3.记录系统中的用户数量、状态
col USERNAME for a10;
col DEFAULT_TABLESPACE for a20;
col TEMPORARY_TABLESPACE for a20;
select USERNAME,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE,ACCOUNT_STATUS from dba_users where ACCOUNT_STATUS='OPEN';
#4.记录要迁移用户的对象数量、状态(注意修改要迁移的用户的名字)
select object_type, COUNT (1) FROM dba_objects WHERE owner = 'DATALOOK1' GROUP BY object_type ORDER BY 1;
select SCHEMA_USER,count(job) from dba_jobs group by SCHEMA_USER;
#5.记录要迁移用户的角色权限
select GRANTEE,GRANTED_ROLE,ADMIN_OPTION,DEFAULT_ROLE from dba_role_privs where grantee='DATALOOK1';
#6.记录系统中所有的 public 对象,如 public 同义词、public dblink
select OWNER,SYNONYM_NAME from dba_synonyms where OWNER='DATALOOK1';
select * from dba_db_links;
#7.锁定要迁移的用户
alter user DATALOOK1 account lock;
#8.杀掉业务会话
#8.1查询 DATALOOK1 用户的会话信息
select SID,SERIAL#,USERNAME,MACHINE,PROGRAM from gv$session where username='DATALOOK1';
#生成 kill session 所需语句
select 'alter system kill session '''||a.sid||','||a.serial#||',@'||a.inst_id||''' immediate;' from gv$session a where a.username='DATALOOK1';
#复制生成的kill语句,使用sys用户执行,断开DATALOOK1用户建立的连接
#再次查询是否有DATALOOK1用户的会话信息
select SID,SERIAL#,USERNAME,MACHINE,PROGRAM from gv$session where username='DATALOOK1';
#8.2查询 DATALOOKPR 用户的会话信息(重复以上步骤)
#9.修改新旧数据库 job_queue_process
#旧库:
alter system set job_queue_processes=0;
#新库:
alter system set job_queue_processes=0;
#10.在旧的数据库服务器上导出数据
#10.1使用 sys 或者 system 用户登录
#10.2创建逻辑目录(注意修改目录)
create directory expdp_dir as '/home/oracle/dump';
#10.3在操作系统创建对应的目录(使用oracle用户创建)
mkdir /home/oracle/dump
#10.4对创建的目录进行授权
#使用 system 导出时,可以不用进行 DATALOOK1和DATALOOKPR 对 expdp_dir 目录的授权
grant read,write on directory expdp_dir to DATALOOK1;
grant read,write on directory expdp_dir to DATALOOKPR;
#10.5导出 DATALOOK1和DATALOOKPR 用户的信息
#以下语句是导出用户DATALOOK1和用户DATALOOKPR的信息,会生成四个文件;19c中必须是“system/Newcapec2020@127.0.0.1:15210/payprepdb"的格式连接数据库!
expdp system/Newcapec2020@127.0.0.1:15210/payprepdb directory=expdp_dir dumpfile=DATALOOK1%U.dmp logfile=DATALOOK1_export.log schemas=DATALOOK1,DATALOOKPR parallel=4 compression=all
【还原到新库】
#1. 创建表空间(和旧库表空间一致)
#2. 创建用户(用户名和密码与旧库保持一致,若不创建用户则还原后解锁用户即可。)
#3.在新的数据库中创建逻辑目录并授权(如果没有手动创建用户则不需要授权)
create directory impdp_dir as '/home/oracle/dump';
grant read,write on directory impdp_dir to DATALOOK1;
grant read,write on directory impdp_dir to DATALOOKPR;
#4.在服务器上创建物理目录(使用oracle用户创建)
mkdir /home/oracle/dump
#5.把旧数据库服务器expdp导出生成的4个dmp文件拷贝到新服务器impdp_dir目录对应的路径下,将4个dmp文件的所有者和所属组修改为oralce和oinstall
chown oracle.oinstall /home/oracle/dump/*.dmp
#5.impdp 导入数据(注意.dmp文件的大小写)
impdp system/Newcapec2020@127.0.0.1:15210/payprepdb directory=impdp_dir dumpfile=DATALOOK1%U.dmp logfile=DATALOOK1_import.log schemas=DATALOOK1,DATALOOKPR parallel=4 cluster=n
【验证,以下为主要步骤,具体参考迁移文档】
#解锁用户
alter user DATALOOK1 account unlock;
alter user DATALOOKPR account unlock;
#检查数据库用户的对象是否一致(和之前的对比)
select OBJECT_TYPE,COUNT (1) from dba_objects where OWNER = 'DATALOOK1' group by OBJECT_TYPE ORDER BY 1;
select OBJECT_TYPE,COUNT (1) from dba_objects where OWNER = 'DATALOOKPR' group by OBJECT_TYPE ORDER BY 1;
#检查一卡通账本表余额总和(一卡通数据库需要对比,其他不需要。)
#恢复新数据库上job_queue_process
alter system set job_queue_processes=1000;
#关闭旧库(避免数据再写入)
shut immediate;
#如果是dg验证数据是否同步(查看对象数量、状态是否和主库一致。)
select object_type, COUNT (1) FROM dba_objects WHERE owner = 'DATALOOK1' GROUP BY object_type ORDER BY 1;
#现场在业务系统修改数据库配置后测试业务是否正常
```
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




