Oracleのエラー「ORA-12516」が発生する場合の対処法【リアルタイムレプリケーションツールDBMoto】


DBMotoでOracleを利用したレプリケーションの際に、以下のエラーが発生することがあります。

ORA-12516: TNS: リスナーは、一致するプロトコル・スタックが使用可能なハンドラを検出できませんでした。

■原因

このエラーが発生する原因はいくつか考えられますが、その中の1つとして、DBMotoからOracleへの接続セッション数がOracle側の最大セッション数をオーバーしてしまう際にエラーが発生することがあります。

■対策

Oracle側のセッション数をオーバーしなければいいので、単純に回避方法は下記のどちらかです。

1. Oracle側の最大セッション数を大きくする
2. DBMotoからOracleへの接続セッション数を減らす

1については、Oracle のカーネルの見直しとマシンのメモリを考慮する必要がありますので簡単にはいかない可能性があります。
2については、レプリケーションをまとめて「グループ化」することで効率よくセッション数を減らすことが可能です。

ここでは2の「グループ化」についてご説明します。

■DBMotoのグループ化

DBMotoは、1レプリケーション=1セッションとなります。
レプリケーション対象テーブルが100あれば、100個のレプリケーションを作成することになります。
同時に100個のレプリケーションを動かした場合、最大で100セッションとなる可能性があります。
これだとOracleに高い負荷をかけてしまうことになりかねません。

そこで「グループ化」です。グループ化とは、複数のレプリケーションを1つにまとめることです。
レプリケーションをまとめれば、その分セッション数を減らすことが可能となります。

例えば、100個あるレプリケーションを10レプリケーション×10グループにすることで、
セッション数は最大10まで減らすことが可能となります。

以下の図をご覧ください。これはレプリケーション設定が3つの例です。
この場合はOracleに対して最大3セッションの接続が発生する可能性があります。

次に以下の図をご覧ください。これもレプリケーションが3つの例ですが、
3つのレプリケーションを1グループにまとめてあるので、セッション数は1つとなります。

このように、テーブル数(レプリケーション数)が多い場合には、グループ化を利用してセッション数を減らす運用が一般的です。

※参考:Oracleの最大セッション数を調べるSQL
select name, type, value
from V$SYSTEM_PARAMETER
where name = ‘processes’ or name = ‘sessions’

●参考記事:DBMotoが使うスレッド数の算出方法
http://blog.goo.ne.jp/hitsw/e/fbf02883f9704197af18ac49bf195867

関連したトピックス

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください