Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách nhập kết xuất oracle từ phiên bản ec2 sang RDS trong AWS

Tôi đồng ý rằng tài liệu chính thức khá khó hiểu và không rõ ràng khi nói đến việc nhập tệp kết xuất của Oracle.

Có một tài liệu khác hướng dẫn từng bước từ amazon tại http://d0.awsstatic.com/whitepapers/strategies-for-migrating-oracle-database-to-aws.pdf và cả bản trình bày tại http://fr.slideshare.net/AmazonWebServices/dat308-28616289

Về cơ bản quy trình là:

  1. bạn cần chuyển tệp sang phiên bản Amazon RDS DB - Amazon cung cấp DATA_PUMP_DIR đã được xác định vì vậy bạn sẽ cần có một tập lệnh để di chuyển các tệp kết xuất của mình từ phiên bản EC2 sang Amazon RDS DATA_PUMP_DIR

Tập lệnh sau sẽ thực hiện công việc cho bạn

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") ;

đảm bảo tất cả các tệp của bạn đều được nhập

select * from table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) order by FILENAME;
  1. Nhập dữ liệu của bạn từ các tệp kết xuất vào phiên bản RDS của bạn

bạn có thể chạy impdp hoặc bạn có thể gửi công việc bằng tập lệnh 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;
/

Quá trình nhập đã hoàn tất và dữ liệu có sẵn trong db RDS của bạn. bạn có thể xóa các tệp của mình khỏi DATA_PUMP_DIR , tập lệnh sau sẽ thực hiện công việc

-- 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;
/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đặt hàng truy vấn Oracle theo SUM mà không chọn SUM

  2. Các lỗi khi cài đặt jdk 1.7 trong linux

  3. Làm thế nào để sử dụng các tham số trong mệnh đề 'where value in ...'?

  4. Ví dụ về câu lệnh Oracle FOR LOOP SELECT

  5. Mẫu thiết kế tốt nhất để đóng kết nối cơ sở dữ liệu khi ngoại lệ xảy ra