/测试案例

双向多主复制环境下的timesten升级测试

背景=========== 客户升级应用,但应用打包了timesten,所以升级应用过程中涉及timesten的重装,所以如何避免升级过程中因升级而写入升级库的数据不被复制到另一边的未升级环境就成了问题。本测试步骤用升级过程中插入数据 application upgrade来模拟应用升级的数据插入。环境=============两个虚拟机,ADG和ADG2,重装(升级)ADG的timesten,升级过程中(恢复ADG2到ADG复制之前)的数据不复制到ADG。配置(双向多主复制)===================ADG1:create replication REP.REPSCHEME1 element “COMPLETE1” datastore master “ACTIVE” on “ADG2” subscriber “ACTIVE” on “ADG” element “COMPLETE2” datastore master “ACTIVE” on “ADG” subscriber “ACTIVE” on “ADG2” store “ACTIVE” on “ADG2” port 16090 store “ACTIVE” on “ADG” port 16093;CALL ttRepStart;ttAdmin -repPolicy always activeADG2:ttRepAdmin -duplicate -from active -host adg -uid repl -pwd repl “dsn=active”ttAdmin -repPolicy always active<<<<adg:Command> call ttrepstop;Command> drop replication REP.REPSCHEME1;Command> drop replication REP.REPSCHEME2;Command> create replication REP.REPSCHEME1 > element “COMPLETE1” datastore > master “ACTIVE” on “ADG2” > subscriber “ACTIVE” on “ADG” > element “COMPLETE2” datastore > master “ACTIVE” on “ADG” > subscriber “ACTIVE” on “ADG2” > store “ACTIVE” on “ADG2” > port 16090 > store “ACTIVE” on “ADG” > port 16093 > ;Command> CALL ttRepStart;Command> create user repl identified by ‘repl’;15004: User REPL already existsThe command failed.Command> exitDisconnecting…Done.[oracle@adg bin]$ ./ttAdmin -repPolicy always activeRAM Residence Policy : inUseReplication Agent Policy : alwaysCache Agent Policy : manualCache Agent Manually Started : False[oracle@adg bin]$ ./ttisql activeCopyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.Type ? or “help” for help, type “exit” to quit ttIsql.connect “DSN=active”;Connection successful: DSN=active;UID=oracle;DataStore=/home/oracle/TimesTen/tt1122/info/active;DatabaseCharacterSet=WE8MSWIN1252;ConnectionCharacterSet=US7ASCII;DRIVER=/home/oracle/TimesTen/tt1122/lib/libtten.so;PermSize=64;TypeMode=0;(Default setting AutoCommit=1)Command> insert into rep.t1 values(1,’test2′); 907: Unique constraint (T1 on REP.T1) violated at Rowid <BMUFVUAAACZAAAAKDR>The command failed.Command> insert into rep.t1 values(3,’test3′);1 row inserted.Command> commit;Command> select * from rep.t1;< 1, test >< 2, test >< 3, test3 >< 4, test4 >4 rows found.Command> <<<<adg2[oracle@adg2 bin]$ ./ttdestroy active[oracle@adg2 bin]$ ./ttRepAdmin -duplicate -from active -host adg -localhost adg2 -uid repl -pwd repl “dsn=active”[oracle@adg2 bin]$ ttIsql -e “call ttrepstart;exit;” active-bash: ttIsql: command not found[oracle@adg2 bin]$ ./ttIsql -e “call ttrepstart;exit;” activeCopyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.Type ? or “help” for help, type “exit” to quit ttIsql.connect “DSN=active”;Connection successful: DSN=active;UID=oracle;DataStore=/home/oracle/TimesTen/tt1122/info/active;DatabaseCharacterSet=WE8MSWIN1252;ConnectionCharacterSet=US7ASCII;DRIVER=/home/oracle/TimesTen/tt1122/lib/libtten.so;PermSize=64;TypeMode=0;(Default setting AutoCommit=1)call ttrepstart;exit;Disconnecting…Done.[oracle@adg2 bin]$ ./ttAdmin -repPolicy always activeRAM Residence Policy : inUseReplication Agent Policy : alwaysCache Agent Policy : manualCache Agent Manually Started : False[oracle@adg2 bin]$ ./ttisql activeCopyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.Type ? or “help” for help, type “exit” to quit ttIsql.connect “DSN=active”;Connection successful: DSN=active;UID=oracle;DataStore=/home/oracle/TimesTen/tt1122/info/active;DatabaseCharacterSet=WE8MSWIN1252;ConnectionCharacterSet=US7ASCII;DRIVER=/home/oracle/TimesTen/tt1122/lib/libtten.so;PermSize=64;TypeMode=0;(Default setting AutoCommit=1)Command> select * from rep.t1;< 1, test >< 2, test >< 3, test3 >3 rows found.Command> insert into rep.t1 values(4,’test4′);1 row inserted.Command> commit;==========升级过程=================<<<Step 1 配置静态复制端口,跳过,因为已经使用了静态端口复制<<<Step 2&3,停止待升级的adg上的应用连接,并在adg2上pause adg2到adg的复制,不是直接停掉复制,这样可以等待transaction log上的事务在停复制前复制到adg上而不是丢失(因为升级后第10步是reset receiver,会清掉bookmark)。<–adg[oracle@adg2 bin]$ ./ttRepAdmin -receiver -name active -state pause active[oracle@adg2 bin]$ ./ttisql activeCopyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.Type ? or “help” for help, type “exit” to quit ttIsql.connect “DSN=active”;Connection successful: DSN=active;UID=oracle;DataStore=/home/oracle/TimesTen/tt1122/info/active;DatabaseCharacterSet=WE8MSWIN1252;ConnectionCharacterSet=US7ASCII;DRIVER=/home/oracle/TimesTen/tt1122/lib/libtten.so;PermSize=64;TypeMode=0;(Default setting AutoCommit=1)Command> select * from rep.t1;< 1, test >< 2, test >< 3, test3 >< 4, test4 >< 5, upgrade_step3 >5 rows found.Command> insert into rep.t1 values(6,’upgrade_step3_adg2′);<===pause复制后,在adg2插入一条数据1 row inserted.Command> commit;Command> select * from rep.t1;< 1, test >< 2, test >< 3, test3 >< 4, test4 >< 5, upgrade_step3 >< 6, upgrade_step3_adg2 >6 rows found.[oracle@adg bin]$ ./ttisql activeCopyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.Type ? or “help” for help, type “exit” to quit ttIsql.connect “DSN=active”;Connection successful: DSN=active;UID=oracle;DataStore=/home/oracle/TimesTen/tt1122/info/active;DatabaseCharacterSet=WE8MSWIN1252;ConnectionCharacterSet=US7ASCII;DRIVER=/home/oracle/TimesTen/tt1122/lib/libtten.so;PermSize=64;TypeMode=0;(Default setting AutoCommit=1)Command> insert into rep.t1 values(5,’upgrade_step3′);1 row inserted.Command> commit;Command> select * from rep.t1;< 1, test >< 2, test >< 3, test3 >< 4, test4 >< 5, upgrade_step3 ><====在adg2 pause receiver之后,adg2新插入的记录没有传播到adg5 rows found.<<<Step4 停止两边的rep agent,从此没有更新发送到对方<—adg[oracle@adg bin]$ ./ttAdmin -repStop active*** [TimesTen][TimesTen 11.2.2.8.18 ODBC Driver][TimesTen]TT10016: Replication Agent was not stopped due to repPolicy setting. *** ODBC Error = S1000, TimesTen Error = 10016[oracle@adg bin]$ ./ttAdmin -repPolicy manual activeRAM Residence Policy : inUseReplication Agent Policy : manualReplication Manually Started : TrueCache Agent Policy : manualCache Agent Manually Started : False[oracle@adg bin]$ ./ttAdmin -repStop activeRAM Residence Policy : inUseReplication Agent Policy : manualReplication Manually Started : FalseCache Agent Policy : manualCache Agent Manually Started : False<—adg2[oracle@adg2 bin]$ ./ttAdmin -repPolicy manual activeRAM Residence Policy : inUseReplication Agent Policy : manualReplication Manually Started : TrueCache Agent Policy : manualCache Agent Manually Started : False[oracle@adg2 bin]$ ./ttAdmin -repStop activeRAM Residence Policy : inUseReplication Agent Policy : manualReplication Manually Started : FalseCache Agent Policy : manualCache Agent Manually Started : False<<<Step5<===防止adg2上有积压的更新发送到adg[oracle@adg bin]$ ./ttRepAdmin -receiver -name active -state stop active[oracle@adg bin]$ <<<Step6<==备份[oracle@adg bin]$ ./ttMigrate -c active /home/oracle/backup.datSaving user PUBLICUser successfully saved.Saving user REPUser successfully saved.Saving user REPLUser successfully saved.Saving table REP.T1 Saving rows… 5/5 rows saved.Table successfully saved.Saving table REP.T2 Saving rows… 0/0 rows saved.Table successfully saved.<<<Step7<===adg删库;adg2重启repagent<–adg删库[oracle@adg bin]$ ./ttdestroy active[oracle@adg bin]$ <–adg2重启repagent[oracle@adg2 bin]$ ./ttAdmin -repStart activeRAM Residence Policy : inUseReplication Agent Policy : manualReplication Manually Started : TrueCache Agent Policy : manualCache Agent Manually Started : False[oracle@adg2 bin]$ <<<Step8<–adg,重装(或升级)[oracle@adg bin]$ ./ttdaemonadmin -stopTimesTen Daemon stopped.[oracle@adg ~]$ cd[oracle@adg ~]$ rm -rf TimesTen[oracle@adg linux8664]$ rm -rf /etc/TimesTen/instance_info [oracle@adg ~]$ cd install/linux8664/[oracle@adg linux8664]$ ./setup.shThere is 1 TimesTen instance installed locally :1) tt1122 (TimesTen11.2.2.8)Of the following options : [1] Install a new instance [2] Upgrade an existing instance [3] Display information about an existing instance [q] Quit the installationWhich would you like to perform? [ 1 ] 1* The default instance name ‘tt1122’ is in use….The 11.2.2.8 Release Notes are located here : ‘/home/oracle/TimesTen/tt1122/README.html’Starting the daemon …TimesTen Daemon startup OK.End of TimesTen installation.<–adg2,恢复从adg2到adg的replication,并插入一条测试数据[oracle@adg2 bin]$ ./ttRepAdmin -receiver -name active -state start active[oracle@adg2 bin]$ ./ttisql activeCopyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.Type ? or “help” for help, type “exit” to quit ttIsql.connect “DSN=active”;Connection successful: DSN=active;UID=oracle;DataStore=/home/oracle/TimesTen/tt1122/info/active;DatabaseCharacterSet=WE8MSWIN1252;ConnectionCharacterSet=US7ASCII;DRIVER=/home/oracle/TimesTen/tt1122/lib/libtten.so;PermSize=64;TypeMode=0;(Default setting AutoCommit=1)Command> insert into rep.t1 values(8,’during upgrade’);1 row inserted.Command> commit;<<<Step9,adg导回备份将active的dsn加回info/sys.odbc.ini:[active]Driver=/home/oracle/TimesTen/tt1122/lib/libtten.soDataStore=/home/oracle/TimesTen/tt1122/info/activePermSize=64DatabaseCharacterSet=WE8MSWIN1252然后还原备份:[oracle@adg bin]$ ./ttmigrate -r active /home/oracle/backup.datRestoring user REP Restoring privileges… Privileges restored.User successfully restored.Restoring user REPL Restoring privileges… Privileges restored.User successfully restored.Restoring table REP.T1 Restoring rows… 5/5 rows restored.Table successfully restored.Restoring table REP.T2 Restoring rows… 0/0 rows restored.Table successfully restored.Restoring replication schema (supports replicated sequences) REP.REPSCHEME1Replication schema (supports replicated sequences) successfully restored.[oracle@adg bin]$ ./ttisql activeCopyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.Type ? or “help” for help, type “exit” to quit ttIsql.connect “DSN=active”;Connection successful: DSN=active;UID=oracle;DataStore=/home/oracle/TimesTen/tt1122/info/active;DatabaseCharacterSet=WE8MSWIN1252;ConnectionCharacterSet=US7ASCII;DRIVER=/home/oracle/TimesTen/tt1122/lib/libtten.so;PermSize=64;TypeMode=0;(Default setting AutoCommit=1)Command> insert into rep.t1 values(9,’application upgrade’);《—-插入数据模拟应用升级过程中的数据写入,这条数据不应该被复制到adg21 row inserted.Command> commit;<<<Step10, 通过把adg2的receiver state重置来清空adg的replication bookmark和txn logs,并重启replication[oracle@adg bin]$ ./ttRepAdmin -receiver -name active -reset active[oracle@adg bin]$ ./ttRepAdmin -receiver -name active -state stop active[oracle@adg bin]$ ./sleep 10[oracle@adg bin]$ ./ttRepAdmin -receiver -name active -state start active<<<Step11 启动adg到adg2的复制[oracle@adg bin]$ ./ttAdmin -repStart activeRAM Residence Policy : inUseReplication Agent Policy : manualReplication Manually Started : TrueCache Agent Policy : manualCache Agent Manually Started : False<<<Step12 两节点插入数据并检查<–adg[oracle@adg bin]$ ./ttisql activeCopyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.Type ? or “help” for help, type “exit” to quit ttIsql.connect “DSN=active”;Connection successful: DSN=active;UID=oracle;DataStore=/home/oracle/TimesTen/tt1122/info/active;DatabaseCharacterSet=WE8MSWIN1252;ConnectionCharacterSet=US7ASCII;DRIVER=/home/oracle/TimesTen/tt1122/lib/libtten.so;PermSize=64;TypeMode=0;(Default setting AutoCommit=1)Command> select * from rep.t1;< 1, test >< 2, test >< 3, test3 >< 4, test4 >< 5, upgrade_step3 >< 8, during upgrade >< 9, application upgrade >7 rows found.Command> insert into rep.t1 values(11,’after upgrade’);1 row inserted.Command> commit;Command> select * from rep.t1;< 1, test >< 2, test >< 3, test3 >< 4, test4 >< 5, upgrade_step3 >< 8, during upgrade >< 9, application upgrade >< 10, after upgrade >< 11, after upgrade >9 rows found.Command><–adg2[oracle@adg2 bin]$ ./ttisql activeCopyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.Type ? or “help” for help, type “exit” to quit ttIsql.connect “DSN=active”;Connection successful: DSN=active;UID=oracle;DataStore=/home/oracle/TimesTen/tt1122/info/active;DatabaseCharacterSet=WE8MSWIN1252;ConnectionCharacterSet=US7ASCII;DRIVER=/home/oracle/TimesTen/tt1122/lib/libtten.so;PermSize=64;TypeMode=0;(Default setting AutoCommit=1)Command> insert into rep.t1 values(10,’after upgrade’);1 row inserted.Command> commit;Command> select * from rep.t1;< 1, test >< 2, test >< 3, test3 >< 4, test4 >< 5, upgrade_step3 >< 6, upgrade_step3_adg2 >< 8, during upgrade ><===可以看到第9条数据“application upgrade”没有写入adg2节点< 10, after upgrade >< 11, after upgrade >9 rows found.Command>结论======这个步骤虽然是用于双向多主复制的timesten升级的,但同样适用于Application升级。通过如上测试记录可见,第9步导回数据库后插入的记录,在第10步重置adg到adg2的replication bookmark&txn log并启动复制后,是没有被复制到adg2的。注:我这里将两边的datastore名称都设置为active了,所以执行ttRepAdmin -receiver的时候容易弄错节点,这个命令应该在它所修改的复制方向的主库上运行(例如adg到adg2就在adg上跑)。

在VirtualBox环境中安装Solaris 10(x86-64)上的Oracle 11.2.0.4双节点RAC

概述
本文来自Oracle数据库产品技术支持官方博客:
https://blogs.oracle.com/Database4CN/
 
本文包含截图,如果需要下载完整的版本,请下载附件。
 
 
本文的目的是以VirtualBox实现在Solaris 10(x86-64)操作系统上两节点的Oracle11.2.0.4 RAC,本实验会先创建一个虚拟机host1,然后用VirtualBox复制的功能创建host2, 这样我们就能得到两台对称的主机用作RAC的两个节点。
 
本文主要参考:
http://docs.oracle.com/cd/E11882_01/install.112/e47805/toc.htm
 
Solaris操作系统的安装以及配置并不是本文的重点,不过在本文附录中介绍了安装RAC可能会用到的Solaris命令。
环境准备
VirtualBox: https://www.virtualbox.org/
Host: Windows 10 x86-64; 70G Disk; 8G Memory; Intel(R) Core(TM) i3-6100 CPU @ 3.70GHz
Guest: Solaris 10 x86-64; 20G Disk; 3G Memory; 2 CPU
Solaris安装介质: [sol-10-u11-ga-x86-dvd.iso]
http://www.oracle.com/technetwork/server-storage/solaris10/downloads/index.html
Oracle安装介质: [选择Solaris x86-64]
https://updates.oracle.com/download/13390677.html
目录结构
vm
  |
  |— sol10
       |
       |—host1
       |    |——–disk1.vdi(20g)
       |
       |—host2
       |    |——–disk1.vdi(20g)
       |
       |— shared-disk
               |——–disk1.vdi(1g)
               |——–disk2.vdi(1g)
|——–disk3.vdi(1g)
|——–disk4.vdi(10g)
|——–disk5.vdi(10g)
虚拟机配置清单
 
虚拟磁盘规划
磁盘 分区 挂载点 文件系统 大小
host1/disk1 c0t0d0s0 / ufs 14g
c0t0d0s1 swap 6g
host2/disk1 c0t0d0s0 / ufs 14g
c0t0d0s1 swap 6g
shared-disk/disk[1-3] 用做normal redundancy的ocr和voting files 1g*3
shared-disk/disk[4-5] 用做normal redundancy的disk group存放数据文件 10g*2
ip规划
将宿主机中的VirtualBox Host-Only Network这个虚拟网卡的ip设置为10.4.120.1以便能与虚拟机通讯, 如下是规划的虚拟机ip信息
host1 e1000g0 e1000g1
ip 10.4.120.15 192.168.1.15
netmask 255.255.255.0 255.255.255.0
gateway 10.4.120.1
host2 e1000g0 e1000g1
ip 10.4.120.16 192.168.1.16
netmask 255.255.255.0 255.255.255.0
gateway 10.4.120.1
安装Solaris 10系统
安装host1的时候,先不用在VirtualBox挂上shared-disk,可以等host1完全安装完毕,并且成功复制出host2后,再挂shared-disk。
Solaris选择最小化安装Core System Support Software Group(Core Group)即可,安装时注意给swap分配6G,剩余磁盘全部给/,创建文件系统时选择ufs文件系统。
设置主机和IP
# cat /etc/nodename
 
host1
 
# cat /etc/hosts
 
::1 localhost
127.0.0.1 localhost
10.4.120.15     host1   loghost
10.4.120.16     host2
192.168.1.15    host1-priv
192.168.1.16    host2-priv
10.4.120.115    host1-vip
10.4.120.116    host2-vip
 
# cat /etc/hostname.e1000g0
 
host1
 
# cat /etc/hostname.e1000g1
 
host1-priv
 
# cat /etc/netmasks
 
10.4.120.0      255.255.255.0
192.168.1.0     255.255.255.0
关掉不用的服务
# svcadm disable svc:network/ftp
# svcadm disable svc:network/telnet
# svcadm disable svc:network/smtp:sendmail
添加安装RAC所必须的package
在添加安装手册中提到的package之前,建议先安装如下package,这些都不是安装RAC所必需的,不过安装后可以大大提高安装RAC的效率。
# pkginfo -i SUNWxcu4 SUNWbash SUNWman SUNWsshcu SUNWsshdu SUNWbind
 
如下是一个安装package的示例, 注意如果提示依赖关系, 那么需要先安装依赖的package
# mount -F hsfs -o ro /dev/dsk/c1t0d0s2 /mnt/cdrom
# pkgadd -d /mnt/cdrom/Solaris_10/Product/ SUNWbash
 
安装完以上package后就可以使用比sh更友好的bash了,如下:
 
# vi /etc/passwd
 
root:x:0:0:Super-User:/root:/usr/bin/bash
 
然后开启ssh, 这样我们可以远程ssh上来, 方便复制粘贴
# ssh-keygen -b 1024 -t rsa1 -f /etc/ssh/ssh_host_key -N “”
# ssh-keygen -b 1024 -t rsa -f /etc/ssh/ssh_host_rsa_key -N “”
# ssh-keygen -b 1024 -t dsa -f /etc/ssh/ssh_host_dsa_key -N “”
# svcadm enable /network/ssh
 
允许root远程登录
# vi /etc/default/login
 
CONSOLE=/dev/console —用#注释掉这一行
 
允许root ssh远程登录
# vi /etc/ssh/sshd_config
 
PermitRootLogin yes
 
重启后我们应当可以通过工具远程ssh到这个系统了,当可以远程ssh后,我们就可以按照文档要求的安装Oracle 11.2 GI & database 所需的package了:
 
# pkginfo -i SUNWarc SUNWbtool SUNWhea SUNWlibC SUNWlibm SUNWlibms SUNWsprot SUNWtoo SUNWi1of SUNWi1cs SUNWi15cs SUNWxwfnt SUNWcsl
安装VirtualBox增强功能
接下来建议安装VirtualBox增强功能, 有了VirtualBox增强功能,我们就可以挂载VirtualBox共享文件夹了, 这样就不需要把安装介质上传到虚拟机里面了, 参考
https://www.virtualbox.org/manual/ch04.html#idm2003
 
在虚拟机的存储中添加一个IDE控制器,然后添加光盘,将光盘放入如下iso文件
C:\Program Files\Oracle\VirtualBox\VBoxGuestAdditions.iso
 
然后启动虚拟机, 在虚拟机中mount光盘, 安装增强功能
# mount -F hsfs -o ro /dev/dsk/c1t0d0s2 /mnt/cdrom
# pkgadd -G -d /mnt/cdrom/VBoxSolarisAdditions.pkg
 
如果今后想卸载VirtualBox增强功能, 可用如下命令
# pkgrm SUNWvboxguest
创建用户和组
执行如下命令以创建grid和oracle用户以及相关的组:
# groupadd -g 1000 oinstall
# groupadd -g 1100 asmadmin
# groupadd -g 1101 asmdba
# groupadd -g 1102 asmoper
# groupadd -g 1200 dba
# groupadd -g 1201 oper
# useradd -u 1000 -g oinstall -G asmadmin,asmdba,asmoper,dba -d /export/home/grid -m -s /usr/bin/bash -c “Grid Infrastructure Owner” grid
# useradd -u 1001 -g oinstall -G asmdba,dba,oper -d /export/home/oracle -m -s /usr/bin/bash -c “Oracle Software Owner” oracle
 
# passwd grid
grid123
 
# passwd oracle
oracle123
 
# id -a grid
uid=1000(grid) gid=1000(oinstall) groups=1100(asmadmin),1101(asmdba),1102(asmoper),1200(dba)
 
# id -a oracle
uid=1001(oracle) gid=1000(oinstall) groups=1101(asmdba),1200(dba),1201(oper)
建立grid & Oracle软件安装目录
用如下命令创建grid和oracle software的安装目录
# mkdir -p /u01/app/grid
# mkdir -p /u01/app/11.2.0/grid
# chown -R grid:oinstall /u01
# mkdir -p /u01/app/oracle/product/11.2.0/dbhome_1
# chown -R oracle:oinstall /u01/app/oracle
# chmod -R 775 /u01
 
根据文档要求创建与ssh相关的软连接
http://docs.oracle.com/cd/E11882_01/install.112/e47805/presolar.htm#CWSOL227
 
# ln -s /etc/ssh /usr/local/etc
# ln -s /usr/bin /usr/local/bin
配置内核参数
查看udp 和 tcp port范围
# /usr/sbin/ndd /dev/tcp tcp_smallest_anon_port tcp_largest_anon_port
 
根据安装文档, 需要将以上参数设置成如下
 
# /usr/sbin/ndd -set /dev/tcp tcp_smallest_anon_port 9000
# /usr/sbin/ndd -set /dev/tcp tcp_largest_anon_port 65500
# /usr/sbin/ndd -set /dev/udp udp_smallest_anon_port 9000
# /usr/sbin/ndd -set /dev/udp udp_largest_anon_port 65500
 
不过以上设置会在重启后丢失, 无法永久保存, 创建如下启动脚本让Solaris启动的时候, 自动修改udp和tcp的参数
 
# cat /etc/init.d/rac_udp_tcp
 
#!/sbin/sh
 
case “$1” in
‘start’)
        /usr/sbin/ndd -set /dev/tcp tcp_smallest_anon_port 9000
        /usr/sbin/ndd -set /dev/tcp tcp_largest_anon_port 65500
        /usr/sbin/ndd -set /dev/udp udp_smallest_anon_port 9000
        /usr/sbin/ndd -set /dev/udp udp_largest_anon_port 65500
        ;;
      *)
        echo “Usage: $0 start”
        exit 1
        ;;
esac
exit 0
 
# chmod +x /etc/init.d/rac_udp_tcp
# ln -s /etc/init.d/rac_udp_tcp /etc/rc3.d/S30rac_udp_tcp
 
配置kernel参数(default)
# projmod -sK “project.max-shm-memory=(priv,4GB,deny)” default
# projmod -sK “project.max-sem-nsems=(priv,256,deny)” default
# projmod -sK “project.max-sem-ids=(priv,100,deny)” default
# projmod -sK “project.max-shm-ids=(priv,100,deny)” default
# projmod -sK “process.max-file-descriptor=(basic,65536,deny),(privileged,65536,deny)” default
# projmod -sK “process.max-stack-size=(basic,33554432,deny),(privileged,33554432,deny)” default
 
下面把root的也配了, 因为crs是root启动的, crs启动时会继承root的project配置, 如果不配root的话, 在通过root用户配置gi(运行root.sh)或者启动asm资源时可能会发生如下错误:
 
ORA-27102: out of memory
Solaris-AMD64 Error: 22: Invalid argument
 
配置kernel参数(root)
# projmod -sK “project.max-shm-memory=(priv,4GB,deny)” user.root
# projmod -sK “project.max-sem-nsems=(priv,256,deny)” user.root
# projmod -sK “project.max-sem-ids=(priv,100,deny)” user.root
# projmod -sK “project.max-shm-ids=(priv,100,deny)” user.root
# projmod -sK “process.max-file-descriptor=(basic,65536,deny),(privileged,65536,deny)” user.root
# projmod -sK “process.max-stack-size=(basic,33554432,deny),(privileged,33554432,deny)” user.root
 
查看poeject配置, 多种方法
# cat /etc/project
# projects -l
# prctl -n project.max-shm-memory -i project user.root
 
如果今后需要将project的配置还原, 只需要将以上的-sK 换成 -rK即可, 例如
 
# projmod -rK “project.max-shm-memory=(priv,4GB,deny)” default
……
# projmod -rK “project.max-shm-memory=(priv,4GB,deny)” user.root
……
配置bash环境变量
root用户(非必须, 只是为了今后执行crsctl等命令方便)
# vi .bash_profile
 
PATH=/usr/sbin:/usr/bin:/usr/sfw/bin
 
ORACLE_SID=+ASM1
ORACLE_BASE=/u01/app/grid
ORACLE_HOME=/u01/app/11.2.0/grid
PATH=$PATH:$ORACLE_HOME/bin:$ORACLE_HOME/OPatch
 
export ORACLE_SID ORACLE_BASE ORACLE_HOME PATH
 
grid用户
# su – grid
$ vi .bash_profile
 
if [ -t 0 ]; then
   stty intr ^C
fi
 
# User specific environment and startup programs
 
ORACLE_SID=+ASM1
ORACLE_BASE=/u01/app/grid
ORACLE_HOME=/u01/app/11.2.0/grid
PATH=$PATH:$ORACLE_HOME/bin:$ORACLE_HOME/OPatch
 
export ORACLE_SID ORACLE_BASE ORACLE_HOME PATH
umask 022
 
oracle用户
# su – oracle
$ vi .bash_profile
 
if [ -t 0 ]; then
   stty intr ^C
fi
 
ORACLE_SID=orcl1
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
PATH=$PATH:$ORACLE_HOME/bin:$ORACLE_HOME/OPatch
 
export ORACLE_SID ORACLE_BASE ORACLE_HOME PATH
umask 022
配置DNS server以提供对scan ip的解析
注意DNS server端可在宿主机中安装bind来实现, 本例宿主机为windows, 可以选择ISC BIND, 它的配置与Linux上的bind相同
https://www.isc.org/downloads/
 
默认isc-bind会安装在C:\Program Files\ISC BIND 9\目录中, 在这个目录中创建子目录etc, 然后在etc中创建如下3个文件:
 
named.conf
myrac.com.zone
120.4.10.in-addr.arpa
 
文件内容参考目录isc-bind,本文也把这些文件内容贴出来了供参考:
 
文件named.conf内容
options {
directory “C:\Program Files\ISC BIND 9\etc”;
};
 
zone “myrac.com” in {
type master;
file “myrac.com.zone”;
};
 
zone “120.4.10.in-addr.arpa” in {
type master;
file “120.4.10.in-addr.arpa”;
};
 
文件myrac.com.zone内容
$TTL 6h
@ IN SOA ns1.myrac.com. hostmaster.myrac.com. (
2017010100
10800
3600
604800
86400 )
 
@ NS ns1.myrac.com.
 
ns1 IN A 10.4.120.1
 
host1 IN A 10.4.120.15
host2 IN A 10.4.120.16
host1-vip IN A 10.4.120.115
host2-vip IN A 10.4.120.116
my-rac-scan IN A 10.4.120.110
my-rac-scan IN A 10.4.120.111
my-rac-scan IN A 10.4.120.112
 
文件120.4.10.in-addr.arpa内容
$TTL 6h
@ IN SOA ns1.myrac.com. hostmaster.myrac.com. (
2017010100
10800
3600
604800
86400 )
 
@ NS ns1.myrac.com.
 
1 IN PTR ns1.myrac.com.
 
15 IN PTR host1.myrac.com.
16 IN PTR host2.myrac.com.
115 IN PTR host1-vip.myrac.com.
116 IN PTR host2-vip.myrac.com.
110 IN PTR my-rac-scan.myrac.com.
111 IN PTR my-rac-scan.myrac.com.
112 IN PTR my-rac-scan.myrac.com.
 
