Linux下靜默安裝Oracle 11g RAC


title: Linux下靜默安裝Oracle 11g RAC
categories: 數(shù)據(jù)庫
tags:
- RAC
- Cluster
- HA
- Oracle
timezone: Asia/Shanghai
date: 2019-01-06


環(huán)境

# Red Hat Enterprise Linux Server release 6.10.x86_64 (Santiago)
# Oracle Linux 7.5 x86_64

p13390677_112040_Linux-x86-64_1of7.zip
p13390677_112040_Linux-x86-64_2of7.zip
p13390677_112040_Linux-x86-64_3of7.zip

注意事項

1.主機名都用小寫字母紊浩,長度不能超過15位凰浮,不要有特殊符號

2.兩個節(jié)點的Plublic和VIP所在網(wǎng)卡的網(wǎng)卡名要一樣

3.表決盤應該都是相同的大小。不同的大小可能導致可用性降低。

第一步:規(guī)劃IP地址和主機名

1.IP地址規(guī)劃

節(jié)點 hostname 類型 IP地址 接口 備注
1 rac1 Plublic IP 10.0.1.131 eth0 手動設置
2 rac2 Plublic IP 10.0.1.132 eth0 手動設置
1 rac1-vip Virtaual IP 10.0.1.133 eth0 集群自動設置
2 rac2-vip Virtaual IP 10.0.1.134 eth0 集群自動設置
Cluster rac-scan SCAN IP 10.0.1.135 eth0 集群自動設置
1 rac1-priv Private IP 11.11.11.131 eth1 手動設置
2 rac2-priv Private IP 11.11.11.132 eth1 手動設置

2.在兩個節(jié)點分別將Plublic IP和Private IP寫入(by all)

只需要手動在兩個節(jié)點上設置靜態(tài)IP地址即可忱辅。修改主機名塘安、關閉防火墻等使用下邊腳本來完成

vim /etc/sysconfig/network-scripts/ifcfg-eth0
vim /etc/sysconfig/network-scripts/ifcfg-eth1

第二步:設置共享存儲

1.現(xiàn)在Win2012上創(chuàng)建5個存儲盤 這里創(chuàng)建了三個1G的投票盤(votingdisk),一個20G的數(shù)據(jù)盤(data),一個10G的備份盤(backup)。

2.連接iscsi 安裝并設置自動啟動(by all)

掃描iscsi存儲并重啟服務器买羞,重啟后會自動掛載

mkdir -p /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
cd /mnt/cdrom/Packages

----- RedHat6:
rpm -ivh iscsi-initiator-utils-6.2.0.873-27.el6_9.x86_64.rpm
chkconfig iscsid on
iscsiadm -m discovery -t sendtargets -p 10.0.1.141:3260

----- RedHat7:
rpm -ivh iscsi-initiator-utils-6.2.0.874-7.0.1.el7.x86_64.rpm
systemctl start iscsid
systemctl enable iscsid
iscsiadm -m discovery -t sendtargets -p 10.0.1.141:3260

3.查看掛載磁盤并分區(qū)(任意一個節(jié)點操作即可)

ll /dev/sd*
fdisk /dev/sdb
fdisk /dev/sdc
fdisk /dev/sdd
fdisk /dev/sde
fdisk /dev/sdf

分區(qū)后如果看不到分區(qū)可用以下命令刷新
partprobe /dev/sdb
partprobe /dev/sdc
partprobe /dev/sdd
partprobe /dev/sde
partprobe /dev/sdf

4.配置裸盤(by all)

vim /etc/udev/rules.d/60-raw.rules

ACTION=="add", KERNEL=="sdb1", RUN+="/bin/raw /dev/raw/raw1 %N"
ACTION=="add", KERNEL=="sdc1", RUN+="/bin/raw /dev/raw/raw2 %N"
ACTION=="add", KERNEL=="sdd1", RUN+="/bin/raw /dev/raw/raw3 %N"
ACTION=="add", KERNEL=="sde1", RUN+="/bin/raw /dev/raw/raw4 %N"
ACTION=="add", KERNEL=="sdf1", RUN+="/bin/raw /dev/raw/raw5 %N"
KERNEL=="raw[1-5]*", OWNER="grid" GROUP="asmadmin", MODE="660"

5.啟動并驗證udev(by all)

----- RedHat6:
/sbin/start_udev

[root@rac1 sshsetup]# ll /dev/raw/
總用量 0
crw-rw---- 1 grid asmadmin 162, 1 12月 28 20:14 raw1
crw-rw---- 1 grid asmadmin 162, 2 12月 28 20:14 raw2
crw-rw---- 1 grid asmadmin 162, 3 12月 28 20:14 raw3
crw-rw---- 1 grid asmadmin 162, 4 12月 28 20:14 raw4
crw-rw---- 1 grid asmadmin 162, 5 12月 28 20:14 raw5
crw-rw---- 1 root disk     162, 0 12月 28 20:14 rawctl

----- RedHat7:
/sbin/udevadm trigger --type=devices --action=change
重新加載udev rule
/sbin/udevadm control --reload
診斷udev rule
/sbin/udevadm test /sys/block/sdb

ll /dev/raw/

如果磁盤有數(shù)據(jù)的可以使用以下命令清空磁盤信息(任意一個節(jié)點操作即可)

dd if=/dev/zero of=/dev/raw/raw1 bs=1024 count=256
dd if=/dev/zero of=/dev/raw/raw2 bs=1024 count=256
dd if=/dev/zero of=/dev/raw/raw3 bs=1024 count=256
dd if=/dev/zero of=/dev/raw/raw4 bs=1024 count=256
dd if=/dev/zero of=/dev/raw/raw5 bs=1024 count=256

第三步:使用初始化腳本初始化系統(tǒng)環(huán)境(見附錄1)

1.使用本腳本應注意事項(by all)

1.必須使用root執(zhí)行
2.請確認已經(jīng)將PlublicIP設置為靜態(tài)IP
3.請確認已掛載Linux安裝光盤
4.本腳本可以重復執(zhí)行
5.本腳本會覆蓋hosts設置,如有特殊需求的請在安裝完畢后手動恢復所需內容
6.vip和priv主機名格式為:“主機名-vip”和“主機名-priv”嫉拐,如有需要請更改
7.此腳本編寫環(huán)境為RedHat6.10 && Oracle 11g RAC
8.此腳本只針對兩個節(jié)點的RAC環(huán)境初始化哩都,腳本啟動的時候會讓選擇節(jié)點1還是節(jié)點2
9.最后請請根據(jù)自己實際情況修改腳本內最上部變量后即可執(zhí)行

2.本腳本所實現(xiàn)功能(by all)

1.關閉SELinux
2.關閉iptables
3.修改主機名
4.寫入hosts
5.禁用ntpd
6.創(chuàng)建所需要的賬戶和組
7.新建grid和oracle安裝目錄
8.配置oracle和grid用戶變量
9.配置本地YUM并安裝依賴包

第四步:安裝grid

注意:在以上的腳本里并沒有對系統(tǒng)內核做修改魁兼,在這步我們使用grid檢測腳本來進行環(huán)境的檢測的同時生成修復腳本來完成對系統(tǒng)內核的修改婉徘,可以在提高效率的同時方式手動修改造成錯誤。
1.配置ssh互信

1.1.使用oracle官方系統(tǒng)的腳本(用root賬戶在其中一個節(jié)點執(zhí)行即可)

注意:需要同時配置grid和oracle兩個賬戶下的public ip和vip的ssh互信

注意:在生成秘鑰的時候不要設置密碼

/home/grid/grid/sshsetup/sshUserSetup.sh -user oracle -hosts 'rac1 rac2 rac1-priv rac2-priv' -advanced
/home/grid/grid/sshsetup/sshUserSetup.sh -user grid -hosts 'rac1 rac2 rac1-priv rac2-priv' -advanced

-hosts 表示:需要配置互信的服務器ip
-user 表示:用于遠程登錄到服務器上的用戶名
-advanced 表示:hosts里的主機咐汞,每兩個主機之間都是互信的盖呼。
    如果不加-advanced,例如:本機是HOST-A化撕,在本機執(zhí)行./sshUserSetup.sh -user aime -hosts A B C几晤。那么就是HOST-A->A, HOST-A->B, HOST-A->C 的互信關系。A,B,C之間是不互信的植阴。

1.2.可以使用以下命令測試剛才做的ssh互信是否生效蟹瘾,如果沒有提示輸入密碼并且輸出了系統(tǒng)時間就OK(by all)

su - oracle
ssh rac1 date && \
ssh rac2 date && \
ssh rac1-priv date && \
ssh rac2-priv date

su - grid
ssh rac1 date && \
ssh rac2 date && \
ssh rac1-priv date && \
ssh rac2-priv date
2.執(zhí)行安裝前的檢查并使用生成的腳本修改內核參數(shù)

2.1.執(zhí)行安裝前的檢查(任意節(jié)點執(zhí)行一次即可)

su - grid
/home/grid/grid/./runcluvfy.sh stage -pre crsinst -n rac1,rac2 -verbose -fixup

語法說明:
-pre: 該選項主要檢查是否滿足安裝的需要圾浅。 
-post:該選擇主要檢查安裝后組件是否正常。 
-n:該選項用于指定節(jié)點列表憾朴。 
-verbose:該選項用于輸出詳細的驗證信息狸捕。 
-fixup:這是Oracle 11gR2中新增加的一個參數(shù)。利用這個參數(shù)众雷,可以產(chǎn)生一個名為runfixup.sh的腳本灸拍。

runfixup.sh腳本中包含一系列的操作系統(tǒng)命令,利用這個腳本可以對操作系統(tǒng)進行一定的修改砾省,使其滿足安裝條件鸡岗。完成系統(tǒng)進行校驗之后,以root用戶的身份執(zhí)行腳本runfixup.sh编兄,就可以解決操作系統(tǒng)中一些尚不滿足安裝條件的情況轩性。

2.2.根據(jù)提示使用root用戶在兩個節(jié)點執(zhí)行修復腳本并安裝cvuqdisk和pdksh,安裝完成后再此運行檢查應該除了GNS和時間同步其他全部OK(by all)

/tmp/CVU_11.2.0.4.0_grid/runfixup.sh
rpm -ivh /home/grid/grid/rpm/cvuqdisk-1.0.9-1.rpm
rpm -ivh pdksh-5.2.14-37.el5_8.1.i386.rpm
rpm -ivh pdksh-5.2.14-37.el5_8.1.x86_64.rpm

pdksh需要單獨下載:
https://pan.baidu.com/s/1cb3nsP7plx2tAqyLmeMGiQ
https://pan.baidu.com/s/1zL3bawYb4sLYx3bqEHQzlw
3.執(zhí)行靜默安裝(靜默安裝腳本見附錄2)(節(jié)點1執(zhí)行即可狠鸳,會自動復制到節(jié)點2)
/home/grid/grid/runInstaller -showProgress -silent -responseFile /home/grid/grid.rsp

