orlace資料庫非常的繁瑣,在linux上的安裝也是非常反人類。步驟非常多且麻煩,容易出錯。不信邪的,在linux上的安裝詳情可以參見oracle官方文檔:
https://docs.oracle.com/cd/E11882_01/install.112/e24326/toc.htm
然後,如果不手動在linux上安裝oracle,或者因為伺服器上還有很多别的應用,不想由于安裝oracle影響到别的應用的正常運作,那麼使用docker容器運作oracle,則是一個不錯的選擇,順便也學習了docker的使用。docker的安裝這裡就不說了,請參考我之前一篇博文:
http://blog.csdn.net/weixin_41004350/article/details/79139930
好的,下面開始進行oracle容器的運作,完成資料庫基本的設定,資料庫的資料導入,資料備份
好的,系統環境: centos7.2 資料庫版本:oracle 11g。
1. 拉取oracle 11g 的鏡像:
用root登陸伺服器,輸入下面的指令,拉取oracle 11g的鏡像,有點大,6.8G多,推薦放用screen放到背景下載下傳。
docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
注意,這個鏡像的底層作業系統版本是centos6.5
2. 鏡像下載下傳完成後,建立容器:
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指令進行導入。
OK,到此,基礎的操作配置已完成。你可以重新送出這個容器作為新的鏡像以儲存修改,随便你。
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/[email protected] 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/[email protected] 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/[email protected] 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。到此。便全部完成了。此隻是做了一個簡單的備份,如何需要将所有資料檔案都持久化,就需要在建立容器的時候,挂載一個存放表空間資料檔案的目錄到容器内,然後在建立表空間的時候,再建立一個臨時表空間,将資料檔案都放入挂載的目錄。這樣存放的資料檔案就能可以持久化了。避免資料的丢失。
如果有什麼寫錯的,或者不明白的地方,歡迎指正