1.1 环境准备
已有IP地址:10.78.246.10,已经运行了一个数据库为orcl,作为主库,主库环境介绍:
Ø Oracle软件安装在/oracle
Ø 数据文件在/oradata
Ø 数据库版本11.2.0.1.0
Ø 内存64G
计划在IP地址为10.78.246.32上创建一个备库ostandby(本来我打算叫orcl_standby的,后来运行的时候说只允许数据库名不超过8个字符的名字),并且备库已经安装了oracle 相同版本的企业版,未建库,只安装了oracle软件
Ø 主机名:oracle.standby
Ø 数据库版本11.2.0.1.0
Ø 内存4G
1.2 主库环境准备
在10.78.246.10上执行步骤:
conn / as sysdba; (先切换为归档日志模式alter database archivelog;,因为这个库已经是了,跳过此步骤) 然后执行: alter database force logging; 我们一般配置密码文件做验证,因此下面的参数应该返回EXECUSIVE(默认就是它,为了保险,检查一下,如果不是就设置一下) show parameter remote_login_passwordfile; alter system set remote_login_passwordfile=exclusive scope=spfile;(上面返回EXECUSIVE则不需要执行) 检查db_unique_name (show paramter db_unique_name;),如果没设置则要设置好 检查flash_back设置,本库之前已经配置好了,不再检查; |
1.3 配置SQL*NET
在创建备库前,要确认两台服务器的数据库之间能通信。需要执行下面的配置:
1. 主库的listener.ora不需要变动,复制到备库的相同目录下($ORACLE_HOME/network/admin),把HOST=xx的内容修改为:
HOST = oracle.standby |
2. 主库的tnsname.ora需要变更为:
OSTANDBY = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.78.246.32)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = ostandby) ) ) ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.78.246.10)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) |
3. 把tnsname.ora复制到备库的相同目录下,修改后内容:
OSTANDBY = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.78.246.32)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = ostandby) ) ) ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =10.78.246.10)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) |
4. 启动主库和备库的监听
用oracle用户执行:lsnrctl start
1.4 主库的redo log配置
在10.78.246.10上执行步骤:
让主库知道 Data Guard 配置里的另外一个库的名字: |
1.5 备库的环境准备
一、 从主库复制文件
Ø 将主库的密码文件($ORACLE_HOME/dbs/orapworcl)复制到备库的相同位置,并改名($ORACLE_HOME/dbs/orapwostandby)
Ø 将主库的控制文件(/oradata/orcl/control01.ctl)复制到备库的相同位置
Ø 从主库生成pfile(在主库上执行SQL> create pfile from spfile;),
复制$ORACLE_HOME/dbs/initorcl.ora到备库相同目录下,并重命名为initostandby.ora
二、 修改备库的启动初始化文件(initostandby.ora):
下面内容中,加粗部分才需要根据备库的情况修改,不加粗的不需要: orcl.__db_cache_size=5637144576 orcl.__java_pool_size=1879048192 orcl.__large_pool_size=268435456 orcl.__oracle_base='/oracle'#ORACLE_BASE set from environment orcl.__pga_aggregate_target=11005853696 orcl.__sga_target=16106127360 orcl.__shared_io_pool_size=0 orcl.__shared_pool_size=7516192768 orcl.__streams_pool_size=536870912 *.audit_file_dest='/oracle/admin/ostandby/adump' ##修改为新库的地址,并用建立该目录 *.audit_trail='db' *.compatible='11.2.0.0.0' *.control_file_record_keep_time=7 *.control_files='/oradata/orcl/control01.ctl' ##建立该目录,复制控制文件到这里(前面已做) *.db_block_size=8192 *.db_domain='' *.db_name='orcl' ##这个一定不要修改为ostandby,否则无法使用复制过来的控制文件 *.db_recovery_file_dest='/oracle/flash_recovery_area' ##建立该目录 *.db_recovery_file_dest_size=87956652032 *.diagnostic_dest='/oracle' *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)' *.fal_server='orcl' *.log_archive_config='dg_config=(orcl,ostandby)' *.log_archive_dest_1='location=use_db_recovery_file_dest valid_for=(all_logfiles, all_roles) db_unique_name=ostandby' *.log_archive_dest_2='service=orcl async valid_for=(online_logfile,primary_role) db_unique_name=orcl' *.log_archive_format='%t_%s_%r.dbf' *.memory_target=1689649152 ##这个是内存数,需要除以16,因为内存是主库的1/16 *.open_cursors=300 *.processes=600 *.remote_login_passwordfile='EXCLUSIVE' *.sessions=665 *.standby_file_management='auto' *.undo_tablespace='UNDOTBS1' db_unique_name=ostandby |
三、 建立备库的文件目录:
根据上一节的说明,建立相应的目录结构,检查一遍:
Ø $ORACLE_BASE/admin/$ORACLE_SID
Ø $ORACLE_BASE/admin/$ORACLE_SID/adump(audit_file_dest配置的目录)
Ø 数据文件目录:/oradata/orcl
Ø 控制文件目录:/oradata/orcl
Ø 日志文件目录:/oradata/orcl
Ø 快速恢复区目录:/oracle/flash_recovery_area
Ø 将备库信息加到 /etc/oratab 文件(可以参考主库的内容添加)
四、 从主库复制文件
停止主库(shutdown immediate),复制下列文件:
Ø 复制主库的/oradata/orcl下的所有dbf及log文件(即数据库文件、日志文件)到备库的相同目录下(/oradata/orcl)
Ø 复制主库的/oracle目录下的cfgtoollogs、diag、admin目录到备库的相同目录下(不复制的话启动备库时显示找不到控制文件)
1.6 启动备库
在备库上执行:
SQL> startup nomount pfile=initostandby.ora SQL> create spfile from pfile; SQL> shutdown SQL> startup nomount SQL> show parameter spfile 修改备库为备用库模式 SQL> alter database mount standby database; 开启备用库应用重做 SQL> alter database recover managed standby database disconnect from session;
下面的为命令参考,非必要时,不需执行 关闭应用重做 SQL>alter database recover managed standby database cancel; 配置实时应用重做 SQL>alter database recover managed standby database using current logfile;
|
1.7 主备库情况检查确认
一、 确认主备库里的归档目的地配置都是有效的,在主库和备库分别执行:
SQL> select DEST_ID, STATUS, DESTINATION, ERROR from V$ARCHIVE_DEST where DEST_ID<=2; |
目的地状态应该显示为 VALID。否则会有错误提示。
二、 确认重做日志是否真的被应用了,在主库执行:
SQL> select SEQUENCE#, FIRST_TIME, NEXT_TIME, APPLIED, ARCHIVED from V$ARCHIVED_LOG where name='ostandby' order by FIRST_TIME; |
如果归档和日志应用均正常,APPLIED 和 ARCHIVED 列都应该是 YES。
如果你发现日志没有被应用,那可能是重做日志有了缺口,这种情况下备库无法进行日志应用。但如果你的 FAL_SERVER 参数设置正确,这应该不会有问题。你可以在主库上检查是否有重做日志缺口:
SQL> select STATUS, GAP_STATUS from V$ARCHIVE_DEST_STATUS where DEST_ID = 2; |
如果一切正常,应该返回 VALID 和 NO GAP。
V$DATAGUARD_STATUS 视图对查找错误和了解发生了什么非常有用。可以在主备库上执行以下查询查看数据库状态:
SQL> select * from V$DATAGUARD_STATUS order by TIMESTAMP; |
三、 直接查询备库,看新数据是否存在
以上步骤已经足够。下面的是你不放心,非要看看的话才做的:
取消日志应用 SQL> alter database recover managed standby database cancel; 将备库打开为只读状态 SQL> ALTER DATABASE OPEN READ ONLY; |
这时你可以查询变化了的数据是否同步过来。
看完之后记得修改数据库状态及启用日志应用。
1.8 参考资料
主要参考:http://kyle.xlau.org/posts/oracle-data-guard-part1.html
其他参考:
http://docs.oracle.com/cd/E11882_01/server.112/e25608/create_ps.htm#i63561
http://tianzt.blog.51cto.com/459544/251239
http://www.cnblogs.com/dba001/archive/2012/02/22/2361983.html