2013年9月30日星期一

Oracle ADG 环境搭建

Oracle官方文档

不错的网络文章

《Oracle Data Guard理论知识》 这篇文章对于理解DataGuard如何利用log进行了介绍。
《Data Guard broker系列》《Data Guard Physical Standby Setup in Oracle Database 11g Release 2》 这篇文章有坑(没有提及_DBG, _DGMGRL),但总体顺序不错。
《Four Steps to create a Physical Standby Database》  这篇文章轮廓写得清晰。 上篇文章中没有提及listener.ora文件中的_DGB , _DGMGRL这两个static listener,是绝对的坑。 _DGB是Datagurad Broker用来侦听不同节点心跳的。_DGMGRL是用来保证数据库down的时候能够访问的。

《How to add and remove databases from Oracle cluseter》这篇主要示例了如何使用crvctl。

 

安装中遇到的一些问题&解决:

1)
现象:
SQL>  STARTUP NOMOUNT PFILE=’/tmp/initDB11G_stby.ora’;
ORA-01261: Parameter db_recovery_file_dest destination string cannot be translated
ORA-01262: Stat failed on a file destination directory
Linux-x86_64 Error: 2: No such file or directory
SQL>
解决:
因为在standby上创建的fast_recovery_area时,把一个字母写错了…

2)
现象:
Warning: ORA-16714: the value of property ArchiveLagTarget is inconsistent with the database setting
解决:
先查看那些不一致,然后更正之。
DGMGRL>  show database 'db11g_stby' 'InconsistentProperties';
edit database 'db11g_stby' set property 'ArchiveLagTarget'=0;
可参考官方文档 http://docs.oracle.com/cd/E11882_01/server.112/e17023/cli.htm
3)
现象:
分别进入primary sqlplus , standby sqlplus执行—-》
SQL> select flashback_on from v$database;
SQL> alter database flashback on;
在standby 上
SQL> alter database flashback on;
alter database flashback on
*
ERROR at line 1:
ORA-01153: an incompatible media recovery is active
SQL>
解决:SQL> STARTUP MOUNT;
ORACLE instance started.
Total System Global Area 2421825536 bytes
Fixed Size 2228880 bytes
Variable Size 1358957936 bytes
Database Buffers 1040187392 bytes
Redo Buffers 20451328 bytes
Database mounted.
SQL> alter database flashback on;
Database altered.
4)
现象:switchover失败
DGMGRL> switchover to db11g_stby;
Performing switchover NOW, please wait…
Error: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
Error: ORA-16625: cannot reach database “db11g_stby”
Failed.
Unable to switchover, primary database is still “db11g”
DGMGRL> show configuration;
Configuration – myconfigProtection Mode: MaxAvailability
Databases:
db11g      – Primary database
db11g_stby – Physical standby databaseFast-Start Failover: DISABLED
Configuration Status:
ORA-16623: database detected role change
ORA-16625: cannot reach database “db11g”
DGM-17017: unable to determine configuration status
DGMGRL>
解决:查看一下stby数据库broker参数,发现staticConnectorIdentifier默认使用1521端口。而我用的stby数据库是1522端口。
DGMGRL> show database  verbose ‘db11g_stby’;
RecvQEntries                    = ‘(monitor)’
SidName                         = ‘DB11G’
StaticConnectIdentifier         = ‘(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=slc01bme)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=DB11G_STBY_DGMGRL.us.oracle.com)(INSTANCE_NAME=DB11G)(SERVER=DEDICATED)))’
StandbyArchiveLocation          = ‘USE_DB_RECOVERY_FILE_DEST’
可以通过一下命令之一修改之:
//通过dgmgrl:
edit database db11g_stby set property StaticConnectIdentifier='(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=slc01bme)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=DB11G_STBY_DGMGRL.us.oracle.com)(INSTANCE_NAME=DB11G)(SERVER=DEDICATED)))';
 或者 sqlplus:
alter system set StaticConnectIdentifier='(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=slc01bme)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=DB11G_STBY_DGMGRL.us.oracle.com)(INSTANCE_NAME=DB11G)(SERVER=DEDICATED)))' scope=both;
参考:
《解决Oracle DataGuard Broker出现的TNS-12514错误》《Four steps to create a Physical Standby Database》 这篇文章里,是在添加了_DBG, _DGMGRL两个服务名之后,执行诸如如下的命令来确保提供合适的conenction给DG broker。下面的命令因为使用服务名而优于前文的链接字符串。
edit database db11g set property staticConnectidentifier=’DB11G’;
edit database db11g_DG1 set property staticConnectidentifier=’DB11G_DG1′;
5)
现象:-bash-3.2$ srvctl add ons
PRCR-1063 : Failed to create context
PRKH-1010 : Unable to communicate with CRS services.
PRKH-1000 : Unable to load the SRVM HAS shared library
PRKN-1008 : Unable to load the shared library “libsrvmhas11.so”
or a dependent library, from
LD_LIBRARY_PATH=”/scratch/dahyuan/app/oracle/product/11.2.0/grid/lib”
[java.lang.UnsatisfiedLinkError: /scratch/dahyuan/app/oracle/product/11.2.0/grid/lib/libsrvmhas11.so: libasmclnt11.so: cannot open shared object file: No such file or directory]
解决:
一种是你的server上真的缺少一些开发包,需要你编译安装。但我这里是因为LD_LIBRARY_PATH的问题,当时libary path没有/usr/lib和/usr/local/lib这两个目录。加上之后再运行root.sh就好了。 LD_LIBRARY_PATH应该至少包括/scratch/dahyuan/app/oracle/product/11.2.0/grid/lib:/usr/lib:/usr/local/lib。
参考:
《Oracle 安装 clusterware时遇到的问题》
6)
现象:-bash-3.2$ srvctl start ons
#
# An unexpected error has been detected by HotSpot Virtual Machine:
# SIGSEGV (0xb) at pc=0x00002ada0b2b3a84, pid=2082, tid=47115974751584
# Java VM: Java HotSpot(TM) 64-Bit Server VM (1.5.0_24-rev-b08 mixed mode)
# Problematic frame:
# V [libjvm.so+0x3afa84]
#
# An error report file with more information is saved as hs_err_pid2082.log
#
# If you would like to submit a bug report, please visit:
#
/scratch/dahyuan/app/oracle/product/11.2.0/dbhome_1/bin/srvctl: line 240: 2082 Aborted $JRE $JRE_OPTIONS -DORACLE_HOME=$ORACLE_HOME -classpath $CLASSPATH $SRVM_PROPERTY_DEFS oracle.ops.opsctl.OPSCTLDriver “$@”
解决:
这个是因为使用了Database_HOME里的srvctl。应该使用grid_HOME/bin里的srvctl。
参考:
《SRVCTL文档》  To manage Oracle ASM on Oracle Database 11g release 2 (11.2) installations, use the SRVCTL binary in the Oracle Grid Infrastructure home for a cluster (Grid home). If you have Oracle RAC or Oracle Database installed, then you cannot use the SRVCTL binary in the database home to manage Oracle ASM.

7)
现象:
DGMGRL>  ENABLE FAST_START FAILOVER;
Error: ORA-16651: requirements not met for enabling fast-start failover
解决:
在primary 和 standby上用sqlplus 都执行,  alter database flashback on;


8)
现象:
DGMGRL> show database  verbose 'db11g_stby';
出现以下警告,
  Database Warning(s):

    ORA-16826: apply service state is inconsistent with the DelayMins property
解决:
在DGMGRL里执行,disable configuration;    再执行 enable configuration;  就可以解决。



2013年1月14日星期一

【翻译】The “reassociation” business of Fusion Middleware

原文出处:http://fusionsecurity.blogspot.jp/2011/10/reassociation-business.html 下面大致翻译了一下,不精准,笔记性质。

 从Fusion Middleware 11.1.1.4开始,OPSS(Oracle Platform Security Service)支持三种类型的安全存储(Security Store):文件、OID(Oracle Internet Directory)以及Oracle DataBase。当weblogic server的domain刚被创建出来时,默认地,OPSS是和文件类型的存储相关联的。文件存储比较适合开发阶段。对于生产环境,不推荐文件存储类型(请参考“ Multiple Nodes Servers Environments”)。如果你的运行环境是在一个台机器上只有唯一的一个weblogic domain、一个weblogic server,文件类型存储也是能工作的。但是99.99%的情况,你的SOA、WebCenter环境是运行在集群环境下的多个服务器上。文件存储不提供这种伸缩性,这种情况下,你应该考虑OID或者Oracle DataBase。

实际上,很多的Fusion应用时使用OID。:) OPSS安全存储由policy,credential,keys以及audit services组成。注意:我没有提及identity store service。因为,OPPS把identity store service'委托给了在weblogic server里配置的'identity provider'。 OPSS不是一个产品,它是Fusion Middleware使用的一组安全服务。 这个帖子十分详细地讲述了如何配置weblogic server domain使用以上的三种不同security store。这也是"reassociation(关联)"这个词的来历。 下面的内容和 “Configuring OPSS Security Store”(强烈推荐阅读)有些重叠。


 在更进一步讲述association之前,我们先说说jps-config.xml的关键点。

jps-config.xml
OPSS使用这个文件描述它所提供的服务。通过设置系统属性–Doracle.security.jps.config你可以指定OPSS从哪里读取这个文件,通常在JRF(Java Required Files)domain的setDomainEnv.sh里设置这个文件的位置。
缺省的位置是${DOMAIN_HOME}/config/fmwconfig/jps-config.xml。(定义在变量EXTRA_JAVA_PROPERTIES里)。建议不要轻易修改jps-config.xml,因为jps-config.xml包含了许多对其它文件的引用。 当以通过config.sh脚本来创建BPM,SOA或者WebCenter 域(domain)时,JRF template会自动被选中,因为这些鱼都依赖JRF。 jps-config.xml是作用于域范围的配置文件。并不存在针对server或者application这一层起作用的jps-config.xml文件。但是,jps-config.xml里context的概念,可以让你让不同的application使用不同的安全服务。这是另外一个话题了。 当执行了reassociation操作,配置的改变会被写入jps-config.xml。破损的jps-config.xml会让你的domain运行在不稳定的状态。所以,对jps-config.xml的修改要慎之又慎。不要手工修改这个文件,而是要用Enterprise Manager或者wlst。

  The Policy Store Policy store保存着Fusion Middleware实例上运行的application的所需要的全部安全策略,包括赋予pricials(users,groups, application roles)以及code 的允许权限。 比如,如果你查看BPM域上OOTB的policy store,你就会发现这些策略分成四组,供4个应用 (OracleBPMProcessRolesApp, OracleBPMComposerRolesApp, b2bui and soainfra)使用。另外还有一组对部署在这个域的所有应用都生效的code-source策略。 jps-config.xml文件里的default context定义了Fusion Middleware里所有应用都用到的服务。

The Credential Store Credential store保存着Fusion Middleware应用连接到其它系统所用的凭证。这不同于下面要讲到的boostrap credentials。 File Based Credential Store Service Instance 

Reassociating to OID 有两种方式做reassociation。 Enterprise Manager和wlst。(只大致介绍一下关键参数的含义,具体见原文。)
EM界面里的: Root DN: 这个需要再做reassociation之前在OID里创建。 Create New Domain: 这里不是表示“创建一个新域”的意思。这里的意识是说,要关联的OID是不是要要从源security store导入数据进行初始化。不选择这个checkbox意味着,你有多个domain共享这个security store。 Domain Name: 这里方便起见,EM使用weblogic域名。但实际上,它可以是任意名字。这个名字用于标识它为一个container节点。多个weblogic域可以绑定到相同的container,但是,一个weblogic域不能绑订到不同的container。

