19c使用Datapump做数据迁移

本文详细描述了如何在Oracle19c环境中进行数据库迁移,包括设置hostname、配置监听、创建表空间、数据构造(如临时表空间、数据表空间和用户权限)、数据导出与传输,以及在目标端的接收、导入和验证过程。
摘要由CSDN通过智能技术生成
环境:
源库目标库
IP192.168.37.200192.168.37.201
系统版本RedHat 7.9RedHat 7.9
数据库版本19.3.0.0.019.3.0.0.0
SIDbegtar
hostnamebegtar
数据量412KB

详细说明:因为只是做练习,这里采用了两个单例19c作为源端和目的端服务器,环境如上面所写。让我们进入正题:

        TIPS:实际操作以实际命令为准,图片只是展示步骤(我是不会告诉你是我在做的时候忘记截源端的过程图导致的~)

一、hostname设置(源端&目标端)

        编辑hosts:

vi /etc/hosts

#修改成自己的ip和hostname
192.168.37.200 beg
192.168.37.201 tar
二、数据构造:
1、配置默认监听(源端&目标端):

        我这里因为没有配置监听,所以配置一下,配置的可以直接跳过:

su - oracle

cd $ORACLE_HOME/network/admin

vi listener.ora

#将以下内容添加至listener.ora
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = beg)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
     (GLOBAL_DBNAME = beg)
     (ORACLE_HOME = /u01/app/oracle/product/19.3.0/db)
     (SID_NAME = beg)
    )
   )


lsnrctl reload

2、启动数据库
sas

startup

3、创建临时表空间和数据表空间
#这里要注意临时表空间的名称和文件的路径,每个人的路径不一样
CREATE TEMPORARY TABLESPACE temp_tbs TEMPFILE '/u01/app/oracle/oradata/BEG/temp_tbs01.dbf' SIZE 100M AUTOEXTEND ON NEXT 50M MAXSIZE 2G;


CREATE TABLESPACE beg_data DATAFILE '/u01/app/oracle/oradata/BEG/beg_data01.dbf' SIZE 100M AUTOEXTEND ON NEXT 50M MAXSIZE 2G;
4、创建用户kk指定数据表空间

这个命令意思为创建用户kk密码oracle并且指定数据表空间为beg_data,临时表空间为temp_tbs

CREATE USER kk IDENTIFIED BY oracle DEFAULT TABLESPACE beg_data TEMPORARY TABLESPACE temp_tbs QUOTA UNLIMITED ON beg_data;
5、授权
grant connect,resource,dba to kk;

6、查看结果
conn kk/oracle

SELECT DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE FROM user_users;

结果是这样的那就表示没有问题:

7、使用kk用户建表

复制粘贴即可:

#创建 departments 表
CREATE TABLE departments (
    department_id   NUMBER PRIMARY KEY,
    department_name VARCHAR2(50),
    manager_id      NUMBER,
    location_id     NUMBER
);

#创建 employees 表
CREATE TABLE employees (
    employee_id    NUMBER PRIMARY KEY,
    last_name      VARCHAR2(50),
    first_name     VARCHAR2(50),
    email          VARCHAR2(100),
    phone_number   VARCHAR2(20),
    hire_date      DATE,
    job_id         VARCHAR2(50),
    salary         NUMBER,
    manager_id     NUMBER,
    department_id  NUMBER
);
8、数据插入        

        我们这里采用如下方式进行数据插入,效率会高很多很多,内容10个部门,100个员工

        这里说明一下,因为此次重点是进行数据迁移的模拟,对表内的关系没有深入探索。

#创建部门数据
DECLARE
    v_department_id   NUMBER;
    v_manager_id      NUMBER;
    v_location_id     NUMBER;
BEGIN
    FOR i IN 1..10 LOOP
        v_department_id := i;
        v_manager_id := ROUND(DBMS_RANDOM.VALUE(1, 100));
        v_location_id := ROUND(DBMS_RANDOM.VALUE(1, 5));
        
        INSERT INTO departments (department_id, department_name, manager_id, location_id)
        VALUES (v_department_id, 'Department ' || v_department_id, v_manager_id, v_location_id);
    END LOOP;
    COMMIT;
