聊一下oracle的高可用方案(非开源数据库) 知识

wangzha 3月前 137

  前段时间因为公司架构重新调整,将数据库Oracle改成了MySQL,大量的数据备份、迁移 忙的我焦头烂额,正好这个机会,我整理了一下文档,就在这跟大家聊聊关于oracle的数据同步问题,(后面还有一篇会写到具体应用)相信还是有很多公司数据库用到Oracle 毕竟数据库行业的龙头老大嘛 言归正传 技术有限,有什么问题的话请大家指出来,我会修改 嘻嘻


DataGuard是甲骨文推出的一种高可用性数据库方案高安全, 它在主节点与备用节点间通过日志同步来保证数据的同步。

  DataGuard分为物理dgstandby和逻辑dgstandby,物理dgstandby方式是通过块拷贝方式同步,逻辑dgstandby是通过应用SQL语句进行同步。


 

主库

备库

系统

Centos 6.9 x64

Centos 7.4 x64

数据库版本

11.2.0.4

11.2.0.4

IP

10.10.1.32

10.10.1.88

1、DataGuard主库配置

1.1 启用force logging功能

sqlplus / as sysdba     (进入)
desc v$database;  (查询forece logging功能)

有一列记录状态(force_loggin

select force_logging from v$database;   (查询是否yes)
alter database force logging;   (启用)

1.2 启用归档

archive log list;  (查看是否启用归档)
select open_mode from v$database;
select log_mode from v$database;  (查询archive log是否打开)

文件名格式:log_archive_format

show parameter log_ar
alter system set log_archive_format='%t_%s_%r.arc' scope=spfile; (修改后需重启生效)

位置:log_archive_dest

sql> shutdown immediate;   (不能用shutdown abort关闭)
sql> startup mount;
archive log list;   (查看归档是否启用)
sql> alter database archivelog;
sql> alter database open;   (打开数据库的归档模式)
archive log list; (查看归档路径)

1.3 设转置主库监听


 

主库

备库

DG用监听

1522(静态)

1522(静态)

(修改主库动态监听)

/disk1/oracle/product/11.2.0/network/admin/listener.ora 

主库修改listener.ora (添加LISTENER1,端口1522作为数据库同步

-------------------------------------------------------------------------------------------------------------
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.1.32)(PORT = 1521))
    )
  )
LISTENER1 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.1.32)(PORT = 1522))
    )
  )
 
SID_LIST_LISTENER1 =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = qdtestdb)
      (ORACLE_HOME = /disk1/app/oracle/product/11/db1)
      (SID_NAME = qdtestdb)
    )
  )
 
ADR_BASE_LISTENER1 = /disk1/app/oracle
-----------------------------------------------------------------


 

lsnrctl start Listener1 (启动Listener1的监听)
lsnrctl status Listener1 (查看Listener1的监听状态)
alter system register; (注册监听生效)

1.4 配置主库初始化参数


 

主库

备库

db_name

qdtestdb

qdtestdb

instance_name

qdtestdb

stddb

db_unique_name

qdtestdb

stddb

tnsnames.ora

TNSmaster

TNSstandby

服务名

qdtestdb

qdtestdb

 

show parameter db_unique_name;
alter system set db_unique_name= qdtestdb scope=spfile; (如果已经是qdtestdb,就无需修改,修改后重启数据库 )
 
show parameter log_archive_config;
alter system set log_archive_config='DG_CONFIG=(qdtestdb,stddb)' scope=both; (是指的DB_UNIQUE_NAME值)


配置归档路径:

log_archive_dest_1
log_archive_dest_2
show parameter log_archive_dest;
mkdir /disk1/app/oracle/archive  (先创建目录)
alter system set log_archive_dest_1='LOCATION=/disk1/app/oracle/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=qdtestdb' scope=both;
alter system set log_archive_dest_2='SERVICE=tnsstandby LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=stddb' scope=both;
show parameter log_archive_dest;  (检查是否成功)


修改主库的tnsname.ora,并拷贝到备库

 

TNSstandby =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.1.88)(PORT = 1522))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = qdtestdb)
    )
  )
 
TNSmaster =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.1.32)(PORT = 1522))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = qdtestdb)
    )
  )
------------------------------------------------------------------------------------------------------------------------
select * from v$dbfile;  (查看数据文件路径)
show parameter db_file_name_convert;  (设置文件转换)数据文件
alter system set db_file_name_convert='/disk1/oracle/oradata/qdtestdb','/disk1/app/oracle/oradata/qdtestdb' scope=spfile;
select * from v$logfile;
show parameter log_file_name_convert;  (重做日志文件)
alter system set log_file_name_convert='/disk1/oracle/oradata/qdtestdb','/disk1/app/oracle/oradata/qdtestdb' 
scope=spfile;
 
show parameter standby_file_management;
alter system set standby_file_management='auto';
 
show parameter fal;
alter system set fal_client='tnsmaster' scope=both;  (这个配本地的,tnsmaster是指tnsname)
alter system set fal_server='tnsstandby' scope=both; (这个配对方的)