以上配置文件完毕后, 在windows的服务中启动ISC BIND服务
 
在guest host中配置DNS客户端以解析scan ip
# vi /etc/resolv.conf
 
domain myrac.com
nameserver 10.4.120.1
 
# vi /etc/nsswitch.conf
 
hosts:      dns files
 
在guest host中测试DNS是否工作正常
 
# nslookup ns1
# nslookup my-rac-scan
# nslookup 10.4.120.1
# nslookup 10.4.120.110
复制生成另一个节点host2
shutdown当前host1后, 在VirtualBox主界面:
控制->复制, 注意勾选 “重新初始化所有网卡的 MAC 地址”
配置另一个节点host2
复制完毕后, 适当修改host2.vbox里的相关信息, 主要是将MAC地址信息调整成上下文一致。然后启动新节点, 修改新节点的ip(参考本文开始的ip规划)
# vi /etc/nodename
# vi /etc/hosts
# vi /etc/hostname.e1000g0
# vi /etc/hostname.e1000g1
# vi /etc/netmasks
 
修改新节点的root/grid/oracle用户的.bash_profile中的$ORACLE_SID 为 +ASM2/orcl2(略), 重启新创建的节点使修改生效
挂载共享磁盘
关闭host1和host2,然后按照之前规划的目录结构创建shared-disk目录,然后在VirtualBox的host1中,添加shared-disk的磁盘1-5,然后回到VirtualBox主界面:
管理->虚拟介质管理,选中shared-disk的磁盘,点击[修改],弹出的界面中选择[可共享];
将shared-disk的disk[1-5]都改成[可共享]
然后在host2的VirtualBox界面中添加磁盘,选择[使用现有的虚拟盘],浏览到shared-disk文件夹,按顺序将将shared-disk目录里的disk[1-5]添加到host2的SATA存储中。
分别启动host1, host2,分别执行如下命令
# touch /reconfigure
然后再重启观察新磁盘是否能在所有host中看到,并且设备名称统一。
配置节点互信
启动所有节点, 先对grid用户配置互信, 如下命令需要在host1和host2中都执行
# su – grid
$ mkdir -p ~/.ssh
$ chmod 700 ~/.ssh
$ ssh-keygen -t rsa
 
如下命令只需要在host1中执行执行
$ touch ~/.ssh/authorized_keys
$ ssh host1 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ ssh host2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ scp ~/.ssh/authorized_keys host2:.ssh/authorized_keys
 
如下命令需要在host1和host2中都执行
$ chmod 600 ~/.ssh/authorized_keys
 
测试互信, 所有节点grid用户执行如下命令直到不需要再输入密码为止
 
$ ssh host1 date
$ ssh host2 date
$ ssh host1-priv date
$ ssh host2-priv date
 
然后以同样的方法, 对oracle用户配置互信(过程与grid完全一样,略)
执行安装检查
保持host1和host2都启动的状态, host1通过共享文件夹挂载安装介质, 在宿主机中, 将p13390677_112040_Solaris86-64_3of6.zip当前路径解压, 会解压出一个grid目录, 然后在VirtualBox运行界面临时分配一个共享文件夹, 路径选择解压出来的grid这个目录.
最后在虚拟机中挂载这个共享文件夹(注意grid是宿主机中的共享文件夹名称)
# mount -F vboxfs -o ro grid /mnt/cdrom/
# su – grid
$ /mnt/cdrom/runcluvfy.sh stage -pre crsinst -n host1,host2 -fixup -verbose
输出参考runcluvfy.txt,所有的检查项目都应当为”passed”,并且最后提示:
Pre-check for cluster services setup was successful.
安装GI software 
以software only模式安装GI, 可以逐个节点安装, 只用启动需要安装的节点即可
# mount -F vboxfs -o ro grid /mnt/cdrom/
# su – grid
$ export DISPLAY=10.4.120.1:0.0
$ /mnt/cdrom/runInstaller
注意选择software only, 安装完一个节点再安装其他节点, 截图及输出参考文件夹gi-software-only,如下是所有的步骤截图,供参考:
 
共享磁盘分区
在host1对共享磁盘分区, 注意共享磁盘分区只需要在任意一个节点执行即可, 具体命令及输出参考disk-format.txt,主要命令如下: (注意0为本地磁盘,1-5为共享磁盘)
# format
format> disk
 
AVAILABLE DISK SELECTIONS:
       0. c0t0d0 <ATA    -VBOX HARDDISK  -1.0  cyl 2607 alt 2 hd 255 sec 63>
          /pci@0,0/pci8086,2829@d/disk@0,0
       1. c0t1d0 <ATA    -VBOX HARDDISK  -1.0 cyl 1020 alt 2 hd 64 sec 32>
          /pci@0,0/pci8086,2829@d/disk@1,0
       2. c0t2d0 <ATA    -VBOX HARDDISK  -1.0  cyl 1020 alt 2 hd 64 sec 32>
          /pci@0,0/pci8086,2829@d/disk@2,0
       3. c0t3d0 <ATA    -VBOX HARDDISK  -1.0  cyl 1020 alt 2 hd 64 sec 32>
          /pci@0,0/pci8086,2829@d/disk@3,0
       4. c0t4d0 <ATA    -VBOX HARDDISK  -1.0  cyl 1302 alt 2 hd 255 sec 63>
          /pci@0,0/pci8086,2829@d/disk@4,0
       5. c0t5d0 <ATA    -VBOX HARDDISK  -1.0  cyl 1302 alt 2 hd 255 sec 63>
          /pci@0,0/pci8086,2829@d/disk@5,0
Specify disk (enter its number)[1]: 2
selecting c0t2d0
[disk formatted]
format> p
partition> p
Current partition table (original):
Total disk cylinders available: 1020 + 2 (reserved cylinders)
 
Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       0               0         (0/0/0)          0
  1 unassigned    wm       0               0         (0/0/0)          0
  2     backup    wu       0 – 1019     1020.00MB    (1020/0/0) 2088960
  3 unassigned    wm       0               0         (0/0/0)          0
  4 unassigned    wm       0               0         (0/0/0)          0
  5 unassigned    wm       0               0         (0/0/0)          0
  6 unassigned    wm       0               0         (0/0/0)          0
  7 unassigned    wm       0               0         (0/0/0)          0
  8       boot    wu       0 –    0        1.00MB    (1/0/0)       2048
  9 unassigned    wm       0               0         (0/0/0)          0
 