END;
/


#员工
BEGIN
    FOR i IN 1..100 LOOP
        INSERT INTO employees (employee_id, last_name, first_name, email, phone_number, hire_date, job_id, salary, manager_id, department_id)
        VALUES (i,
                'Lastname' || i,
                'Firstname' || i,
                'email' || i || '@example.com',
                TO_CHAR(ROUND(DBMS_RANDOM.VALUE(1000000000, 9999999999))),
                SYSDATE - ROUND(DBMS_RANDOM.VALUE(0, 365*20)),
                'JOB' || ROUND(DBMS_RANDOM.VALUE(1, 10)),
                ROUND(DBMS_RANDOM.VALUE(30000, 100000)),
                ROUND(DBMS_RANDOM.VALUE(1, 100)),
                ROUND(DBMS_RANDOM.VALUE(1, 10)));
    END LOOP;
    COMMIT;
END;
/

我们插入完成之后可以查看下数据:

结果是:department有10条,employees有100条

col DEPARTMENT_NAME for a15;
select * from departments;


col LAST_NAME for a10;
col FIRST_NAME for a10;
col EMAIL for a15;
col JOB_ID for a10;
select * from departments;
三、创建相关目录(源端&目标端)

        此目录用于存放需要传输的数据文件与日志文件,到这一步的时候只有源端建立了kk用户,目标端还没有,所以授权只用在源端授权:

su - root

mkdir -p /u01/app/tempFile


#授予oracle用户相关权限
chown -R oracle:oinstall /u01/app/tempFile

chmod 777 /u01/app/tempFile


#指定目录
su - oracle

sas

startup

create or replace directory tmpDir as '/u01/app/tempFile';


#只在源端操作这一步
grant read, write on directory tmpDir to kk;
四、导出数据表并传输
1、导出数据表

参数说明:kk/oracle 这是用户以及密码, @beg:1521/beg 这三个分别是ip:端口/数据库名称,schemas后面跟的参数是要将用户kk下的所有对象,下面这些directory=tmpDir根据上一步进行设置, dumpfile后是导出的数据名字,logfile=export.log这是日志文件

su - oracle

expdp kk/oracle@beg:1521/beg schemas=kk directory=tmpDir dumpfile=export.dmp logfile=export.log

2、传输文件到目标端
cd /u01/app/tempFile

scp export.dmp oracle@tar:/u01/app/tempFile/export.dmp
[oracle@beg:/u01/app/tempFile]$ scp export.dmp oracle@tar:/u01/app/tempFile/export.dmp
oracle@tar's password:
export.dmp                                    100%  412KB  20.9MB/s   00:00
五、目标端操作
1、创建表空间

依旧是注意路径

su - oracle

sas

startup

#创建临时表空间
CREATE TEMPORARY TABLESPACE temp_tbs TEMPFILE '/u01/app/oracle/oradata/TAR/temp_tbs01.dbf' SIZE 100M AUTOEXTEND ON NEXT 50M MAXSIZE 2G;

#创建数据表空间
CREATE TABLESPACE beg_data
DATAFILE '/u01/app/oracle/oradata/TAR/beg_data01.dbf' SIZE 100M
AUTOEXTEND ON NEXT 50M MAXSIZE 2G;
2、查看/u01/app/tempFile的所有者
cd /u01/app

ll

很明显它的所有者是oracle

六、导入数据至目标端

内容与之前相似,这里就不做过多介绍了

impdp system/oracle@tar:1521/tar schemas=kk directory=tmpDir dumpfile=export.dmp job_name=myjob

七、验证

在上一步中,kk用户已经在目标端自动创建了,我们使用kk用户登录:

sas

conn kk/oracle

我们知道在源端这两个表中一个有10条数据,一个有100条,我们使用以下命令在目标端验证下:

select count(*) from departments;
select count(*) from employees;

至此就OK啦

  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值