1.拉取oracle 11g 的鏡像:
用root登陸服務器,輸入下面的命令,拉取oracle 11g的鏡像,有點大,6.8G多;
docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g #注意,這個鏡像的底層操作系統版本是centos6.5
2. 鏡像下載完成后,創建容器:
*在創建容器之前首先要在服務器或者虛擬機上創建一個data_temp的目錄(當然這個名字可以隨便取,看個人喜好),並且賦予可讀寫權限,為了下面運行容器做映射:
mkdir /usr/local/data_temp chown -R 500.500 /usr/local/data_temp
創建一個文件目錄,用於掛載到容器內,做oracle數據備份時數據存放的位置,保證備份數據不丟失。並將文件的權限給到 500.500 這個是在容器內的oracle用戶的sid。不用管,后面會用到
docker run -d --name oracle_11g -p 1521:1521 -v /usr/local/data_temp:/home/oracle/data_temp registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
其中,oracle_11g是名稱,-p是端口映射,-v是將宿主機的/usr/local/data_temp 目錄映射到容器內的 /home/oracle/data_temp內。
3. 進入容器:
docker ps ## 查看容器的id號,復制一下 docker exec -it xxxxxxxx /bin/bash ## xxxxxxx就是上一部查看的id號
4 . 查看oracle狀態,修改system用戶密碼:
source ~/.bash_profile ## 加載一下用戶環境變量,進入容器后,自動是oracle用戶
sqlplus /nolog ## 使用sqlplus 工具,進去命令行
SQL> connect /as sysdba ## 使用sysdba 連接oracle,最大權限,os認證,只能在本機上登陸使用。
SQL> select status from v$instance; ## 查看oracle現在的狀態 ,狀態為 OPEN 則正常,表示已開啟狀態。 SQL> alter user system identified by oracle; ## 修改用戶 system 的密碼為 oracle ,可以自定義
5. 修改oracle數據庫編碼為 中國編碼(常用編碼)。 默認的是美國的UTF8編碼(一般不修改):
SQL> select * from nls_database_parameters where parameter ='NLS_CHARACTERSET'; ## 查看數據庫編碼,結果最下面一行則是目前編碼 SQL> shutdown immediate; ## 關閉數據庫 SQL> startup mount; ## 啟動到 mount狀態,oracle分為4個狀態,詳情請百度 SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION; ## 設置session ,下同 SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0; SQL> alter database open; ## 打開oracle到 open狀態 SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK; ## 修改編碼為 ZHS16GBK SQL> shutdown immediate; ## 重啟oracle ,先關閉,再啟動 SQL> startup;
6. 創建自定義的 directory ,用於存放備份數據(很重要):
SQL> create or replace directory DATA_TEMP as '/home/oracle/data_temp'; ## 將掛載進來的目錄/home/oracle/data_temp創建到oracle的directoy中。
創建之后,導出的數據可以指定導出到這個目錄,那么數據可以直接在宿主機上的對應目錄中拿到,持久化保存。另外需要導入的數據文件也是直接放到這個目錄,在容器中則可以調用impdp命令進行導入;至此,基礎的操作配置已完成,你可以重新提交這個容器作為新的鏡像以保存修改。
7. 然后就是創建表空間,創建用戶,並授權:
創建表空間核用戶,這個可以使用工具連接到oracle數據庫上進行創建,也可以手動命令行進行創建。注意依然是在sysdba權限下操作,命令如下:
SQL> select name from v$tempfile; ## 查詢臨時表空間的路徑 ## 下面這句,創建表空間,名:tets ,數據文件路徑復制臨時表空間數據文件路徑然后改一下文件名就行了,大小:1G, 自動增長:50M 。 參數根據自己的需求自行修改 SQL> create tablespace test datafile '/home/oracle/app/oracle/oradata/helowin/tets02.dbf' size 1G reuse autoextend on next 50M maxsize unlimited default storage(initial 128k next 128k minextents 2 maxextents unlimited); SQL> select tablespace_name from dba_tablespaces ## 查看所有表空間,看看是否有剛才創建的 SQL> create user test01 identified by testpasswd default tablespace TEST temporary tablespace TEMP; ## 創建用戶,test01,密碼:testpass,設置默認表空間為剛才創建的 test, 臨時表空間設為默認的 TEMP。 SQL> select username from dba_users ## 查看用戶名,可以看到是否有剛才我們創建的用戶名 SQL> grant connect,dba,exp_full_database,imp_full_database to test01 with admin option; ## 授權用戶 test01,擁有連接,管理員,導入,導出權限,並可以傳遞權限。(根據需求自己定義權限)
8. 導入數據,導出數據:
還記得之前自定義的directory文件目錄嗎?第6步中設置的。 只需要將需要導入的數據文件,放入這個目錄。就可以使用 impdp命令導入數據了。用expdp命令導出的數據,也可以設置放在此文件目錄中,由於這個目錄是最初從宿主機上掛載來的,所以,這些導入導出的數據,將不會隨容器關閉而丟失,可以持久化保存數據。
導出命令如下,注意這里操作的時候要退出sqlplus,回到oracle用戶下操作:
## 導入數據,登陸用戶為剛才創建的用戶,實例為鏡像的實例helowin,數據文件為第6步創建的DATA_TEMP,導入文件為BPM.EXPDP,用戶為test01到test01,這些需要自行修改,導入的用戶和當時導出的用戶最好保持一直。
impdp test01/testpasswd@helowin table_exists_action=replace directory=DATA_TEMP dumpfile=BPM.EXPDP logfile=BPM_20180124.log REMAP_SCHEMA=test01:test01 schemas=test01
## 導出數據,導出文件名為:BPM.EXPDP, 路徑為: DATA_TEMP, 用戶為test01 expdp test01/testpasswd@helowin dumpfile=BPM.EXPDP directory=DATA_TEMP schemas=test01 reuse_dumpfiles=y version=11.2.0.1.0
9. 了解了導入導出后,就可以寫一個簡單的導出數據的腳本,設置定時任務,作為數據備份。
簡單的備份數據的腳本如下:
#! /usr/bin/python import datetime import os import re back_dir = '/home/oracle/data_temp' today = datetime.datetime.today().strftime('%Y-%m-%d') command = 'source /home/oracle/.bash_profile && expdp bpm/bpm@helowin dumpfile=bb pmxk_%s.expdp directory=DATA_TEMP schemas=bpm reuse_dumpfiles=y version=11.2.0.11 .0' %today os.system(command) dirlist = os.listdir(back_dir) for dirname in dirlist: if 'bpmxk' in dirname: time1 = re.findall('bpmxk_(.*?).expdp',dirname)[0] time2 = datetime.datetime.strptime(time1,'%Y-%m-%d') time_diff = datetime.datetime.today() - time2 if time_diff.days > 20: os.remove(back_dir+'\\'+dirname)
然后設置定時任務,進入root賬號操作,此鏡像的root密碼為:helowin。
vi /etc/crontab ## 編輯定時任務配置文件,添加下面一行 * 3 * * * root /home/oracle/oracle_backup.sh ## 每天凌晨3點自行備份腳本 chmod 777 /home/oracle/oracle_backup.sh ## 給備份腳本可執行授權 service crond start ## 啟動crond服務,默認是沒有啟動的。
OK。到此。便全部完成了。此只是做了一個簡單的備份,如何需要將所有數據文件都持久化,就需要在創建容器的時候,掛載一個存放表空間數據文件的目錄到容器內,然后在創建表空間的時候,再創建一個臨時表空間,將數據文件都放入掛載的目錄。這樣存放的數據文件就能可以持久化了。避免數據的丟失。
如果有什么寫錯的,或者不明白的地方,歡迎指正