环境描述
(仅限个人学习交流使用,未涉及任何企商业务)
Primary: Standby1: Standby2:
IP:192.1678.66.51 IP:192.1678.66.52 IP:192.1678.66.53
SID:orcl SID:orcl SID:orcl
db_unique_name:orcl1 db_unique_name:orcl2 db_unique_name:orcl3
global_name:orcl global_name:orcl global_name:orcl
instance建立完成 仅Oracle软件 仅Oracle软件
[主库]参数文件更改:
SQL> ALTER PROFILE "DEFAULT" LIMIT
FAILED_LOGIN_ATTEMPTS UNLIMITED
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_LOCK_TIME UNLIMITED
PASSWORD_GRACE_TIME UNLIMITED;
[主库]查看并增加online log日志文件:
SQL> SET LINESIZE 300;
COL MEMBER FORMAT A64;
SELECT A.GROUP#, A.BYTES/1024/1024 AS SIZE_MB, A.STATUS, B.TYPE, B.MEMBER FROM V$LOG A, V$LOGFILE B WHERE A.GROUP# = B.GROUP# ORDER BY A.GROUP#, B.MEMBER;
GROUP# SIZE_MB STATUS TYPE MEMBER
---------- ---------- ---------------- ------- ------------------------------------
1 200 INACTIVE ONLINE /data/oradata/ORCL/redo01.log
2 200 INACTIVE ONLINE /data/oradata/ORCL/redo02.log
3 200 CURRENT ONLINE /data/oradata/ORCL/redo03.log
[主库]增加online log日志组:
SQL> alter database add logfile group 4 ('/data/oradata/ORCL/redo04a.log', '/data/oradata/ORCL/redo04b.log') size 50M;
SQL> alter database add logfile group 5 ('/data/oradata/ORCL/redo05a.log', '/data/oradata/ORCL/redo05b.log') size 50M;
SQL> alter database add logfile group 6 ('/data/oradata/ORCL/redo06a.log', '/data/oradata/ORCL/redo06b.log') size 50M;
[主库]切换日志(为切换当前组CURRENT状态)
SQL> alter system switch logfile;
[主库]切换日志(切换当前组INACTIVE)
SQL> alter system checkpoint;
[主库]删除原online log组
SQL> alter database drop logfile group 1;
SQL> alter database drop logfile group 2;
SQL> alter database drop logfile group 3;
[主库]增加online log组
SQL> alter database add logfile group 1 ('/data/oradata/ORCL/redo01a.log', '/data/oradata/ORCL/redo01b.log') size 50M;
SQL> alter database add logfile group 2 ('/data/oradata/ORCL/redo02a.log', '/data/oradata/ORCL/redo02b.log') size 50M;
SQL> alter database add logfile group 3 ('/data/oradata/ORCL/redo03a.log', '/data/oradata/ORCL/redo03b.log') size 50M;
验证:
SQL> select a.group#, a.bytes/1024/1024 as size_mb, a.status, b.type, b.member from v$log a, v$logfile b where a.group# = b.group# order by a.group#, b.member;
GROUP# SIZE_MB STATUS TYPE MEMBER
---------- ---------- ---------------- ------- ----------------------------------------------------------------
1 50 UNUSED ONLINE /data/oradata/ORCL/redo01a.log
1 50 UNUSED ONLINE /data/oradata/ORCL/redo01b.log
2 50 UNUSED ONLINE /data/oradata/ORCL/redo02a.log
2 50 UNUSED ONLINE /data/oradata/ORCL/redo02b.log
3 50 UNUSED ONLINE /data/oradata/ORCL/redo03a.log
3 50 UNUSED ONLINE /data/oradata/ORCL/redo03b.log
4 50 CURRENT ONLINE /data/oradata/ORCL/redo04a.log
4 50 CURRENT ONLINE /data/oradata/ORCL/redo04b.log
5 50 UNUSED ONLINE /data/oradata/ORCL/redo05a.log
5 50 UNUSED ONLINE /data/oradata/ORCL/redo05b.log
6 50 UNUSED ONLINE /data/oradata/ORCL/redo06a.log
6 50 UNUSED ONLINE /data/oradata/ORCL/redo06b.log
[主库]查看并开启归档模式
SQL> select force_logging,log_mode,flashback_on from v$database;
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database force logging;
SQL> alter database archivelog;
SQL> alter database open;
验证:
SQL> select force_logging,log_mode,flashback_on from v$database;
FORCE_LOGGING LOG_MODE FLASHBACK_ON
--------------------------------------- ------------ ------------------
YES ARCHIVELOG NO
[主库]修改参数文件
SQL> alter system set INSTANCE_NAME='orcl' scope=spfile;
SQL> alter system set DB_UNIQUE_NAME='orcl1' scope=spfile;
SQL> alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl1,orcl2,orcl3)' scope=both;
SQL> alter system set LOG_ARCHIVE_DEST_1='LOCATION=/data/archlog/orcl valid_for=(all_logfiles,all_roles) db_unique_name=orcl1' scope=spfile;
SQL> alter system set LOG_ARCHIVE_DEST_2='SERVICE=orcl2 lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=orcl2' scope=both;
SQL> alter system set LOG_ARCHIVE_DEST_3='SERVICE=orcl3 lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=orcl3' scope=both;
SQL> alter system set LOG_ARCHIVE_FORMAT='ARC_%T_%S_%R.arc' scope=spfile;
SQL> alter system set LOG_ARCHIVE_MAX_PROCESSES=5 scope=both;
SQL> alter system set FAL_CLIENT=orcl1 scope=both;
SQL> alter system set FAL_SERVER=orcl2,orcl3 scope=both;
SQL> alter system set STANDBY_FILE_MANAGEMENT=AUTO scope=both;
SQL> alter system set log_archive_dest_state_2=defer scope=both;
SQL> alter system set log_archive_dest_state_3=defer scope=both;
因为涉及到spfile的修改,所以应该重启数据库
SQL> shutdown immediate;
SQL> startup;
SQL> create pfile from spfile;
[主库]修改并配置listener.ora监听文件
编辑文件与netmgr配置的并无区别
# listener.ora Network Configuration File: /u01/app/oracle/product/19.3.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl1)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/db_1)
(SID_NAME = orcl1)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.51)(PORT = 1521))
)
ADR_BASE_LISTENER = /u01/app/oracle
[主库]修改并配置tnsnames.ora文件
LOCAL_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.51)(PORT = 1521))
ORCL1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.51)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
ORCL2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.52)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
ORCL3 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.53)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
[主库]查询并配置standby redolog
SQL> set linesize 300;
SQL> col member format a64;
SQL> select a.group#, a.bytes/1024/1024 as size_mb, a.status, b.type, b.member from v$standby_log a, v$logfile b where a.group# = b.group# order by a.group#, b.member;
alter database add standby logfile group 7 ('/data/oradata/ORCL/standby_redo07a.log','/data/oradata/ORCL/standby_redo07b.log') size 50M;
alter database add standby logfile group 8 ('/data/oradata/ORCL/standby_redo08a.log','/data/oradata/ORCL/standby_redo08b.log') size 50M;
alter database add standby logfile group 9 ('/data/oradata/ORCL/standby_redo09a.log','/data/oradata/ORCL/standby_redo09b.log') size 50M;
alter database add standby logfile group 10 ('/data/oradata/ORCL/standby_redo10a.log','/data/oradata/ORCL/standby_redo10b.log') size 50M;
alter database add standby logfile group 11 ('/data/oradata/ORCL/standby_redo11a.log','/data/oradata/ORCL/standby_redo11b.log') size 50M;
alter database add standby logfile group 12 ('/data/oradata/ORCL/standby_redo12a.log','/data/oradata/ORCL/standby_redo12b.log') size 50M;
alter database add standby logfile group 13 ('/data/oradata/ORCL/standby_redo13a.log','/data/oradata/ORCL/standby_redo13b.log') size 50M;
验证:
SQL> select a.group#, a.bytes/1024/1024 as size_mb, a.status, b.type, b.member from v$standby_log a, v$logfile b where a.group# = b.group# order by a.group#, b.member;
GROUP# SIZE_MB STATUS TYPE MEMBER
---------- ---------- ---------- ------- ----------------------------------------
7 50 UNASSIGNED STANDBY /data/oradata/ORCL/standby_redo07a.log
7 50 UNASSIGNED STANDBY /data/oradata/ORCL/standby_redo07b.log
8 50 UNASSIGNED STANDBY /data/oradata/ORCL/standby_redo08a.log
8 50 UNASSIGNED STANDBY /data/oradata/ORCL/standby_redo08b.log
9 50 UNASSIGNED STANDBY /data/oradata/ORCL/standby_redo09a.log
9 50 UNASSIGNED STANDBY /data/oradata/ORCL/standby_redo09b.log
10 50 UNASSIGNED STANDBY /data/oradata/ORCL/standby_redo10a.log
10 50 UNASSIGNED STANDBY /data/oradata/ORCL/standby_redo10b.log
11 50 UNASSIGNED STANDBY /data/oradata/ORCL/standby_redo11a.log
11 50 UNASSIGNED STANDBY /data/oradata/ORCL/standby_redo11b.log
12 50 UNASSIGNED STANDBY /data/oradata/ORCL/standby_redo12a.log
12 50 UNASSIGNED STANDBY /data/oradata/ORCL/standby_redo12b.log
13 50 UNASSIGNED STANDBY /data/oradata/ORCL/standby_redo13a.log
13 50 UNASSIGNED STANDBY /data/oradata/ORCL/standby_redo13b.log
/备库1/
–注意检查.bash_profile
[主库]准备备库参数、密码文件(不要忘记传输密码文件,否则也会导致主备无法同步)
$ cd /data/oradata/ORCL/
SQL> create pfile from spfile;
# scp initorcl.ora orapworcl oracle@192.168.66.52:/u01/app/oracle/product/19.3.0/db_1/dbs/
[备库]建立对应的文件路径
$ mkdir -p /u01/app/oracle/admin/orcl/adump
$ mkdir -p /data/oradata/ORCL/
$ mkdir -p /data/archlog/orcl
[备库]修改pfile配置文件
*.db_name='orcl' --主备保持一致
*.db_unique_name='orcl2'
*.fal_client='ORCL2'
*.fal_server='ORCL1','ORCL3'
*.log_archive_dest_1='LOCATION=/data/archlog/orcl valid_for=(all_logfiles,all_roles) db_unique_name=orcl2'
*.log_archive_dest_2='SERVICE=orcl1 lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=orcl1'
利用此pfile创建spfile
SQL> create spfile from pfile;
[备库]修改并配置listener.ora监听文件
# listener.ora Network Configuration File: /u01/app/oracle/product/19.3.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/db_1)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.52)(PORT = 1521))
)
ADR_BASE_LISTENER = /u01/app/oracle
[备库]修改并配置tnsnames.ora文件
LOCAL_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.52)(PORT = 1521))
ORCL1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.51)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
ORCL2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.52)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
ORCL3 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.53)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
使用tnsping进行测试;
[主库]备份主库数据文件
# mkdir -p /data/rmanbackup
# chown -R oracle:oinstall /data
$ rman target /
RMAN> run{
allocate channel d1 type disk;
allocate channel d2 type disk;
allocate channel d3 type disk;
allocate channel d4 type disk;
backup as compressed backupset full database format '/data/rmanbackup/Full_%U.bak';
sql "alter system archive log current";
backup as compressed backupset filesperset 12 format '/data/rmanbackup/Arch_%d_%T_%s_full.bak' archivelog all;
BACKUP format '/data/rmanbackup/cont_%T_%s' current controlfile;
release channel d1;
release channel d2;
release channel d3;
release channel d4;
}
SCP传输:
# scp /data/rmanbackup/\* oracle@192.168.66.52:/data/rmanbackup
[备库]数据恢复
RMAN> startup nomount
RMAN> restore standby controlfile from '/data/rmanbackup/cont_20230802_99'
RMAN> alter database mount;
RMAN> restore database;
RMAN> recover database;
[备库]配置standby在线日志
$ sqlplus / as sysdba
/*执行restore之后,数据库中有日志组,但是操作系统中并没有实际的日志文件*/
SQL> alter database drop standby logfile group 7 ;
SQL> alter database drop standby logfile group 8 ;
SQL> alter database drop standby logfile group 9 ;
SQL> alter database drop standby logfile group 10;
SQL> alter database drop standby logfile group 11;
SQL> alter database drop standby logfile group 12;
SQL> alter database drop standby logfile group 13;
SQL> alter database add standby logfile group 7 ('/data/oradata/ORCL/standby_redo07a.log','/data/oradata/ORCL/standby_redo07b.log') size 50M;
SQL> alter database add standby logfile group 8 ('/data/oradata/ORCL/standby_redo08a.log','/data/oradata/ORCL/standby_redo08b.log') size 50M;
SQL> alter database add standby logfile group 9 ('/data/oradata/ORCL/standby_redo09a.log','/data/oradata/ORCL/standby_redo09b.log') size 50M;
SQL> alter database add standby logfile group 10 ('/data/oradata/ORCL/standby_redo10a.log','/data/oradata/ORCL/standby_redo10b.log') size 50M;
SQL> alter database add standby logfile group 11 ('/data/oradata/ORCL/standby_redo11a.log','/data/oradata/ORCL/standby_redo11b.log') size 50M;
SQL> alter database add standby logfile group 12 ('/data/oradata/ORCL/standby_redo12a.log','/data/oradata/ORCL/standby_redo12b.log') size 50M;
SQL> alter database add standby logfile group 13 ('/data/oradata/ORCL/standby_redo13a.log','/data/oradata/ORCL/standby_redo13b.log') size 50M;
[主库]开启通道
SQL> alter system set log_archive_dest_state_2=enable scope=both;
[备库]应用日志
SQL> alter database recover managed standby database using current logfile disconnect from session;
SQL> alter database recover managed standby database cancel;
SQL> alter database open;
SQL> alter database recover managed standby database using current logfile disconnect;
/备库2/
–注意检查.bash_profile
[主库]准备备库参数、密码文件(不要忘记传输密码文件,否则也会导致主备无法同步)
$ cd /data/oradata/ORCL/
SQL> create pfile from spfile;
# scp initorcl.ora orapworcl oracle@192.168.66.53:/u01/app/oracle/product/19.3.0/db_1/dbs/
[备库]建立对应的文件路径
$ mkdir -p /u01/app/oracle/admin/orcl/adump
$ mkdir -p /data/oradata/ORCL/
$ mkdir -p /data/archlog/orcl
[备库]修改pfile配置文件
*.db_name='orcl' --主备保持一致
*.db_unique_name='orcl3'
*.fal_client='ORCL3'
*.fal_server='ORCL1','ORCL2'
*.log_archive_dest_1='LOCATION=/data/archlog/orcl valid_for=(all_logfiles,all_roles) db_unique_name=orcl3'
*.log_archive_dest_3='SERVICE=orcl1 lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=orcl1'
利用此pfile创建spfile
SQL> create spfile from pfile;
[备库]修改并配置listener.ora监听文件
# listener.ora Network Configuration File: /u01/app/oracle/product/19.3.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/db_1)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.53)(PORT = 1521))
)
ADR_BASE_LISTENER = /u01/app/oracle
[备库]修改并配置tnsnames.ora文件
LOCAL_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.53)(PORT = 1521))
ORCL1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.51)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
ORCL2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.52)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
ORCL3 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.53)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
使用tnsping进行测试;
[备库]建立备份目录
# mkdir -p /data/rmanbackup
# chown -R oracle:oinstall /data
[主库]备份主库数据文件
$ rman target /
RMAN> run{
allocate channel d1 type disk;
allocate channel d2 type disk;
allocate channel d3 type disk;
allocate channel d4 type disk;
backup as compressed backupset full database format '/data/rmanbackup/Full_%U.bak';
sql "alter system archive log current";
backup as compressed backupset filesperset 12 format '/data/rmanbackup/Arch_%d_%T_%s_full.bak' archivelog all;
BACKUP format '/data/rmanbackup/cont_%T_%s' current controlfile;
release channel d1;
release channel d2;
release channel d3;
release channel d4;
}
SCP传输:
# scp /data/rmanbackup/\* oracle@192.168.66.53:/data/rmanbackup
[备库]数据恢复
RMAN> startup nomount
RMAN> restore standby controlfile from '/data/rmanbackup/cont_20230803_117'
RMAN> alter database mount;
RMAN> restore database;
RMAN> recover database;
[备库]配置standby在线日志
$ sqlplus / as sysdba
/*执行restore之后,数据库中有日志组,但是操作系统中并没有实际的日志文件*/
SQL> alter database drop standby logfile group 7 ;
SQL> alter database drop standby logfile group 8 ;
SQL> alter database drop standby logfile group 9 ;
SQL> alter database drop standby logfile group 10;
SQL> alter database drop standby logfile group 11;
SQL> alter database drop standby logfile group 12;
SQL> alter database drop standby logfile group 13;
SQL> alter database add standby logfile group 7 ('/data/oradata/ORCL/standby_redo07a.log','/data/oradata/ORCL/standby_redo07b.log') size 50M;
SQL> alter database add standby logfile group 8 ('/data/oradata/ORCL/standby_redo08a.log','/data/oradata/ORCL/standby_redo08b.log') size 50M;
SQL> alter database add standby logfile group 9 ('/data/oradata/ORCL/standby_redo09a.log','/data/oradata/ORCL/standby_redo09b.log') size 50M;
SQL> alter database add standby logfile group 10 ('/data/oradata/ORCL/standby_redo10a.log','/data/oradata/ORCL/standby_redo10b.log') size 50M;
SQL> alter database add standby logfile group 11 ('/data/oradata/ORCL/standby_redo11a.log','/data/oradata/ORCL/standby_redo11b.log') size 50M;
SQL> alter database add standby logfile group 12 ('/data/oradata/ORCL/standby_redo12a.log','/data/oradata/ORCL/standby_redo12b.log') size 50M;
SQL> alter database add standby logfile group 13 ('/data/oradata/ORCL/standby_redo13a.log','/data/oradata/ORCL/standby_redo13b.log') size 50M;
[主库]开启通道
SQL> alter system set log_archive_dest_state_3=enable scope=both;
[备库]应用日志
SQL> alter database recover managed standby database using current logfile disconnect from session;
SQL> alter database recover managed standby database cancel;
SQL> alter database open;
SQL> alter database recover managed standby database using current logfile disconnect;