一、 Primary 数据库配置及相关操作

源数据库

IP地址:192.168.52.201

数据库SID: sean

DB_UNIQUE_NAME:jsspre



目标数据库

IP地址:192.168.52.199

数据库SID:sean

DB_UNIQUE_NAME:jsspdg



1、 确认主库处于归档模式

    SQL> archive log list;

    Database log mode              Archive Mode

    Automatic archival             Enabled

    Archive destination            USE_DB_RECOVERY_FILE_DEST

    Oldest online log sequence     1

    Next log sequence to archive   3

    Current log sequence           3

2、 将primary数据库置为FORCE LOGGING模式。通过下列语句:

    SQL> alter database force logging;

    数据库已更改。

3、 创建standby数据库控制文件

    SQL> alter database create standby controlfile as '/u01/bjctl01.ctl';

    数据库已更改。

4、 创建primary数据库客户端初始化参数文件

  注:主要此处修改项较多,为了方便,我们首先创建并修改pfile,然后再通过pfile重建spfile,你当然也可以通过alter system set命令直接修改spfile内容。

    SQL> create pfile='/u01/bjpfile.ora'   from spfile;

    文件已创建。

  原内容:

sean.__db_cache_size=205520896

sean.__java_pool_size=4194304

sean.__large_pool_size=4194304

sean.__shared_pool_size=71303168

sean.__streams_pool_size=0

*.audit_file_dest='/u01/admin/sean/adump'

*.background_dump_dest='/u01/admin/sean/bdump'

*.compatible='10.2.0.2.0'

*.control_files='/u01/oradata/sean/control01.ctl','/u01/oradata/sean/control02.ctl','/u01/oradata/sean/control03.ctl'#Restore

 Controlfile

*.core_dump_dest='/u01/admin/sean/cdump'

*.db_block_size=8192

*.db_domain=''

*.db_file_multiblock_read_count=16

*.db_name='sean'

*.db_recovery_file_dest='/u01/flash_recovery_area'

*.db_recovery_file_dest_size=2147483648

*.dispatchers='(PROTOCOL=TCP) (SERVICE=seanXDB)'

*.job_queue_processes=10

*.open_cursors=300

*.pga_aggregate_target=96468992

*.processes=150

*.remote_login_passwordfile='EXCLUSIVE'

*.sga_target=289406976

*.undo_management='AUTO'

*.undo_tablespace='UNDOTBS1'

*.user_dump_dest='/u01/admin/sean/udump'

  修改客户端初始化参数文件,增加下列内容

      

    #add below parameter for standy database

    *.DB_UNIQUE_NAME=jsspre

    *.LOG_ARCHIVE_CONFIG='DG_CONFIG=(jsspre,jsspdg)'

    *.LOG_ARCHIVE_DEST_2='SERVICE=JSSPDG_192.168.52.199 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=jsspdg'

    *.LOG_ARCHIVE_DEST_STATE_2=DEFER


    #-------- 配置standby角色的参数用于角色转换


    *.FAL_SERVER=JSSPDG_192.168.52.199

    *.FAL_CLIENT=JSSPRE_192.168.52.201

    *.DB_FILE_NAME_CONVERT='/u01/oradata/sean','/u01/oradata/sean'

    *.LOG_FILE_NAME_CONVERT='/u01/oradata/sean','/u01/oradata/sean'

    *.STANDBY_FILE_MANAGEMENT=AUTO

 为什么有的加星号了呢?


  

星号(*)是RAC中使用的,多个实例共用1参数文件,通过前缀区分。
比如两个实例名分别是ora1, ora2。那么可以这样在参数中设置各自的undo表空间:
ora1.undo_tablespace=undo1
ora2.undo_tablesapce=undo2
而*.pga_target=10000代表:
两个实例的pga_target都是10000


 通过pfile重建spfile

    SQL> shutdown immediate

    ...

    SQL> create spfile from pfile=¨/u01/bjpfile.ora¨;

    文件已创建。

5、 复制数据文件到standby服务器

  注意需要复制所有数据文件,备份的控制文件及客户端初始化参数文件

复制方法:

1、SCP(Secure Copy)

  
scp 命令是 SSH 中最方便有用的命令了,试想,在两台服务器之间直接传送文件,仅仅用 scp 一个命令就完全解决了。你可以在一台服务器上以 root 身份运行 #scp servername:/home/ftp/pub/file1 ./ 这样就把另一台服务器上的文件 /home/ftp/pub/file1 直接传到本机器的当前目录下,当然你也可以用 #scp /tmp/file2 servername:/boot 把本机上的文件 /tmp/file2 送到另一台机器的 /boot 目录下。而且整个传送过程仍然是用 SSH 加密的。
  scp就是secure copy,是用来进行远程文件拷贝的。数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证 。 与rcp 不同的是,scp 在需要进行验证时会要求你输入密码或口令。

