2015-02-04 4 views
3

У меня есть файлы дампов из нашего экземпляра OracleDB, и мне нужно импортировать его в наш экземпляр RDS новостей.Импорт дампа Oracle на Amazon RDS

Я следовал инструкциям из http://d0.awsstatic.com/whitepapers/strategies-for-migrating-oracle-database-to-aws.pdf (от p23) и http://www.connecteddba.com/howto/MigratetoRDS.html (что более или менее то же самое)

Файлы на экземпляре EC2 и я могу подключиться к экземпляру RDS, пользователь правильно прав.

я правильно установлены библиотеки перл для запуска сценария

$ perl -e 'use DBI; print $DBI::VERSION,"\n";' 
1.633 
$ perl -e 'use DBD::Oracle; print $DBD::Oracle::VERSION,"\n";' 
1.74 

Я сконфигурированный переменные, чтобы указать на моей информации RDS - Из теста на установление соединения http://www.connecteddba.com/howto/MigratetoRDS.html сайта, она проходит правильно

$ perl test.pl 
Got here without dying 

Однако при запуске сценария копирования он выходит из строя со следующей ошибкой:

$ perl copy_to_rds.pl <myfile>.dmp 
DBD::Oracle::db do warning: ORA-24344: success with compilation error (DBD SUCCESS_WITH_INFO: OCIStmtExecute) [for Statement "create or replace package perl_global as fhutl_file.file_type; end;"] at copy_to_rds.pl line 25. 
DBD::Oracle::st execute failed: ORA-06550: Ligne 1, colonne 7 : 
PLS-00905: object <myrdsuser>.PERL_GLOBAL is invalid 
ORA-06550: Ligne 1, colonne 7 : 
PL/SQL: Statement ignored (DBD ERROR: error possibly near <*> indicator at char 6 in 'BEGIN <*>perl_global.fh := utl_file.fopen(:dirname, :fname, 'wb', :chunk); END;') [for Statement "BEGIN perl_global.fh := utl_file.fopen(:dirname, :fname, 'wb', :chunk); END;" with ParamValues: :chunk=8192, :dirname='DATA_PUMP_DIR', :fname='<myfile>.dmp'] at copy_to_rds.pl line 30. 
ORA-06550: Ligne 1, colonne 7 : 
PLS-00905: object <myrdsuser>.PERL_GLOBAL is invalid 
ORA-06550: Ligne 1, colonne 7 : 
PL/SQL: Statement ignored (DBD ERROR: error possibly near <*> indicator at char 6 in 'BEGIN <*>perl_global.fh := utl_file.fopen(:dirname, :fname, 'wb', :chunk); END;') 

Сценарий выглядит следующим образом:

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 fhutl_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") ; 
+0

Как выглядит ваш код? – Sobrique

+0

'создавать или заменять пакет perl_global как fhutl_file.file_type; end; 'Это не использует правильный синтаксис. – mmmmmpie

+0

Какой должен быть синтаксис? я пропускаю \? Я следую инструкциям из doc –

ответ

1

Для тех, кто приезжает сюда с той же проблемой, на самом деле синтаксис не был правильным и должен был быть

my $sql_global = "create or replace package perl_global as fh utl_file.file_type; end;"; 

сценарий по ссылке не был правильным, но это правильно в pdf-файле с amazon.

+0

, скажем, у меня есть файл data.dmp. Я положил его на EC2 Windows. Я могу подключиться от этого EC2 к Oracle RDS с помощью SQL Developer. Но я не знаю, как запустить скрипт. Не могли бы вы рассказать мне, пожалуйста? –

+0

вам нужно будет установить perl на windows и запустить его из консоли perl или командной строки Windows –

+0

Я разместил свой сценарий ниже. Это не сработало. Он сказал: Неопознанный символ \ x93, отмеченный <- ЗДЕСЬ после y $ data = <- ЗДЕСЬ возле столбца 12 на строке import-oracle.pl 8. –

Смежные вопросы