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するだけ。