### 前言
安裝過Oracle的同學應該都知道,其安裝步驟的繁瑣,以及每一步的小心翼翼,可以說是全程提心吊膽。想想我大學時為了裝Oracle,重裝了多少次系統。。。好不容易裝好了,卻感覺系統被托慢了,學完後解除安裝也會解除安裝不幹淨,不知道會不會影響到其他開發工具。等等諸多困難,現在是真的不想在經曆一次了。是以我打算試着用oracle的docker鏡像來啟動oracle容器,這樣既好解除安裝又不能夠幫助開發,還不影響我的作業系統。**注意:如果你是在校大學生,那麼一定不要偷懶,一定要親自嘗試一下安裝oracle的過程以及oracle的基本指令,折騰那一次對你非常好。哈哈哈** 。 廢話不多說,下邊是本文的大綱:
- 安裝docker
- 拉取Oracle鏡像
- Oracle資料持久化
- 建立表空間、使用者
下邊正式開始
### 安裝Docker
安裝Docker非常簡單,直接訪阿裡雲的鏡像源,其中有詳細的安裝docker過程,下邊是它的連結:
docker安裝方法:
https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.53322f70wQUbMs
### 拉取Oracle鏡像
安裝好Docker後,就可以拉取Oracle鏡像了,執行下邊的指令,大概3個G左右,去睡個覺吧
```bash
sudo docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
```
### Oracle容器資料持久化
由于Docker的生命周期很短,是以當容器重新啟動後,Oracle中存儲的資料将會消失,是以需要将Oracle容器的資料持久化到主控端中,同時使容器啟動時通路主控端的oracle資料目錄,進而實作資料持久化。
**上邊拉取**的oracle鏡像的重要資料分别在容器的`/home/oracle/app/oracle/oradata/`目錄和`/home/oracle/app/oracle/flash_recovery_area/helowin/`目錄下,是以我們要把這兩個目錄的檔案儲存到主控端中.
下邊跟着我一步一步來,不要少任何步驟。
#### 在主控端建立兩個目錄
在主控端中建立兩個目錄用來存儲Oracle的必須檔案:
```bash
mkdir -p /opt/oracle11g-demo-pub/flash_recovery_area
mkdir -p /opt/oracle11g-demo-pub/oradata
```
#### 啟動一個臨時Oracle容器
使用如下指令啟動一個臨時Oracle容器,用于将原始鏡像中的資料存儲到主控端目錄中。
```bash
docker run --name oracle11g_test -d registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
```
執行完上邊指令後會輸出一行編碼,該編碼即為該容器的ID,我們可以通過這個ID的前三位通路容器。
#### 複制臨時Oracle容器中的資料到主控端
将臨時容器的Oracle資料複制到剛剛建立好的目錄中,執行如下指令
```bash
docker cp oracle11g_test:/home/oracle/app/oracle/oradata/helowin /opt/oracle11g-demo-pub/oradata
docker cp oracle11g_test:/home/oracle/app/oracle/flash_recovery_area/helowin/ /opt/oracle11g-demo-pub/flash_recovery_area
```
#### 啟動正式容器,使其挂載主控端目錄
啟動正式的容器,并讓其挂載素主機中建立的那兩個目錄,讓容器通路已有資料
```bash
docker run -v /opt/oracle11g-demo-pub/oradata:/home/oracle/app/oracle/oradata -v /opt/oracle11g-demo-pub/flash_recovery_area/helowin/:/home/oracle/app/oracle/flash_recovery_area/helowin/ -p 1521:1521 --name oracle11g -d registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
```
**說明:**`-v`參數後邊為主控端的目錄,`-p`參數表示容器對外開放的端口号,`-name`為容器的名字.
#### 進入正式Oracle容器,授權可通路目錄
執行以下指令,進入正式Oracle容器中:
```bash
docker exec -it oracle11g bash
```
可以嘗試使用如下指令進入挂載的目錄:
```bash
cd /home/oracle/app/oracle/flash_recovery_area/helowin/
```
不出意料,它應該報`bash: cd: /home/oracle/app/oracle/flash_recovery_area/helowin/: Permission denied`這行錯誤,這行錯誤是說oracle使用者沒有權限通路這個目錄.是以我們需要切換到容器的root使用者下,修改該目錄權限
```bash
su root # 秘密輸入helowin,回車即可
cd /home/oracle/app/oracle/ # 進入該目錄
ll # 檢視目錄權限
total 0
drwxr-x--- 1 oracle oinstall 21 Jan 4 2016 admin
drwxr-xr-x 5 oracle oinstall 43 Aug 23 2014 cfgtoollogs
drwxr-xr-x 3 oracle oinstall 17 Aug 23 2014 checkpoints
drwxrwxr-x 1 oracle oinstall 34 Aug 23 2014 diag
drwxr-x--- 4 oracle oinstall 36 Jan 4 2016 flash_recovery_area
drwxr-xr-x 3 root root 21 Aug 14 19:58 oradata # 注意該目錄
drwxr-xr-x 3 oracle oinstall 18 Aug 26 2014 oradiag_oracle
drwxr-xr-x 1 oracle oinstall 20 Aug 27 2014 product
chown -R oracle.oinstall oradata # 使用該指令修改目錄擁有者
ll
total 0
drwxr-x--- 1 oracle oinstall 21 Jan 4 2016 admin
drwxr-xr-x 5 oracle oinstall 43 Aug 23 2014 cfgtoollogs
drwxr-xr-x 3 oracle oinstall 17 Aug 23 2014 checkpoints
drwxrwxr-x 1 oracle oinstall 34 Aug 23 2014 diag
drwxr-x--- 4 oracle oinstall 36 Jan 4 2016 flash_recovery_area
drwxr-xr-x 3 oracle oinstall 21 Aug 14 19:58 oradata # 可以看到已經修改成功
drwxr-xr-x 3 oracle oinstall 18 Aug 26 2014 oradiag_oracle
drwxr-xr-x 1 oracle oinstall 20 Aug 27 2014 product
cd /home/oracle/app/oracle/flash_recovery_area # 打開另一個目錄
ll
total 0
drwxr-x--- 4 oracle oinstall 41 Jan 4 2016 HELOWIN
drwxr-x--- 2 root root 52 Jan 4 2016 helowin # 注意此處
chown -R oracle.oinstall helowin # 修改該目錄所屬
ll
total 0
drwxr-x--- 4 oracle oinstall 41 Jan 4 2016 HELOWIN
drwxr-x--- 2 oracle oinstall 52 Jan 4 2016 helowin # 修改成功
```
上邊的一頓操作後,傳回oracle使用者,可以使用如下指令:
```bash
su - oracle
```
### 重新開機資料庫
繼續操作,需要切換到oracle使用者中!!!切換完畢後,跟着下邊的指令一個一個敲
```bash
source ~/.bash_profile # 加載環境變量,寫入sqlplus到path中
sqlplus /nolog
SQL>conn / as sysdba # 以DBA角色連接配接到資料庫
SQL>shutdown immediate; # 關閉資料庫執行個體
SQL>startup; # 啟動
```
所有指令執行完畢後,大概是這個樣子:
```bash
sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Thu Aug 15 17:47:24 2019
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>
SQL> shutdown immediate; # 重點
ORA-01507: database not mounted
ORACLE instance shut down.
SQL> startup # 重點
ORACLE instance started.
Total System Global Area 1603411968 bytes
Fixed Size 2213776 bytes
Variable Size 402655344 bytes
Database Buffers 1191182336 bytes
Redo Buffers 7360512 bytes
Database mounted. # 重點
Database opened # 重點
```
如果輸出的内容**重點**部分和我的一樣,則說明oracle資料庫啟動成功了,可以進行下一步的建立使用者後者表空間了,可以繼續操作 了,否則,停止正在運作的容器,并重新開始。可能用到的指令。
```bash
sudo docker ps # 顯示正在運作的容器
sudo docker stop [容器id] # 停止正在運作的容器
sudo docker start [容器id] # 啟動停止運作的容器
sudo docker rm [容器id] # 删除停止狀态的容器
```
### oracle的常用指令
1. 修改使用者資訊
```sql
alter user [使用者名] identified by [密碼];
alter user [使用者名] identified by [密碼];
```
2. 建立使用者
```sql
create user [使用者名] identified by [密碼];
grant connect,resource,dba to [使用者名]; # 使用者授權
```
3. 導入指令
```bash
imp [使用者名]/[密碼]@helowin file=[dmp檔案所在位置] full=y # 注意helowin,是該鏡像的執行個體名
```
4. 建立臨時表空間
```sql
create temporarytablespace user_temp
tempfile '臨時表空間檔案存放路徑,精确到檔案(自定義的)'
size 50m
autoextend on
next 50m maxsize 20480m
extent management local;
```
5. 建立資料表空
```sql
create tablespace user_data
logging
datafile '資料表空間檔案存放路徑,精确到檔案(自定義的)'
size 50m
autoextend on
next 50m maxsize 20480m
extent management local;
```
6. 修改使用者的預設表空間
```sql
alter user [使用者名] default tablespace [表空間名];
```
至此,關于如何使用Docker部署Oracle已經講解完畢。