-showProgress       用于在控制臺上顯示安裝進度炮姨。僅在無提示安裝下才支持此選項。
-ignorePrereq       忽略運行先決條件檢查碰煌。由于我們沒有使用DNS來解析SCAN所以會報一個SCAN的錯誤舒岸,因為使用udev綁定裸設備而沒有使用ASMLIB來使用ASM,所以會報一個ASM的錯誤芦圾,這兩個錯誤都是可以忽略的蛾派,但靜默安裝在檢測到錯誤后就會停止安裝,不能像圖形界面那樣點一下忽略跳過个少,所以我們使用這個參數(shù)來繞過預檢
-silent             對于無提示模式下的操作, 輸入內容可以是一個響應文件, 也可以是命令行變量值對的列表洪乍。
-responseFile       指定要使用的響應文件和路徑。
其它命令請查詢幫助 -help
4.根據(jù)提示分別在兩個節(jié)點按以下順序執(zhí)行sh腳本(by all)
1.節(jié)點1:/u01/app/oraInventory/orainstRoot.sh
2.節(jié)點2:/u01/app/oraInventory/orainstRoot.sh

3.節(jié)點1:/u01/app/11.2.0/grid/root.sh
4.節(jié)點2:/u01/app/11.2.0/grid/root.sh

Redhat7在執(zhí)行root.sh的時候出現(xiàn)以下錯誤提示,經(jīng)查是個bug:
ohasd failed to start
Failed to start the Clusterware. Last 20 lines of the alert log follow: 
2018-12-31 21:40:24.432: 
[client(11531)]CRS-2101:The OLR was formatted using version 3.

解決方法1:
/bin/dd if=/var/tmp/.oracle/npohasd of=/dev/null bs=1024 count=1
5.根據(jù)提示需要提供密碼腳本文件

在運行安裝程序的節(jié)點使用grid用戶執(zhí)行以下腳本

關于此密碼文件的官方說明:https://docs.oracle.com/database/121/CWLIN/app_nonint.htm#CWLIN379

touch /home/grid/cfgrsp.properties
/u01/app/11.2.0/grid/cfgtoollogs/configToolAllCommands RESPONSE_FILE=/home/grid/cfgrsp.properties

在這里我們只提供一個空文件夜焦,關于官方說明只是在需要使用智能管理平臺界面IPMICA的時候才需要提供密碼壳澳。
6.至此grid已安裝完成,附上群集狀態(tài)檢查
[grid@rac1 ~]$ crsctl check crs
CRS-4638: Oracle High Availability Services is online
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online

[grid@rac1 ~]$ crs_stat -t -v
Name           Type           R/RA   F/FT   Target    State     Host        
----------------------------------------------------------------------
ora....ER.lsnr ora....er.type 0/5    0/     ONLINE    ONLINE    rac1        
ora....N1.lsnr ora....er.type 0/5    0/0    ONLINE    ONLINE    rac1        
ora.OCR.dg     ora....up.type 0/5    0/     ONLINE    ONLINE    rac1        
ora.asm        ora.asm.type   0/5    0/     ONLINE    ONLINE    rac1        
ora.cvu        ora.cvu.type   0/5    0/0    ONLINE    ONLINE    rac1        
ora.gsd        ora.gsd.type   0/5    0/     OFFLINE   OFFLINE               
ora....network ora....rk.type 0/5    0/     ONLINE    ONLINE    rac1        
ora.oc4j       ora.oc4j.type  0/1    0/2    ONLINE    ONLINE    rac1        
ora.ons        ora.ons.type   0/3    0/     ONLINE    ONLINE    rac1        
ora....SM1.asm application    0/5    0/0    ONLINE    ONLINE    rac1        
ora....C1.lsnr application    0/5    0/0    ONLINE    ONLINE    rac1        
ora.rac1.gsd   application    0/5    0/0    OFFLINE   OFFLINE               
ora.rac1.ons   application    0/3    0/0    ONLINE    ONLINE    rac1        
ora.rac1.vip   ora....t1.type 0/0    0/0    ONLINE    ONLINE    rac1        
ora....SM2.asm application    0/5    0/0    ONLINE    ONLINE    rac2        
ora....C2.lsnr application    0/5    0/0    ONLINE    ONLINE    rac2        
ora.rac2.gsd   application    0/5    0/0    OFFLINE   OFFLINE               
ora.rac2.ons   application    0/3    0/0    ONLINE    ONLINE    rac2        
ora.rac2.vip   ora....t1.type 0/0    0/0    ONLINE    ONLINE    rac2        
ora....ry.acfs ora....fs.type 0/5    0/     ONLINE    ONLINE    rac1        
ora.scan1.vip  ora....ip.type 0/0    0/0    ONLINE    ONLINE    rac1        

[grid@rac1 ~]$ olsnodes -n
rac1    1
rac2    2

[grid@rac1 ~]$ ps -ef|grep lsnr|grep -v 'grep'|grep -v 'ocfs'|awk '{print$9}'
LISTENER_SCAN1
LISTENER

[grid@rac1 ~]$ srvctl status asm -a
ASM 正在 rac2,rac1 上運行
ASM 已啟用茫经。

[grid@rac1 ~]$ olsnodes -n -i -s -t
rac1    1       rac1-vip        Active  Unpinned
rac2    2       rac2-vip        Active  Unpinned

[grid@rac1 ~]$ crsctl query css votedisk
##  STATE    File Universal Id                File Name Disk group
--  -----    -----------------                --------- ---------
 1. ONLINE   859e013bd7544f67bfb2f5ebc7ecbae4 (/dev/raw/raw1) [OCR]
 2. ONLINE   a96ac903004f4ffebf2f6da76fb5325b (/dev/raw/raw2) [OCR]
 3. ONLINE   6e53a9f9bf8e4facbf26317b8edfbd34 (/dev/raw/raw5) [OCR]
Located 3 voting disk(s).

