最近の投稿
Docker上で動かしている Oracle Database 11g にデータベースをインポートする(Oracle Data Pump)
Docker上で動かしている Oracle Database 11g のバックアップをとった。
Docker上で動かしている Oracle Database 11g にあるデータベースのバックアップをとる(Oracle Data Pump)
今度はこれをインポートしてみる。
Docker環境
1) Dockerディレクトリのコピー
まず、データが空のデータベースを作成する。
Dockerのディレクトリをまるまるコピーする。
前回 Dockerのディレクトリは、~/Docker/oracle なので、
$ cp -r ~/Docker/oracle ~Docker/oracle_test
として、まるごとコピーした。
2) データを空にする。
Dockerコンテナと共有しているディレクトリのうち、バックアップ用に使っているのは、
a) oradata
b) backup
c) dump
である。
c) の dump には、前回エクスポートした大事なファイルが入っているので、これ以外の a) と b) のディレクトリの中を空にする。
3) Dockerを起動
$ docker-compose up
Dockerコンテナを作成、起動させる。
データベース・サーバーに接続して作業
1) Dockerコンテナ
まず、Dockerコンテナに入る。
$ docker exec -it oracle11a /bin/bash
今回、Dockerコンテナには 'oracle11a' という名前をつけておいた。
データベースに systemユーザーで入る。
bash-4.2# su oracle bash-4.2$ sqlplus system/XXXXXX SQL>
2) ユーザーの作成
mydbユーザーを作成する。各種権限もつけておく。
SQL> create user mydb identiried by "XXX"; -- パスワード SQL> grant create session to mydb; SQL> grant create table to mydb; SQL> grant resource to mydb; SQL> grant unlimited tablespace to mydb;
インポートに必要なディレクトリオブジェクトを作成する。
SQL> create directory impdp_dir as '/mnt/dump'; ディレクトリが作成されました。
今回は、インポートなので、impdp_dir というオブジェクト名にしておいた。
SQL> exit bash-4.2$
3) インポート作業
インポートのための設定ファイルを作成する。
bash-4.2$ vim impdp_mydb.par directory=impdp_dir dumpfile=expdp_dump.dmp logfile=expdp_dump.log job_name=job_impdp
インポート実行
bash-4.2$ impdp mydb/app parfile=impdp_mydb.par
すると、以下のようなメッセージが出力されて、インポートが成功した。
Import: Release 11.2.0.2.0 - Production on 日 2月 28 17:23:01 2021 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 接続先: Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production マスター表"MYDB"."JOB_IMPDP"は正常にロード/アンロードされました "MYDB"."JOB_IMPDP"を起動しています: mydb/******** parfile=impdp_mydb.par オブジェクト型SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAの処理中です オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です . . "MYDB"."BAK_EMP" 7.414 KB 6行がインポートされました . . "MYDB"."DEPT" 5.984 KB 5行がインポートされました . . "MYDB"."EMP" 7.406 KB 6行がインポートされました . . "MYDB"."EMPLOYEE" 5.906 KB 2行がインポートされました . . "MYDB"."MUTTER" 6.046 KB 7行がインポートされました オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です ジョブ"MYDB"."JOB_IMPDP"が17:23:12で正常に完了しました
4) 確認してみる
mydbユーザでデータベースにログインして、確認してみる。
bash-4.2$ sqlplus mysb/XXXX ... SQL> select * from emp; ... SQL> select table_name from user_tables; ...
ちゃんとデータベースがインポートされている。
Docker環境があれば、いろいろ試せて、勉強になる。
参考
エイリアスの使い方
よく忘れるので、メモ。
$ alias ll='ls -laF --color=auto'
Docker上で動かしている Oracle Database 11g にあるデータベースのバックアップをとる(Oracle Data Pump)
バックアップのとり方にはいろいろあるようで、今回は、expdpを使う。(Data Pump)
expdpは Oracle/InstantClient_21 ならクライアントプログラムに入っているが、11gは 入っていない。
おそらく、サーバー上で動作させるコマンドだからだろう。
サーバー上にダンプをとる場所を作って、そこにとることにする。
Docker環境
docker-compose.yml
version: '3' services: database: image: oracle/database:11.2.0.2-xe volumes: - ./oradata:/u01/app/oracle/oradata - ./backup:/mnt/backup - ./dump:/mnt/dump - ./scripts:/u01/app/oracle/scripts ports: - 1521:1521 container_name: docker-oracle11 shm_size: '1gb' environment: - ORACLE_PWD=manager - TZ=Asia/Tokyo - NLS_LANG=Japanese_Japan.AL32UTF8
Docker上の /mnt/dump を、ローカルの ./dump に共有している。
作業開始
Dockerに接続
以下の状態。
$ docker-compose ps Name Command State Ports -------------------------------------------------------------------------------- docker-oracle11 /bin/sh -c exec Up (healthy) 0.0.0.0:1521->1521/tcp $ORACLE_BA ...
Dockerに入る。
$ docker exec -it docker-oracle11 /bin/bash bash-4.2#
vim が必要なので、インストールする。
bash-4.2# yum install -y vim
ダンプファイルを作成するディレクトリのアクアス権限を確認する。
bash-4.2# ls -laF /mnt drwxrwxr-x 2 oracle dba 4096 Feb 28 10:40 dump/
Oracleユーザーになる
Oracleデータベースに接続するためには、oracleユーザーになる必要がある。
bash-4.2# su oracle bash-4.2$ cd bash-4.2$ pwd /u01/app/oracle
以下の内容で、expdp_mydb.parというファイルを作っておく。
$ vim expdp_mydb.par directory=expdp_dir dumpfile=expdp_dump.dmp logfile=expdp_dump.log job_name=job_expdp
Oracleデータベースにsysユーザーでログイン
sysユーザーでログインする。
$ sqlplus / as sysdba
ディレクトリ・オブジェクトを作成し、そのパスを実際のディレクトリに紐付ける。
SQL> create directory expdp_dir as '/mnt/dump'; ディレクトリが作成されました。
(注)
もし、なんらかの事情で、ディレクトリのパスを変更したい場合は、以下のようにする。
SQL> create or replace directory expdp_dir as '/mnt/dump'; ディレクトリが作成されました。
データベースのユーザーに権限を与える。
今回の場合は、mydbユーザーでデータベースを作成している。
SQL> grant read,write on directory expdp_dir to mydb; 権限付与が成功しました。
確認してみる。
SQL> select directory_name, directory_path from dba_directories 2 where directory_name like 'EXPDP%'; DIRECTORY_NAME ------------------------------ DIRECTORY_PATH -------------------------------------------------------------------------------- EXPDP_DIR /mnt/dump
SQL> exit
oracleユーザーに切り替わり、ダンプをとる。
ここからは OracleユーザーでDocker上での作業である。
再確認。
$ cat expdp_mydb.par directory=expdp_dir dumpfile=expdp_dump.dmp logfile=expdp_dump.log job_name=job_expdp
expdpコマンドを実行する。
bash-4.2$ expdp mydb/app parfile=expdp_mydb.par
以下のように出力された。
Export: Release 11.2.0.2.0 - Production on 日 2月 28 10:33:05 2021 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 接続先: Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production "MYDB"."JOB_EXPDP"を起動しています: mydb/******** parfile=expdp_mydb.par BLOCKSメソッドを使用して見積り中です... オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です BLOCKSメソッドを使用した見積り合計: 320 KB オブジェクト型SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAの処理中です オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/INDEXの処理中です オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です オブジェクト型SCHEMA_EXPORT/TABLE/COMMENTの処理中です オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です . . "MYDB"."BAK_EMP" 7.414 KB 6行がエクスポートされました . . "MYDB"."DEPT" 5.984 KB 5行がエクスポートされました . . "MYDB"."EMP" 7.406 KB 6行がエクスポートされました . . "MYDB"."EMPLOYEE" 5.906 KB 2行がエクスポートされました . . "MYDB"."MUTTER" 6.046 KB 7行がエクスポートされました マスター表"MYDB"."JOB_EXPDP"は正常にロード/アンロードされました ****************************************************************************** MYDB.JOB_EXPDPに設定されたダンプ・ファイルは次のとおりです: /mnt/dump/expdp_dump.dmp ジョブ"MYDB"."JOB_EXPDP"が10:33:28で正常に完了しました
Dockerから抜けて、dumpディレクトリを見てみる。
bash-4.2$ exit bash-4.2# exit $ ls -l ./dump -rw-r----- 1 <user> <group> 233472 2月 28 10:33 expdp_dump.dmp -rw-r--r-- 1 <user> <group> 1913 2月 28 10:33 expdp_dump.log
2つのファイルができている。
dmpファイルは、バイナリファイルである。
logファイルは、テキストファイルである。