先日impコマンドで盛大にずっこけたので戒めに。
接続先の指定漏れに気付くまでおおよそ3日かかるという、呆れてものも言えないやつです。
まぁせっかくなので、色々調べたことをまとめておこうかと思います。
長くなるので先に修正前と修正後をば。
修正前 | 最終修正後 |
---|---|
imp.sh #!/bin/csh setenv ORACLE_SID sid setenv NLS_LANG JAPANESE_JAPAN.JA16SJIS setenv LANG ja_JP.PCK imp ID/PW parfile=imp.par | imp.sh #!/bin/csh setenv ORACLE_SID sid01 setenv NLS_LANG JAPANESE_JAPAN.JA16SJIS setenv LANG ja_JP.PCK imp ID/PW@sid01 parfile=imp.par |
imp.par FILE=./imp.dmp LOG=./imp.log FROMUSER=user01 TOUSER=user01 | imp.par FILE=./imp.dmp LOG=./imp.log FROMUSER=user01 TOUSER=user01 |
ちょいちょい消したり書き換えたりしてますが、ざっくりこんな感じです。
(ORACLE_SIDは書き間違いでなくCDB(※参考サイトを後述)のやつを書いてました、嘘だと思うだろ…ガチなんだぜ…)
parファイルはもうちょっとオプション付けてます。
(゚д゚)って顔されてる気がします、ぐぅの音も出ません。
そもそも何でimpコマンド使ってるの?impdpコマンドでは???と思われそうですが、取得元(客先)がexpコマンドでエクスポートしてるようで仕方なしです。
impdpコマンドの方がずっと楽(先人作のしっかりした手順書がある)なので私もそっちがいいんですが…。
結局impdpコマンドの手順書と、先輩作のimpコマンドの手順メモを元に私がimpコマンド時の手順書作りましたよえぇ。
作ったものの今後使うことがあるのかどうか。
前提として、対象サーバのユーザやオブジェクトを一度消して再作成しています。
作成失敗等エラーが発生していないのは確認済み。
1つのCDBに対し、PDBが2つあります、今回やるのは2つあるうちの片方(PDB01としましょう)。
impコマンドは上記の通りシェルに記載しています、なので実行するときは[./imp.sh]を叩くのみ。
で、まず修正前のシェルを実行するとこんなエラーが出ました。
(~前述色々~)
. user01のオブジェクトをuser01にインポートしています
IMP-00003: Oracleエラー1435が発生しました。
ORA-01435: ユーザーが存在しません。
インポートは正常に終了しましたが、警告が発生しました。
警告: オブジェクトは別のユーザー: userによってエクスポートされました。
とか
IMP-00403:
警告: このインポートでは、権限の問題により失敗したDDLを含む別個のSQLファイル”./imp_sys.sql”が生成されました。
とかは特に気にしなくても大丈夫です。
が、IMP-00403の方は今回で言うimp_sys.sqlの容量が1KB以上だと問題ありなので、内容を確認する必要があります。
詳しくはこちらをどうぞ、英語の記事ですがchromeの翻訳機能でざっくり分かると思います。
JoeLi’s TechLife
IMP-00403: Warning: This import generated a separate SQL file “logfilename_sys” which contains DDL that failed due to a privilege issue.
話はORA-01435に戻ってユーザーが存在しない問題ですが、対象のサーバには存在する。
([SELECT * FROM all_users;]で確認)
@IT atmarkit
■ユーザーの確認/作成/変更/削除
リーダーに分かんねぇ!と泣きついて見てもらい、ORACLE_SIDが間違ってることをようやく発見。
上にちらっと書いた通りCDBのSIDにしていました。
CDBとはコンテナデータベースのことで、もう一つPDBというプラガブルデータベースというものがあります。
Oracle12cから実装されたもので、私はCDBの中に複数のPDBを作成できる、という認識。
CDBはパブリック、PDBはローカル的な(?)
学校(CDB)という大きな枠の中に1年生(PDB1)、2年生(PDB2)…と言った小さな枠が存在する、的な。
CDBがどうとかPDBがどうとか先輩が言ってたなー程度にしか知らなかったので、こちらのサイトにお邪魔しました。
ひとりでできるもん.com
マルチテナントとは
完全に話が反れますが、お連れにスキーマとかテーブルとかの階層を聞かれた際、こう例えたことを思い出しました。
Aという土地(DB)にB国(スキーマ)があり、B国内に建ってる家(テーブル)の部屋割り(カラム)にあった人(データ)が住む。
DB周りは疎い、と言うか苦手なもんで、これ以上は詳しい人に聞くか調べてください。頑張って!
リーダーの指摘から以下のように修正。
修正後 |
---|
imp.sh #!/bin/csh setenv ORACLE_SID sid01 setenv NLS_LANG JAPANESE_JAPAN.JA16SJIS setenv LANG ja_JP.PCK imp ID/PW parfile=imp.par |
imp.par FILE=./imp.dmp LOG=./imp.log FROMUSER=user01 TOUSER=user01 |
これで実行して出てきたエラーがこれ。
IMP-00058: Oracleエラー1034が発生しました。
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Solaris-AMD64 Error: 2: No such file or directory
Additional information: 2503
Additional information: -1821195529
IMP-00005: ログオンに失敗しました
IMP-00000: エラーが発生したためインポートを終了します。
株式会社コーソル
ORA-01034: Oracleは使用できません。
ORA-27101: shared memory realm does not exis
PDBのSIDを指定しているのに、ログオンはCDBを向いているのでこけている、というのは今となれば分かるんですがその時は分からず。
SID修正前で良かったんじゃないかとユーザーの確認をし始めます。
まずimp.dmpの中身を確認。
インポートする気がないので何かしらのユーザーでOracle接続しつつ直接叩きます。
[imp ID/PW file=imp.dmp log=a.log fromuser=user01 touser=user01 show=y]
ablog
Oracle で dump ファイルの中身を確認する
(記事は古いですが、コマンドは生きているので参考になります)
試しにa.logとして出力しましたが、ユーザーはちゃんといます。
去年もやってますから当たり前っちゃ当たり前なんですが。
続いて、どう叩いたらどっち(CDB、PDB)を向くのか確認してみます。
(ついでに気になったのでSIDも確認)
ひとりでできるもん.com
cdbpdbへの接続
Oracle初心者でもスッキリわかる
Oracle SIDを確認・設定する方法
[show con_name]
・sqlplus / as sysdba
→CDB$ROOT
・sqlplus ID/PW@sid01
→pdb01
・sqlplus ID/PW
→CDB$ROOT
[SELECT INSTANCE_NAME FROM V$INSTANCE;]
・sqlplus / as sysdba
・sqlplus ID/PW@sid01
・sqlplus ID/PW
→INSTANCE_NAME
--------------------------------
sid
(クライアント端末からsysユーザーとか、接続先をIP、SIDで指定しても結果は一緒。
一括してCDBのSIDが表示されるのは意外というか、そうなんだってなりました)
あれ?と思い別の向け先のimpコマンドを覗いてようやく最終修正後に辿り着きました。
特に時間に追われる作業じゃなかったので結構ゆっくり調査してましたが、もっとしっかり他の見ときゃよかったんじゃん!と。
あ”ー!となるのは恒例行事。
impコマンドに”;”を付けていた、とかパラメーターでfull=yを指定していた、とかテクニカルなミスではなく、ただただ馬鹿でしたと言う落ちでした。
クソ雑魚なめくじ!!!