以上配置修改后需重启oracle服务


2、DataGuard备库配置


 

主库

备库

db_name

qdtestdb

qdtestdb

instance_name

qdtestdb

stddb

db_unique_name

qdtestdb

stddb

tnsnames.ora

tnsmaster

tnsstandby

服务名

qdtestdb

qdtestdb

2.1拷贝密码文件

主库和备库,SYS密码要一样

orapwSID

/disk1/app/oracle/product/11/db/dbs/orapwqdtestdb此加密文件拷贝到备库并改名为 orapwstddb

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

[oracle@orcl dbs]$ ls
hc_racdb1.dat  init.ora  initracdb1.ora  qdtestdb  已经有一个密码文件了
[oracle@orcl dbs]$ orapwd file=orapwqdtestdb password=Qdone.123 force=y

这条命令可以手动生成密码文件,force=y的意思是强制覆盖当前已有的密码文件

将主库的密码文件copy给备库,并重命名

[oracle@orcl dbs]$ scp orapworcl 192.168.8.153:$ORACLE_HOME/dbs/orapwstddb

第二种方法可以在备库直接生存与主库一样的密码文件

orapwd file =orapwstddb password=oracle


2.2启动实例到nomount状态

创建pfile

create spfile from pfile;   (这一步需要把主库的pfile内容拷到备库,再执行,执行需关闭实例)

startup nomount;

进入到/disk1/oracle/product/11.2.0/dbs

touch initstddb.ora

vim initstddb.ora  (拷贝的内容参照主库spfile参考)

 

进入主库,输入命令 strings spfileqdtestdb.ora 复制以下内容到备库的pfile文件initstddb.ora   (每行前面*.去掉)

把以下配置拷到备库的initstddb.ora

 /disk1/oracle/product/11.2.0/dbs/initstddb.ora

---------------------------------------------------------------
db_name='qdtestdb'
db_unique_name='stddb'
memory_target=6G
compatible='11.2.0.4.0'
audit_file_dest='/disk1/oracle/admin/qdtestdb/adump'
control_files='/disk1/oracle/oradata/qdtestdb/control01.ctl','/disk1/oracle/fast_recovery_area/qdtestdb/control02.ctl'
log_archive_config='DG_CONFIG=(qdtestdb,stddb)'
log_archive_dest_1='LOCATION=/disk1/oracle/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=stddb'
log_archive_dest_2='SERVICE=tnsmaster LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=qdtestdb'
db_file_name_convert='/disk1/app/oracle/oradata/qdtestdb','/disk1/oracle/oradata/qdtestdb'
log_file_name_convert='/disk1/app/oracle/oradata/qdtestdb','/disk1/oracle/oradata/qdtestdb'
fal_client='tnsstandby'
fal_server='tnsmaster'
standby_file_management='auto'
log_archive_format='%t_%s_%r.arc'
 
------------------------------------------------------------------


env |grep ORA   查看oracle环境变量

cat .bash_profile  ORACLE_SID=stddb  (修改SID)

 

sqlplu / as  sysdba

必须关闭库

shutdown abort

create spfile from pfile; (使用initstddb.orapfile创建spfile)

cd  $ORACLE_HOME/dbs (查看pfile是否创建成功)

sql> startup nomount;

show parameter spfile;   (启动到nomountshow spfile)

show parameter log


2.3配置静态监听 (和主库一样)

备库为什么一定要配置静态监听?

nomount状态下必须使用静态监听才能连接实例

shutdown immediate;

startup nomount;

Lsnrctl status listener1

备库查看是否nomount 状态

select status from v$instance;

/disk1/oracle/product/11.2.0/network/admin/listener.ora

修改listener.ora

----------------------------------------------------------------------
添加
LISTENER1 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.1.88)(PORT = 1522))
    )
  )
SID_LIST_LISTENER1 =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = qdtestdb)
      (ORACLE_HOME = /disk1/oracle/product/11.2.0)
      (SID_NAME = stddb)
    )
  )
---------------------------------------------------------------------


修改tnsname.ora

---------------------------------------------------------------------
添加
TNSstandby =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.1.88)(PORT = 1522))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = qdtestdb)
    )
  )
 
TNSmaster =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.1.32)(PORT = 1522))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = qdtestdb)
    )
  )
----------------------------------------------------------------------


2.4测试监听

主库和备库都要执行tnsping

tnsping tnsmaster 
tnsping tnsstandby

主库和备库都要验证

sqlplus sys/Qdone.123@tnsmaster as sysdba
sqlplus sys/Qdone.123@tnsstandby as sysdba
select status from v$instance;

2.5主备库参数检查

1)检查db_unique_name

show parameter db_unique_name

2)检查主库备的版本号是否一致 compatible

show parameter compa

3)检查log_archive_config

show parameter log_archive_config

DG_CONFIG=(qdtestdb,stddb) 指的是db_unique_name

4)检查log_archive_dest_1,和_2 (主库和备库相反)

