Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

impdbでlocalにデータベースを取り込む

More than 1 year has passed since last update.

今日は、windows環境にてimpdbでローカルにデータベースを作成する方法について書いていこうと思います。
ここではデーターベースのインストール方法については割愛します。
インストール方法については、こちらの記事を参考にしてください。

oracle12cをインストールする方法

では、データベースをインストールした前提で、impdbについて記載します。

1.rootユーザーでログインする。

まずはrootユーザーでインストールしたsqlplusにログインします。
コマンドを立ち上げて、以下のコマンドを入力します。

sqlplus sys as sysdba
 設定したパスワード

このrootユーザーでログイン後、コマンドプロンプトの表示は以下のようになります。

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
に接続されました。
SQL>

ここで、きちんとシステムユーザーでログインできているかを確認します。
以下のSQLを叩いてください。

SQL> show con_name;

正しくrootユーザーでログインできていると、以下のような結果が返ってくると思います。

CON_NAME
------------------------------
CDB$ROOT

これは自分が今どのデータベースにいるかを確認するためのSQLです。

oracle12cから、データベース上の概念として、コンテナデータベースとプラガブルデータベースというものが存在しています。
すべてのプラガブルデータベースは、コンテナデータベースの下に存在しています。
コンテナデータベースはいわばすべての親データベースというわけです。

2.プラガブルデータベースへ移動する

1.で用いた「show con_name」コマンドにより、rootでログインすると、まずはコンテナデータベースに入ることがわかりました。

ところで、コンテナデータベースでは、ユーザーを作成したり、表領域を作成することができません。

なのでお次は、いろんなことが出来るプラガブルデータベースへ移動します。

コンテナデータベースからプラガブルデータベースへ移動するには、rootユーザーでsqlplusにログインした状態で、以下のSQLを使います。

SQL> alter session set container=pdborcl;

このコマンドは、コンテナデータベースからプラガブルデータベースへと移動するためのSQLです。

このSQLを実行したのちに、再度「show con_name」コマンドを実行すると、以下のような結果が得られます。

CON_NAME
------------------------------
PDBORCL

これでプラガブルデータベースへと移動できたので、いろんなことができます。
いろんなことが出来るようになったので、まずは表などをいろいろといじるための場所【表領域】を
作ります。

3.表領域を作成する

表領域とは、テーブルを独自に作成したり、消したり、select文やらなんやらでテーブルをいじくりまわすための作業場のようなものです。

それでは表領域を作成します。

rootユーザーでsqlplusにログインした状態で、以下のSQLを実行します。

SQL> create tablespace 表領域名 datafile 'C:\○○○\×××(任意のパス)' size 1000M SEGMENT SPACE MANAGEMENT AUTO;

上のSQLは「任意のパス」の場所に、「表領域名」という名前の表領域を100Mの大きさで作成するということです。表領域の大きさは好きに指定していただいてよいかと思います。

このSQLを実行後、「任意のパス」の場所には、「表領域名」という名前の100Mのファイルが作成されていると思います。

これで表領域が作成できたので、次はユーザーを作成します。

4.ユーザーを作成する

先ほどまでは、rootユーザーでデータベースを動かしていましたが、ここからは独自のユーザーを作り、rootユーザーから独自のユーザーに権限を与えていきます。
rootユーザーの持つ権限を独自のユーザーに与えることで、そのユーザーを用いていろんなことができるようになるというわけです。

では、rootユーザーで以下のSQLを実行しましょう。

SQL> create user ユーザー名 identified by パスワード default tablespace 作成した表領域名 quota unlimited on 作成した表領域名;

このSQLは、ユーザー名:パスワード を作成し、デフォルトで作業する表領域を割り振り、その表領域の使用量をどのくらい割り当てるかを命令しています。

今回は、quota unlimitedなので、無制限に作成した表領域を使用することができます。

次に、作成したこのユーザーに権限を与えます。
コマンドは次の通りです。

SQL> grant dba to 作成したユーザー名;

これで権限を付与できました。
お次にロールを付与します。

SQL> alter user 作成したユーザー名 default role all;

これでロールも付与できました。
こうして作成したユーザーに権限とロールを与えることが出来ました。

ここまでできたところで、以下のSQLを実行し、きちんとユーザーが作成できているかどうかを確認してみましょう。
確認のためには以下のSQLを実行します。

SQL> select * from all_users;

このSQLを用いると作成されたユーザーの一覧が確認できます。