wlst里的参数: > reassociateSecurityStore(domain="farm1", admin="cn=orcladmin", password="welcome1", ldapurl=ldap://localhost:3060, servertype="OID", jpsroot="cn=SecurityStore",[join=”trueOrfalse”]) 理解了EM的输入,wlst就容易理解了。join这个参数,对应着EM里的是否'Create new domain'。

Bootstrap cwallet.sso 
当reassociated到OID时,weblogic需要知道连接到OID服务器的登录凭证。缺省地,这些凭证被保存在jps-config.xml bootstrap.credstore指定的位置。 如果以后需要修改这个credentials,可以使用以下wlst命令: > modifyBootStrapCredential(jpsConfigFile='',username='', password='') 这里 jpsConfigFile = 有效的jps config文件路径。 username = 用户名 password = 新密码 比如 > modifyBootStrapCredential(jpsConfigFile='/opt/wls/oracle/middleware/user_projects/domains/soa_domain/config/fmwconfig/jps-config.xml',username='cn=orcladmin', password='welcome1')

2012年9月11日星期二

(ZT) MAC 常用软件

Designer Daily的Mirko整理分享的一份免费Mac软件列表,大多数适用于自由职业者。当然,这个概念很模糊,没有什么软件是只有自由职业者才使用的,自由职业者本身又是一个包罗万象、异常模糊的概念。 所以, 所有Mac用户都可以看看,Windows用户也可以看,因为Mirko同时使用Mac和Windows,他不但列出了免费Mac软件,还包括相关的Windows平台下的替换方案。 1、Name Changer 重命名多个文件,可以完美地一次给多个文件重新命名。当你处理图片的时候,它是你的最佳助手。 2、Anxiety 这款轻量级的软件可以帮助你管理简单的任务列表。如果你不想用复杂的GTD软件,那么这款软件最适合你。 3、Cyberduck 拥有漂亮界面的FTP软件,并且整合了多个文本编辑器。 4、Adium 这款开源的即时通讯软件可以让你登陆所有的IM账号。 5、Carbon Copy cloner 帮助你快速建立一个可以引导启动的磁盘镜像。 6、The Unarchiver 兼容多种模式的解压缩软件。 7、AppCleaner 帮助你在删除软件的时候不留下任何垃圾文件。 8、The Gimp 图像处理软件,photoshop的替代品。 9、Skype Windows下也可以使用 10、firefox 免费、开源的浏览器,拥有大量插件。 Windows下也可以使用 11、Caffeine 不要让你的Mac休眠,给它点咖啡因吧。 12、Burn 高级CD和DVD刻录软件。 13、Handbrake DVD到Mpeg格式的转换软件,可以帮助你转换DVD影片。 Windows下也可以使用 14、Audacity 开源的录音、音频编辑软件。 Windows下也可以使用 15、Smultron Mac下强大的文本编辑器。 Windows替代方案 16、InkScape 开源的矢量编辑软件,Illustrator的替代品。 Windows也可以使用 17、Freemind 脑图软件,我最喜欢的整理思维的方法。 Windows下也可以使用 18、Disk Inventory X Mac OS X下的磁盘检查工具,帮助你快速查看是什么占用了磁盘空间。 Windows替代方案 19、Colloquy 高级IRC客户端,拥有良好的用户界面。 Windows替代方案 20、Neo Office 开源的办公软件套装,Word和Excel的替代品。 Windows替代方案 21、QuickSilver 快速运行程序的软件,真正提高你的效率。 Windows替代方案 22、NetNewsWire 我最喜欢的RSS阅读器,每天早晨喝咖啡的时候打开。 Windows替代方案 23、DeepVacuum 帮助你通过http或ftp协议下载完整的网站或页面。 Windows替代方案 24、HyperDither 批量修改图片尺寸的软件,如果你不喜欢用Photoshop的动作,这款软件可以为你节省时间。 Windows替代方案 25、Transmission 这款BT软件让你分享文件变得非常简单。 Windows替代方案 英文原文: 25 free Mac Apps for freelancers 中文译文: yeeyan

2010年10月22日星期五

几个第三方库的交叉编译

交叉编译环境根目录在/usr/coma/v4t_le
编译器: /usr/coma/v4t_le/bin
目标运行环境及库: /usr/coma/v4t_le/target /usr/coma/v4t_le/target/usr/lib

在执行交叉编译之前,先设置2个环境变量:
export CC=/usr/coma/v4t_le/bin/arm_v4t_le-gcc
export CXX=/usr/coma/v4t_le/bin/arm_v4t_le-g++

expat-2.0.1
libarchive-2.5.5
这两个库的交叉编译没有什么麻烦,进入到源文件路径后:
./configure --host=arm4tl-hardhat-linux --prefix=/opt/coma/v4t_le/target/usr
make
make install
执行这三个命令就基本好了。

zlib-1.2.5 更简单,
./configure --prefix=/opt/coma/v4t_le/target/usr|
make
make install

OpenSSL的交叉编译相对麻烦:(Reference: Linux下第三方库交叉编译 - lee353086的专栏 - CSDN博客.)
#openssl版本0.9.8o
方式一:生成静态库
# ./config --prefix=/home/kagula/arm432 no-asm shared os/compiler:arm-linux-gcc
修改MakeFile文件中的以下变量
EX_LIBS= -ldl
AR= arm-linux-ar $(ARFLAGS) r
ARD=arm-linux-ar $(ARFLAGS) d
RANLIB= arm-linux-ranlib
#Make
#Make install
生成libssl.a libcrytpo.a (这两个库的使用顺序不能颠倒)
(把arm-linux-ar 要换成你的交叉编译器对应的文件名:
我这里是/opt/coma/v4t_le/bin/arm_v4t_le-ar
相应的arm-linux-ranlib 也要替换为/opt/coma/v4t_le/bin/arm_v4t_le-ranlib。)
备注:【1】使用os/compiler选项会导致shared参数不起作用,即只能生成静态库【2】如果刚编译成x86版本的,编译成arm版本之前记得要make clean下清除掉x86版本的目标文件。
方式二:生成动态库
#CC=arm-linux-gcc ./config no-asm shared --prefix=/home/kagula/arm432
如上修改MakeFile文件中的变量
#Make
#Make install
在安装目录就会看到libssl.so及libcrypto.so相关文件

gSoap
这个包的交叉编译是最麻烦的,在尝试过程中(由于环境的不同)你可能会发现需要一些其它的第三方包,比如Bison, Flex,M4,甚至需要在/usr/lib下建立一个libssl.so的软链接。另外比较特殊的是,你需要一个现在宿主机上编译一个本地的gsoap库,因为在交叉编译wsdl目录下文件是,需要执行gsoapcpp2,而目标平台的gsoapcpp2是不可能在宿主机行执行的。所以,还需要修改wsdl里的Makefile文件重新修改SOAP的值为: SOAP=soapcpp2 。 当然soapcpp2需要在你的宿主机环境的PATH里。

问题1: 交叉编译gsoap的时候总出现'malloc' has not been declared 的错误。在网上查了下,是因为cstdlib的一个库bug。
1. 将#define malloc rpl_malloc 屏蔽;
2.将#define HAVE_MALLOC 0 更改为:#define HAVE_MALLOC 1

问题2: “找不到yacc”的问题。Bison是优于yacc的方案:http://www.gnu.org/software/bison/

问题3: ./congifugre bison有说需要GNU M4 1.4.13 。 M4主页:http://www.gnu.org/software/m4/

问题4:还需要GNU Flex http://flex.sourceforge.net/ 这个需要安装到宿主机环境。

问题5:不能执行soapcpp2。 解决办法:在宿主机上编译一个本地的gsoap库。

2010年10月13日星期三

nm gcc参数顺序

用nm可以查看目标文件以及库文件中包含的方法。如果链接中出现undefined reference,可以用nm去查看一下相关的库中是否存在那个方法进行错误排除。

$(OBJDIR)/stdsoap2.o: $(COMA_libs)/$(LIB_GSOAP)/stdsoap2.c $(COMA_libs)/$(LIB_GSOAP)/plugin/httpform.c $(COMA_libs)/$(LIB_GSOAP)/plugin/httpget.c
$(CC) -Os -I$(COMA_libs)/$(LIB_GSOAP) -L $(COMA_libs)/$(LIB_GSOAP) $(THREAD) -c -o $@ -DWITH_OPENSSL $^
上面是有问题的,需要调整参数顺序。注意-c -o的顺序。
$(OBJDIR)/stdsoap2.o: $(COMA_libs)/$(LIB_GSOAP)/stdsoap2.c $(COMA_libs)/$(LIB_GSOAP)/plugin/httpform.c $(COMA_libs)/$(LIB_GSOAP)/plugin/httpget.c
 $(CC) -Os -I$(COMA_libs)/$(LIB_GSOAP) -L $(COMA_libs)/$(LIB_GSOAP) $(THREAD) -DWITH_OPENSSL -c -o $@ $< 

下面是原来指令中缺少了两个目标文件,不能链接。
COMA:   $(OBJECT_FILES) $(API_FILES) $(ADAPTER_FILES) $(GUI_FILES) $(ENV_OBJECT_FILES)    $(OBJDIR)/stdsoap2.o  $(OBJDIR)/NE3S_serverlib.o $(OBJDIR)/NE3S_clientlib.o $(OBJDIR)/env.o $(OBJDIR)/app.o bin/tree.o
 $(CC) -g -Xlinker -Map -Xlinker COMA.map -Os -L $(COMA_libs)/$(LIB_GSOAP) -L $(COMA_libs)/zlibonly-dll/lib -L $(COMA_libs)/libarchive-2.5.5/.libs $(COMA_libs)/$(LIB_GSOAP)/libgsoap.a $(THREAD) -pedantic  -o COMA $(GUI_FILES) $(ENV_OBJECT_FILES) $(API_FILES) $(ADAPTER_FILES) $(OBJECT_FILES)  $(OBJDIR)/stdsoap2.o $(OBJDIR)/NE3S_serverlib.o $(OBJDIR)/NE3S_clientlib.o $(OBJDIR)/env.o $(OBJDIR)/app.o bin/tree.o ../$(OBJDIR)/httpget.o ../$(OBJDIR)/httpform.o $(COMA_libs)/libarchive-2.5.5/.libs/libarchive.a  -DWITH_OPENSSL -lcrypto -lexpat -lssl -lz 

2010年9月17日星期五

在项目中Struts2的form需要由变量来定义。如果使用
通过这个%{#variableName} 可以解决这个问题。

比如:

2010年6月9日星期三

运行时改变log4j属性。

log4j特性一般由配置文件决定,如果需要在运行时进行改变,可以通过以下类似的方法解决:

Appender appender = Logger.getRootLogger().getAppender("devLogFile");
RollingFileAppender fa = (RollingFileAppender) appender;
fa.setMaxFileSize(logSizeStr);
fa.activateOptions();