partition> 6
Part      Tag    Flag     Cylinders        Size            Blocks
  6 unassigned    wm       0               0         (0/0/0)          0
 
Enter partition id tag[unassigned]: usr
Enter partition permission flags[wm]:
Enter new starting cyl[1]: 3
Enter partition size[0b, 0c, 3e, 0.00mb, 0.00gb]: $
partition> label
Ready to label disk, continue? y
 
partition> p
partition> q
format> q
值得注意是:
1) SATA端口1~5的磁盘都是共享磁盘,其中:
   1~3共享磁盘为1G大小, 用于做normal redundancy的ocr和voting files;
   4~5共享磁盘为10G大小, 用于做normal redundancy的disk group 存放数据文件.
2) 我们把整个磁盘都分给了part 6, 并tag为usr, 注意分区一定要从cylinder 3 开始,不能从0开始,注意Enter partition size的时候输入$代表所有剩余的磁盘
3) 分区完毕一定要执行label以保存
 
改变共享磁盘的owner及mode, 需要在host1和host2分别执行
# chown grid:asmadmin /dev/rdsk/c0t[1-5]d0s6
# chmod 660 /dev/rdsk/c0t[1-5]d0s6
# ls -lL /dev/rdsk/c0t[1-5]d0s6
配置GI
保持所有节点启动,但只需要以grid用户在一个节点执行即可, 本例在host1中执行
# su – grid
$ export DISPLAY=10.4.120.1:0.0
$ /u01/app/11.2.0/grid/crs/config/config.sh
截图及输出参考文件夹gi-config
注意: 第9步会遇到bug 17274371, 参见gi-config/9.txt的描述:
 
https://docs.oracle.com/cd/E11882_01/relnotes.112/e23559/toc.htm#CJAEJECJ
 
Prerequisite Check May Fail When Installing Oracle Grid Infrastructure
When installing Oracle Grid Infrastructure, although the correct owner, group, or permissions are set for Oracle ASM, the prerequisite check may fail with the following errors:
 
PRVF-9991 : Owner of device “device name” did not match the expected owner
PRVF-9992 : Group of device “device name” did not match the expected group
PRVF-9993 : Permission of device “device name” did not match the expected
 
Workaround:
Ignore the error.
This issue is tracked with Oracle bug 17274371.
如下是所有的步骤截图,供参考:
 
如果以上config失败, 可以deconfig清除配置, 逐个节点(不能是最后一个节点),root运行:
# perl /u01/app/11.2.0/grid/crs/install/rootcrs.pl -deconfig -force
deconfig最后一个节点执行的命令是不同的:
# perl /u01/app/11.2.0/grid/crs/install/rootcrs.pl -deconfig -force -lastnode
安装Oracle数据库软件
建议选择software-only安装, 保持所有节点的crs启动,在host1以oracle执行即可, 在宿主机中, 将p13390677_112040_Solaris86-64_1of6.zip 和 p13390677_112040_Solaris86-64_2of6.zip当前路径解压, 这样会产生一个合并后的database目录, 然后在VirtualBox运行界面临时分配一个共享文件夹, 路径选择解压出来的database这个目录.
最后在虚拟机中挂载这个共享文件夹(注意database是宿主机中的共享文件夹名称)
# mount -F vboxfs -o ro database /mnt/cdrom/
# su – oracle
$ export DISPLAY=10.4.120.1:0.0
$ /mnt/cdrom/runInstaller
截图及输出参考文件夹oracle-software-only, 如下是所有的步骤截图,供参考:
 
创建diskgroup
创建diskgroup用于存放oracle数据文件, 保持所有节点crs启动,在host1以grid执行
# su – grid
$ export DISPLAY=10.4.120.1:0.0
$ asmca
在这里我们创建了名称为DATA的diskgroup,当然,我们也可以在这里创建DATA这个diskgroup上的ACFS卷以及ACFS文件系统。截图及输出参考文件夹asmca, 如下是所有的步骤截图,供参考:
 
创建数据库
创建数据库, 保持所有节点crs启动,在host1以oracle执行
# su – oracle
$ export DISPLAY=10.4.120.1:0.0
$ dbca
截图及输出参考文件夹dbca,如下是所有的步骤截图,供参考:
 
观察资源状况
到此所有的安装和配置结束。在任意节点上root观察资源情况。
# crsctl stat res -t
——————————————————————————–
NAME           TARGET  STATE        SERVER                   STATE_DETAILS
——————————————————————————–
Local Resources
——————————————————————————–
ora.DATA.dg
               ONLINE  ONLINE       host1
               ONLINE  ONLINE       host2
ora.GI.dg
               ONLINE  ONLINE       host1
               ONLINE  ONLINE       host2
ora.LISTENER.lsnr
               ONLINE  ONLINE       host1
               ONLINE  ONLINE       host2
ora.asm
               ONLINE  ONLINE       host1                    Started
               ONLINE  ONLINE       host2                    Started
ora.gsd
               OFFLINE OFFLINE      host1
               OFFLINE OFFLINE      host2
ora.net1.network
               ONLINE  ONLINE       host1
               ONLINE  ONLINE       host2
ora.ons
               ONLINE  ONLINE       host1
               ONLINE  ONLINE       host2
ora.registry.acfs
               ONLINE  ONLINE       host1
               ONLINE  ONLINE       host2
——————————————————————————–
Cluster Resources
——————————————————————————–
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       host2
ora.LISTENER_SCAN2.lsnr
      1        ONLINE  ONLINE       host1
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  ONLINE       host1
ora.cvu
      1        ONLINE  ONLINE       host1
ora.host1.vip
      1        ONLINE  ONLINE       host1
ora.host2.vip
      1        ONLINE  ONLINE       host2
ora.oc4j
      1        ONLINE  ONLINE       host1
ora.orcl.db
      1        ONLINE  ONLINE       host1                    Open
      2        ONLINE  ONLINE       host2                    Open