最简单的应用实例

  最简单的应用如下 :
  scp 本地用户名@IP地址:文件名 1 远程用户名 @IP 地址 : 文件名 2
  [ 本地用户名 @IP 地址:] 可以不输入 , 可能需要输入远程用户名所对应的密码 .
  可能有用的几个参数 :
  -v 和大多数 linux 命令中的 -v 意思一样 , 用来显示进度 . 可以用来查看连接 , 认证 , 或是配置错误 .
  -C 使能压缩选项 .
  -P 选择端口 . 注意 -p 已经被 rcp 使用 .
  -4 强行使用 IPV4 地址 .
  -6 强行使用 IPV6 地址 .
  -r Recursively copy entire directories.
  如——
  copy 本地的档案到远程的机器上
  scp /etc/lilo.conf my@
  会将本地的 /etc/lilo.conf 这个档案 copy 到 ,使用者my 的家目录下。
  =====================================================
  例如:
  copy 本地的档案到远程的机器上
  scp /etc/lilo.conf k@net67.ee.oit.edu.tw:/home/k
  会将本地的 /etc/lilo.conf 这个档案 copy 到 net67.ee.oit.edu.tw,使用者 k 的家目录下。
  copy远程机器上的档案到本地来
  scp k@net67.ee.oit.edu.tw:/etc/lilo.conf /etc
  会将 net67.ee.oitdu.tw 中 /etc/lilo.conf 档案 copy 到本地的 /etc 目录下。
  保持从来源 host 档案的属性
  scp –p k@net67.ee.tw:/etc/lilo.conf /etc
  在此必须注意使用者的权限是否可读取远程上的档案,若想知道更多关于 scp 的使用方法,可去看看 scp 的使用手册。
2、ftp
 在ftp中也非常简单,只需要输入:ftp 192.168.52.199
输入用户名
密码
就可以登陆了
ftp命令详解

(另:在学习过程中,有很多不明白,如:rsh,rlogin,ssh等区别与用法等,望各位不吝赐教!))

6、 配置listener及net service names。

  #vi listener.ora

  加入

 SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME=sean)

      (ORACLE_HOME = /u01/oracle)

      (SID_NAME=sean)

    )

  )


LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.52.199)(PORT = 1521))

         )

  )

配完之后重启listener:

注意:有时候出现TNS-12541错误 请用root用户查看/etc/hosts下是否ip对应本计算机名

记着要在dg的两个主机都查看哦!!

    #lsnrctl stop

    #lsnrctl start

   #vi tnsnames.ora

加入

JSSPDG_192.168.52.199 =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST=192.168.52.199)(PORT=1521))

    )

    (CONNECT_DATA =

      (SID = sean)

      (SERVER=DEDICATED)

    )

  )



JSSPRE_192.168.52.201 =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST=192.168.52.201)(PORT=1521))

    )

    (CONNECT_DATA =

    (SID = sean)

      (SERVER=DEDICATED)

    )

  )



通过tnsping测试tnsnames是否正确有效:

    # tnsping 

    JSSPDG_192.168.52.199

    ...

    Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.52.201)(PORT = 1521)) (CONNECT_

    DATA = (SERVER = DEDICATED) (SERVICE_NAME = sean)))

    OK (30  毫秒)

    #tnsping 

    JSSPRE_192.168.52.201

    ...

    Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.52.199)(PORT = 1521)) (CONNECT_

    DATA = (SERVER = DEDICATED) (SERVICE_NAME = sean)))

    OK (10  毫秒)

二、 Standby 数据库配置及相关操作


在主库:

solaris下oracle默认的位置是$ORACLE_HOME/dbs目录,默认的文件名是orapwSID,对于别的文件名是不认的。

orapwd file=/u01/oracle/dbs/orapwsean password=verysafe entries=30

复制到备库。

orapwd详解

 创建密码文件,注意保持sys密码与primary数据库一致。

     复制文件,不做过多描述

5、 修改初始化参数文件

  增加下列参数:

    *.LOG_ARCHIVE_DEST_1='LOCATION=/u01/oradata/sean/archive'

    *.db_unique_name=jsspdg

    *.LOG_ARCHIVE_CONFIG='DG_CONFIG=(jsspre,jsspdg)'

    *.LOG_ARCHIVE_DEST_2='SERVICE=JSSPRE_192.168.52.201 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)  DB_UNIQUE_NAME=jsspre'

    *.LOG_ARCHIVE_DEST_STATE_2=ENABLE

    *.FAL_SERVER=JSSPRE_192.168.52.201

    *.FAL_CLIENT=JSSPDG_192.168.52.199

  注意同时修改*_dest的路径。

  通过该pfile创建spfile

    SQL> create spfile from pfile='/u01/a.ora';

    文件已创建。