[grid@rac1 ~]$ srvctl config scan
SCAN 名稱: rac-scan, 網(wǎng)絡: 1/10.0.1.0/255.255.255.0/eth0
SCAN VIP 名稱: scan1, IP: /rac-scan/10.0.1.135

[grid@rac1 ~]$ srvctl config scan_listener
SCAN 監(jiān)聽程序 LISTENER_SCAN1 已存在巷波。端口: TCP:1521

第五步:安裝Oracle Database

1.創(chuàng)建ASM磁盤組DATA用于存放數(shù)據(jù)庫文件和BAK用于備份

方法1:使用ASMCA
方法2:使用ASMCMD
  1. /home/oracle/database/runInstaller

    -responseFile 指定要使用的響應文件和路徑。
    -silent 對于無提示模式下的操作, 輸入內容可以是一個響應文件, 也可以是命令行變量值對的列表卸伞。
    -executePrereqs 僅執(zhí)行先決條件檢查抹镊。
    -showProgress 用于在控制臺上顯示安裝進度。僅在無提示安裝下才支持此選項荤傲。


附錄:Bug(附徹底解決辦法)

Bug說明:https://www.cnblogs.com/zx3212/p/7017641.html

ALERT:  Grid Infrastructure Fails to Start OHASD With RedHat Linux or Oracle Linux with RedHat Compatible Kernel (RHCK) Version 3.10.0-514.21.2.EL7.X86_64 or Higher (Doc ID 2282371.1)

https://community.oracle.com/message/14424838#14424838

解決方法:手動創(chuàng)建服務文件垮耳,并設置開機自動啟動

touch /usr/lib/systemd/system/ohas.service
chmod 777 /usr/lib/systemd/system/ohas.service
cat <<EOF>/usr/lib/systemd/system/ohas.service
[Unit]
Description=Oracle High Availability Services
After=syslog.target

[Service]
ExecStart=/etc/init.d/init.ohasd run >/dev/null 2>&1 Type=simple
Restart=always

[Install]
WantedBy=multi-user.target
EOF

以root用戶運行下面的命令

systemctl daemon-reload
systemctl enable ohas.service
systemctl start ohas.service

附錄1:初始化腳本(將以下內容保存為sh文件直接執(zhí)行即可)

#/bin/bash
# 本腳本針對RedHat6、CentOS6靜默安裝Oracle 11g RAC初始化系統(tǒng)參數(shù)用
# 本腳本只適用于新安裝系統(tǒng)的初始化,已經(jīng)在使用或者有調整系統(tǒng)參數(shù)的禁止使用V辗稹?∷浴!A逭谩乌询!
# 注意:本腳本會覆蓋hosts設置

################################### 已驗證 Linux 發(fā)行版 ###################################
# Red Hat Enterprise Linux Server release 6.10.x86_64 (Santiago)
# Oracle Linux 7.5 x86_64

################################### 請根據(jù)自己實際情況修改變量 ###################################
rac1HostName=rac1
rac2HostName=rac2
rac1PlublicIP=10.0.1.131
rac2PlublicIP=10.0.1.132
rac1VIP=10.0.1.133
rac2VIP=10.0.1.134
scanIP=10.0.1.135
rac1PrivIP=11.11.11.131
rac2PrivIP=11.11.11.132
scanName=rac-scan
oraclePasswd=oracle
gridPasswd=grid

# grid and oracle 根目錄
GridOracleHomeTemp=/u01

# grid實例名稱(節(jié)點1為:“名稱1”,節(jié)點2為:“名稱2”)
GRID_SIDTemp=+ASM

# 安裝grid時候的:Oracle Base
GRID_BASETemp=/u01/app/grid

# 安裝grid時候的:Software Location
GRID_HOMETemp=/u01/app/11.2.0/grid

# 安裝database時候的:Oracle Base
ORACLE_BASETemp=/u01/app/oracle

# 數(shù)據(jù)庫名稱
ORACLE_UNQNAMETemp=oracledbrac

# 數(shù)據(jù)庫實例名稱(節(jié)點1實例名稱為:orcl1豌研,節(jié)點2為:orcl2)
ORACLE_SIDTemp=orcl

################################### 請根據(jù)自己實際情況修改變量 ###################################


# 檢查當前用戶是否為root權限
if [ `id -u` -eq 0 ];then
    echo "當前用戶是root用戶妹田,將繼續(xù)安裝!"
else
    echo "非root用戶!"
    exit 0
fi

# 輸出提示,是否已設置靜態(tài)IP并掛載光驅
echo
read -p "請確認您已經(jīng)將PlublicIP設置為靜態(tài)IP并已掛載Linux安裝光盤.按Enter鍵開始,Ctrl+C退出" tempchar
echo

# 請選擇你的系統(tǒng)版本(RedHat6或者Redhat7)
read -p "系統(tǒng)版本為:6 or 7:" LinuxVer
if [ ${LinuxVer} -eq 6 ]
then
    echo "您選擇的系統(tǒng)是Linux發(fā)行版:6"
elif [ ${LinuxVer} -eq 7 ]
then
    echo "您選擇的系統(tǒng)是Linux發(fā)行版:7"
else
    echo "輸入錯誤鹃共,程序將推出"
    exit
fi


# 選擇當前節(jié)點(此腳本只支持雙節(jié)點安裝RAC)
read -p "當前節(jié)點為1 or 2:" nodeNum
if [ $nodeNum -eq 1 ]
then
    echo "當前服務器為:節(jié)點1"
    hostname=${rac1HostName}
    racPlublicip=${rac1PlublicIP}
    racVIP=${rac1VIP}
elif [ $nodeNum -eq 2 ]
then
    echo "當前服務器為:節(jié)點2"
    hostname=${rac2HostName}
    racPlublicip=${rac2PlublicIP}
    racVIP=${rac2VIP}