ora.scan1.vip
      1        ONLINE  ONLINE       host2
ora.scan2.vip
      1        ONLINE  ONLINE       host1
ora.scan3.vip
      1        ONLINE  ONLINE       host1
附录: 安装RAC过程中可能参考的Solaris命令
重启
# init 6
 
完全停止Solaris
# init 5
 
扫描硬件改动
# devfsadm -cv
# cfgadm -alv
 
重启并重配硬件信息, 用于添加或者改变了硬件
# touch /reconfigure
# init 6
 
查看硬件信息
# prtconf
 
查看物理内存
# prtconf | grep -i memory
 
服务列表
# svcs
 
启用及禁用服务
# svcadm disable svc:network/ftp
# svcadm disable svc:network/telnet
# svcadm disable svc:network/smtp:sendmail
 
查看磁盘和光盘的名称以及状态
# iostat -En
 
挂载光盘
# mount -F hsfs -o ro /dev/dsk/c1t0d0s2 /mnt/cdrom
 
卸载光盘
# umount /mnt/cdrom/
 
查找某个命令属于安装介质中的哪个package
例如我想安装nslookup命令, 但是不知道nslookup命令在安装介质的哪个package中
# grep nslookup /mnt/cdrom/Solaris_10/Product/*/pkgmap
从输出结果能迅速定位需要安装的package为SUNWbind
 
安装package, 例如安装SUNWbind这个package
# pkgadd -d /mnt/cdrom/Solaris_10/Product/ SUNWbind
 
列出所有的网卡
# grep e1000g /etc/path_to_inst
 
“/pci@0,0/pci8086,1e@3” 0 “e1000g”
“/pci@0,0/pci8086,1e@8” 1 “e1000g”
 
或者
# dladm show-link
 
e1000g0         type: non-vlan  mtu: 1500       device: e1000g0
e1000g1         type: non-vlan  mtu: 1500       device: e1000g1
 
启用新添加的网卡e1000g1
# ifconfig e1000g1 plumb up
 
查看ip信息
# ifconfig –a
 
查看文件md5
# digest -l
# digest -v -a md5 your_file_name
 
查看进程
# ps -ae -o user,pid,ppid,pri,pcpu,pmem,vsz,rss,wchan,s,stime,time,args
 
查看某进程,比如进程475打开了多少文件句柄
# pfiles 475
 
 
查看free memory
# pagesize
# sar -r 2 5
 
查看memory swap in/out
# vmstat -S 2 5
 
查看top进程
# prstat 2 5
 
查看cpu使用率
# vmstat 2 5
 

RAC 11.2.0.4 升级到 12.1.0.2 详细步骤

12.1.0.2已经发布一段时间了,随着用户的增多,目前12C的版本稳定性,以及各个方面的功能性,得到大家的认可。很多用户,需要将数据库从低版本升级到12C,本文就升级过程,做了详细的记录。

     由于图片过多,通过PDF附件的形式上传到blog,请下载附件。

Upgrade_Oracle_Grid_Infrastructure_11.2.0.4_to_12.1.0.2.pdf

 

 

节点OS重装后加回集群的步骤(10g RAC)

前面写过11gR2 RAC中节点OS重装后加回集群的步骤,但目前仍有客户在使用10g RAC,而10g RAC还不支持crsctl delete node这样的命令来一键删除重做节点的OCRthread等信息,操作起来比较繁琐。

My Oracle SupportOTN上面与此有关的文档:

Removing a Node from a 10gR1 RAC Cluster (Doc ID 269320.1)

Adding New Nodes to Your Oracle RAC 10g Cluster on Linux

http://www.oracle.com/technetwork/articles/vallath-nodes-095339.html

Doc ID 269320.1的操作是在重装OS之前把节点从集群删除的步骤,适用于服务器资源的重新调配。而实际工作中大多数情况下则是节点OS损坏重装或机器更换需要加回集群的场景,客户往往难以分清哪些步骤该做哪些步骤该跳过。故在此将这些步骤测试并记录下来供参考��

使用RMAN备份RAC本地目录中的archive log的第二种方案

有一部分RAC环境中的log_archive_dest_n设置到了本地的磁盘上,这在正常使用中并没有什么问题。而在备份的时候如果只从一个instance的channel发起的话,由于只能访问本节点的本地目录,所以在备份其他节点的archive log的时候会出现错误。而很多情况下,客户会使用NFS的方式,把本地节点的归档目录mount到其他的节点。这样配置,一个节点就可以访问所有其他节点的archive log了。但是此种方法也有一个问题:就是在某节点备份archive log的时候,如果备份的是其他节点生成archive log的时候,由于是通过NFS mount过来的目录,所以归档日志需要通过网络传输到本地然后再备份到磁带上。这样一来,增加的节点间文件传输既造成了对网络的影响,其本身的效率也受到网络带宽以及性能的制约。所以以下介绍一种通过每个节点开启通道,让每个节点的通道备份本节点archive log的方式(不使用NFS)

Thread Checkpoint 在单节点和 RAC 中的不同

在 Oracle 的官方文档中介绍 Oracle 的 Checkpoint 有:
(1)Thread Checkpoint;
(2)Tablespace and datafile checkpoint;
(3) Incremental checkpoint。
对于后两种 checkpoint,大家都有一个比较清晰的认识。 但是对于 Thread checkpoint 和 database checkpoint 之间的关系以及他们在单节点和RAC数据库之间的不同可能存在一些误区。 下面将通过一些例子来讲解一下 Thread checkpoint,以及在单节点和 RAC 中 Thread checkpoint 的不同。

TimesTen 返璞归真 – 多连接在ttIsql 中的应用

最近有用户咨询:ttIsql是否可以支持多个并发连接到 TimesTen 数据库。这个问题具有一定的普遍性,相信其他用户也会感兴趣,因此决定将其纳入这篇博客。ttIsql 是一个用来操作TimesTen数据库的交互式SQL命令型管理程序 (utility)。除了支持SQL命令的执行,它还提供了一整套丰富的功能,使得用户不仅能够连接到数据库, 执行其内置(built-in)程序和管理程序,还能支持灵活的命令编辑,以及调用主机操作系统的命令。 所有这些都可以在同一个ttIsql会话中实现!

TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569