使用Oracle Data Pump将数据库迁移到AWS RDS Oracle数据库

钢哥注:本文是对AWS官方博文《使用Oracle Data Pump将数据库迁移到AWS的RDS Oracle数据库》的整理,原文请点击 这里

关键假设

生产数据库的业务有足够的停机时间,在迁移过程中数据不会变化。

准备本地数据库

使用docker镜像在本地快速创建Oracle数据库实例,Oracle数据库版本11.2.0.4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## 下载数据库镜像
docker pull registry.aliyuncs.com/helowin/oracle_11g

## 启动数据库实例
docker run -d --name oracle_11g -p 1521:1521 registry.aliyuncs.com/helowin/oracle_11g

# 查看容器进程
docker ps -a

## 进入容器
docker exec -it 容器ID /bin/bash

## 加载环境变量
source /home/oracle/.bash_profile

## 连接数据库
sqlplus / as sysdba

初始化数据库

创建一些表和数据,作为数据库迁移的模拟数据。

1
2
## 创建数据库导出目录
mkdir -p /home/oracle/datapump/datafiles
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- 连接到数据库
sqlplus / as sysdba

-- 创建test用户
create user test identified by "welcome1";

-- 为test用户授权
grant dba to test;

-- 创建数据表
create table test.aa(id varchar2(20) not null primary key, name varchar2(30));

-- 插入测试数据
insert into test.aa values ('1', 'kenny');
insert into test.aa values ('2', 'gloria');
insert into test.aa values ('3', 'bob');
commit;
/

-- 将数据库导出目录加入到数据库中
create directory dpump_dir as '/home/oracle/datapump/datafiles';

-- 授权
grant read, write on directory dpump_dir to test;

用expdp命令导出数据库

1
2
## 使用expdp命令导出test用户所有表
expdp test/welcome1 directory=dpump_dir dumpfile=test.dmp

配置目标RDS数据库

在源数据库的 tnsnames.ora 文件中配置目标RDS数据库信息

1
rdsorcl=(description=(address_list=(address=(protocol=TCP)(host=orcl.cr72zlp5vle5.ap-northeast-1.rds.amazonaws.com)(port=1517)))(connect_data=(SID=orcl)))
1
2
3
4
5
## 如果连接有错误,用tnsping检查RDS连接信息。正常情况下应返回"OK (xxx msec)"类似的字样
tnsping "(description=(address_list=(address=(protocol=TCP)(host=orcl.cr72zlp5vle5.ap-northeast-1.rds.amazonaws.com)(port=1517)))(connect_data=(SID=rdsorcl)))"

## 使用sqlplus连接目标RDS数据库
sqlplus test/welcome1@rdsorcl
1
2
-- 在目标RDS数据库中创建directory对象
exec rdsadmin.rdsadmin_util.create_directory('dpump_dir');

将导出文件上传到目标RDS数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
-- sqlplus登录源数据库,创建指向目标RDS数据库的db link
create database link to_rds connect to test identified by welcome1 using '(description=(address_list=(address=(protocol=TCP)(host= orcl.cr72zlp5vle5.ap-northeast-1.rds.amazonaws.com)(port=1517)))(connect_data=(SID=orcl)))';

-- 运行DBMS_FILE_TRANSFER包,将导出的数据文件上传到RDS数据库的目录中
BEGIN
DBMS_FILE_TRANSFER.PUT_FILE(
source_directory_object => 'dpump_dir',
source_file_name => 'test.dmp',
destination_directory_object => 'dpump_dir',
destination_file_name => 'test.dmp',
destination_database => 'to_rds');
END;
/

通过impdp命令导入数据

1
impdp test@rdsorcl dumpfile=test.dmp directory=dpump_dir full=y

执行完后检查RDS中的表和数据是否导入成功。

总结

从上面的过程我们可以看到,将一个Oracle数据库迁移到RDS的过程并不复杂,如果源数据库很大,由于需要导出数据、将数据上传到RDS的Data Pump目录、导入数据,迁移的过程也会比较长。

上述过程假设了我们生产数据库的业务有足够的停机时间,在迁移过程中数据不会变化。 如果迁移过程中,源数据库会发生变化,那么我们就需要同步数据中心和RDS数据库间的日志了。

如果源数据库很大,可以在AWS上启动一台中间服务器,并在中间服务器上安装Oracle的客户端软件,将源数据库的 Data Pump 导出文件分片然后scp复制、Tsunami UDP 加速上传等方式将文件上传到中间服务器,然后再上传到RDS的 Data Pump 目录中,这样能加速迁移的过程。

王方钢 / Kenny Wang wechat
0%