服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > 数据库技术 > Oracle技术 > oracle错误库 > 查看文档

linux环境下oracle9i的dataguard配置

  本来我不想写这方面的东东,但是对比oracl9i在solaris下和在linux下安装,oracle9i 在linux9上的安装真的是要麻烦很多,下面我把我遇到的问题(好像也是大部分oracle初学者安装时遇到的题)简要的说一下,oracle9i 在linux9上的安装也折腾了我好几个月,没办法,我太笨了。

  环境:

  os: linux 9

  oracle: oracle9i

  primary: 1.1.1.1

  standby: 1.1.1.2 (主副主机都是两台普通的pc主机)

  第一部分 oracle9i 在linux9上的安装

  本来我不想写这方面的东东,但是对比oracl9i在solaris下和在linux下安装,oracle9i 在linux9上的安装真的是要麻烦很多,下面我把我遇到的问题(好像也是大部分oracle初学者安装时遇到的题)简要的说一下,oracle9i 在linux9上的安装也折腾了我好几个月,没办法,我太笨了。

  1)运行runinstaller的时候报错。

-bash-2.05b$ ./runinstaller
-bash-2.05b$ initializing java virtual machine from
/tmp/orainstall2005-01-20_06-39-06pm/jre/bin/java.
please wait...
/tmp/orainstall2005-01-20_06-39-06pm/jre/bin/i386/
native_threads/java: error
while loading shared libraries:
libstdc++-libc6.1-1.so.2: cannot open shared object
file: no such file or directory
oracle net configuration assistant 
oracle database configuration assistant 
      agent configuration assistant

  三个工具的details错误信息都是:

/home/oracle/jre/1.1.8/bin../lib/i686/

native_threads/libzip.so :symbol errno, 
version glibc_2.0 not definded in file libc.so.6 with
link time reference(libzip.so)
unable to initialize threads:
cannot find class java/lang/thread
could not create java vm

  解决方法:

  在运行runinstaller之前做下面的步骤。

  export ld_assume_kernel=2.4.19

  ignore your kernal version

  下载文件libcwait.c

  ftp://people.redhat.com/drepper/libcwait.c

  (通过ie无法下载的话,就用命令行)

  用gcc -shared -o libcwait.so -fpic -o2 libcwait.c

  进行编译然后export ld_preload=/$path/libcwait.so

  上面的方法能使oracle net configuration assistant ,

  oracle database configuration assistant 安装成功。

  修复agent configuration assistant不能配置成功的方法:请参考chinaunix上的《在rhas3上成功安装oracle9204》。

  运行runinstaller之后,出现安装组件的选择结果,这时点“install”,开始安装,复制文件,进度条在一点一点的增加,当安装并link 完后,出现配置工具界面,agent服务不能配置成功,忽略不用管,在下面修复。dbca,netca,http都正确配置完毕哦。

  呵呵。下面开始修复错误。其实要是把各个界面抓取下来就更好了。

  6、安装p3238244_9204_linux.zip补丁

  此补丁也是从http://metalink.oracle.com下下载,同时要下载一个opatch软件包:p2617419_220_generic.zip,它主要是用来悠agent服务不能启动的错误。

  过程如下:

[quote:864939f94a]su - oracle 
$ cp p2617419_210_generic.zip /tmp 
$ cd /tmp 
$ unzip p2617419_210_generic.zip 
$ export path=$path:/tmp/opatch 
$ export path=$path:/sbin        # the patch needs "fuser" which is located in /sbin 
$ unzip p3238244_9204_linux.zip 
$ cd 3238244 
$ opatch apply 
:864939f94a]补丁修复完成,需要relinked一个.mk文件。 
$ cd $oracle_home/network/lib 
      $ make -f ins_oemagent.mk install

  现在在运行agentctl start,看是不是可以成功运行agent服务了啊,可以用stop、status来停止此服务或者检查服务的状态。

  在这个成功之后,居然不能启动oracle,说是不能找到初始化文件,没办法,我用dbca先删除了原来安装时建立的库,再重新建立了数据库。

  7、运行dbca来创建数据库。呵呵,一路畅通,完成数据库的安装。

  希望你也能成功安装。

  申明一点,我在9i没配置好agent configuration assistant,应该在linux9i环境里按照上面的步骤也能配置好。

  运行runinstaller后,安装界面出来出现乱码

  export lang=en_us 再运行runinstaller (这是最简单实用的办法)

  报/etc/oratab 错误

  如果在机器上以前安装过,再一次安装的时候如果报/etc/oratab 错误。请将/etc/oratab 清空(删除也可)

  cp /dev/null /etc/oratab

  (4)然后开始建库,当建库到46%时会出现共享内存问题,

  ora-27123: unable to attach to shared memory segment

  这时需要给内核指定内存,可以:

  echo 4294967295 >/proc/sys/kernel/shmmax

  或者编辑/etc/sysctl.conf

  kernel.shmmax=4294967295

  这样就可以数据库的安装。

  运行:要启动oracle要先运行数据库监听程序:lsnrctl start 关闭:lsnrctl stop

  运行oemapp console可以打开oracle企业管理器工具,还有一些错误,可能需要修改/etc/hosts,/etc/sysctl.conf,请大家在google上搜一下按照网友提示的方法进行修改。

  另外主副主机的目录设置成一样。都将oracle用户主目录设为/home/oracle.主副主机的数据库名字都设为oracle,实例名也都设为一样,都设为oracle(申明一点,是否必须将主副主机的数据库名字实例名都设为相同,我曾在cu上发过贴子问过,好像大家都说不需要,但我们这的dba说是必须,反正我在这里设的是相同。

  第二步:dataguard配置

  首先将主副两主机都设为归档模式。

  1. 主节点备份并生成备用数据库控制文件

  登陆主节点,进行数据库备份,并生成备用数据库控制文件

[oracle@primary]$ sqlplus "/ as sysdba"
sql> startup
sql> shutdown immediate
sql> exit
[oracle@primary]pwd
/home/oracle
[oracle@primary]$ ls
admin  dictionary.ora  jre  oradata  orainventory  oui  product  soft
[oracle@primary]tar -cvf oradata.tar oradata
[oracle@primary]$ ls -l *.tar
-rw-r--r--    1 oracle   dba      576512000 aug 16 10:22 oradata.tar
[oracle@primary]$ sqlplus "/ as sysdba"
sql> startup
sql> archive log list;
database log mode              archive mode
automatic archival             enabled  
archive destination            /home/oracle/oradata/primary/archive
oldest online log sequence     88
next log sequence to archive   90
current log sequence           90
sql> alter database create standby controlfile as '/home/oracle/standby.ctl';
database altered.
sql> exit
      [oracle@primary]

  3. 登陆备用节点(standby),ftp获得primary主机的数据库文件(即oradata.tar文件)、备用控制文件(/home/oracle/standby.ctl) ,口令文件( $oracle_home/dbs/下的orapworacle)传到standby里的相应位置。

  

  具体步骤:

  3.1 在standby的/home/oracle/oradata下,原来有一个oracle的文件夹(里面是该主机下的dbf,redolog文件),再新建一个primary文件夹。将primary主机的oradata.tar解开的文件全部直接(即primary不要再有文件夹)放到primary下,将刚生成的备用控制文件(/home/oracle/standby.ctl)也放到primary下。

  3.2 在standby的oracle_home/dbs/下,先将以前的orapworacle备份一下(改个名字即可),再将primary的$oracle_home/dbs/下的orapworacle 文件ftp放到standby的oracle_home/dbs/下. 说明一下,我在查阅eygle的大作及很多人的相关文章,都没有提到这一点,但如果没做这一步的话,再后面的启动备用数据库的时候,即在

[oracle@eygle primary]$ sqlplus "/ as sysdba"
sql> startup nomount;
sql> alter database mount standby database;
sql> alter database recover managed standby database disconnect from session;

  这一步时就会报ora-01991 错误,说是invalid passwd file.询问我们的dba,说是必须要用primary的orapworacle来替换standby的. 我试过,这样做了后就ok了。

  所以我这在这里就把primary的orapworacle来替换standby的orapworacl也当作一步必须步骤,但我真的不能肯定这一步是否是必须的,如果不是必须的,为何我做这一步,总会报错。如果是必须的,为何eygle和其他大牛的大作里都没有提到这一步,难道是因为这个太简单吗?? 我真的是有些疑惑。如果哪位大牛看到这,请给我一个肯定的回答,我不胜感激。

  在standby主机的$oracle/home/admin下原来有oracle目录。现在新建primary目录,再在primary目录下新建bdump,cdump,udump.

  primary的参数文件

oracle@primary_andy $cat  .bash_profile
# .bash_profile
# get the aliases and functions
#if [ -f ~/.bashrc ]; then
#       . ~/.bashrc
#fi
# user specific environment and startup programs
#export bash_env=$home/.bashrc
path=$path:/home/oracle/product/9.2.0
/bin:$oracle_home/jre/bin:/opt/sunwspro/
bin:/usr/bin:/usr/ccs/bin:/usr/ucb:/
etc:/usr/local/bin:/usr/bin/saved:
export path
unset username
oracle_owner=oracle
oracle_base=/home/oracle
export oracle_base
oracle_home=/home/oracle/product/9.2.0
export oracle_home
lang=
lc_all=
oracle_sid=oracle
export oracle_sid
tns_admin=/homehttp://oracle.chinaitlab.com/config/9.2.0; export tns_admin
nls_lang=american_america.zhs16gbk; export nls_lang
#ora_nls33=$oracle_home/ocommon/nls/admin/data; export ora_nls33
classpath=$oracle_home/jre:$oracle_home/jlib:$oracle_home/rdbms/
jlib:/opt/j2sdk_nb/j2sdk1.4.2/bin
export classpath
tmpdir=/tmp;export tmpdir
umask 022
ld_library_path=$oracle_home/lib:/lib:/lib/tls:/lib/i686:/usr/openwin/
lib:/usr/dt/lib
export ld_library_path
export ld_preload=/home/oracle/libcwait.so;
export ld_assume_kernel=2.4.19;
display=1.1.1.3:0.0;export display;
export ps1="\u@\h $"
#cat initoracle.ora_primary
*.aq_tm_processes=1
*.background_dump_dest='/home/oracle/admin/oracle/bdump'
*.compatible='9.2.0.0.0'
*.control_files='/home/oracle/oradata/oracle/control01.ctl','/home/
oracle/oradata/oracle/c
ontrol02.ctl','/home/oracle/oradata/oracle/control03.ctl'
*.core_dump_dest='/home/oracle/admin/oracle/cdump'
*.db_block_size=8192
*.db_cache_size=33554432
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='oracle'
*.dispatchers='(protocol=tcp) (service=oraclexdb)'
*.fast_start_mttr_target=300
*.hash_join_enabled=true
*.instance_name='oracle'
*.java_pool_size=83886080
*.job_queue_processes=10
*.large_pool_size=16777216
*.log_archive_dest_1='location=/home/oracle/oradata/archivelog/'
*.log_archive_dest_2='service=standby mandatory reopen=60'
*.log_archive_dest_state_1='enable'
*.log_archive_format='log_%t_%s.arc'
*.log_archive_start=true
*.open_cursors=300
*.pga_aggregate_target=25165824
*.processes=150
*.query_rewrite_enabled='false'
*.remote_login_passwordfile='exclusive'
*.shared_pool_size=83886080
*.sort_area_size=524288
*.star_transformation_enabled='false'
*.timed_statistics=true
*.undo_management='auto'
*.undo_retention=10800
*.undo_tablespace='undotbs1'
      *.user_dump_dest='/home/oracle/admin/oracle/udump'

  

  修改standby主机的initoracle.ora文件(先备份),我的initoracle.ora如下,供参考

*.aq_tm_processes=1
*.background_dump_dest='/home/oracle/admin/primary/bdump'
*.compatible='9.2.0.0.0'
*.control_files='/home/oracle/oradata/primary/standby.ctl'
*.core_dump_dest='/home/oracle/admin/primary/cdump'
*.db_block_size=8192
*.db_cache_size=33554432
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='oracle'
*.dispatchers='(protocol=tcp) (service=oraclexdb)'
*.fast_start_mttr_target=300
*.hash_join_enabled=true
*.instance_name='oracle'
*.java_pool_size=83886080
*.job_queue_processes=10
*.large_pool_size=16777216
*.open_cursors=300
*.pga_aggregate_target=25165824
*.processes=150
*.query_rewrite_enabled='false'
*.remote_login_passwordfile='exclusive'
*.shared_pool_size=83886080
*.sort_area_size=524288
*.star_transformation_enabled='false'
*.timed_statistics=true
*.undo_management='auto'
*.undo_retention=10800
*.undo_tablespace='undotbs1'
*.user_dump_dest='/home/oracle/admin/primary/udump'
*.log_archive_format=log_%t_%s.arc
*.log_archive_start=true
*.standby_file_management=auto
*.log_archive_dest_1='location=/home/oracle/oradata/archivelog/'
*.log_archive_dest_state_1 = enable
*.fal_server='primary'
*.fal_client='standby'
*.db_file_name_convert=("/home/oracle/oradata/oracle","/home/oracle/oradata/primary")  
----(主辅数据库数据文件相互转换的目录)
*.standby_file_management=auto  即可实现重命名主库的数据文件!!
*.log_file_name_convert=("/home/oracle/oradata/archivelog","/home/oracle/oradata/archivelog")  
----(主辅数据库联机日志redolog相互转换的目录)
*.standby_archive_dest=/home/oracle/oradata/archivelog                   
      ----(从主数据库产生的archivelog传到辅数据库的目录)

  4. 配置主节点(primary主机上)的tnsnames.ora文件

(protocol=tcp) 
(port=1521) 
(host=1.1.1.1)) 
(connect_data= 
(sid=oracle)))
standby=(description= 
(address= 
(protocol=tcp) 
(port=1521) 
(host=1.1.1.2)) 
(connect_data= 
      (sid=oracle)))

  同样,在副节点(standby) 的tnsnames.ora文件。

  5. 在副节点(standby)上配置listener.ora文件, 添加监听服务standby_listener,在相应的节里添加有关的内容:

