サンプルスクリプト
ここで紹介するスクリプトは、さまざまなOSおよびデータベースタスクのスクリプト作成方法の例として提供されています。それらはそのまま供給されます。特定の手順のサポートが必要な場合は、NetAppまたはNetAppリセラーにお問い合わせください。
データベースのシャットダウン
次のPerlスクリプトは、Oracle SIDの引数を1つ指定してデータベースをシャットダウンします。Oracleユーザまたはrootとして実行できます。
#! /usr/bin/perl use strict; use warnings; my $oraclesid=$ARGV[0]; my $oracleuser='oracle'; my @out; my $uid=$<; if ($uid == 0) { @out=`su - $oracleuser -c '. oraenv << EOF1 77 Migration of Oracle Databases to NetApp Storage Systems © 2021 NetApp, Inc. All rights reserved $oraclesid EOF1 sqlplus / as sysdba << EOF2 shutdown immediate; EOF2 ' `;} else { @out=`. oraenv << EOF1 $oraclesid EOF4 sqlplus / as sysdba << EOF2 shutdown immediate; EOF2 `;}; print @out; if ("@out" =~ /ORACLE instance shut down/) { print "$oraclesid shut down\n"; exit 0;} elsif ("@out" =~ /Connected to an idle instance/) { print "$oraclesid already shut down\n"; exit 0;} else { print "$oraclesid failed to shut down\n"; exit 1;}
データベースの起動
次のPerlスクリプトは、Oracle SIDの引数を1つ指定してデータベースをシャットダウンします。Oracleユーザまたはrootとして実行できます。
#! /usr/bin/perl use strict; use warnings; my $oraclesid=$ARGV[0]; my $oracleuser='oracle'; my @out; my $uid=$<; if ($uid == 0) { @out=`su - $oracleuser -c '. oraenv << EOF1 $oraclesid EOF1 sqlplus / as sysdba << EOF2 startup; EOF2 ' `;} else { @out=`. oraenv << EOF3 $oraclesid EOF1 sqlplus / as sysdba << EOF2 startup; EOF2 `;}; print @out; if ("@out" =~ /Database opened/) { print "$oraclesid started\n"; exit 0;} elsif ("@out" =~ /cannot start already-running ORACLE/) { print "$oraclesid already started\n"; exit 1;} else { 78 Migration of Oracle Databases to NetApp Storage Systems © 2021 NetApp, Inc. All rights reserved print "$oraclesid failed to start\n"; exit 1;}
ファイルシステムを読み取り専用に変換
次のスクリプトは、ファイルシステム引数を取り、ディスマウントして読み取り専用として再マウントしようとします。これは、データをレプリケートするためにファイルシステムの可用性を維持しつつ、偶発的な破損から保護する必要がある移行プロセスで役立ちます。
#! /usr/bin/perl use strict; #use warnings; my $filesystem=$ARGV[0]; my @out=`umount '$filesystem'`; if ($? == 0) { print "$filesystem unmounted\n"; @out = `mount -o ro '$filesystem'`; if ($? == 0) { print "$filesystem mounted read-only\n"; exit 0;}} else { print "Unable to unmount $filesystem\n"; exit 1;} print @out;
ファイルシステムの交換
次のスクリプト例は、あるファイルシステムを別のファイルシステムに置き換えるために使用します。`/etc/fstab`ファイルを編集するので、rootとして実行する必要があります。古いファイルシステムと新しいファイルシステムの単一のカンマ区切り引数を受け入れます。
-
ファイルシステムを交換するには、次のスクリプトを実行します。
#! /usr/bin/perl use strict; #use warnings; my $oldfs; my $newfs; my @oldfstab; my @newfstab; my $source; my $mountpoint; my $leftover; my $oldfstabentry=''; my $newfstabentry=''; my $migratedfstabentry=''; ($oldfs, $newfs) = split (',',$ARGV[0]); open(my $filehandle, '<', '/etc/fstab') or die "Could not open /etc/fstab\n"; while (my $line = <$filehandle>) { chomp $line; ($source, $mountpoint, $leftover) = split(/[ , ]/,$line, 3); if ($mountpoint eq $oldfs) { $oldfstabentry = "#Removed by swap script $source $oldfs $leftover";} elsif ($mountpoint eq $newfs) { $newfstabentry = "#Removed by swap script $source $newfs $leftover"; $migratedfstabentry = "$source $oldfs $leftover";} else { push (@newfstab, "$line\n")}} 79 Migration of Oracle Databases to NetApp Storage Systems © 2021 NetApp, Inc. All rights reserved push (@newfstab, "$oldfstabentry\n"); push (@newfstab, "$newfstabentry\n"); push (@newfstab, "$migratedfstabentry\n"); close($filehandle); if ($oldfstabentry eq ''){ die "Could not find $oldfs in /etc/fstab\n";} if ($newfstabentry eq ''){ die "Could not find $newfs in /etc/fstab\n";} my @out=`umount '$newfs'`; if ($? == 0) { print "$newfs unmounted\n";} else { print "Unable to unmount $newfs\n"; exit 1;} @out=`umount '$oldfs'`; if ($? == 0) { print "$oldfs unmounted\n";} else { print "Unable to unmount $oldfs\n"; exit 1;} system("cp /etc/fstab /etc/fstab.bak"); open ($filehandle, ">", '/etc/fstab') or die "Could not open /etc/fstab for writing\n"; for my $line (@newfstab) { print $filehandle $line;} close($filehandle); @out=`mount '$oldfs'`; if ($? == 0) { print "Mounted updated $oldfs\n"; exit 0;} else{ print "Unable to mount updated $oldfs\n"; exit 1;} exit 0;
このスクリプトの使用例として、
/oradata
の移行先/neworadata
および/logs
の移行先/newlogs
。このタスクを実行する最も簡単な方法の1つは、単純なファイルコピー操作を使用して、新しいデバイスを元のマウントポイントに再配置することです。 -
古いファイルシステムと新しいファイルシステムが
/etc/fstab
ファイルは次のとおりです。cluster01:/vol_oradata /oradata nfs rw,bg,vers=3,rsize=65536,wsize=65536 0 0 cluster01:/vol_logs /logs nfs rw,bg,vers=3,rsize=65536,wsize=65536 0 0 cluster01:/vol_neworadata /neworadata nfs rw,bg,vers=3,rsize=65536,wsize=65536 0 0 cluster01:/vol_newlogs /newlogs nfs rw,bg,vers=3,rsize=65536,wsize=65536 0 0
-
このスクリプトを実行すると、現在のファイルシステムがアンマウントされ、新しいファイルシステムに置き換えられます。
[root@jfsc3 scripts]# ./swap.fs.pl /oradata,/neworadata /neworadata unmounted /oradata unmounted Mounted updated /oradata [root@jfsc3 scripts]# ./swap.fs.pl /logs,/newlogs /newlogs unmounted /logs unmounted Mounted updated /logs
-
このスクリプトでは、
/etc/fstab
必要に応じてファイルを作成この例では、次の変更が含まれています。#Removed by swap script cluster01:/vol_oradata /oradata nfs rw,bg,vers=3,rsize=65536,wsize=65536 0 0 #Removed by swap script cluster01:/vol_neworadata /neworadata nfs rw,bg,vers=3,rsize=65536,wsize=65536 0 0 cluster01:/vol_neworadata /oradata nfs rw,bg,vers=3,rsize=65536,wsize=65536 0 0 #Removed by swap script cluster01:/vol_logs /logs nfs rw,bg,vers=3,rsize=65536,wsize=65536 0 0 #Removed by swap script cluster01:/vol_newlogs /newlogs nfs rw,bg,vers=3,rsize=65536,wsize=65536 0 0 cluster01:/vol_newlogs /logs nfs rw,bg,vers=3,rsize=65536,wsize=65536 0 0
データベース移行の自動化
この例では、シャットダウン、起動、およびファイルシステム置換スクリプトを使用して移行を完全に自動化する方法を示します。
#! /usr/bin/perl use strict; #use warnings; my $oraclesid=$ARGV[0]; my @oldfs; my @newfs; my $x=1; while ($x < scalar(@ARGV)) { ($oldfs[$x-1], $newfs[$x-1]) = split (',',$ARGV[$x]); $x+=1;} my @out=`./dbshut.pl '$oraclesid'`; print @out; if ($? ne 0) { print "Failed to shut down database\n"; exit 0;} $x=0; while ($x < scalar(@oldfs)) { my @out=`./mk.fs.readonly.pl '$oldfs[$x]'`; if ($? ne 0) { print "Failed to make filesystem $oldfs[$x] readonly\n"; exit 0;} $x+=1;} $x=0; while ($x < scalar(@oldfs)) { my @out=`rsync -rlpogt --stats --progress --exclude='.snapshot' '$oldfs[$x]/' '/$newfs[$x]/'`; print @out; if ($? ne 0) { print "Failed to copy filesystem $oldfs[$x] to $newfs[$x]\n"; exit 0;} else { print "Succesfully replicated filesystem $oldfs[$x] to $newfs[$x]\n";} $x+=1;} $x=0; while ($x < scalar(@oldfs)) { print "swap $x $oldfs[$x] $newfs[$x]\n"; my @out=`./swap.fs.pl '$oldfs[$x],$newfs[$x]'`; print @out; if ($? ne 0) { print "Failed to swap filesystem $oldfs[$x] for $newfs[$x]\n"; exit 1;} else { print "Swapped filesystem $oldfs[$x] for $newfs[$x]\n";} $x+=1;} my @out=`./dbstart.pl '$oraclesid'`; print @out;
ファイルの場所を表示する
このスクリプトは、多数の重要なデータベースパラメータを収集し、読みやすい形式で出力します。このスクリプトは、データレイアウトを確認する場合に役立ちます。また、他の用途に合わせてスクリプトを変更することもできます。
#! /usr/bin/perl #use strict; #use warnings; my $oraclesid=$ARGV[0]; my $oracleuser='oracle'; my @out; sub dosql{ my $command = @_[0]; my @lines; my $uid=$<; if ($uid == 0) { @lines=`su - $oracleuser -c "export ORAENV_ASK=NO;export ORACLE_SID=$oraclesid;. oraenv -s << EOF1 EOF1 sqlplus -S / as sysdba << EOF2 set heading off $command EOF2 " `;} else { $command=~s/\\\\\\/\\/g; @lines=`export ORAENV_ASK=NO;export ORACLE_SID=$oraclesid;. oraenv -s << EOF1 EOF1 sqlplus -S / as sysdba << EOF2 set heading off $command EOF2 `;}; return @lines} print "\n"; @out=dosql('select name from v\\\\\$datafile;'); print "$oraclesid datafiles:\n"; for $line (@out) { chomp($line); if (length($line)>0) {print "$line\n";}} print "\n"; @out=dosql('select member from v\\\\\$logfile;'); print "$oraclesid redo logs:\n"; for $line (@out) { chomp($line); if (length($line)>0) {print "$line\n";}} print "\n"; @out=dosql('select name from v\\\\\$tempfile;'); print "$oraclesid temp datafiles:\n"; for $line (@out) { chomp($line); if (length($line)>0) {print "$line\n";}} print "\n"; @out=dosql('show parameter spfile;'); print "$oraclesid spfile\n"; for $line (@out) { chomp($line); if (length($line)>0) {print "$line\n";}} print "\n"; @out=dosql('select name||\' \'||value from v\\\\\$parameter where isdefault=\'FALSE\';'); print "$oraclesid key parameters\n"; for $line (@out) { chomp($line); if ($line =~ /control_files/) {print "$line\n";} if ($line =~ /db_create/) {print "$line\n";} if ($line =~ /db_file_name_convert/) {print "$line\n";} if ($line =~ /log_archive_dest/) {print "$line\n";}} if ($line =~ /log_file_name_convert/) {print "$line\n";} if ($line =~ /pdb_file_name_convert/) {print "$line\n";} if ($line =~ /spfile/) {print "$line\n";} print "\n";
ASM移行のクリーンアップ
#! /usr/bin/perl #use strict; #use warnings; my $oraclesid=$ARGV[0]; my $oracleuser='oracle'; my @out; sub dosql{ my $command = @_[0]; my @lines; my $uid=$<; if ($uid == 0) { @lines=`su - $oracleuser -c "export ORAENV_ASK=NO;export ORACLE_SID=$oraclesid;. oraenv -s << EOF1 EOF1 sqlplus -S / as sysdba << EOF2 set heading off $command EOF2 " `;} else { $command=~s/\\\\\\/\\/g; @lines=`export ORAENV_ASK=NO;export ORACLE_SID=$oraclesid;. oraenv -s << EOF1 EOF1 sqlplus -S / as sysdba << EOF2 set heading off $command EOF2 `;} return @lines} print "\n"; @out=dosql('select name from v\\\\\$datafile;'); print @out; print "shutdown immediate;\n"; print "startup mount;\n"; print "\n"; for $line (@out) { if (length($line) > 1) { chomp($line); ($first, $second,$third,$fourth)=split('_',$line); $fourth =~ s/^TS-//; $newname=lc("$fourth.dbf"); $path2file=$line; $path2file=~ /(^.*.\/)/; print "host mv $line $1$newname\n";}} print "\n"; for $line (@out) { if (length($line) > 1) { chomp($line); ($first, $second,$third,$fourth)=split('_',$line); $fourth =~ s/^TS-//; $newname=lc("$fourth.dbf"); $path2file=$line; $path2file=~ /(^.*.\/)/; print "alter database rename file '$line' to '$1$newname';\n";}} print "alter database open;\n"; print "\n";
ASMからファイルシステム名への変換
set serveroutput on; set wrap off; declare cursor df is select file#, name from v$datafile; cursor tf is select file#, name from v$tempfile; cursor lf is select member from v$logfile; firstline boolean := true; begin dbms_output.put_line(CHR(13)); dbms_output.put_line('Parameters for log file conversion:'); dbms_output.put_line(CHR(13)); dbms_output.put('*.log_file_name_convert = '); for lfrec in lf loop if (firstline = true) then dbms_output.put('''' || lfrec.member || ''', '); dbms_output.put('''/NEW_PATH/' || regexp_replace(lfrec.member,'^.*./','') || ''''); else dbms_output.put(',''' || lfrec.member || ''', '); dbms_output.put('''/NEW_PATH/' || regexp_replace(lfrec.member,'^.*./','') || ''''); end if; firstline:=false; end loop; dbms_output.put_line(CHR(13)); dbms_output.put_line(CHR(13)); dbms_output.put_line('rman duplication script:'); dbms_output.put_line(CHR(13)); dbms_output.put_line('run'); dbms_output.put_line('{'); for dfrec in df loop dbms_output.put_line('set newname for datafile ' || dfrec.file# || ' to ''' || dfrec.name ||''';'); end loop; for tfrec in tf loop dbms_output.put_line('set newname for tempfile ' || tfrec.file# || ' to ''' || tfrec.name ||''';'); end loop; dbms_output.put_line('duplicate target database for standby backup location INSERT_PATH_HERE;'); dbms_output.put_line('}'); end; /
データベースでログを再生
このスクリプトは、マウントモードのデータベースに対してOracle SIDの引数を1つ指定し、現在使用可能なすべてのアーカイブログを再生します。
#! /usr/bin/perl use strict; my $oraclesid=$ARGV[0]; my $oracleuser='oracle'; 84 Migration of Oracle Databases to NetApp Storage Systems © 2021 NetApp, Inc. All rights reserved my $uid = $<; my @out; if ($uid == 0) { @out=`su - $oracleuser -c '. oraenv << EOF1 $oraclesid EOF1 sqlplus / as sysdba << EOF2 recover database until cancel; auto EOF2 ' `;} else { @out=`. oraenv << EOF1 $oraclesid EOF1 sqlplus / as sysdba << EOF2 recover database until cancel; auto EOF2 `; } print @out;
スタンバイデータベースでログを再生
このスクリプトは、スタンバイデータベース用に設計されている点を除き、上記のスクリプトと同じです。
#! /usr/bin/perl use strict; my $oraclesid=$ARGV[0]; my $oracleuser='oracle'; my $uid = $<; my @out; if ($uid == 0) { @out=`su - $oracleuser -c '. oraenv << EOF1 $oraclesid EOF1 sqlplus / as sysdba << EOF2 recover standby database until cancel; auto EOF2 ' `;} else { @out=`. oraenv << EOF1 $oraclesid EOF1 sqlplus / as sysdba << EOF2 recover standby database until cancel; auto EOF2 `; } print @out;