Oracle DataGuard可以实现数据库的热备,11g后也可以用来作为实时的读写分离方案。下文以CentOS5.5+Oracle11g为例说明部署步骤。
主库
ip:192.168.1.232
host:oracleTkBak.ipmph.com
sid:orcl
备库
ip:192.168.1.50
host:testOracle2.ipmph.com
sid:orcl
50备库:vim /etc/hosts:备库的hosts里面加主库IP,主库的hosts里面加备库IP
127.0.0.1 testOracle2.ipmph.com testOracle2 localhost.localdomain localhost
192.168.1.232 oracleTkBak.ipmph.com
232主库 vim /etc/hosts:
127.0.0.1 oracleTkBak.ipmph.com oracleTkBak localhost.localdomain localhost
192.168.1.50 testOracle2.ipmph.com
安装时备库先不用装数据库,只安装程序。数据文件由主库复制。
1.primary库操作
1)打开强制日志模式
先查询:select FORCE_LOGGING from v$database;
如果是NO就执行下面的alter
alter database force logging;
修改完之后再执行上面的查询
2)检查是否是归档模式
archive log list;
如果为如下日志,则未归档
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 1
Current log sequence 2
shutdown immediate
startup mount
alter database archivelog;
3)复制密码文件
scp /opt/11g/oracle/product/11.2.0/db_1/dbs/orapworcl 192.168.1.50:/opt/11g/oracle/product/11.2.0/db_1/dbs/orapworcl
在备库的/opt/11g/oracle/product/11.2.0/db_1/dbs/ 目录下把orapworcl文件拷贝一份并重命名成orapwstandby(不能是.ora文件,如果是.ora的话会报:ORA-16191:
Primary log shipping client not logged on standby这个错误)
4)设置归档文件地址
建立归档目录 mkdir /opt/11g/oracle/oradata/orcl/archive
alter system set log_archive_dest_1='location=/opt/11g/oracle/oradata/orcl/archive';
5)增加standby日志文件
startup mount
alter database add standby logfile group 4('/opt/11g/oracle/oradata/orcl/standby_redo01.log') size 100M;
alter database add standby logfile group 5('/opt/11g/oracle/oradata/orcl/standby_redo02.log') size 100M;
alter database add standby logfile group 6('/opt/11g/oracle/oradata/orcl/standby_redo03.log') size 100M;
alter database add standby logfile group 7('/opt/11g/oracle/oradata/orcl/standby_redo04.log') size 100M;
alter database add standby logfile group 8('/opt/11g/oracle/oradata/orcl/standby_redo05.log') size 100M;
检查结果
select group#,type,member from v$logfile;
6)创建primary数据库初始化参数
通过修改创建的pfile,然后重新生成spfile,
SQL> create pfile from spfile;
File created.
备份pfile,路径/opt/11g/oracle/product/11.2.0/db_1/dbs/initorcl.ora
备份完后vi initorcl.ora 把下面的添加到文件末尾,删除合并重复的行
主库
*.db_name='orcl'
*.db_unique_name='primary'
*.log_archive_config='dg_config=(primary,standby)'
*.log_archive_dest_1='LOCATION=/opt/11g/oracle/oradata/orcl/archive valid_for=(all_logfiles,all_roles) db_unique_name=primary'
*.log_archive_dest_state_1=enable
*.log_archive_dest_2='SERVICE=standby lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=standby'
*.log_archive_dest_state_2=enable
*.fal_server=standby
*.fal_client=primary
*.standby_file_management=auto
*.remote_login_passwordfile='EXCLUSIVE'
*.log_archive_format=%t_%s_%r.arc
DB_FILE_NAME_CONVERT='oradata/orcl','oradata/orcl'
LOG_FILE_NAME_CONVERT='oradata/orcl','oradata/orcl'
用pfile启动数据库,使配置生效
shutdown immediate
startup pfile='/opt/11g/oracle/product/11.2.0/db_1/dbs/initorcl.ora'
create spfile from pfile='/opt/11g/oracle/product/11.2.0/db_1/dbs/initorcl.ora';
shutdown immediate
startup
将initorcl.ora复制到备库
scp /opt/11g/oracle/product/11.2.0/db_1/dbs/initorcl.ora 192.168.1.50:/opt/11g/oracle/product/11.2.0/db_1/dbs/
修改备库中的initorcl.ora 文件:
*.db_name='orcl'
*.db_unique_name='standby'
*.log_archive_config='dg_config=(primary,standby)'
*.log_archive_dest_1='LOCATION=/opt/11g/oracle/oradata/orcl/archive valid_for=(all_logfiles,all_roles) db_unique_name=standby'
*.log_archive_dest_state_1=enable
*.log_archive_dest_2='SERVICE=primary lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=primary'
*.log_archive_dest_state_2=enable
*.fal_server=primary
*.fal_client=standby
*.standby_file_management=auto
*.remote_login_passwordfile='EXCLUSIVE'
*.log_archive_format=%t_%s_%r.arc
DB_FILE_NAME_CONVERT='oradata/orcl','oradata/orcl'
LOG_FILE_NAME_CONVERT='oradata/orcl','oradata/orcl'
7)在主库中创建备库的控制文件,注意备库的控制文件要在主库的MOUNT状态下创建。
shutdown immediate
startup mount
alter database create standby controlfile as '/home/oracle/standby.ctl';
复制控制文件到备库
scp /home/oracle/standby.ctl 192.168.1.50:/home/oracle/standby.ctl
复制数据文件到备库
alter database open;
alter database begin backup;
SQL> !scp /opt/11g/oracle/oradata/orcl/system01.dbf 192.168.1.50:/opt/11g/oracle/oradata/orcl/
oracle@192.168.1.245's password:
scp: /opt/11g/oracle/oradata/orcl/: No such file or directory
这里会报备库没有那个目录,到备库去mkdir这个目录
alter database end backup;
8)配置listener和tnsname
配置listener
vi /opt/11g/oracle/product/11.2.0/db_1/network/admin/listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /opt/11g/oracle/product/11.2.0/db_1/)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /opt/11g/oracle/product/11.2.0/db_1)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = oracleTkBak.ipmph.com)(PORT = 1521))
)
)
ADR_BASE_LISTENER = /opt/11g/oracle
配置tnsname
vi /opt/11g/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
PRIMARY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracleTkBak.ipmph.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
STANDBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = testOracle2.ipmph.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
复制文件到备库
scp /opt/11g/oracle/product/11.2.0/db_1/network/admin/*.ora 192.168.1.50:/opt/11g/oracle/product/11.2.0/db_1/network/admin/
注意修改对应的listener的HOST
至此主库的操作完成。
2.standby备库操作
备库一般只需安装程序而不需要安装数据库,因此相关的文件需要从主库拷贝到备库。在上述过程中scp操作已经拷贝了部分数据。
1)建立相关admin、flash_recovery_area目录,这些目录都是 在oracle用户创建
cd /opt/11g/oracle/
mkdir admin
然后在admin目录下创建orcl目录
mkdir orcl
在orcl目录下创建下面三个目录
mkdir adump
mkdir dpdump
mkdir pfile
cd /opt/11g/oracle/
mkdir flash_recovery_area
cd flash_recovery_area/
mkdir orcl
cd /opt/11g/oracle/oradata/orcl
mkdir archive
2)复制控制文件
mv /home/oracle/standby.ctl /opt/11g/oracle/oradata/orcl/control01.ctl
cd /opt/11g/oracle/oradata/orcl/
cp control01.ctl control02.ctl
cp control01.ctl control03.ctl
注意需要将control02.ctl复制到flash_recovery_area/orcl下
cp control02.ctl /opt/11g/oracle/flash_recovery_area/orcl/
3)切换pfile
切换到root用户后执行:setenforce 0
然后切换到oracle用户进入sqlplus
shutdown immediate
startup pfile='/opt/11g/oracle/product/11.2.0/db_1/dbs/initorcl.ora'
create spfile from pfile='/opt/11g/oracle/product/11.2.0/db_1/dbs/initorcl.ora';
shutdown immediate
startup
4)测试
测试listener是否配置成功,可通过 tnsping测试
测试权限是否正确
sqlplus sys/oracle@standby as sysdba
3.测试
1)正常启动主库
sqlplus / as sysdba;
startup
2)启动备库
sqlplus /nolog
conn / as sysdba;
startup mount
ALTER DATABASE OPEN READ ONLY;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
3)在主库上做一次日志切换
ALTER SYSTEM SWITCH LOGFILE;
在主备上查看对应的归档日志情况
SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
也可以在主库上查看错误信息
Select status,dest_name,error from v$archive_dest where rownum<10;
4)在主库上建表插入数据并在备库查询
create table zetest(id integer,name char(10),memo char(20));
insert into zetest values(1,'test','xxxx');
commit;
5)在备库上查询是否同步
select * from test;
11g备库第一次查询可能会报 数据库没打开的错误,按照下面10G的方法执行一遍以后就可以时时同步并查询了
注意:如果是oracle10g,不能在同步的时候同时执行查询
需要在备库执行
alter database recover managed standby database disconnect from session;
接收同步后查询需要
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE OPEN READ ONLY;
select * from test;
然后输入
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
继续接收主库的同步数据
错误可以去/usr/11g/oracle/diag/rdbms/standby/orcl/trace/这个目录下去查看
主库和备库的启动关闭顺序:
启动:先启备库,后启主库
关闭:先关主库,后关备库
修改host
vi /etc/sysconfig/network
HOSTNAME=PRIMARY
配置RMAN自动管理ARCHIVELOG
如果主库和备库安装路径不一致的话,一定要把备库的相关配置文件都改成备库自己的路径。需要注意的是这种情况下从主库生成的控制文件中的数据文件和日志文件路径都是主库的路径,而控制文件又是二进制文件不能通过vi直接修改。可以通过下面的方式修改日志文件和数据文件的位置:
1、启动数据库 并mount
startup mount;
alter database create standby controlfile as '/home/oracle/standby.ctl';
复制控制文件到备库
scp /home/oracle/standby.ctl 192.168.1.245:/home/oracle/standby.ctl
复制控制文件
mv /home/oracle/standby.ctl /opt/11g/oracle/oradata/orcl/control01.ctl
cp control01.ctl control02.ctl
cp control01.ctl control03.ctl
复制数据文件到备库
alter database open;
alter database begin backup;
SQL> !scp /opt/11g/oracle/oradata/orcl/system01.dbf 192.168.1.50:/opt/11g/oracle/oradata/orcl/
oracle@192.168.1.245's password:
alter database end backup;
2、alter system set standby_file_management=manual scope=both;
3、
alter database rename file '/opt/11g/oracle/oradata/orcl/users01.dbf' to '/usr/11g/oracle/oradata/orcl/users01.dbf';
alter database rename file '/opt/11g/oracle/oradata/orcl/undotbs01.dbf' to '/usr/11g/oracle/oradata/orcl/undotbs01.dbf';
alter database rename file '/opt/11g/oracle/oradata/orcl/sysaux01.dbf' to '/usr/11g/oracle/oradata/orcl/sysaux01.dbf';
alter database rename file '/opt/11g/oracle/oradata/orcl/system01.dbf' to '/usr/11g/oracle/oradata/orcl/system01.dbf';
alter database rename file '/opt/11g/oracle/oradata/orcl/temp01.dbf' to '/usr/11g/oracle/oradata/orcl/temp01.dbf';
alter database rename file '/opt/11g/oracle/oradata/orcl/exam2x_temp.dbf' to '/usr/11g/oracle/oradata/orcl/exam2x_temp.dbf';
alter database rename file '/opt/11g/oracle/oradata/orcl/exam2x_data01.dbf' to '/usr/11g/oracle/oradata/orcl/exam2x_data01.dbf';
alter database rename file '/opt/11g/oracle/oradata/orcl/exam2x_data02.dbf' to '/usr/11g/oracle/oradata/orcl/exam2x_data02.dbf';
alter database rename file '/opt/11g/oracle/oradata/orcl/exam2x_data03.dbf' to '/usr/11g/oracle/oradata/orcl/exam2x_data03.dbf';
alter database rename file '/opt/11g/oracle/oradata/orcl/redo03.log' to '/usr/11g/oracle/oradata/orcl/redo03.log';
alter database rename file '/opt/11g/oracle/oradata/orcl/redo02.log' to '/usr/11g/oracle/oradata/orcl/redo02.log';
alter database rename file '/opt/11g/oracle/oradata/orcl/redo01.log' to '/usr/11g/oracle/oradata/orcl/redo01.log';
alter database rename file '/opt/11g/oracle/oradata/orcl/standby_redo01.log' to '/usr/11g/oracle/oradata/orcl/standby_redo01.log';
alter database rename file '/opt/11g/oracle/oradata/orcl/standby_redo02.log' to '/usr/11g/oracle/oradata/orcl/standby_redo02.log';
alter database rename file '/opt/11g/oracle/oradata/orcl/standby_redo03.log' to '/usr/11g/oracle/oradata/orcl/standby_redo03.log';
alter database rename file '/opt/11g/oracle/oradata/orcl/standby_redo04.log' to '/usr/11g/oracle/oradata/orcl/standby_redo04.log';
alter database rename file '/opt/11g/oracle/oradata/orcl/standby_redo05.log' to '/usr/11g/oracle/oradata/orcl/standby_redo05.log';
4、alter system set standby_file_management=auto scope=both;
如果查询慢的话需要注释掉:/etc/resolv.conf中的内容
oracle 11g数据库用户密码180天自动过期调整