OracleDBを11gから12cへ移行
何年かに一度こういう作業が発生します。だいたいやってることは同じなんですが、なにせ何年に一度の作業なもので、やりかたなんか覚えてない。ここに書いとかないと今度やるときまたストレスがたまってしまう。って今度もオレがやるのかな。
前提
現在使っているサーバから新しいサーバへのデータ移行です。新しいサーバにはなにも入ってないし、DBもできてない状況です。
iniファイルを作成する
古いサーバ側の $ORACLE_HOME/dbs以下に init(インスタンス名).ora ってファイルがあるはず。まれにない場合があるけどそういう場合は稼働しているインスタンスのmemoryから吐き出させる。
SQL> create pfile='/tmp/init.ora' from memory;
iniファイルを調整
新しいサーバのディスク構成に合わせて、iniファイルを編集する。
自分の環境では以下のパラメータを調整しました。
パラメータ | 変更点 | ||
_oracle_base | ディレクトリを調整 | ||
_compression_compatibility | 削除 | ||
audit_file_dest | ディレクトリを調整 | ||
background_dump_dest | ディレクトリを調整 | ||
compatible | 新環境のOracleバージョンへ | ||
control_files | ディレクトリを調整 | ||
core_dump_dest | ディレクトリを調整 | ||
db_recovery_file_dest | ディレクトリを調整 | ||
diagnostic_dest | ディレクトリを調整 | ||
local_listener | 削除 | ||
user_dump_dest | ディレクトリを調整 |
インスタンスへ接続
$ sqlplus /nolog SQL> conn system/manager as sysdba ;
さっき調整したiniファイルからspfileを作成する
Oracleのドキュメントだとここで一回シャットダウンしろってことになってるんだけど、必要なのかな。
SQL> create spfile='/u01/oracle/dbs/spfilemynewdb.ora' from PFILE='/tmp/init.ora' ; SQL> shutdown
再度接続してnomountまで上げる
$ sqlplus /nolog SQL> conn system/manager as sysdba ; SQL> startup nomount
旧環境上で以下の情報を入手する
create databaseの前に旧環境下で以下の情報を調査します。
tablespace名とdatafileのパス、サイズ
こういうSQLで調べられます。
SQL> select file_name,tablespace_name from dba_data_files ;
SYSAUX,SYSTEM以外のテーブルスペースとデータファイルの情報を入手。サイズも調べましょう。
pfile中のundo_tablespaceパラメータの値
create database中でundoテーブルスペースを指定しますが、pfileのundo tablespaceパラメータの値と同じである必要があります。
利用している文字コード
SQL> select value from nls_database_parameters where parameter='NLS_CHARACTERSET' AL32UTF8 SQL>
create databaseする
こんな感じです。
create database database_name controlfile reuse logfile group 1 ('/mnt/db/oracle/oradata/hoge/log1/redo0101.log','/mnt/db/oracle/oradata/hoge/log1/redo0102.log') size 8M , group 2 ('/mnt/db/oracle/oradata/hoge/log2/redo0201.log','/mnt/db/oracle/oradata/hoge/log2/redo0202.log') size 8M maxlogfiles 40 datafile '/mnt/db/oracle/oradata/hoge/system01.dbf' size 180357129 autoextend on next 30M sysaux datafile '/mnt/db/oracle/oradata/hoge/sysaux.dbf' size 1048578048 autoextend on next 30M undo tablespace "undotbs1" datafile '/mnt/db/oracle/oradata/hoge/undotbs.dbf' size 1048578048 autoextend on next 30M maxsize unlimited maxdatafiles 240 character set al32utf8
ログファイルの場所は適当に調整。ディレクトリは作っとかないとエラーになります。
system,sysauxのデータファイルにサイズは前段で調べたサイズで。まぁ適当でもいいんですけどね。
undo tablespaceの名前(上記例だと"undotbs1")はpfileのパラメータで指定したものを。
character setの値もそうですね。
SYSTEM,SYSAUX,UNDO以外のテーブルスペースをデータファイルと一緒に作成する
USERとか、ユーザがつくったやつとか。例えばこんな感じです。一時表領域も作成します。
SQL> create tablespace USER datafile '/mnt/db/oracle/oradata/hoge/user01.dbf' size 500M autoextend on next 50M ; SQL> create tablespace DATA_MAIN datafile '/mnt/db/oracle/oradata/hoge/main01.dbf' size 500M autoextend on next 100M SQL> create temporary tablespace temp tempfile '/mnt/db/oracle/oradata/hoge/temp01.dbf' size 500M reuse autoextend on next 50M ;
移行スクリプトを実行
以下の3つのスクリプトを実行する。$ORACLE_HOME/rdmbs/admin以下にあります。
SQL>@/u01/app/oracle/product/12.1.0/db_1/rdbms/admin/catalog.sql SQL>@/u01/app/oracle/product/12.1.0/db_1/rdbms/admin/catspace.sql SQL>@/u01/app/oracle/product/12.1.0/db_1/rdbms/admin/catproc.sql
最後のやつが少々時間がかかる程度。多分データ量に依存するんだと思う。
このスクリプトが終了すると、勝手にopenになります。
あとは旧環境でフルダンプしたファイルをimportするだけ。