您好,登錄后才能下訂單哦!
項目需求
據稱現有環境為多節點RAC,管理成本高,主要體現在沒有專業技術人家對基礎設施進行維護。遷移到云上以后,基礎設施維護就節省掉了。而且后邊容量擴充易如反掌,遠程維護之類也比物理環境去現場操作方便許多。
但在云上,oracle RAC實現的兩個前提條件--共享存儲及心跳網絡,不被正式支持,因此要在云上部署oracle RAC用于生產環境,不是一個好的解決方案。經過多輪討論,一致同意在百度云部署單實例oracle 12c,以dataguard方式來保護數據可用性。
當然,相對與RAC,單實例的系統負載能力要差很多;同樣是兩個節點,RAC兩節點是同時對外提供讀寫服務,而單實例dataguard,只有一臺設備對外提供服務,而另一臺只能做備用,與主庫進行數據同步而已。考慮到實際業務訪問量不大的情況,這樣做也在可接受范圍。
基礎設施
兩臺云主機,臨時綁定公網ip,20M獨享帶寬。
資源配置為:cpu 8core,內存32G,系統盤50G,云盤1000G。
云主機默認沒有swap,因此用這1000G云盤的部分做swap,其余用于安裝目錄及數據目錄。
操作系統版本已經有別人選好,版本為CentOS release 6.8,我沒有自主權,不然就選centos 7。不過6也好,關防火墻沒centos 7那么繁瑣。
曾經在阿里云部署了幾套oracle 11g,用的centos 7,在執行正式安裝指令./runInstaller 時,多要一步操作,即以oracle帳號帳號執行 export DISPLAY=:1,不然無法進行下一步。具體參考我以前的文章“阿里云部署oracle 11g”,連接地址為https://blog.51cto.com/sery/2107701 。
軟件使用oracle 12c,有正式授權,讓我自己去官網下載。這還真費事,先下載到自己的個人電腦(不能直接用wget,需要輸入用戶名及密碼驗證—也許我不懂怎么在命令行拼接這個下載的url),再上傳到云主機。接近4G的文件,下載、上傳花了太多時間,唉!
oracle安裝前的準備
主要步驟有:準備交換分區及數據分區、修改主機名、修改系統相關配置及依賴包、準備桌面環境。
◎準備準備交換分區及數據分區
◆準備交換分區
fdisk /dev/vdb mkswap /dev/vdb1 swapon /dev/vdb1 |
Fdisk操作過程中,分區代碼選“82”,大小為18G。執行完上述操作后,用命令free –m檢查是否生效。
由上圖可知,交換分區確實被加載到系統。為了讓交換分區隨系統開機加載,需要修改文件/etc/fstab,加入的內容等描述完加數據分區以后,一并貼出。
◆準備數據分區
fdisk /dev/vdb mkfs.ext4 /dev/vdb2 mkdir /u01 mount /dev/vdb2 /u01 |
為使掛接永久生效,需要對文件/etc/fstab做修改,加入交換分區及數據分區以后,/etc/fstab文件的內容如下所示:
修改完以后,重啟一下系統,用df –h 及 free –m 執行一下,看是否自動掛載交換分區及數據分區。
◎修改主機名
云服務器的主機名,總是莫名其妙,看起來很是不爽。改主機名,有兩個目的,一個是登錄系統便于辨識,另外一個原因是服務器之間通訊用短詞比ip地址省事。需要注意的是,操作系統版本不一樣,修改主機名的方式也可能不同。比如centos 7,就有一個/etc/hostname文件來關聯。對于centos 6及以前版本,與主機名有關系的文件大概有:/etc/sysconfig/network,/etc/sysconfig/network-scriptes/ifcfg-eth0,/etc/hosts。有時候出問題,很可能就在這些文件里主機名的設定,建議挨個檢查。下面只列出兩個云主機的/etc/hosts內容:
[root@oradb162 ~]# more /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 #192.168.0.4 instance-umns7cw3-2 instance-umns7cw3-2.novalocal 192.168.0.4 oradb162 192.168.0.5 oradb95 | [root@oradb95 ~]# more /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.0.5 oradb95 oradb95.novalocal 192.168.0.4 oradb162 |
改完后,如果執行hostname沒見效果,再檢查一遍與主機名相關文件的設置,然后重啟系統試試。主機名生效后,用設定的名稱代替ip地址,兩機互ping測試網絡連通性。
◎準備桌面環境
大部分情況下,我都用遠程桌面方式安裝oracle,這有助于把控整個安裝過程,直觀了解安裝進展及發生的問題。桌面環境由xwindow及vncserver組成,默認情況下,云主機是沒有安裝這兩個工具。多次實踐證明,vncserve配合xwindow為最佳組合,安裝完就能用,不藍屏或灰屏。具體的安裝步驟如下:
yum groupinstall "X Window System" "Desktop" -y yum install tigervnc-server -y |
安裝完這兩個工具以后,只需要啟動vncserver,設置好用戶名和密碼,注意輸出,用客戶端連接的時候需要使用。
連接成功以后,沒有黑屏灰屏,恭喜!
◎修改系統相關配置及依賴包
步驟比較繁雜,因為經常要安裝部署oracle,我就寫了一個腳本,該腳本在11g及12c都有效,其內容為:
[root@oradb95 ~]# more oracle_rep.bash #!/bin/bash #writed by sery 2012-05-16
######################################### #install depending packages # ######################################### yum install gcc* gcc-* gcc-c++-* glibc-devel-* glibc-headers-* compat-libstdc* \ libstdc* elfutils-libelf-devel* libaio-devel* \ sysstat* unixODBC-* pdksh-* ksh compat-libcap1 ######################################## #add groups,user and create dir # ######################################## /usr/sbin/groupadd -g 501 oinstall /usr/sbin/groupadd -g 502 dba useradd -u 1000 -g oinstall -G dba oracle
mkdir /u01/app/ mkdir -p /u01/app/oraInventory mkdir -p /u01/app/oracle chown -R oracle:oinstall /u01/app chmod -R 775 /u01/app
############################################## #modify sysctl.conf # ############################################## cat >> /etc/sysctl.conf <<done fs.file-max = 6815744 kernel.shmall = 2097152 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048576 fs.aio-max-nr = 1048576 done
sysctl -p
############################################### #modify /etc/security/limits.conf # ############################################### cat >> /etc/security/limits.conf << done oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 done
################################################ #modify /etc/pam.d/login # ################################################ echo "session required pam_limits.so">>/etc/pam.d/login
################################################ # setting user oracle env # ################################################ cat >> /home/oracle/.bash_profile <<done export ORACLE_SID=gbdb export ORACLE_UNQNAME=oradb162 export ORACLE_base=/u01/app/oracle export ORACLE_HOME=/u01/app/oracle/product/12.2.0 export PATH=$ORACLE_HOME/bin:$PATH done |
依賴包安裝那步,可能有重復(安裝xwindow桌面環境可能會順帶安裝了一些依賴),不過如果已經安裝過相關的包,執行過程會自動跳過,不會有任何風險存在。執行這個腳本,完事后檢查一下相關目錄是否生成,配置文件是否被修改。
正式安裝oracle
用vnc客戶端連接到云主機,進入系統桌面以后,至少開一個終端窗口,以root帳號執行指令“xhost +”,切換帳號到oracle ,指令為 “su – oracle”。再開一終端窗口,以root帳號把下載來的oracle解包,命令如下:
unzip linuxx64_12201_database.zip |
執行完畢,將在當前路徑生成目錄database,把此目錄復制到/home/oracle,執行命令:
chown –R oracle:oinstall /home/oracle/database |
現在切換到oracle帳號那個終端窗口,執行“./runInstaller”,只要能出安裝界面,一般都不會有問題。
往下進行的時候,選擇只安裝數據庫軟件,即第2個選項。再往下,會檢查依賴包,交換分區等,如有問題,會有輸出提示,按提示處理即可。安裝軟件所需要的時間,跟資源配置相關,資源越好(cpu、內存、硬盤)、速度越快,安裝時間也就越短。
安裝完軟件,檢查一下目錄,看看/u01/app/oracle路徑下,文件目錄是否都生成了。12c正確安裝以后,不需要執行netca來配置監聽器,默認已經弄好了,直接以oracle帳號啟動即可:
[oracle@oradb95 ~]$ su – oracle [oracle@oradb95 ~]$ lsnrctl start [oracle@oradb95 ~]$ lsnrctl status LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 14-JUN-2018 14:47:13
Copyright (c) 1991, 2016, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 12.2.0.1.0 - Production Start Date 14-JUN-2018 10:32:21 Uptime 0 days 4 hr. 14 min. 52 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Log File /u01/app/oracle/diag/tnslsnr/oradb95/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oradb95)(PORT=1521))) The listener supports no services The command completed successfully |
上述操作在兩個服務器都相同。
創建數據庫(僅在主庫操作)
繼續在vnc客戶端進行操作。終端窗口,以oracle帳號執行“dbca”,彈出圖形操作界面,選擇“Create a database(創建一個數據庫)”。
下一步選“typical configuration”,字符集選GBK(這個是對方要求的,也可以創建完后再更改),密碼設置設置建議不要用特殊字符,如“Sd4d@8_”這類的,在連接數據庫的時候,會比較惱火!如果選擇了“Advanced configuration(高級定制方式)”,就順手把歸檔項給選上。由于是舊的項目遷移,沒有選擇12c的新特性“容器數據庫”。內存管理,可工具自己系統資源的情況自行調整(拉滾動條即可)。
高級定制還可以把EM配置上,12c的em還是管理數據庫還是很方便的,特別是擴充系統表空間(默認系統表空間、系統輔助白空間太小,不太適應真實應用)。
連續點幾個“Next”,到匯總界面后,基本就沒什么問題了。
如果對創建的數據庫不滿意,在沒有正式導入數據投入生產以前,再用dbca進行刪除即可。
數據庫創建成功后,實例自動啟動,可查看系統進程進行驗證。更進一步,執行命令:
[root@oradb162 ~]# su - oracle [oracle@oradb162 ~]$ sqlplus / as sysdba;
SQL*Plus: Release 12.2.0.1.0 Production on Fri Jun 15 10:35:53 2018
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> select count(*) from v$session;
COUNT(*) ---------- 46 |
如果得到如上的結果,可以認為一切正常。
前邊我強調過,oracle 默認系統表空間太小,需要調整。有兩種方法:一種是sqlplus客戶端進去執行alter 語句,另一種是em瀏覽器方式。其實都是去操縱那個sql語句而已。下邊以圖形方式來演示這個更改過程,看起來更直觀一些.
鼠標點左側“+SYSTEM”,選中文件那行,如下圖:
點菜單“操作”下拉列表框,選“調整大小”項,彈出具體的操作框,如下兩圖所示:
填寫大小為2G,不急著確定,點“顯示 SQL”,可得到實際sql語句如下:
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/GBDB/datafile/o1_mf_system_fl1mqhrq_.dbf' RESIZE 2G; |
瞧,是不是跟sqlplus敲代碼的效果一樣呢?默認是810M,現在點“確定”按鈕是更改生效。到oracle數據庫目錄實際查看,看文件大小是否發生改變。
[oracle@oradb162 datafile]$ cd /u01/app/oracle/oradata/GBDB/datafile/ [oracle@oradb162 datafile]$ du -hs * 551M o1_mf_sysaux_fl1msk5v_.dbf 2.1G o1_mf_system_fl1mqhrq_.dbf 2.3M o1_mf_temp_fl1mw9p0_.tmp 71M o1_mf_undotbs1_fl1mtnct_.dbf 5.1M o1_mf_users_fl1mtojb_.dbf |
嘿嘿,沒騙人呢,文件大小確實變化了。再用此方法,把輔助表空間調成1G的容量。
Datagurd實現過程
主備兩機都需要操作,而且操作方法有差異,在描述中,我會特別標明,不至于讓他人困惑。
兩臺服務器的監聽器隨oracle 12c的安裝已經自動配置完成,默認監聽并沒有生成文件,需要手動或者執行netca去生成。
◆主庫的監聽文件內容為:
[oracle@oradb162 admin]$ pwd /u01/app/oracle/product/12.2.0/network/admin [oracle@oradb162 admin]$ more listener.ora # listener.ora Network Configuration File: /u01/app/oracle/product/12.2.0/network/admin/listener.ora # Generated by Oracle configuration tools.
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oradb162)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) )
SID_LIST_LISTENER= (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = gbdb) (ORACLE_HOME =/u01/app/oracle/product/12.2.0) (SID_NAME = gbdb) ) ) |
◆備庫的監聽文件內容為:
[oracle@oradb162 admin]$ pwd /u01/app/oracle/product/12.2.0/network/admin [oracle@oradb162 admin]$ more listener.ora # listener.ora Network Configuration File: /u01/app/oracle/product/12.2.0/network/admin/listener.ora # Generated by Oracle configuration tools.
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oradb95)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) )
SID_LIST_LISTENER= (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = gbdb) (ORACLE_HOME =/u01/app/oracle/product/12.2.0) (SID_NAME = gbdb) ) ) |
◎配置本地命名服務
兩臺服務器進行相同的操作。繼續在vnc客戶端,終端窗口以oracle帳號執行netca(開始用文本編輯器編寫tnsname.ora文件,總是不行。比如第一行要定格,不要有空格等,書寫要求太嚴。后用圖形創建,創建完查看文件,即不出錯,又了解實質)。鼠標選取第三項,如圖所示:
選取“add”點“Next”按鈕,“Service Name”填“gbdb”,接著點幾次“Next”,到填“Host name”這里填寫“oradb162(與/etc/hosts設定相一致)”,如下圖所示:
配置完這個,再重復此操作,把oradb95給加上。執行完畢后,tnsname.ora的內容為:
[oracle@oradb95 admin]$ more tnsnames.ora # tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.2.0/network/admin/tnsnames.ora # Generated by Oracle configuration tools.
ORADB162 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oradb162)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = gbdb) ) )
ORADB95 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oradb95)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = gbdb) ) ) |
這樣再也不用擔心書寫格式、寫漏括號“)”啥的了。
得檢驗這些設置有沒有用,在兩臺服務器分別執行如下指令進行驗證:
[oracle@oradb95 admin]$ tnsping oradb95
TNS Ping Utility for Linux: Version 12.2.0.1.0 - Production on 15-JUN-2018 12:08:46
Copyright (c) 1997, 2016, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oradb95)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = oradb95))) OK (0 msec) [oracle@oradb95 admin]$ tnsping oradb162
TNS Ping Utility for Linux: Version 12.2.0.1.0 - Production on 15-JUN-2018 12:08:51
Copyright (c) 1997, 2016, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oradb162)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = oradb162))) OK (0 msec) |
◎主庫啟用歸檔及force logging強制記錄日志
1、歸檔操作:檢查主庫是否處于歸檔,如果不是,則啟用它,具體指令如下(啟用要在mount下進行):
SQL> archive log list; Database log mode No Archive Mode Automatic archival Disabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 11 Current log sequence 13
SQL> alter database archivelog;
Database altered. SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 11 Next log sequence to archive 13 Current log sequence 13 SQL> alter database open;
Database altered. |
2、force logging強制記錄日志:先檢查是否啟用,如未則啟用之(可在數據庫open狀態下執行),步驟如下:
SQL> select force_logging from v$database;
FORCE_LOGGING --------------------------------------- NO
SQL> alter database force logging;
Database altered.
SQL> select force_logging from v$database;
FORCE_LOGGING --------------------------------------- YES |
◎為備庫準備控制文件
在主庫上執行如下操作,生成的文件存放到一個臨時的位置,后邊等其它文件都到齊后,再把它移動到合適的位置。我參考好多文檔,都在創建者玩意,但實際上我用rman復制方式創建備庫,根本就不需要這個控制文件。分析原因,應該是這樣:備庫以 startup nomount pfile 方式啟動實例,只讀取參數文件而已;主庫以rman同時連主備庫,以指令“duplicate target database”從主庫復制所需文件,也包括了控制文件。
SQL> alter database create standby controlfile as '/home/oracle/gdbd.ctl';
Database altered. |
◎主庫創建standby redo log
盡量與主庫現有的日志文件大小相一致,創建的組不少于系統現有的。
查當前日志組大小 SQL> select GROUP#,BYTES/1024/1024 size_M,STATUS,ARCHIVED from v$log;
GROUP# SIZE_M STATUS ARC ---------- ---------- ---------------- --- 1 200 CURRENT NO 2 200 INACTIVE YES 3 200 INACTIVE YES 查存儲路徑 SQL> select MEMBER from v$logfile;
MEMBER -------------------------------------------------------------------------------- /u01/app/oracle/oradata/GBDB/onlinelog/o1_mf_3_fl1mvv1j_.log /u01/app/oracle/fast_recovery_area/gbdb/GBDB/onlinelog/o1_mf_3_fl1mvvkc_.log /u01/app/oracle/oradata/GBDB/onlinelog/o1_mf_2_fl1mvv0q_.log /u01/app/oracle/fast_recovery_area/gbdb/GBDB/onlinelog/o1_mf_2_fl1mvvfs_.log /u01/app/oracle/oradata/GBDB/onlinelog/o1_mf_1_fl1mvty3_.log /u01/app/oracle/fast_recovery_area/gbdb/GBDB/onlinelog/o1_mf_1_fl1mvvgd_.log
6 rows selected. ###一個組兩個成員,路徑不同,大小內容完全一致。 [root@oradb162 ~]# diff /u01/app/oracle/oradata/GBDB/onlinelog/o1_mf_3_fl1mvv1j_.log /u01/app/oracle/fast_recovery_area/gbdb/GBDB/onlinelog/o1_mf_3_fl1mvvkc_.log [root@oradb162 ~]# du /u01/app/oracle/fast_recovery_area/gbdb/GBDB/onlinelog/o1_mf_3_fl1mvvkc_.log 204804 /u01/app/oracle/fast_recovery_area/gbdb/GBDB/onlinelog/o1_mf_3_fl1mvvkc_.log [root@oradb162 ~]# du /u01/app/oracle/oradata/GBDB/onlinelog/o1_mf_3_fl1mvv1j_.log 204804 /u01/app/oracle/oradata/GBDB/onlinelog/o1_mf_3_fl1mvv1j_.log
創建新的日志組,也存放在兩個位置
SQL> alter database add standby logfile group 4 ('/u01/app/oracle/oradata/GBDB/onlinelog/standby01.log','/u01/app/oracle/fast_recovery_area/gbdb/GBDB/onlinelog/stabdy01.log') size 200M;
Database altered.
SQL> alter database add standby logfile group 5 ('/u01/app/oracle/oradata/GBDB/onlinelog/standby02.log','/u01/app/oracle/fast_recovery_area/gbdb/GBDB/onlinelog/stabdy02.log') size 200M;
Database altered.
SQL> alter database add standby logfile group 6 ('/u01/app/oracle/oradata/GBDB/onlinelog/standby03.log','/u01/app/oracle/fast_recovery_area/gbdb/GBDB/onlinelog/stabdy03.log') size 200M;
Database altered.
SQL> alter database add standby logfile group 7 ('/u01/app/oracle/oradata/GBDB/onlinelog/standby04.log','/u01/app/oracle/fast_recovery_area/gbdb/GBDB/onlinelog/stabdy04.log') size 200M;
Database altered.
驗證所創建的組 SQL> select group#,thread#,sequence#,archived,status from v$standby_log;
GROUP# THREAD# SEQUENCE# ARC STATUS ---------- ---------- ---------- --- ---------- 4 0 0 YES UNASSIGNED 5 0 0 YES UNASSIGNED 6 0 0 YES UNASSIGNED 7 0 0 YES UNASSIGNED |
◎準備初始化參數文件
主庫上生成文件,復制到備庫,然后兩個參數文件都需要做修改,以符合實際需求。主庫上對參數的修改,可以直接在sqlplus里執行alter語句,但這不太保險,一旦出錯,容易給自己造成壓力。建議修改參數文件前,做個原始備份,然后修改此參數文件。萬一將來以此修改過的參數文件生成服務器參數文件(spfile)出現異常,備份的那個參數文件就是后悔藥。
◆執行以下指令生成參數文件:
SQL> create pfile='/home/oracle/initgd.ora' from spfile;
File created. 修改修改前做個原始備份 [oracle@oradb162 ~]$ pwd /home/oracle [oracle@oradb162 ~]$ cp initgd.ora initgd.ora.bk20180617 |
復制一份參數文件initgd.ini到備庫服務器的/home/oracle目錄,等待修改。
◆修改主庫參數文件/home/oracle/initgb.ora
在源文件的基礎上增加如下內容(一行太長,有些行自動換行了,書寫時請注意):
*.db_unique_name='oradb162' *.fal_client='oradb162' *.fal_server='oradb95' *.log_archive_config='DG_CONFIG=(oradb162,oradb95)' *.log_archive_dest_1='LOCATION=/u01/app/oracle/fast_recovery_area/gbdb/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=oradb162' *.log_archive_dest_2='SERVICE=oradb95 LGWR ASYNC VALID_FOR=(ALL_LOGFILES,PRIMARY_ROLES) DB_UNIQUE_NAME=oradb95' *.log_archive_dest_state_1='ENABLE' *.log_archive_dest_state_2='ENABLE' *.standby_file_management='AUTO' |
◆準備庫參數文件/home/oracle/initgb.ora
從主庫復制文件,用同樣路徑。把所需文件放在/home/oracle目錄,一來沒權限不足的問題,而來不會與其它數據文件混在一起,等dataguard運行起來以后,這些文件就基本不再使用,不干擾后期維護。
備庫參數文件/home/oracle/initgb.ora的內容如下,與主庫不同的地方,特別用底色做了標記。
[oracle@oradb95 ~]$ more initgb.ora gbdb.__data_transfer_cache_size=0 gbdb.__db_cache_size=7918845952 gbdb.__inmemory_ext_roarea=0 gbdb.__inmemory_ext_rwarea=0 gbdb.__java_pool_size=67108864 gbdb.__large_pool_size=100663296 gbdb.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment gbdb.__pga_aggregate_target=3388997632 gbdb.__sga_target=10099884032 gbdb.__shared_io_pool_size=536870912 gbdb.__shared_pool_size=1442840576 gbdb.__streams_pool_size=0 *.audit_file_dest='/u01/app/oracle/admin/gbdb/adump' *.audit_trail='db' *.compatible='12.2.0' *.control_files='/u01/app/oracle/oradata/GBDB/controlfile/o1_mf_fl1mvrh5_.ctl','/u01/app/oracle/fast_recovery_area/gbdb/GBDB/controlfile controlfile/o1_mf_fl1mvrls_.ctl' *.db_block_size=8192 *.db_create_file_dest='/u01/app/oracle/oradata' *.db_name='gbdb' *.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area/gbdb' *.db_recovery_file_dest_size=8016m *.diagnostic_dest='/u01/app/oracle' *.dispatchers='(PROTOCOL=TCP) (SERVICE=gbdbXDB)' *.local_listener='LISTENER_GBDB' *.open_cursors=300 *.pga_aggregate_target=3209m *.processes=640 *.remote_login_passwordfile='EXCLUSIVE' *.sga_target=9627m *.undo_tablespace='UNDOTBS1'
*.db_unique_name='oradb95' *.fal_client='oradb95' *.fal_server='oradb162' *.log_archive_config='DG_CONFIG=(oradb162,oradb95)' *.log_archive_dest_1='LOCATION=/u01/app/oracle/fast_recovery_area/gbdb/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=oradb95' *.log_archive_dest_2='SERVICE=oradb162 LGWR ASYNC VALID_FOR=(ALL_LOGFILES,PRIMARY_ROLES) DB_UNIQUE_NAME=oradb162' *.log_archive_dest_state_1='ENABLE' *.log_archive_dest_state_2='ENABLE' *.standby_file_management='AUTO' |
兩臺云服務器(主備庫)資源配置、操作系統版本、oracle軟件、目錄結構完全一樣,因此不需要做日志和數據文件轉換。書寫參數文件一定要仔細認真,我在這里踩了個大坑,整個端午節都耗在上邊了。
參數文件里邊有幾個值,要特別留意。db_name、db_unique_name、service,該怎么填?與哪些項目想關聯,是必須弄清楚的。
(1) db_name:主備庫用同樣的名稱,這里用的值是gbdb,oracle系統賬號環境變量.bash_profile里邊定義。
(2) db_unique:主庫與備庫不同,主庫定義為oradb162,備庫為oradb95,與系統的/etc/hosts定義相同,也可以不同。也可以在oracle系統賬號環境變量.bash_profile里邊也設定一下。
(3) service:這個最容易引起混淆,個人認為,應該是從tnsname.ora取值,取的是那個net service name,不是代碼塊里邊那個service(代碼塊頂頭的那行,沒有括號,而真正的service,使用相同的設置gbdb,與sid也設定得一樣了)。
我犯的低級錯誤就在參數文件的log_archive_dest_1這一行,因為這行很長,轉換到下一行了,擔心不是一個正行,因此使用了刪除,未曾留心,把DB_UNIQUE_NAME=oradb162的字符“a”給刪掉,變成DB_UNIQUE_NAME=ordb162,配置完以后,死活不能同步數據。查看oracle告警日志,有log1目標找不到的信息,一直以為是監聽器監或者是是本地名稱服務tnsnames設置的問題呢。Sqlplus執行 show parameter log_archive_dest能得到一些有用信息。
◆備庫服務器創建所需目錄
創建這些目錄的依據來自參數文件/home/oracle/initgb.ora,需逐個核對創建。
1、 創建控制文件目錄:
[oracle@oradb95 ~]$ mkdir /u01/app/oracle/oradata/GBDB/controlfile -p [oracle@oradb95 ~]$ mkdir /u01/app/oracle/fast_recovery_area/gbdb/GBDB/controlfile -p |
2、 創建歸檔日志目錄:
[oracle@oradb95 ~]$mkdir /u01/app/oracle/fast_recovery_area/gbdb -p |
這步重復了,在創建控制文件目錄時,已經創建過了。
3、 創建審計文件目錄:
[oracle@oradb95 ~]$ mkdir -p /u01/app/oracle/admin/gbdb/adump |
◆備庫服務器準備密碼文件及控制文件
這兩個文件都來自于主庫服務器,直接同步或者復制過來,注意不要改變文件的屬主,即這些文件的屬主是oracle和oinstall。
1、 根據參數文件的定義,我們需要把控制文件分別同步到目錄(這個步驟其實是多此一舉了)/u01/app/oracle/oradata/GBDB/controlfile/,/u01/app/oracle/fast_recovery_area/gbdb/GBDB/controlfile/。
[oracle@oradb95 ~]$ cp gdbd.ctl /u01/app/oracle/oradata/GBDB/controlfile [oracle@oradb95 ~]$ cp gdbd.ctl /u01/app/oracle/fast_recovery_area/gbdb/GBDB/controlfile/ |
2、 復制數據庫密碼文件到目錄/u01/app/oracle/product/12.2.0/dbs.
[oracle@oradb95 ~]$ cp orapwgbdb /u01/app/oracle/product/12.2.0/dbs |
文件位于什么位置,一定要跟定義及oracle規定相符合。一些人寫的文檔,不做強調,一頓亂貼;在哪個機器操作,主機命名,模棱兩可,給初學者帶來很多麻煩和困擾。
實際上,備庫有參數文件和密碼文件就夠了。如果在執行數據庫復制過程出現異常,極有可能是備庫的目錄沒有被創建,根據提示創建就行。控制文件會自動被復制過來,因此無需手動搞一遍。
◎復制數據庫到備庫
分五個步驟,有順序地進行。
◆第一步:主庫以mount參數啟動實例:
SQL> startup mount pfile='/home/oracle/initgb.ora'; ORACLE instance started.
Total System Global Area 1.0100E+10 bytes Fixed Size 12170040 bytes Variable Size 1979714760 bytes Database Buffers 8086618112 bytes Redo Buffers 21381120 bytes Database mounted. |
參數文件有錯的話,換成原始備份的那個,就可以恢復到正常狀況,比直接sql里改參數要保險一些。
◆第二步,備庫啟動oracle實例。一定要安裝好oracle軟件,復制主庫的密碼文件到對應的位置,還有那個參數文件,位置隨意,能讀取就行。
[oracle@oradb95 ~]$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Tue Jun 19 12:59:58 2018
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup nomount pfile='/home/oracle/initgb.ora'; ORACLE instance started.
Total System Global Area 1.0100E+10 bytes Fixed Size 12170040 bytes Variable Size 1979714760 bytes Database Buffers 8086618112 bytes Redo Buffers 21381120 bytes |
注意:主庫是mount參數,備庫是nomount。nomount不需要使用控制文件。
◆第三步,rman連主備庫,這個是在主庫上進行的操作:
[oracle@oradb162 oradata]$rman target sys/Oradb_162@oradb162 auxiliary sys/Oradb_162@oradb95 Recovery Manager: Release 12.2.0.1.0 - Production on Tue Jun 19 12:46:55 2018
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
connected to target database: GBDB (DBID=2214703447, not open) connected to auxiliary database: GBDB (not mounted) |
注意:連接字串只有@后邊的服務名不同,其它要一樣喲。為了不引起混亂,也可以簡化成“rman target / auxiliary sys/Oradb_162@oradb95”。
◆第四步,復制數據庫到備庫,還是在主庫執行呢,就在rman提示符里邊。
RMAN>duplicate target database for standby from active database nofilenamecheck; ………大量輸出,略………………… |
這一步是容易出問題的地方,要注意看輸出,最可能的原因就是需要的目錄沒有手工創建。另外,如果跟我想法相同(主備目錄結構相同、oracle sid也相同),那么用rman復制時把參數“nofilenamecheck”加上。
◆第五步,主庫打開數據庫。
SQL> alter database open;
Database altered. |
◎啟動備庫,使其與主庫同步
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
Database altered. |
復制完數據庫以后,備庫把自己切換成mount狀態了,因此無需人為干涉。
◎驗證主備同步狀況
暴力一點,主庫上創建一個表空間,等待片刻,分別查看兩邊文件的生成情況。
SQL> create tablespace WUHUSER datafile ‘/u01/app/oracle/oradata/whcrm/wuhuser01.fbf’ size 10G; |
登錄到到備庫,查看目錄,看是否自動生成數據文件。
[oracle@oradb95 oradata]$ pwd /u01/app/oracle/oradata [oracle@oradb95 oradata]$ ls -al total 4194332 drwxr-xr-x 4 oracle oinstall 4096 Jun 19 10:43 . drwxrwxr-x 10 oracle oinstall 4096 Jun 18 14:15 .. drwxr-xr-x 3 oracle oinstall 4096 Jun 18 22:17 gbdb drwxr-xr-x 3 oracle oinstall 4096 Jun 18 15:27 GBDB -rw-r----- 1 oracle oinstall 4294975488 Jun 19 13:19 wuhuser01.dbf |
同時也查看兩邊的oracle告警日志,做進一步核實。再增一法,主備庫查歸檔情況。
主庫執行 SQL> alter system switch logfile;
System altered SQL> select SEQUENCE#,FIRST_TIME,NEXT_TIME ,APPLIED from v$archived_log; …………………………省略若干………………… SEQUENCE# FIRST_TIM NEXT_TIME APPLIED ---------- --------- --------- --------- 46 19-JUN-18 19-JUN-18 NO 46 19-JUN-18 19-JUN-18 YES 47 19-JUN-18 19-JUN-18 NO 47 19-JUN-18 19-JUN-18 YES 48 19-JUN-18 19-JUN-18 NO 48 19-JUN-18 19-JUN-18 NO
94 rows selected. |
備庫執行 select SEQUENCE#,FIRST_TIME,NEXT_TIME ,APPLIED from v$archived_log; …………………………省略若干………………… SEQUENCE# FIRST_TIM NEXT_TIME APPLIED ---------- --------- --------- --------- 37 19-JUN-18 19-JUN-18 YES 38 19-JUN-18 19-JUN-18 YES 39 19-JUN-18 19-JUN-18 YES 40 19-JUN-18 19-JUN-18 YES 41 19-JUN-18 19-JUN-18 YES 42 19-JUN-18 19-JUN-18 YES 43 19-JUN-18 19-JUN-18 YES 44 19-JUN-18 19-JUN-18 YES 45 19-JUN-18 19-JUN-18 YES 46 19-JUN-18 19-JUN-18 YES 47 19-JUN-18 19-JUN-18 YES
SEQUENCE# FIRST_TIM NEXT_TIME APPLIED ---------- --------- --------- --------- 48 19-JUN-18 19-JUN-18 IN-MEMORY
34 rows selected. |
Dataguard主備角色切換
為保證可靠性,需要進行主庫->備庫,備庫->主庫;原主庫->主庫,原備庫->備庫。能變過去也能變回來,方為好手。
切換有操作順序,需先在主庫操作,使其變成備庫,然后才可以在備庫進行切換。
◎主庫切換成備庫
查看主庫切換狀態:
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS -------------------- TO STANDBY |
主庫變備庫:
SQL> alter database commit to switchover to standby;
Database altered. |
主庫再啟動實例(現在角色是standby備庫了)
SQL> startup mount; ORACLE instance started.
Total System Global Area 1.0100E+10 bytes Fixed Size 12170040 bytes Variable Size 1979714760 bytes Database Buffers 8086618112 bytes Redo Buffers 21381120 bytes Database mounted. SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
Database altered. |
◎備庫變主庫
主庫活著的話,執行“select switchover_status from v$database;”得到的輸出為“NOT ALLOWED”。主庫轉換成備庫完成后,再執行這個指令,這時輸出為:
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS -------------------- TO PRIMARY |
備庫角色切換到主庫
SQL> alter database commit to switchover to primary;
Database altered. |
數據庫打開,這步別忘記了。
SQL> alter database open;
Database altered. |
重復執行上述步驟,又可以把角色還原。為防止意外,我強烈建議他們再增加一個云主機,把oracle安裝好,一旦主庫故障,立即把備庫提升成主庫,同時把預留的那臺做數據庫服務,使之成為新的standby備庫。發生故障的主庫修復以后,準備好oracle,留著備用。
老田有話說
最近受邀在51CTO博客專欄出版《負載均衡高手煉成記》,依托自己十余年的IT運維經驗,以實際工作經驗為基礎,介紹不同場景下,負載均衡的實現方式,以及負載均衡的日常維護。
本專欄適合于一直徘徊在運維初級未找到入佳境之門的運維工程師,也適合對負載均衡有興趣了解和學習的技術愛好者。跟著老田學完這個系列課程,不僅學知識,更是漲薪、升職、進心儀公司的一大捷徑!
《負載均衡高手煉成記》
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。