else
    echo -e "\033[31m節(jié)點選擇錯誤\033[0m"
    exit
fi


# 1.關閉SELinux
grep "SELINUX=disabled" /etc/selinux/config > /dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "SElinux本身就是關閉狀態(tài)"
    setenforce 0
else
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    [ $? -eq 0 ] && echo "關閉SELinux - Success" || echo -e "\033[31m關閉SELinux----------Failed\033[0m"
    setenforce 0
fi

# 2.關閉iptables和firewalld(需要區(qū)分6和7)
if [ ${LinuxVer} -eq 6 ]
then
    service iptables stop
    chkconfig iptables off
    [ $? -eq 0 ] && echo "禁止iptables開機自動啟動 - Success" || echo -e "\033[31m禁止iptables開機自動啟動----------Failed\033[0m"
else
    systemctl stop firewalld
    systemctl disable firewalld
    [ $? -eq 0 ] && echo "禁止firewalld開機自動啟動 - Success" || echo -e "\033[31m禁止firewalld開機自動啟動----------Failed\033[0m"
    systemctl stop iptables
    systemctl disable iptables
    [ $? -eq 0 ] && echo "禁止iptables開機自動啟動 - Success" || echo -e "\033[31m禁止iptables開機自動啟動----------Failed\033[0m"
fi

# 3.修改主機名(需要區(qū)分6和7)
if [ ${LinuxVer} -eq 6 ]
then
    hostname ${hostname}
    sed -i "/HOSTNAME=/c HOSTNAME=${hostname}" /etc/sysconfig/network
    [ $? -eq 0 ] && echo "修改主機名 - Success" || echo -e "\033[31m修改主機名----------Failed\033[0m"
else
    hostnamectl set-hostname ${hostname}
    [ $? -eq 0 ] && echo "修改主機名 - Success" || echo -e "\033[31m修改主機名----------Failed\033[0m"
fi

# 4.寫入hosts
cat <<EOF >/etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
${rac1PlublicIP} ${rac1HostName}
${rac2PlublicIP} ${rac2HostName}
${rac1VIP} ${rac1HostName}-vip
${rac2VIP} ${rac2HostName}-vip
${scanIP} ${scanName}
${rac1PrivIP} ${rac1HostName}-priv
${rac2PrivIP} ${rac2HostName}-priv
EOF
[ $? -eq 0 ] && echo "寫入hosts文件 - Success" || echo -e "\033[31m寫入hosts----------Failed\033[0m"

# 5.禁用ntpd,Oracle會自動啟用自己的ctssd來進行時間同步(需要區(qū)分6和7)
if [ ${LinuxVer} -eq 6 ]
then
    service ntpd stop
    chkconfig ntpd off
    [ $? -eq 0 ] && echo "禁止ntp開機自動啟動 - Success" || echo -e "\033[31m禁止ntp開機自動啟動----------Failed\033[0m"
    # mv /etc/ntp.conf /etc/ntp.conf.bak > /dev/null 2>&1
else
    systemctl stop ntpd
    systemctl disable ntpd
    [ $? -eq 0 ] && echo "禁止ntp開機自動啟動 - Success" || echo -e "\033[31m禁止ntp開機自動啟動----------Failed\033[0m"
    # mv /etc/ntp.conf /etc/ntp.conf.bak > /dev/null 2>&1
fi

# 6.創(chuàng)建所需要的賬戶和組

#Add oracle user. If present ,do nothing but create the mandatory groups
#添加oracle用戶鬼佣。 如果存在,除了創(chuàng)建必需組之外什么也不做

USERID="54321"
GROUPID="54321"

# 6.1.檢查GROUPID是否被占用
groupnum=`cat /etc/group | sort -t: -g +2 -3 | grep -v nfsnobody | cut -f3 -d":" | tail -1`
if [ "${groupnum}" -ge "${GROUPID}" ]; then
    GROUPID=`expr $groupnum + 1`
fi

# 6.2.檢查USERID是否被占用
usernum=`cat /etc/passwd | sort -t: -g +2 -3 | grep -v nfsnobody | cut -f3 -d":" | tail -1`
if [ "${usernum}" -ge "${USERID}" ]; then
    USERID=`expr $usernum + 1`
fi

# 6.3.創(chuàng)建oinstall組
/bin/grep "^oinstall" /etc/group > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Group oinstall - 已經(jīng)存在"
else
    echo "Adding group oinstall with gid ${GROUPID}"
    /usr/sbin/groupadd -g ${GROUPID} oinstall
fi

# 6.4.創(chuàng)建dba組
/bin/grep "^dba" /etc/group > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Group dba - 已經(jīng)存在"
else
    echo "Adding group dba"
    /usr/sbin/groupadd dba
fi

# 6.5.創(chuàng)建oper組 add by 6
/bin/grep "^oper" /etc/group > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Group oper - 已經(jīng)存在"
else
    echo "Adding group oper"
    /usr/sbin/groupadd oper
fi

# 6.6.創(chuàng)建asmdba組 add by 6
/bin/grep "^asmdba" /etc/group > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Group asmdba - 已經(jīng)存在"
else
    echo "Adding group asmdba"
    /usr/sbin/groupadd asmdba
fi

# 6.7.創(chuàng)建asmadmin組 add by 6
/bin/grep "^asmadmin" /etc/group > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Group asmadmin - 已經(jīng)存在"
else
    echo "Adding group asmadmin"
    /usr/sbin/groupadd asmadmin
fi

# 6.8.創(chuàng)建asmoper組 add by 6
/bin/grep "^asmoper" /etc/group > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Group asmoper - 已經(jīng)存在"
else
    echo "Adding group asmoper"
    /usr/sbin/groupadd asmoper