ではユーザーが作成できたことを確認し、お次はディレクトリを作成します。

5.ディレクトリを作成する

2.で表領域を作成する際に、'C:\○○○\×××(任意のパス)'と指定したのを覚えていますでしょうか?
これはパスと呼ばれ、「あるファイルが存在する場所までの道筋」みたいなものです。

しかしこのパス、いちいち書くのは面倒ではないですか?

例えば、「表領域までのパスを書いてくださーい」と言われた場合、毎回毎回'C:\○○○\×××(任意のパス)'と書くのはめんどうですよね?

では、この'C:\○○○\×××(任意のパス)'というパスを「NININOPATH」と書くだけでよくなればすごく便利ですよね。

それを可能とするために作られるのがディレクトリというものです。
ディレクトリはOracle内でのみ使える、環境変数といったものですかね。

ちなみに環境変数は、そのOS内でのみ使えるもので、ディレクトリと同じように、'C:\○○○\×××(任意のパス)'を「NININOPATH」という変数で扱えるようにしてくれます。

では環境変数の話はさておき、ディレクトリを作成するための以下のコマンドをrootユーザーで実行してみます。

SQL> create directory NININOPATH as 'C:\○○○\×××(任意のパス);

これでNININOPATH はC:\○○○\×××(任意のパス)と同じ意味で扱えることが出来るようになりました。

しかし、このディレクトリにも権限があり、初期状態では作成したrootユーザーしかこのC:\○○○\×××(任意のパス)というパスをNININOPATHという変数で扱うことができません。

なので例のごとく、rootユーザーから作成したユーザーにディレクトリの権限を委譲します。

そのために、以下のSQLを実行します。

SQL> grant read, write on directory NININOPATH to 作成したユーザー;

これで作成したユーザーに権限を委譲することが出来ました。

では、きちんとディレクトリが作成できているかを確認するために、以下のSQLを実行します。

SQL> select * from all_directories ;

このコマンドを実行することで、作成されてディレクトリの一覧が確認できます。
自分が作成したディレクトリがあれば、成功です。

ではここまでできたところで、一度rootユーザーからログアウトします。
以下のSQLを実行してください。

SQL> quit

これでsqlplusからログアウトし、コマンドプロンプトへ戻ります。

6.データベースをインポートする

それではいよいよデータベースをインポートします。

が、その前準備として以下の2つの作業をしておきます。

1.あらかじめエクスポートしていたdmpファイルを5で作成したディレクトリの配下に移動させておきます。
2.空のログファイルを作成しておきます。テキストエディタで新規ファイルを作成し、中身は何も書かず、○○.logとして、5で作成したディレクトリの配下に移動させておきます。
3.また、インポートしたいデータベース内で以下のSQLを実行し、テーブルスペース名とスキーマ名を確認しておいてください。

--表領域名を取得
SELECT * FROM USER_TABLES;

--スキーマを取得
SELECT DISTINCT USERNAME FROM ALL_USERS;

この2つの作業が完了したのち、以下のコマンドを実行します。

impdp ユーザー名/パスワード@localhost:1521/pdborcl directory=NININOPATH dumpfile=○○.DMP remap_schema=☆☆:□□ remap_tablespace=★★:■■ logfile=NININOPATH:○○.log

ユーザー名/パスワード@localhost:1521/pdborclは、ユーザー名/パスワードでlocalhostに作成したデータベースのうちプラガブルデータベースへ接続しますよ、ということです。

directory=NININOPATH dumpfile=○○.DMPは、NININOPATHにいる○○.DMPをインポートしてねということです。

remap_schema=☆☆:□□ は、インポートしたいデータベースで確認したスキーマ名☆☆から4で作成したスキーマに変更してねということです。

remap_tablespace=★★:■■ は、インポートしたデータベースで確認した表領域名★★から3で作成した表領域名に変更してねということです。

logfile=NININOPATH:○○.log は、NININOPATHにいるログファイルを開いてね、ということです。

このコマンドを実行することでインポートがつらつらと行われます。
以上で、impdbでlocalにデータベースを取り込むは完了です。

samurai_se
アニオタ声豚ラーメンレンジャー(本職)兼SE(副業)の勉強のアウトプット用アカウントです。 座右の銘は「人事を尽くして天命を待つ」「降りかかる火の粉は完全消火、ついでに損害賠償請求。保険金がめておかわり3杯」
https://www.untitledreport.tokyo/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away