primary=(description= 
(address= 
sid_list_listener =
  (sid_list =
    (sid_desc =
        (sid_name = oracle)
        (global_dbname = oracle)
      (oracle_home = /home/oracle/oradata)
    )
  )
listener =
  (description_list =
     (description =
      (address = (protocol = tcp)(host = standby)(port = 1521))
    )
        )

  在主副库上启动lsnrctl,

  -bash-2.05b$ lsnrctl

  lsnrctl>start # 启动监听服务

  6.在主备节点用tnsping测试网络连通性

  在primary机上

-bash-2.05b$ tnsping primary
-bash-2.05b$ tnsping standby
   在standby机上
-bash-2.05b$ tnsping primary
-bash-2.05b$ tnsping standby

  7. 启动副数据库

sql> startup nomount;
sql> alter database mount standby database;
database altered.
sql> alter database recover managed standby database disconnect from session;
database altered.

  8. 在主节点设置归档路径

sql> alter system set log_archive_dest_2='service=standby mandatory reopen=60';
system altered.

  定义了主库向副库传输日志。

  # 定义归档到备用库,强制归档,重试时间60秒。

  # 如果定义为可选状态(optional),那么在归档失败后不会再次尝试归档的。定义

  # 为madatory状态后,如果本次归档失败,则在归档下一个日志时会再次尝试。

sql> alter system switch logfile;
system altered.
sql> /
system altered.
sql>

  在备用节点观察日志:

[oracle@eygle bdump]$ tail -f alert_primary.log
mrp0: background managed standby recovery process started
starting datafile 1 recovery in thread 1 sequence 90
datafile 1: '/opt/oracle/oradata/primary/system01.dbf'
starting datafile 2 recovery in thread 1 sequence 90
datafile 2: '/opt/oracle/oradata/primary/undotbs01.dbf'
…………………………
-bash-2.05b$ mkdir /home/oracle/oradata/oracle/stdarch
-------------------------------------------------------

  9.主辅数据库的切换(停止主数据库,启用备用数据库)

  修改primary的参数文件initoracle.ora(先做好备份)

  增加

*.standby_archive_dest='/home/oracle/oradata/standbyarch'
*.fal_server='standby'
*.fal_client='primary'
*.db_file_name_convert=("/home/oracle/oradata/primary","/home/oracle/oradata/oracle")
*.log_file_name_convert=("/home/oracle/oradata/archivelog","/home/oracle/oradata/archivelog")
*.standby_file_management='auto'

  删除 log_archive_dest_2参数

  修改standby的参数文件initoracle.ora(先做好备份)

  增加

*.log_archive_dest_2='service=primary mandatory reopen=60'
*.log_archive_dest_state_2='enable'

  删除

*.standby_archive_dest=/home/oracle/oradata/archivelog
*.fal_server='standby'
*.fal_client='primary'
*.db_file_name_convert=("/home/oracle/oradata/primary","/home/oracle/oradata/oracle")
*.log_file_name_convert=("/home/oracle/oradata/archivelog","/home/oracle/oradata/archivelog")
*.standby_file_management=auto

  

  在primary主机上执行

sql> alter database commit to switchover to physical standby with session shutdown ;
database altered.

  察看primary主机上的后台日志

…………………………….
sql> shutdown immediate
ora-01507: database not mounted
oracle instance shut down.

  以备用模式(standby)启用主数据

sql> create spfile from pfile;
sql> startup nomount;
sql>show parameter standby_file_management;
sql> alter database mount standby database;
database altered.

  打开备用数据库(在standby主机上执行)

[oracle@standby oracle]$ sqlplus "/ as sysdba"
sql> alter database commit to switchover to primary with session shutdown ;
database altered.
sql> shutdown immediate;
     ora-01507: database not mounted
oracle instance shut down
sql>create spfile from pfile;
sql> startup;
        ……
database mounted.
database opened.
sql> select sequence#,group#,status from v$log;
sql> select sequence#,group#,status from v$log;
 sequence#     group# status
---------- ---------- --------------------------------
        72          1 inactive
        73          2 inactive
        74          3 current
sql> alter system switch logfile;
system altered.
sql> select sequence#,group#,status from v$log;
 sequence#     group# status
---------- ---------- --------------------------------
        75          1 current
        73          2 inactive
              74          3 active

  在primary主机上执行:

sql> alter database recover managed standby database disconnect from session;
database altered.

  在primary主机上观察日志应用情况

[oracle@primary bdump]$ tail -f alert_oracle.log
starting datafile 2 recovery in thread 1 sequence 93
datafile 2: '/opt/oracle/oradata/primary/undotbs01.dbf'
starting datafile 3 recovery in thread 1 sequence 93
datafile 3: '/opt/oracle/oradata/primary/users01.dbf'
……………………………………………….
media recover

  10.现在可做一个测试,在standby主机上进行数据修改(standby主机现在做primary)

sql> create table t as select * from dba_users;
table created.
sql> alter system switch logfile;
system altered.

  

  在从库上(primary主机上)以read only打开数据库,执行查询

sql> select username from t;
select username from t
*
error at line 1:
ora-01219: database not open: queries allowed on fixed tables/views only
sql> alter database recover managed standby database cancel;
database altered.
sql> alter database open read only;
database altered.
sql> select username from t;
username
------------------------------
sys
system
dbsnmp
outln
wmsys
sql> alter database recover managed standby database disconnect from session;
database altered.

  常见问题

  至此,主副的配置已基本完成,可做以下实验来验证配置的准确性。

  1. 在主库上新建一个表,看修改时候能马上传到副库上;

  2. 在主库上新建一个表空间,新增加一个datafile,看修改时候能马上传到副库上(应该是只要在副库上执行恢复模式,就能在副库上看到新建的表空间;

  3. 在主库上新建一个临时表空间,rename datafile 均不能应用到副库上;

  4. 应当实时察看standby库的alert文件,就能清晰明了地知道主副更新的情况;

  5. 关于启动关闭顺序。

  启动的时候,先从库的listener,再启动从库,再启动主库的listener,再主库。

  关闭的时候,先关闭主库,再启动从库。

  6. 8i副数据库切换为主的话,将无法再切为副。主数据库也是! 也就是说,只能完成一次切换,这叫failover!9i可实现主副数据库任意切换,这叫switchover

  7. 察看主机当前的运行状态:

sql> select name,open_mode,protection_mode,database_role from v$database;
name open_mode protection_mode database_role
--------- ---------- -------------------- ----------------
primary mounted maximum performance physical standby

  8.查看主数据库日志是否全部传送到副数据库,可查看v$archive_gap,更简单的方法是查看各自主机的日志归档目录的日志序号即可。

  11. 常用的一些方法:

  可在副数据库上运行一些脚本,确保主数据库上的更新能及时在副数据库上得到实现。可将以下脚本放在crontab表中。

oracle@standby $cat refresh (刷新脚本)
oracle_sid=oracle
oracle_home=/home/oracle/product/9.2.0
export oracle_sid oracle_home
date=`date '+%y%m%d'`
touch /home/oracle/refresh_$date.log
$oracle_home/bin/sqlplus /nolog << eof
spool /home/oracle/refresh_$date.log
connect sys/abc123 as sysdba
shutdown immediate;
quit
eof
$oracle_home/bin/sqlplus /nolog << eof2
spool /home/oracle/refresh_2_$date.log
connect sys/abc123 as sysdba
startup nomount pfile=$oracle_home/dbs/initoracle.ora;
alter database mount standby database;
alter database set standby database to maximize performance;
alter database recover managed standby database disconnect from session;
spool off
eof2
oracle@standby $cat readonly (更新脚本)
#!/bin/sh
oracle_sid=oracle
oracle_home=/home/oracle/product/9.2.0
export oracle_sid oracle_home
$oracle_home/bin/sqlplus /nolog << eof
spool /home/oracle/refresh-read.log
connect sys/abc123 as sysdba
rem change from recover mode to read-only
alter database recover managed standby database cancel;
alter database open read only ;
spool off
eof
switchover过程。

  

  12.把数据库切换回到主节点

  先将standby此时的initoracle.ora恢复为以前是standby时的参数。

  在主节点(standby主机上)

sql> alter database commit to switchover to physical standby;
database altered.
sql> shutdown immediate
ora-01507: database not mounted
statoracle instance shut down.
sql> startup nomount pfile=/home/oracle/product/9.2.0/dbs/initoracle.ora;
;
oracle instance started.
total system global area 135337420 bytes
fixed size 452044 bytes
variable size 109051904 bytes
database buffers 25165824 bytes
redo buffers 667648 bytes
sql> alter database mount standby database;
database altered.
sql> alter database recover managed standby database disconnect from session;
database altered.

  在备用节点(在primary主机上)

  先将primary此时的initoracle.ora恢复为以前是primary时的参数。

sql> alter database commit to switchover to primary;
database altered.
sql> shutdown immediate;
ora-01507: database not mounted
oracle instance shut down.
sql> startup pfile=/home/oracle/product/9.2.0/dbs/initoracle.ora;
oracle instance started.
total system global area 135337420 bytes
fixed size 452044 bytes
variable size 109051904 bytes
database buffers 25165824 bytes
redo buffers 667648 bytes
database mounted.
database opened.

扫描关注微信公众号