fi

# 6.9.創(chuàng)建oracle賬戶霜浴,如果已有oracle賬號晶衷,將自動為該賬號設置密碼。
/bin/grep "^oracle:" /etc/passwd   > /dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "Adding user oracle with user id ${USERID}, initial login group oinstall, supplementary group asmadmin,asmdba,dba,oper and  home directory /home/oracle"
    /usr/sbin/useradd -u ${USERID} -g oinstall -G asmadmin,asmdba,dba,oper -d /home/oracle oracle
    if [ "$?" -eq "0" ]; then
        echo "Changing ownership of /home/oracle to oracle:oinstall"
        /bin/chown oracle:oinstall /home/oracle
    else
        echo -e "\033[31m創(chuàng)建oracle用戶失敗----------Failed\033[0m"
    fi
else
    echo "用戶oracle已經(jīng)存在"
fi

# 6.10.創(chuàng)建grid賬戶 如果已有grid賬號阴孟,將自動為該賬號設置密碼晌纫。add by 6
/bin/grep "^grid:" /etc/passwd > /dev/null 2>&1
if [ $? -ne 0 ]; then
    #Add the user - password is disabled for grid user.
    #添加用戶 - 并自動為grid用戶設置密碼。
    echo "Adding user grid with user id ${USERID}, initial login group oinstall, supplementary group asmadmin,asmdba,asmoper,dba and  home directory /home/grid"
    /usr/sbin/useradd -u `expr ${USERID} + 1` -g oinstall -G asmadmin,asmdba,asmoper,dba -d /home/grid grid
    if [ "$?" -eq "0" ]; then
        echo "Changing ownership of /home/grid to grid:oinstall"
        /bin/chown grid:oinstall /home/grid
    else    
        echo -e "\033[31m創(chuàng)建grid用戶失敗----------Failed\033[0m"
    fi
else
    echo "用戶grid已經(jīng)存在"
fi

# 6.11.為oracle賬戶設置密碼
echo ${oraclePasswd} | passwd --stdin oracle
if [ $? -eq 0 ]
then
    echo "修改oracle密碼 - Success"
else
    echo -e "\033[31m修改oracle密碼----------Failed\033[0m"
fi

# 6.12.為grid賬戶設置密碼
echo ${gridPasswd} | passwd --stdin grid
if [ $? -eq 0 ]
then
    echo "修改grid密碼 - Success"
else
    echo -e "\033[31m修改grid密碼----------Failed\033[0m"
fi

# 6.13.檢查oracle用戶所屬組是否正確
id oracle | grep asmadmin > /dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "oracle附屬組檢查通過"
else
    usermod -aG asmadmin oracle
    if [ $? -eq 0 ]
    then
        echo "用oracle用戶添加組成功"
    else
        echo -e "\033[31m用oracle用戶添加組失敗----------Failed\033[0m"
    fi
fi

id oracle | grep asmdba > /dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "oracle附屬組檢查通過"
else
    usermod -aG asmdba oracle
    if [ $? -eq 0 ]
    then
        echo "用oracle用戶添加組成功"
    else
        echo -e "\033[31m用oracle用戶添加組失敗----------Failed\033[0m"
    fi
fi

id oracle | grep dba > /dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "oracle附屬組檢查通過"
else
    usermod -aG dba oracle
    if [ $? -eq 0 ]
    then
        echo "用oracle用戶添加組成功"
    else
        echo -e "\033[31m用oracle用戶添加組失敗----------Failed\033[0m"
    fi
fi

id oracle | grep oper > /dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "oracle附屬組檢查通過"
else
    usermod -aG oper oracle
    if [ $? -eq 0 ]
    then
        echo "用oracle用戶添加組成功"
    else
        echo -e "\033[31m用oracle用戶添加組失敗----------Failed\033[0m"
    fi
fi

# 6.14.檢查grid用戶所屬組是否正確
id grid | grep asmadmin > /dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "grid附屬組檢查通過"
else
    usermod -aG asmadmin grid
    if [ $? -eq 0 ]
    then
        echo "用戶 grid 添加組成功"
    else
        echo -e "\033[31m用戶 grid 添加組失敗----------Failed\033[0m"
    fi
fi

id grid | grep asmdba > /dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "grid附屬組檢查通過"
else
    usermod -aG asmdba grid
    if [ $? -eq 0 ]
    then
        echo "用戶 grid 添加組成功"
    else
        echo -e "\033[31m用戶 grid 添加組失敗----------Failed\033[0m"
    fi
fi

id grid | grep asmoper > /dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "grid附屬組檢查通過"
else
    usermod -aG asmoper grid
    if [ $? -eq 0 ]
    then
        echo "用戶 grid 添加組成功"
    else
        echo -e "\033[31m用戶 grid 添加組失敗----------Failed\033[0m"
    fi
fi

id grid | grep dba > /dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "grid附屬組檢查通過"
else
    usermod -aG dba grid
    if [ $? -eq 0 ]
    then
        echo "用戶 grid 添加組成功"
    else
        echo -e "\033[31m用戶 grid 添加組失敗----------Failed\033[0m"
    fi
fi

# 獲取oinstall組的最終ID
GROUPID=`cat /etc/group | grep oinstall | awk -F ":" '{print $3}'`

# 6.15.檢查oracle用戶主組是否正確
id oracle | grep gid=${GROUPID} > /dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "oracle主組檢查通過"
else
    usermod --gid ${GROUPID} oracle
    if [ $? -eq 0 ]
    then
        echo "用戶 grid 主組修改成功"
    else
        echo -e "\033[31m用戶 oracle 主組修改失敗----------Failed\033[0m"
    fi
fi

