【问题标题】:How to import oracle dump from ec2 instance to RDS in AWS如何将 oracle 转储从 ec2 实例导入 AWS 中的 RDS
【发布时间】:2017-03-02 23:33:24
【问题描述】:

我是 AWS 中的 RDS 新手。我有一个位于 ec2 instance 上的数据库转储文件。我有几个问题:

  1. 如何将转储文件移动到RDS Instance
  2. 执行此操作的先决条件是什么。我的意思是我需要安装什么客户端才能做到这一点。

感谢任何帮助或领导。

谢谢

【问题讨论】:

  • 是的,但我什么也没得到
  • 我已经配置了具有转储文件的 ec2 实例。我还配置了 oracle RDS 实例。我已经在 ec2 实例上安装了 oracle 客户端。现在如何导入转储。那是q问题。请帮帮我。
  • 如果您不了解该文档中的任何内容,我认为您需要聘请某人为您完成。
  • 在这种情况下,我不确定您是否能够在这样的论坛中获得帮助。

标签: oracle amazon-web-services amazon-ec2 amazon-rds


【解决方案1】:

我同意官方文档在Oracle导入转储文件时非常混乱和不清楚。

http://d0.awsstatic.com/whitepapers/strategies-for-migrating-oracle-database-to-aws.pdf 上还有来自亚马逊的另一个文档分步说明,http://fr.slideshare.net/AmazonWebServices/dat308-28616289 上还有一个演示文稿

基本上流程是:

  1. 您需要将文件传输到 Amazon RDS 数据库实例 - Amazon 提供了已定义的 DATA_PUMP_DIR,因此您需要有一个脚本将转储文件从 EC2 实例移动到 Amazon RDS DATA_PUMP_DIR

以下脚本将为您完成这项工作

use DBI;
use warnings;
use strict;

# RDS instance info
my $RDS_PORT=1521;
my $RDS_HOST="<my rds instance>";
my $RDS_LOGIN="<myuser>/*******";
my $RDS_SID="<ORCL_LIKE>"; 

#The $ARGV[0] is a parameter you pass into the script
my $dirname = "DATA_PUMP_DIR";
my $fname = $ARGV[0];

my $data = "dummy";
my $chunk = 8192;

my $sql_open = "BEGIN perl_global.fh := utl_file.fopen(:dirname, :fname, 'wb', :chunk); END;";
my $sql_write = "BEGIN utl_file.put_raw(perl_global.fh, :data, true); END;";
my $sql_close = "BEGIN utl_file.fclose(perl_global.fh); END;";
my $sql_global = "create or replace package perl_global as fh utl_file.file_type; end;";

my $conn = DBI->connect('dbi:Oracle:host='.$RDS_HOST.';sid='.$RDS_SID.';port='.$RDS_PORT,$RDS_LOGIN, '') || die ( $DBI::errstr . "\n");

my $updated=$conn->do($sql_global);
my $stmt = $conn->prepare ($sql_open);
$stmt->bind_param_inout(":dirname", \$dirname, 12);
$stmt->bind_param_inout(":fname", \$fname, 12);
$stmt->bind_param_inout(":chunk", \$chunk, 4);
$stmt->execute() || die ( $DBI::errstr . "\n");

open (INF, $fname) || die "\nCan't open $fname for reading: $!\n";
binmode(INF);
$stmt = $conn->prepare ($sql_write);
my %attrib = ('ora_type','24');
my $val=1;
while ($val> 0) {
  $val = read (INF, $data, $chunk);
  $stmt->bind_param(":data", $data , \%attrib);
  $stmt->execute() || die ( $DBI::errstr . "\n") ; };
die "Problem copying: $!\n" if $!;
close INF || die "Can't close $fname: $!\n";
  $stmt = $conn->prepare ($sql_close);
$stmt->execute() || die ( $DBI::errstr . "\n") ;

确保所有文件都已导入

select * from table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) order by FILENAME;
  1. 将数据从转储文件导入 RDS 实例

您可以运行 impdp 或者您可以使用 PL/SQL 脚本提交作业

declare
  h1    NUMBER;
begin

  h1 := dbms_datapump.open (operation => 'IMPORT', job_mode => 'FULL', job_name => 'IMPORT_DUMP', version => 'COMPATIBLE');
  dbms_datapump.add_file(handle => h1, filename => 'IMPORT.LOG', directory => 'DATA_PUMP_DIR', filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);

  -- optional 
  dbms_datapump.set_parallel(handle => h1, degree => 8);

  dbms_datapump.add_file(handle => h1, filename => 'IMPORT.LOG', directory => 'DATA_PUMP_DIR', filetype => 3);
  dbms_datapump.set_parameter(handle => h1, name => 'KEEP_MASTER', value => 0);

  dbms_datapump.add_file(handle => h1, filename => 'HOST_01.dmp', directory => 'DATA_PUMP_DIR', filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE);
  <repeat the add_file for all your files>

  dbms_datapump.set_parameter(handle => h1, name => 'INCLUDE_METADATA', value => 1);
  dbms_datapump.set_parameter(handle => h1, name => 'DATA_ACCESS_METHOD', value => 'AUTOMATIC');
  dbms_datapump.set_parameter(handle => h1, name => 'REUSE_DATAFILES', value => 0);
  dbms_datapump.set_parameter(handle => h1, name => 'SKIP_UNSUSABLE_INDEXES', value => 0);

  dbms_datapump.start_job(handle => h1, skip_current => 0, abort_step => 0);
  dbms_datapump.detach(handle => h1);
end;
/

导入已完成,数据可用于您的 RDS 数据库。你可以从DATA_PUMP_DIR 清理你的文件,下面的脚本可以完成这项工作

-- remove file from data pump dir
begin
utl_file.fremove ('DATA_PUMP_DIR','import.log');
utl_file.fremove ('DATA_PUMP_DIR','<name of file>.dmp');
end fremove;
/

【讨论】:

  • 你知道了吗:由于 API 与当前作业定义不一致,无法执行当前 API。 DBMS_DATAPUMP.GET_STATUS 提供的后续消息将进一步描述该错误。
猜你喜欢
  • 2018-05-09
  • 2018-06-30
  • 2015-01-18
  • 2018-10-09
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2014-08-18
相关资源
最近更新 更多