show parameter log_archive_dest_1
Show parameter log_archive_dest_2


检查log_archive-dest_state_2

Show parameter log_archive_dest_state

enable-启用,

defer-禁用状态

Show parameter db_file_name_convert

主库参数(备库在前,主库在后)

备库参数(主库在前,备库在后)

Show parameter log_file_name_convert

主库参数(备库在前,主库在后)

备库参数(主库在前,备库在后)

Show parameter standby  (主库和备库都auto)
Show parameter log_archive_format

如果备库与主库格式不一致,在备库执行以下 (需要重启数据库生效)

alter system set log_archive_format=’%t_%s_%r.arc’  scope=spfile;
show parameter memor (主库和备库都检查,如果不一致需修改)
Alter system set memory_target=6741085388 scope=spfile;
alter system set memory_target=5G scope=spfile;(手动调整内存)


3、使用RMAN Duplicate技术创建物理standby

sqlplus sys/Qdone.123@tnsmaster as sysdba

sqlplus sys/Qdone.123@tnsstandby as sysdba

Select status from v$instance; (查看备库状态是否nomount)

rman target sys/Qdone.123@tnsstandby  (必须显示指定密码,否则后面会报密码错误的提示)

在主库执行

rman target sys/Qdone.123@tnsmaster auxiliary sys/Qdone.123@tnsstandby (也可以一行直接连接)

RMAN> connect auxiliary sys/Qdone.123@tnsmaster  (备库未挂载状态)

RMANduplicate target database for standby from active database nofilenamecheck;


4、添加standby日志

standby日志组:redo日志组+1 (添加4个)

主备库都添加日志组。为了主备切换保持两边一样的配置。

mkdir -p /disk1/oracle/oradata/standbylog/

(这一步根据当前实际情况,可不创建)

standby日志组=日志组+1

主库

alter database add standby logfile group 11 ('/disk1/app/oracle/oradata/qdtestdb/dgredo11.rdo') size 500m;
alter database add standby logfile group 12('/disk1/app/oracle/oradata/qdtestdb/dgredo12.rdo') size 500m;
alter database add standby logfile group 13 ('/disk1/app/oracle/oradata/qdtestdb/dgredo13.rdo') size 500m;
alter database add standby logfile group 14 ('/disk1/app/oracle/oradata/qdtestdb/dgredo14.rdo') size 500m;

备库

alter database add standby logfile group 11 ('/disk1/oracle/oradata/qdtestdb/dgredo11.rdo') size 500m;
alter database add standby logfile group 12 ('/disk1/oracle/oradata/qdtestdb/dgredo12.rdo') size 500m;
alter database add standby logfile group 13 ('/disk1/oracle/oradata/qdtestdb/dgredo13.rdo') size 500m;
alter database add standby logfile group 14 ('/disk1/oracle/oradata/qdtestdb/dgredo14.rdo') size 500m;

如果要重建logfile group 需要把standby_file_management改为手动

alter system set standby_file_management=manual ;

主库备库删除standby redo log日志组

SQL> alter database drop logfile group 7; Database altered. SQL> alter database drop logfile group 8; Database altered. SQL> alter database drop logfile group 9; Database altered.
SQL> alter database drop logfile group 10; Database altered. SQL>
alter system set standby_file_management=auto ;


PLSQL视图:

select * from v$log
Select * from v$standby_log;
SELECT * FROM v$logfile;
select status from v$instance;



5、开启同步 

开启同步:

在备库打开数据库

select status from v$instance;

主备库都要开启

alter database open;

备库如果没有mount 需要再次start mount;

开启redo应用(实时同步)commit

一般执行下面的命令就可以了

alter database recover managed standby database using current logfile disconnect;

开启redo应用(日志切换才会同步)

alter database recover managed standby database disconnect from session;

以下不建议执行

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

停止redo应用同步

alter database recover managed standby database cancel;


6、数据同步测试

select name,open_mode,database_role,protection_mode,protection_level from v$database;
alter database clear logfile group 4;
alter database clear logfile group 5;
alter database clear logfile group 6;
alter database clear logfile group 7;
alter database clear logfile group 8;
alter database clear logfile group 9;
alter database clear logfile group 10;

SELECT t.DATABASE_ROLE,t.PROTECTION_MODE,t.PROTECTION_LEVEL FROM v$database t;


测试项目:

1)创建表空间

create tablespace abc datafile '/disk1/app/oracle/oradata/orcl/abc.dbf' size 50m;

2)创建用户

Create user test identified by test;

Grant dba to test;

3)创建表

Create table abc(id int);

4)增删改表数据

 

如果不生效切换用户

alter system switch logfile;

commit;

查看所有数据文件源

select name from v$datafile;

 




####下一篇会写到DataGuard的相关原理及模式、应用






 










































最后于 3月前 被wangzha编辑 ,原因:
最新回复 (0)
    • 运维开源项目互助社区—致敬开源
      2
        立即登录 立即注册 
返回