# 6.16.檢查grid用戶主組是否正確
id grid | grep gid=${GROUPID} > /dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "oracle主組檢查通過"
else
    usermod --gid ${GROUPID} grid
    if [ $? -eq 0 ]
    then
        echo "用戶 grid 主組修改成功"
    else
        echo -e "\033[31m用戶 grid 主組修改失敗----------Failed\033[0m"
    fi
fi


# 7.新建grid和oracle安裝目錄

mkdir -p ${GRID_BASETemp}
mkdir -p ${GRID_HOMETemp}
mkdir -p ${ORACLE_BASETemp}
chown -R grid:oinstall ${GridOracleHomeTemp}
chown oracle:oinstall ${ORACLE_BASETemp}
chmod -R 775 ${GridOracleHomeTemp}

# 8.配置oracle和grid用戶變量
if [ $nodeNum -eq 1 ]
then
    grep 666666 /home/oracle/.bash_profile
    if [ $? -eq 0 ]; then
        cp /home/oracle/.bash_profile.666666 /home/oracle/.bash_profile
    else
        cp /home/oracle/.bash_profile /home/oracle/.bash_profile.666666
    fi

cat <<EOF >>/home/oracle/.bash_profile
#add by 666666
export ORACLE_SID=${ORACLE_SIDTemp}1  # RAC1
export ORACLE_UNQNAME=${ORACLE_UNQNAMETemp}
export ORACLE_BASE=${ORACLE_BASETemp}
export ORACLE_HOME=\$ORACLE_BASE/product/11.2.0/db
export TNS_ADMIN=\$ORACLE_HOME/network/admin
export PATH=/usr/sbin:\$PATH
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
EOF

    grep 666666 /home/grid/.bash_profile
    if [ $? -eq 0 ]; then
        cp /home/grid/.bash_profile.666666 /home/grid/.bash_profile
    else
        cp /home/grid/.bash_profile /home/grid/.bash_profile.666666
    fi

cat <<EOF >>/home/grid/.bash_profile
#add by 666666
export ORACLE_SID=${GRID_SIDTemp}1  # RAC1
export ORACLE_BASE=${GRID_BASETemp}
export ORACLE_HOME=${GRID_HOMETemp}
export PATH=/usr/sbin:\$PATH
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=\$ORACLE_HOME/JRE:\$ORACLE_HOME/jlib:\$ORACLE_HOME/rdbms/jlib
umask 022
EOF

else
    grep 666666 /home/oracle/.bash_profile
    if [ $? -eq 0 ]; then
        cp /home/oracle/.bash_profile.666666 /home/oracle/.bash_profile
    else
        cp /home/oracle/.bash_profile /home/oracle/.bash_profile.666666
    fi

cat <<EOF >>/home/oracle/.bash_profile
#add by 666666
export ORACLE_SID=${ORACLE_SIDTemp}2  # RAC2
export ORACLE_UNQNAME=${ORACLE_UNQNAMETemp}
export ORACLE_BASE=${ORACLE_BASETemp}
export ORACLE_HOME=\$ORACLE_BASE/product/11.2.0/db
export TNS_ADMIN=\$ORACLE_HOME/network/admin
export PATH=/usr/sbin:\$PATH
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
EOF

    grep 666666 /home/grid/.bash_profile
    if [ $? -eq 0 ]; then
        cp /home/grid/.bash_profile.666666 /home/grid/.bash_profile
    else
        cp /home/grid/.bash_profile /home/grid/.bash_profile.666666
    fi

cat <<EOF >>/home/grid/.bash_profile
#add by 666666
export ORACLE_SID=${GRID_SIDTemp}2  # RAC2
export ORACLE_BASE=${GRID_BASETemp}
export ORACLE_HOME=${GRID_HOMETemp}
export PATH=/usr/sbin:\$PATH
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=\$ORACLE_HOME/JRE:\$ORACLE_HOME/jlib:\$ORACLE_HOME/rdbms/jlib
umask 022
EOF
fi

# 9.配置本地YUM并安裝依賴包(需要區(qū)分6和7)
mkdir -p /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
mv /etc/yum.repos.d/local.repo /etc/yum.repos.d/local.repo.bak
cat <<EOF >/etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt/cdrom
gpgcheck=0
enabled=1
EOF



yum clean all       #清理本地緩存
yum clean plugins   #清理插件緩存


yum install -y binutils-* compat-db* compat-db-* control-center* gcc-* gcc-c++-* glibc-* glibc-common-* gnome-libs-* \
make-* pdksh* sysstat-* xscreensaver-* make-* gdb-6.1post-* glibc-* glibc-common-* glibc-devel-* glibc-devel-* \
compat-gcc-* compat-gcc-c++-* compat-libstdc++-* compat-libstdc++-devel-* gnome-libs-* libstdc++-* libstdc++-devel-* \
openmotif-* sysstat-* setarch-* libaio-* libaio-devel-* libXp* libXp-devel* elfutils-libelf-devel* unixODBC-* \
unixODBC-devel-* compat-libcap1.x86_64 libcap.so.1 sg3_utils

附錄2:grid靜默安裝響應文件

# 此文件從p13390677_112040_Linux-x86-64_2of7.zip提取
# by 6 20181231 QQ:1327133225

oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v11_2_0

# 修改1:當前安裝節(jié)點的計算機名稱----------------------------------------------(重點注意1)
ORACLE_HOSTNAME=rac1

# 修改2:版本信息路徑(路徑相關可以不修改)
INVENTORY_LOCATION=/u01/app/oraInventory

# 修改3:語言永丝,多選用,隔開(正常來說保持默認即可)
SELECTED_LANGUAGES=en,zh_CN
oracle.install.option=CRS_CONFIG