6、 启动standby到mount

    SQL> startup mount;

    ORACLE  例程已经启动。

    Total System Global Area  167772160 bytes

    Fixed Size                  1289484 bytes

    Variable Size              62915316 bytes

    Database Buffers           96468992 bytes

    Redo Buffers                7098368 bytes

    数据库装载完毕。

7、 启动redo应用

    SQL>

     alter database recover managed standby database using current logfile disconnect from session;
    注意这个时候要看aler警告文件,等出现Mem# 0 errs 0: /u01/oradata/sean/stdREDO02.LOG
    时在进行转换和暂停操作

8、 查看同步情况

  首先连接到primary数据库

    SQL> show parameter instance_name;

    NAME                                 TYPE        VALUE

    ------------------------------------ ----------- ------------------------------

    instance_name                        string      jssweb

    SQL> alter system switch logfile;

    系统已更改。

    SQL> select max(sequence#) from v$archived_log;

    MAX(SEQUENCE#)

    --------------

                51

  连接到standby数据库

    SQL> show parameter instance_name;

    NAME                                 TYPE        VALUE

    ------------------------------------ ----------- ------------------------------

    instance_name                        string      jsspdg

    SQL> select max(sequence#) from v$archived_log;

    MAX(SEQUENCE#)

    --------------

                51

接收归档文件

在主库

JSSPRE>alter system set log_archive_dest_state_2=enable;


9、 暂停应用

  通过下列语句暂停redo应用。

    SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

    数据库已更改。

  注意,此时只是暂时redo应用,并不是停止Standby数据库,standby仍会保持接收只不过不会再应用接收到的归档,直到你再次启动redo应用为止。


SQL> alter database recover managed standby database using current logfile disconnect from session;
alter database recover managed standby database using current logfile disconnect from session
*
第 1 行出现错误:
ORA-38500: USING CURRENT LOGFILE option not available without stand

这个错误说明,在standby库没有standby logfile,在maxmize pretection,maxmize availability中必须
要有standby logfile,为了避免数据的损失最少,maxmize performance 也最好创建standby logfile,考虑角色切换
primary库也要创建standby logfile,

standby logfile创建的要求, 与primary的redo logfile的大小相同,个数要至少多一个


SQL> shutdown immeidate;
SP2-0717: 非法的 SHUTDOWN 选项
SQL> shutdown immediate;
ORA-01109: 数据库未打开


已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             167775108 bytes
Database Buffers          436207616 bytes
Redo Buffers                7135232 bytes
数据库装载完毕。


SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------

/u01/oradata/sean/redo03.log

/u01/oradata/sean/redo02.log

/u01/oradata/sean/redo01.log

SQL> alter database add standby logfile group 4 '/u01/oradata/sean/stdREDO01.LOG' size 50m;

数据库已更改。

SQL> alter database add standby logfile group 5 '/u01/oradata/sean/stdREDO02.LOG' size 50m;

数据库已更改。

SQL> alter database add standby logfile group 6 '/u01/oradata/sean/stdREDO03.LOG' size 50m;

数据库已更改。

SQL> alter database add standby logfile group 7 '/u01/oradata/sean/stdREDO04.LOG' size 50m;

数据库已更改。

现在,再启用实时应用, 就ok了!!!

SQL> alter database recover managed standby database using current logfile disconnect from session;

数据库已更改。

  ORA-16004

另:

查看主库是否有错误:

select status,error from v$archive_dest where dest_id=2;

oracle警告日志文件ALERT.LOG位置

vi /u01/admin/sean/bdump/alert_sean.log

记录系统日志,比如日志切换的记录,修改系统参数等系统事件。
位置在参数background_dump_dest指定的路径下,一般为: %ORACLE_BASE%\admin\%ORACLE_SID%\bdump
background_dump_dest='/u01/admin/sean/bdump'

参考:

注:关机后重启,需重启listener

查看进程的活动状态
select PROCESS ,CLIENT_PROCESS,SEQUENCE# ,STATUS from v$managed_standby;

新建、删除表空间等要看参数standby_file_management

查看物理standby数据库未接收的日志文件
SQL> select a.thread#,a.sequence# from
  (select thread#,sequence# from v$archived_log where dest_id=1) a
  where a.sequence# not in
  (select sequence# from v$archived_log where dest_id=2 and thread#=a.thread#);


   THREAD#  SEQUENCE#
---------- ----------
         1         14

查看当前redo应用和redo传输服务的活动状态
SQL> select PROCESS,STATUS,THREAD#,SEQUENCE#,BLOCK#,BLOCKS from v$managed_standby;

PROCESS   STATUS          THREAD#  SEQUENCE#     BLOCK#     BLOCKS
--------- ------------ ---------- ---------- ---------- ----------
ARCH      OPENING               1          9      22529       1133
ARCH      CLOSING               1         10       4097        362
LNS       WRITING               1         11       1640         13