1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【oracle】スキーマのコピーをPCで実行する

Posted at

筆者はなんちゃってDBAをしています。
個人の感想ですが、開発者に任せてもいいかなと思っていたことを、メモとして残したいと思います。

開発時にDBスキーマとかテーブル定義などデータ環境は、DBAが作ってくれますよね。
複数人での開発の場合、使うテーブルが重複して窮屈だったりします。
そのような時、テスト用の個人スキーマを準備してくれる現場もあると思います。
今回はあくまでも、そのような環境でかつテストDBを前提に記述します。

※勝手にやると怒られるかも知れないため、ルールが不明なときはDBAに確認しましょう。

DBスキーマのコピーは、データパンプ(datapump)を使うのが一般的だとおもいますが、DBサーバーに入れないためDBAにいちいちお願いするのが面倒だったりしませんか。

そんな時、PCからインポート(imp)/エクスポート(exp)を使ってスキーマをコピーするとこができます。
※PCにオラクルのクライアントがインストールされている前提です。

ここで利用するツールは、下記です。
・sqlplus
・exp(エクスポート)
・imp(インポート)

#手順(sqlplus)#
まずは、個人用スキーマを準備します。
コマンドプロンプトで実行していきます。
①SYSTEM権限でログイン
sqlplusにログインします。

sqlplus system/[パスワード]@[接続先名]
set linesize 1000  //おまじない
set pagesize 0 //おまじない
show user //おまじない

②接続確認
これからドロップする個人用のスキーマに接続している人がいないか確認します。接続中だとスキーマをドロップできないため接続を切ってもらいます。
表示されている情報で誰がつないでいるかわかります。ほとんどの場合、一人事故です。自分がアプリ立ち上げていたり、参照ツールが接続していたりします。

SELECT USERNAME,OSUSER,MACHINE,PROGRAM,status FROM V$SESSION where username = '[個人スキーマ名]';

・強制的に接続を切るには、killコマンドを使います。

select sid, serial#, username, program, status from v$session where username = '[個人スキーマ名]';
//SIDとシリアルNoを確認します。列名は、(sid, serial#)です。
alter system kill session '404, 116';   //(sid, serial#)をセットして実行します。

③スキーマのドロップ(削除)
個人用のスキーマを削除します。
初めて作る場合は、削除対象がないので飛ばします。

drop user [個人スキーマ名] cascade ;

④スキーマの作成
個人用のスキーマを作成します。

CREATE USER [個人スキーマ名] IDENTIFIED BY [パスワード(個人スキーマ接続用)]
DEFAULT TABLESPACE "DATA"
TEMPORARY TABLESPACE TEMP
QUOTA UNLIMITED ON "DATA";

⑤権限付与
個人スキーマは、何ができるかを権限付与します。テスト用なので色々つけておきます。

GRANT
 ALTER SESSION,
 CREATE SESSION,
 SELECT ANY SEQUENCE,
 RESOURCE,
 EXECUTE ANY PROCEDURE,
 DBA,
 CREATE TABLE,
 CREATE MATERIALIZED VIEW
TO
  [個人スキーマ名];

ここまでで、個人用スキーマの準備ができました。
exitでsqlplusを終了します。

#手順(インポート/エクスポート)#
sqlplusは、終了しましたか。

ここからが、コピーの開始です。
コマンドプロンプトでインポート(imp)/エクスポート(exp)をします。

①エクスポート(exp)
データをPC上にエクスポートする。

exp system/[パスワード]@[接続先] file=[PC上のパス]\[エクスポートファイル名].dmp owner=[コピー元のスキーマ名] log=[PC上のパス]\[エクスポートログファイル名].log

②インポート(imp)
エクスポートしたファイルを参照して、個人用スキーマにインポートする。

imp system/[パスワード]@[接続先] file=[PC上のパス]\[エクスポートファイル名].dmp fromuser=[コピー元のスキーマ名] touser=[個人スキーマ名] ignore=y log=[PC上のパス]\[インポートログファイル名].log

これでコピー元のスキーマから、個人スキーマにレコードも含めてまるまるコピーできました。
できたけどアプリの実行中にエラーが出るっていう場合は、権限不足のことが多かったです。
oracleは何をするにも権限が必要なのでDBAに確認しましょう。

以上ですが、参考になれば幸いです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?