# 修改4:grid 的 BASE 和 HOME 目錄(路徑相關可以不修改)
ORACLE_BASE=/u01/app/grid
ORACLE_HOME=/u01/app/11.2.0/grid

oracle.install.asm.OSDBA=asmdba
oracle.install.asm.OSOPER=asmoper
oracle.install.asm.OSASM=asmadmin

# 修改5:scan名稱锹漱,和hosts對應--------------------------------------------------(重點注意2)
oracle.install.crs.config.gpnp.scanName=rac-scan

# 修改6:集群監(jiān)聽端口號---------------------------------------------------------(重點注意3)
oracle.install.crs.config.gpnp.scanPort=1521

# 修改7:cluster名稱,可以保持默認
oracle.install.crs.config.clusterName=rac-cluster

oracle.install.crs.config.gpnp.configureGNS=false
oracle.install.crs.config.gpnp.gnsSubDomain=
oracle.install.crs.config.gpnp.gnsVIPAddress=
oracle.install.crs.config.autoConfigureClusterNodeVIP=false

# 修改8:節(jié)點信息慕嚷,跟hosts對應---------------------------------------------------(重點注意4)
oracle.install.crs.config.clusterNodes=rac1:rac1-vip,rac2:rac2-vip

# 修改9:網(wǎng)卡信息和網(wǎng)段哥牍,對應ifconfig結果(兩個節(jié)點的網(wǎng)卡名稱需要一致)----------(重點注意5)
oracle.install.crs.config.networkInterfaceList=eth0:10.0.1.0:1,eth1:11.11.11.0:2

# 存儲形式,使用ASM的話保持默認即可(可以不修改)
oracle.install.crs.config.storageOption=ASM_STORAGE

oracle.install.crs.config.sharedFileSystemStorage.diskDriveMapping=
oracle.install.crs.config.sharedFileSystemStorage.votingDiskLocations=
oracle.install.crs.config.sharedFileSystemStorage.votingDiskRedundancy=NORMAL
oracle.install.crs.config.sharedFileSystemStorage.ocrLocations=
oracle.install.crs.config.sharedFileSystemStorage.ocrRedundancy=NORMAL
oracle.install.crs.config.useIPMI=false
oracle.install.crs.config.ipmi.bmcUsername=
oracle.install.crs.config.ipmi.bmcPassword=

# SYS密碼
oracle.install.asm.SYSASMPassword=asmadmin

# 修改10:表決盤名稱(可以不修改)
oracle.install.asm.diskGroup.name=OCR

# 修改11:表決盤冗余選項(接受以下3個選項)-----------------------------------------(重點注意6)

# HIGH          高冗余:最少5塊磁盤喝检,Oracle ASM默認提供三重鏡像嗅辣。可以容忍在不同故障組中丟失兩個Oracle ASM磁盤挠说。
# NORMAL        正常冗余:最少3塊磁盤澡谭,Oracle ASM默認提供雙向鏡像,這意味著鏡像所有文件损俭,以便每個范圍有兩個副本蛙奖。容許丟失一個磁盤。
# EXTERNAL      外部冗余:最少1塊盤撩炊,由外部RAID提供冗余外永。

oracle.install.asm.diskGroup.redundancy=NORMAL
oracle.install.asm.diskGroup.AUSize=1

# 修改12:表決盤所使用的裸盤崎脉,根據(jù)需要修改------------------------------------------(重點注意7)
oracle.install.asm.diskGroup.disks=/dev/raw/raw1,/dev/raw/raw2,/dev/raw/raw5

oracle.install.asm.diskGroup.diskDiscoveryString=

# ASMSNMP密碼
oracle.install.asm.monitorPassword=asmadmin
oracle.install.crs.upgrade.clusterNodes=
oracle.install.asm.upgradeASM=false
oracle.installer.autoupdates.option=SKIP_UPDATES
oracle.installer.autoupdates.downloadUpdatesLoc=
AUTOUPDATES_MYORACLESUPPORT_USERNAME=
AUTOUPDATES_MYORACLESUPPORT_PASSWORD=
PROXY_HOST=
PROXY_PORT=0
PROXY_USER=
PROXY_PWD=
PROXY_REALM=
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末拧咳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子囚灼,更是在濱河造成了極大的恐慌骆膝,老刑警劉巖祭衩,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異阅签,居然都是意外死亡掐暮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門政钟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來路克,“玉大人,你說我怎么就攤上這事养交【悖” “怎么了?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵碎连,是天一觀的道長灰羽。 經(jīng)常有香客問我,道長鱼辙,這世上最難降的妖魔是什么廉嚼? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮倒戏,結果婚禮上怠噪,老公的妹妹穿的比我還像新娘。我一直安慰自己杜跷,他們只是感情好舰绘,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著葱椭,像睡著了一般捂寿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上孵运,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天秦陋,我揣著相機與錄音,去河邊找鬼治笨。 笑死驳概,一個胖子當著我的面吹牛,可吹牛的內容都是我干的旷赖。 我是一名探鬼主播顺又,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼等孵!你這毒婦竟也來了稚照?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎果录,沒想到半個月后上枕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡弱恒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年辨萍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片返弹。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡锈玉,死狀恐怖,靈堂內的尸體忽然破棺而出义起,到底是詐尸還是另有隱情嘲玫,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布并扇,位于F島的核電站去团,受9級特大地震影響,放射性物質發(fā)生泄漏穷蛹。R本人自食惡果不足惜土陪,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肴熏。 院中可真熱鬧鬼雀,春花似錦、人聲如沸蛙吏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸦做。三九已至励烦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泼诱,已是汗流浹背坛掠。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留治筒,地道東北人屉栓。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像耸袜,于是被迫代替她去往敵國和親友多。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內容