Oracle数据库主从同步配置详解
1. 安装前准备
-
1.1.软件
1、数据库软件:Oracle 11g r1 (企业版)
2、操作系统:WINDOWS SERVER 2008 ENTERPRISE EDTION 64X -
1.2.环境
主库主机: dbprimary 192.168.1.57
从库主机: dbstandby 192.168.1.58
PS:在安装oracle时,主库安装数据库,从库只安装软件
2.主库配置
配置前准备
在/app/文件夹下创建interlib文件夹,再创建子文件夹log。
日志文件路径 logUrl=’/app/interlib/log/’。
控制文件路径:standbyUrl=’/app/interlib’;
-
2.1开启归档模式
在主库上启动数据库到mount模式,开启归档模式与force logging。
在DOS中依次执行下面语句:
执行下面代码:
sqlplus / as sysdba
shutdown immediate;
startup mount;
alter database archivelog;
alter database force logging;
- 2.2.为备用库创建日志文件
执行下面代码:
alter database add standby logfile group 4 (logUrl/ STAN04.LOG) size 50m;
alter database add standby logfile group 5 (logUrl/ STAN05.LOG) size 50m;
alter database add standby logfile group 6 (logUrl/ STAN06.LOG) size 50m;
PS:logUrl是日志文件的路径,路径需要加单引号,否则会报错ora-02236。
- 2.3.创建standby控制文件
执行下面代码:
alter database create standby controlfile as standbyUrl \standby.ctl’;
- 2.4.导出当前数据库参数文件并修改
执行下面代码:
create pfile=' standbyUrl/initora.ora' from spfile;
standbyUrl是控制文件路径,只是为了保存initora.ora文件,方便查找。[^footnote].
编辑initora.ora文件,增加下面的内容。
#下面这部分是要添加的
*.db_unique_name='primary'
*.archive_lag_target=1800
*.fal_client='standby'
*.fal_server='primary'
*.log_archive_config='DG_CONFIG=(primary,standby)'
*.log_archive_dest_1='LOCATION= logUrl VALID_FOR=(all_logfiles,all_roles) db_unique_name=primary'
*.log_archive_dest_2='service=standby arch async valid_for=(online_logfiles,primary_role) db_unique_name=standby'
*.log_archive_dest_state_1='enable'
*.log_archive_dest_state_2='enable'
*.log_archive_format='%t_%s_%r.dbf'
*.DB_FILE_NAME_CONVERT='D:\ oracle数据库数据文件路径','oracle数据库数据文件路径(例如D:\app\Administrator\oradata\orcl\)'
*.LOG_FILE_NAME_CONVERT=' logUrl ',' logUrl '
*.standby_file_management='auto'
效果图为:
PS:该效果图中的路径不是正确的,只是提供一个参考,具体的路径需根据实际情况配置。
按照顺序执行下面命令:
#停止服务
shutdown immediate;
#使用新参数文件启动数据库
startup pfile=' standbyUrl \initora.ora' nomount;
#创建新的spfile文件
create spfile from pfile=' standbyUrl \initora.ora';
#停止服务
shutdown immediate;
#启动服务
startup;
- 2.5.创建密码文件
#执行命令,该语句在DOS窗口执行,不需要登录sqlplus
orapwd file=passwordUrl\PWDorcl.ora password=123 entries=10
PS:密码文件存放路径:passwordUrl=D:\app\Administrator\product\11.2.0\dbhome_1\database。
- 2.6.配置监听和访问服务
修改listener.ora
监听服务文件路径:/app/product/11.2.0/dbhome_1/NETWORK/ADMIN/listener.ora
修改listener.ora文件,加粗的是要添加和修改的内容
#修改SID_LIST_LISTENER
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = D:\app\Administrator\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:D:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
#添加SID_DESC
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = oracle主目录(例如D:\app\Administrator\product\11.2.0\dbhome_1))
(SID_NAME = orcl)
)
)
#修改LISTENER
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
#在原来的基础上添加SID_DESC
(ADDRESS = (PROTOCOL = TCP)(HOST = 主库主机IP)(PORT = 1521))
)
)
ADR_BASE_LISTENER = D:\app\Administrator
修改tnsname.ora文件
# tnsnames.ora Network Configuration File: D:\app\Administrator\product\11.2.0\dbhome_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
#增加主库配置
PRIMARY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.1.57) (PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
#增加从库配置
STANDBY=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.1.58) (PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = WIN-QEDP6N8PVGK)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
测试监听
#alter database open是数据库处于mount状态,从mount状态打开数据库的命令。
alter database open;
lsnrctl stop;
lsnrctl start;
sqlplus sys/pwd@primary as sysdba
PS:若连接失败,检查防火墙设置或者ping下IP地址是否正常。
关闭主数据库
shutdown immediate;
3.从库配置
3.1.主库复制文件到从库
- 将主库oracle目录下的admin,cfgtollogs,diag,flash_recover_area目录拷贝到备用库的相同路径,备库已经有的文件和文件夹直接覆盖掉吧。
- 将主库oracle目录下的oradata文件夹下内容复制到从库相同目录下 。
- 将主库生成的密码文件拷贝到从库相同路径下。 将D:\app\interlib拷贝到备库相同路径 。
- 将standby.ctl文件拷贝到备库的数据文件夹内(D:\app\Administrator\oradata\orcl\)和D:\app\Administrator\flash_recovery_area\orcl\下。在两个路径下将文件复制为control01.ctl,control02.ctl,control03.ctl。
- 将主库的listener.ora和tnsname.ora拷贝到备库相同路径 。
- 主库和备库创建D:\app\interlib\tmp文件夹。
-
修改备库listener.ora文件的Ip为备库Ip(192.168.1.58 )。
3.2.备库新建实例
#在备库上注册oracle实例到服务中,具体命令如下:
oradim -new -sid orcl(实例名)
PS:如果已经装了数据库,执行的话也会提示这个实例已经存在,接着继续下面的就可以
3.3.备库启动监听
lsnrctl start
3.4.修改备库参数文件并创建实例
将刚才从主库拷贝过来的initora.ora作下面的修改,用下面的内容覆盖主库增加的内容。
#下面是要修改的地方
*.db_unique_name='standby'
*.archive_lag_target=1800
*.fal_client='primary'
*.fal_server='standby'
*.log_archive_config='DG_CONFIG=(primary,standby)'
*.log_archive_dest_1='LOCATION=D:\app\interlib\log\ VALID_FOR=(all_logfiles,all_roles) db_unique_name=standby'
*.log_archive_dest_2='service=primary arch async valid_for=(online_logfiles,primary_role) db_unique_name=primary'
*.log_archive_dest_state_1='enable'
*.log_archive_dest_state_2='enable'
*.log_archive_format='%t_%s_%r.dbf'
*.DB_FILE_NAME_CONVERT='D:\app\Administrator\oradata\orcl\','D:\app\Administrator\oradata\orcl\'
*.LOG_FILE_NAME_CONVERT='D:\app\interlib\log\','D:\app\interlib\log\'
*.standby_file_management='auto'
使用新参数文件建立从库实例
startup nomount pfile=’d:\app\interlib\initora.ora’;
create spfile from pfile=’d:app\interlib\initora.ora’;
shutdown immediate;
startup nomount
3.5.配置从库为备用库模式
alter database mount standby database;
#开启备用库应用重做
alter database recover managed standby database disconnect from session;
#关闭应用重做
alter database recover managed standby database cancel;
#配置实时应用重做
alter database recover managed standby database using current logfile;
startup nomount
3.6.检测配置是否成功
#查看切换状态:
select switchover_status from v$database;
#手动切换归档,查看归档文件是否自动同步到备用库. 切换归档:
alter system switch logfile;
#在主库和从库查看归档日志是否同步:
SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
具体操作步骤:
1. 查看oradata/archive文件是否传过去了
2. 在dbprimary上插入一些数据
#主库操作,查看当前sequence
(dbprimary)sql>select max(sequence#) from v$archived_log;
#从库操作,查看当前sequence
(dbstandby)sql>select max(sequence#) from v$archived_log;
#主库操作,查看当前sequence
(dbprimary)sql>alter system switch logfile;
#主库操作,查看当前sequence
(dbprimary)sql>select max(sequence#) from v$archived_log;
#从库操作,查看当前sequence
(dbstandby)sql>select max(sequence#) from v$archived_log;
如果dbstandby的sequence跟着改变,说明已经好了
如果查看从库可以看到归档日志,表示归档日志同步成功,如果APPLIED列的值为yes,表示重做应用成功.
主库配置完成.
4.常用命令
#检测Data Guard方式的命令
SELECT PROTECTION_MODE FROM V$DATABASE;
#修改Data Guard保护模式
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE {AVAILABILITY | PERFORMANCE | PROTECTION};
#对单实例数据库或RAC中的当前实例执行日志切换;
ALTER SYSTEM SWITCH LOGFILE
#会对数据库中的所有实例执行日志切换。
而ALTER SYSTEM ARCHIVE LOG CURRENT
5.常见错误处理办法
错误号 | 错误描述 |
---|---|
ORA-10456 | cannot open standby database; media recovery session may be in progress |
#解决办法
alter database recover managed standby database cancel;
alter database open;
alter database recover managed standby database using current logfile disconnect ;
错误号 | 错误描述 |
---|---|
ORA-02232 | ??? MOUNT ?? |
#解决办法
主库生成的standby.ctl控制文件拷贝到initora.ora中控制文件指定的地方,再重新
使用initora.ora nomount启动数据库即可,对于从库原有的control01.ctl文件进行覆盖,必须保证主库和从库的control01文件一致。
本文引用部分文章:
https://www.2cto.com/database/201308/239244.html
http://blog.csdn.net/qq_23412263/article/details/70240485
http://tianzt.blog.51cto.com/459544/251239/