暂无图片
暂无图片
19
暂无图片
暂无图片
暂无图片

安装配置DG环境及DG日常运维

原创 西北第二DBA 2020-09-22
5743

首先确定原生产库是否安装Dataguard组件:

SQL> select * from v$option where parameter='Oracle Data Guard';

PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
Oracle Data Guard
TRUE

一、安装前准备工作

1、修改primary和standby主机名,内容如下:

# vi /etc/hosts   //并添加内网IP地址对应的hostname,如下


127.0.0.1           localhost
::1                   localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.8.151 dg-primary
192.168.8.152 dg-standby

2、primary和standby服务器均安装ssh服务:

# yum install -y openssh-clients

3、修改standby数据库的/etc/sysconfig/iptables文件,开通1521端口:

# vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 1521 -j ACCEPT
# service iptables restart

二、standby服务器上安装oracle环境

只安装软件,不安装数据库

1、安装yum:

# ln -sf /media/RHEL_6.4\ x86_64\ Disc\ 1/ rhel

# vi /etc/yum.repos.d/rhel-source.repo
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=file:///root/rhel/
enabled=1
gpgcheck=0
gpgkey=file:///root/rhel/

2、安装oracle必须的包:

(需要提前将pdksh-5.2.14-36.el5.x86_64.rpm包上传至/root/目录下)

# yum -y install gcc-c++*
# yum -y install libaio-devel*
# yum -y install elfutils-libelf-devel*

# cd /root/rhel/Packages
# rpm -ivh compat-libstdc++-33-3.2.3-69.el6.x86_64.rpm

# cd 
# rpm -ivh pdksh*

3、修改内核参数

# vi /etc/sysctl.conf 在文件最后增加:

fs.aio-max-nr = 1048576
fs.file-max = 6553600
kernel.shmall = 8388608
kernel.shmmax = 9663676416
kernel.shmmni = 4096
kernel.sem = 2010 285420 100 142
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586
参考值:
fs.aio-max-nr = 1048576
fs.file-max = 6553600
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586
参数详解
fs.aio-max-nr = 1048576         //同时可以拥有的的异步IO请求数目。1048576 即 1024*1024 也就是 1024K 个。
fs.file-max = 6553600           //系统允许打开的文件数。
kernel.shmall = 2097152         //设置共享内存总页数。这个值太小有可能导致数据库启动报错。
                                  计算公式为:内存(G)*1024*1024*1024/4096,4096为getconf PAGE_SIZE得到分页大小。
kernel.shmmax = 2147483648      //Linux进程可以分配的单独共享内存段的最大值。一般设置为内存总大小的一半。
                                  这个值的设置应该大于SGA_MAX_TARGET或MEMORY_MAX_TARGET的值,
                                  因此对于安装Oracle数据库的系统,shmmax的值应该比内存的二分之一大一些。

kernel.shmmni = 4096            //设置系统级最大共享内存段数量。推荐最小值为4096。
kernel.sem = 250 32000 100 128  //从左到右分别为SEMMSL、SEMMNS、SEMOPM和SEMMNI。
                                  1)SEMMSL:设置每个信号灯组中信号灯最大数量,推荐的最小值是250。
                                             对于系统中存在大量并发连接的系统,推荐将这个值设置为PROCESSES初始化参数加10。
                                            
                                  2)SEMMNS:设置系统中信号灯的最大数量。操作系统在分配信号灯时不会超过LEAST(SEMMNS,SEMMSL*SEMMNI)。
                                             事实上,如果SEMMNS的值超过了SEMMSL*SEMMNI是非法的,因此推荐SEMMNS的值就设置为SEMMSL*SEMMNI。
                                             Oracle推荐SEMMNS的设置不小于32000,假如数据库的PROCESSES参数设置为600,则SEMMNS的设置应为:

                                             SQL> select (600+10)*142 from dual;

                                                 (600+10)*142
                                                 ------------
                                                  86620

                                  3)SEMOPM:设置每次系统调用可以同时执行的最大信号灯操作的数量。
                                             由于一个信号灯组最多拥有SEMMSL个信号灯,因此有推荐将SEMOPM设置为SEMMSL的值。
                                             Oracle验证的10.2和11.1的SEMOPM的配置为100。

                                  4)SEMMNI:设置系统中信号灯组的最大数量。Oracle10g和11g的推荐值为142。

net.ipv4.ip_local_port_range = 1024 65000    //ip_local_port_range表示端口的范围,为指定的内容 
net.core.rmem_default = 262144               //表示接收套接字缓冲区大小的缺省值(以字节为单位)。
net.core.rmem_max = 4194304                  //表示接收套接字缓冲区大小的最大值(以字节为单位)。
net.core.wmem_default = 262144               //表示发送套接字缓冲区大小的缺省值(以字节为单位)。
net.core.wmem_max = 1048586                  //表示发送套接字缓冲区大小的最大值(以字节为单位。

最后输入下面的命令,让内核参数生效:

# /sbin/sysctl -p

sysctl -p 报错解决方法如下:

modprobe bridge
lsmod | grep bridge
sysctl -p

4、修改用户的限制文件

# vi /etc/security/limits.conf 在文件后增加
oracle           soft    nproc           2047
oracle           hard    nproc           16384
oracle           soft    nofile          1024
oracle           hard    nofile          65536
oracle           soft    stack           10240

# vi /etc/pam.d/login 文件,(64位系统时,千万别写成/lib/security/pam_limits.so,否则导致无法登录)增加如下:
session  required  /lib64/security/pam_limits.so
session  required  pam_limits.so

# vi /etc/profile (在unset -f pathmunge下一行)增加如下内容:
if [ $USER = "oracle" ]; then
 if [ $SHELL = "/bin/ksh" ]; then
  ulimit -p 16384
  ulimit -n 65536
 else
  ulimit -u 16384 -n 65536
 fi
fi

5、建立用户组及用户

# groupadd oinstall
# groupadd dba
# useradd -g oinstall -G dba -d /home/oracle oracle
# passwd oracle          //设置oracle密码

6、创建目录及修改权限:

# mkdir -p /home/oracle/app
# mkdir -p /home/oracle/app/oracle
# mkdir -p /home/oracle/app/oracle/product
# mkdir -p /home/oracle/app/oracle/product/11.2.0            //数据库系统安装目录
# mkdir -p /home/oracle/app/oracle/product/11.2.0/dbhome_1
# mkdir -p /home/oracle/backup                         //数据备份目录
# mkdir -p /home/oracle/oraInventory                    //清单目录

# chown -R oracle:oinstall /home/oracle/app
# chown -R oracle:oinstall /home/oracle/backup
# chown -R oracle:oinstall /home/oracle/oraInventory

# chmod -R 775 /home/oracle/app

7、设置并刷新环境变量:

# su - oracle
$ vi /home/oracle/.bash_profile
umask 022
export ORACLE_BASE=/home/oracle/app
export ORACLE_HOME=$ORACLE_BASE/oracle/product/11.2.0/dbhome_1
export ORACLE_SID=xtwl
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib

$ source ~/.bash_profile

8、解压安装包:

# yum install -y unzip
# su - oracle
$ unzip linux.x64_11gR2_database_1of2.zip
$ unzip linux.x64_11gR2_database_2of2.zip

9、修改安装应答文件

$ cp -R /home/oracle/database/response /home/oracle         //复制一份模板
$ cd /home/oracle/response
$ vi db_install.rsp 

修改db_install.rsp文件如下:

ORACLE_HOSTNAME=dg-standby    //通过hostname命令获取
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/home/oracle/oraInventory
SELECTED_LANGUAGES=en,zh_CN
ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_1
ORACLE_BASE=/home/oracle/app
oracle.install.db.InstallEdition=EE
oracle.install.db.isCustomInstall=true
oracle.install.db.customComponents=oracle.server:11.2.0.1.0,oracle.sysman.ccr:10.2.7.0.0,oracle.xdk:11.2.0.1.0,oracle.rdbms.oci:11.2.0.1.0,oracle.network:11.2.0.1.0,oracle.network.listener:11.2.0.1.0,oracle.rdbms:11.2.0.1.0,oracle.options:11.2.0.1.0,oracle.rdbms.partitioning:11.2.0.1.0,oracle.oraolap:11.2.0.1.0,oracle.rdbms.dm:11.2.0.1.0,oracle.rdbms.dv:11.2.0.1.0,orcle.rdbms.lbac:11.2.0.1.0,oracle.rdbms.rat:11.2.0.1.0
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=oinstall
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE
oracle.install.db.config.starterdb.globalDBName=xtwl
oracle.install.db.config.starterdb.SID=xtwl
oracle.install.db.config.starterdb.characterSet=AL32UTF8
oracle.install.db.config.starterdb.memoryOption=true
oracle.install.db.config.starterdb.memoryLimit=5120
oracle.install.db.config.starterdb.password.ALL=dbadmin1122  //注意修改
oracle.install.db.config.starterdb.control=DB_CONTROL
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false
DECLINE_SECURITY_UPDATES=true   //一定要是true

10、安装oracle软件:

$cd /home/oracle/database
$./runInstaller -silent -responseFile /home/oracle/response/db_install.rsp     //了解安装进度 tail -f /home/oracle/oraInventory/logs/installActions*log

当安装界面出现如下信息的时候

The following configuration scripts need to be executed as the "root" user.
 #!/bin/sh
 #Root scripts to run
/home/oracle/oraInventory/orainstRoot.sh
/home/oracle/app/oracle/product/11.2.0/dbhome_1/root.sh
To execute the configuration scripts:
 1. Open a terminal window
 2. Log in as "root"
 3. Run the scripts
 4. Return to this window and hit "Enter" key to continue
Successfully Setup Software.

在新打开的root登录的窗口中执行下面的脚本

#/home/oracle/oraInventory/orainstRoot.sh
#/home/oracle/app/oracle/product/11.2.0/dbhome_1/root.sh
//执行完上面的脚本后回到安装界面按下Enter键以继续

11、安装监听:

$cd /home/oracle/response
$netca /silent /responsefile /home/oracle/response/netca.rsp

成功运行后,在/home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin目录下生成sqlnet.ora和listener.ora两个文件。

通过 netstat -tlnp 命令,看到
tcp 0 0 0.0.0.0:1521 0.0.0.0:* LISTEN 22494/tnslsnr
说明监听器已经在1521端口上开始工作了

三、primary数据库上操作

1、修改生产库之前未优化的参数:
(1)手动备份spfile文件:

$ cp $ORACLE_HOME/dbs/spfilextwl.ora $ORACLE_HOME/dbs/spfilextwl_bak.ora

(2)修改最大连接数

## 查询当前最大连接数
sql> show parameter processes;
## 修改
sql> alter system set processes=2000 scope = spfile;

(3)禁止回收站功能

SQL> show parameter recyclebin;
SQL> alter system set recyclebin=off scope=spfile;

(4)关闭审计功能:

SQL> show parameter audit;
SQL> alter system set audit_trail=NONE scope=spfile;

(5)修改用户密码用不过期

SQL> select * from dba_profiles s where s.profile='DEFAULT' and resource_name='PASSWORD_LIFE_TIME';
PROFILE          RESOURCE_NAME   RESOURCE
------------------------------ -------------------------------- --------
LIMIT
----------------------------------------
DEFAULT          PASSWORD_LIFE_TIME  PASSWORD
180
SQL> alter profile default limit password_life_time unlimited;
Profile altered.
SQL> select * from dba_profiles s where s.profile='DEFAULT' and resource_name='FAILED_LOGIN_ATTEMPTS';
PROFILE          RESOURCE_NAME   RESOURCE
------------------------------ -------------------------------- --------
LIMIT
----------------------------------------
DEFAULT          FAILED_LOGIN_ATTEMPTS  PASSWORD
10
SQL> alter profile default limit failed_login_attempts unlimited;
Profile altered.

(6)设置控制文件有效时间!

SQL> alter system set control_file_record_keep_time=45 scope=spfile;

System altered.

2、设置数据库为自动内存管理模式:

(1)修改数据库为自动内存管理模式:

SQL> alter system set memory_target=10240M scope=spfile;        //物理内存的60%左右。
System altered.

SQL> alter system set memory_max_target=10240M scope=spfile;    //物理内存的60%左右。
System altered.

SQL> alter system set sga_target=0 scope=spfile;
System altered.

SQL> alter system set sga_max_size=7168M scope=spfile;          //实例内存的70%左右,即memory_max_target*70%,也即物理内存*60%*70%。
System altered.

SQL> alter system set pga_aggregate_target=0 scope=spfile;
System altered.

SQL> alter system set pre_page_sga=FALSE scope=spfile;
System altered.

(2)重启数据库:

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup;
ORACLE instance started.

Total System Global Area 2254802944 bytes
Fixed Size      2215344 bytes
Variable Size   1073742416 bytes
Database Buffers  1174405120 bytes
Redo Buffers      4440064 bytes
Database mounted.
Database opened.
## 如果/dev/shm大小设置不足,重启会出现以下报错:
SQL> startup;
ORA-00845: MEMORY_TARGET not supported on this system

解决方式如下:

(1)查看并修改/dev/shm的大小:
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              26G   13G   12G  51% /
tmpfs                 1.9G   76K  1.9G   1% /dev/shm
/dev/sda1             194M   32M  152M  18% /boot
/dev/sr0              3.5G  3.5G     0 100% /media/RHEL_6.4 x86_64 Disc 1

# vi /etc/fstab
tmpfs                   /dev/shm                tmpfs   defaults,size=3072M        0 0


(2)重新挂载/dev/shm:
# mount -o remount /dev/shm

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              26G   13G   12G  51% /
tmpfs                 3.0G   76K  3.0G   1% /dev/shm
/dev/sda1             194M   32M  152M  18% /boot
/dev/sr0              3.5G  3.5G     0 100% /media/RHEL_6.4 x86_64 Disc 1

)


(3)查看各个内存参数设置:
SQL>  show parameter sga;

NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
lock_sga        boolean  FALSE
pre_page_sga        boolean  FALSE
sga_max_size        big integer 7G
sga_target        big integer 0
SQL> show parameter pga;

NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target       big integer 0
SQL> show parameter memory;

NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address      integer  0
memory_max_target       big integer 10G
memory_target        big integer 10G
shared_memory_address       integer  0

3、修改redo log组以及大小:

(1)创建redo日志存放目录:

$ mkdir -p /home/oracle/app/oradata/xtwllog/
$ chmod 750 /home/oracle/app/oradata/xtwllog/

(2)查询日志信息:

SQL> select group#,bytes/1024/1024,status from v$log;

    GROUP# BYTES/1024/1024 STATUS
---------- --------------- ----------------
     1        50 ACTIVE
     2        50 CURRENT
     3        50 ACTIVE

(3)查询日志目录:

SQL> select * from v$logfile order by group#;

    GROUP# STATUS  TYPE    MEMBER                                         IS_
---------- ------- ------- ------------------------------------------ ----------------
     1       ONLINE  /home/oracle/app/oradata/xtwl/redo01.log                         NO
     2       ONLINE  /home/oracle/app/oradata/xtwl/redo02.log                         NO
     3       ONLINE  /home/oracle/app/oradata/xtwl/redo03.log                         NO

(4)新增两组日志组,每组500M:

SQL> alter database add logfile group 4 '/home/oracle/app/oradata/xtwllog/redo04.log' size 500M;

Database altered.

SQL> alter database add logfile group 5 '/home/oracle/app/oradata/xtwllog/redo05.log' size 500M;

Database altered.

(5)查询4、5两组日志是否成功添加:

SQL> select group#,bytes/1024/1024,status from v$log;

    GROUP# BYTES/1024/1024 STATUS
---------- --------------- ----------------
     1        50 INACTIVE
     2        50 CURRENT
     3        50 INACTIVE
     4           500 UNUSED
     5           500 UNUSED

(6)删除日志组1:

SQL> alter database drop logfile group 1;

Database altered.

(7)删除日志组2报错:

SQL> alter database drop logfile group 2;
alter database drop logfile group 2
*
ERROR at line 1:
ORA-01623: log 2 is current log for instance xtwl (thread 1) - cannot drop
ORA-00312: online log 2 thread 1: '/home/oracle/app/oradata/xtwl/redo02.log'

(8)需要手动切换日志多次,使新建的日志组能够应用:

SQL> alter system switch logfile;

System altered.


SQL> select group#,bytes/1024/1024,status from v$log;

    GROUP# BYTES/1024/1024 STATUS
---------- --------------- ----------------
     2        50 ACTIVE
     3        50 INACTIVE
     4           500 CURRENT
     5           500 UNUSED

SQL> alter system switch logfile;

System altered.

SQL> select group#,bytes/1024/1024,status from v$log;

    GROUP# BYTES/1024/1024 STATUS
---------- --------------- ----------------
     2        50 ACTIVE
     3        50 INACTIVE
     4           500 ACTIVE
     5           500 CURRENT

(9)使用alter system checkpoint将Active的日志状态置为INACTIVE:

SQL> alter system checkpoint;

System altered.

SQL> select group#,bytes/1024/1024,status from v$log;

    GROUP# BYTES/1024/1024 STATUS
---------- --------------- ----------------
     2        50 INACTIVE
     3        50 INACTIVE
     4           500 INACTIVE
     5           500 CURRENT

(10)删除原2,3日志组:

SQL> alter database drop logfile group 2;

Database altered.

SQL> alter database drop logfile group 3;

Database altered.

(11)新增1,2,3日志组,每组500M:

SQL> alter database add logfile group 1 '/home/oracle/app/oradata/xtwllog/redo01.log' size 500M;

Database altered.

SQL> alter database add logfile group 2 '/home/oracle/app/oradata/xtwllog/redo02.log' size 500M;

Database altered.

SQL> alter database add logfile group 3 '/home/oracle/app/oradata/xtwllog/redo03.log' size 500M;

Database altered.

SQL> SELECT group#, members, bytes/1024/1024 byte_mb, status FROM v$log;


    GROUP#    MEMBERS     BYTE_MB STATUS
---------- ---------- ---------- ----------------
     1        1         500 UNUSED
     2        1         500 UNUSED
     3        1         500 UNUSED
     4        1         500 INACTIVE
     5        1         500 CURRENT

(12)多次执行切换日志操作,使新建的日志组都能正常应用:

SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

SQL> SELECT group#, members, bytes/1024/1024 byte_mb, status FROM v$log;

    GROUP#    MEMBERS     BYTE_MB STATUS
---------- ---------- ---------- ----------------
     1        1         500 ACTIVE
     2        1         500 ACTIVE
     3        1         500 CURRENT
     4        1         500 INACTIVE
     5        1         500 ACTIVE


SQL> select * from v$logfile order by group#;
    GROUP# STATUS  TYPE    MEMBER                                         IS_
---------- ------- ------- ------------------------------------------ ----------------
  1    ONLINE  /home/oracle/app/oradata/xtwllog/redo01.log             NO
  2    ONLINE  /home/oracle/app/oradata/xtwllog/redo02.log             NO
  3    ONLINE  /home/oracle/app/oradata/xtwllog/redo03.log             NO
  4    ONLINE  /home/oracle/app/oradata/xtwllog/redo04.log             NO
  5    ONLINE  /home/oracle/app/oradata/xtwllog/redo05.log             NO
 

(13)删除原redo日志文件,释放磁盘空间:

$ rm /home/oracle/app/oradata/xtwl/redo0*.log

4、修改primary数据库为force logging模式:

SQL> alter database force logging;
Database altered.
SQL> select force_logging from v$database;
FOR
---
YES

5、修改primary数据库为归档模式:

$ mkdir -p /home/oracle/app/archlog    //在primary和standby数据库均需要创建归档目录
$ sqlplus / as sysdba
SQL> archive log list;                         //显示是否归档
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;          //修改为归档模式
SQL> alter database open;
SQL> archive log list;                          //重启后归档模式修改成功
//此阶段需要重启,让以上修改的参数生效,时间1分钟。

6、停止数据库,并备份pfile文件,以便修改参数:

SQL> shutdown immediate;
SQL> create pfile from spfile;         
SQL> exit;
$ cp $ORACLE_HOME/dbs/initxtwl.ora $ORACLE_HOME/dbs/initxtwl_bak.ora

修改初始化文件参数如下,添加以下内容:

$ vi $ORACLE_HOME/dbs/initxtwl.ora
*.db_name='xtwl'
*.db_unique_name='xtwlpri'
*.log_archive_format='xtwldb_%t_%s_%r.log'
*.log_archive_config='DG_CONFIG=(xtwlpri,xtwlstd)'
*.log_archive_dest_1='LOCATION=/home/oracle/app/archlog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=xtwlpri'
*.log_archive_dest_2='SERVICE=xtwl_std LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=xtwlstd'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.fal_server='xtwl_std'
*.fal_client='xtwl_pri'
*.db_file_name_convert='/home/oracle/app/oradata/xtwl/','/home/oracle/app/oradata/xtwl/'
*.log_file_name_convert='/home/oracle/app/oradata/xtwllog/','/home/oracle/app/oradata/xtwllog/'
*.standby_file_management='AUTO'

7、修改listener.ora文件如下,注册静态监听:

vi $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER = 
  (SID_LIST = 
    (SID_DESC = 
      (SID_NAME = PLSExtProc) 
      (ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/dbhome_1) 
      (PROGRAM = extproc) 
    ) 
 
    (SID_DESC = 
      (GLOBAL_DBNAME = xtwl) 
      (ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/dbhome_1) 
      (SID_NAME = xtwl) 
     ) 
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = dg-primary)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = /home/oracle/app

8、配置tnsnames.ora文件如下:

$ vi $ORACLE_HOME/network/admin/tnsnames.ora
XTWL_PRI =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dg-primary)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = xtwl)
    )
  )

XTWL_STD =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dg-standby)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = xtwl)
    )
  )

9、重启监听服务:

$ lsnrctl stop
$ lsnrctl start
$ lsnrctl status

10、由修改的pfile文件重建spfile文件,并启动数据库:

$ sqlplus / as sysdba
SQL> create spfile from pfile;
File created.
SQL> startup;
ORACLE instance started.
Total System Global Area 1603411968 bytes
Fixed Size      2213776 bytes
Variable Size    452986992 bytes
Database Buffers  1140850688 bytes
Redo Buffers      7360512 bytes
Database mounted.
Database opened.

第4~9步需要重启数据库。

11、将primary的数据文件、参数文件、密码文件等拷贝至standby数据库:

$ cd $ORACLE_BASE
$ scp -r admin/ fast_recovery_area/ oradata/ oracle@dg-standby:$ORACLE_BASE     //拷贝数据文件等,diag/目录不用拷贝

$ cd $ORACLE_HOME/dbs
$ scp initxtwl.ora orapwxtwl oracle@linux-dg2:$ORACLE_HOME/dbs/                 //拷贝参数文件、密码文件

四、standby数据库上操作

1、修改初始化参数文件如下:

$ vi $ORACLE_HOME/dbs/initxtwl.ora
*.db_name='xtwl'
*.db_unique_name='xtwlstd'
*.log_archive_format='xtwldb_%t_%s_%r.log'
*.log_archive_config='DG_CONFIG=(xtwlstd,xtwlpri)'
*.log_archive_dest_1='LOCATION=/home/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=xtwlstd'
*.log_archive_dest_2='SERVICE=xtwl_pri LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=xtwlpri'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.fal_server='xtwl_pri'
*.fal_client='xtwl_std'
*.db_file_name_convert='/home/oracle/app/oradata/xtwl/','/home/oracle/app/oradata/xtwl/'
*.log_file_name_convert='/home/oracle/app/oradata/xtwl/','/home/oracle/app/oradata/xtwl/'
*.standby_file_management='AUTO'

2、配置listener.ora文件如下:

$ vi $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER = 
  (SID_LIST = 
    (SID_DESC = 
      (SID_NAME = PLSExtProc) 
      (ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/dbhome_1) 
      (PROGRAM = extproc) 
    ) 
 
    (SID_DESC = 
      (GLOBAL_DBNAME = xtwl) 
      (ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/dbhome_1) 
      (SID_NAME = xtwl) 
     ) 
   )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = dg-standby)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = /home/oracle/app

3、配置tnsnames.ora文件如下:

XTWL_PRI =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dg-primary)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = xtwl)
    )
  )

XTWL_STD =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dg-standby)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = xtwl)
    )
  )

4、重启并查看监听:

$ lsnrctl stop
$ lsnrctl start
$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 22-JAN-2016 15:55:05
Copyright (c) 1991, 2009, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                22-JAN-2016 15:15:47
Uptime                    0 days 0 hr. 39 min. 17 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File         /home/oracle/app/diag/tnslsnr/dg-standby/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dg-standby)(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "xtwl" has 1 instance(s).
  Instance "xtwl", status UNKNOWN, has 1 handler(s) for this service...
 

5、由修改的pfile文件重建spfile文件,并启动数据库到nomount状态:

SQL> create spfile from pfile;
File created.
SQL> startup nomount;
ORACLE instance started.

Total System Global Area 1603411968 bytes
Fixed Size      2213776 bytes
Variable Size    738199664 bytes
Database Buffers   855638016 bytes
Redo Buffers      7360512 bytes

6、检测主备库上的tns是否都能ping通:

$ tnsping xtwl_pri

TNS Ping Utility for Linux: Version 11.2.0.3.0 - Production on 04-FEB-2016 14:13:05
Copyright (c) 1997, 2011, Oracle.  All rights reserved.
Used parameter files:
/home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = dg-primary)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = xtwl)))
OK (10 msec)


$ tnsping xtwl_std

TNS Ping Utility for Linux: Version 11.2.0.3.0 - Production on 04-FEB-2016 14:13:10
Copyright (c) 1997, 2011, Oracle.  All rights reserved.
Used parameter files:
/home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = dg-primary)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = xtwl)))
OK (0 msec)

7、通过rman duplicate创建备库:

$ rman target sys/dbadmin1122@xtwl_pri auxiliary sys/dbadmin1122@xtwl_std nocatalog
Recovery Manager: Release 11.2.0.1.0 - Production on Mon Jan 25 15:39:37 2016

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

connected to target database: XTWL (DBID=11425320)
using target database control file instead of recovery catalog
connected to auxiliary database: XTWL (not mounted)

RMAN> duplicate target database for standby from active database nofilenamecheck;
...
...(日志信息)
Finished Duplicate Db at 25-JAN-16

在primary和standby数据库均新建standby日志如下:

$ sqlplus / as sysdba
SQL> alter database add standby logfile group 6 ('/home/oracle/app/oradata/xtwllog/stdredo01.log') size 500M;
SQL> alter database add standby logfile group 7 ('/home/oracle/app/oradata/xtwllog/stdredo02.log') size 500M;
SQL> alter database add standby logfile group 8 ('/home/oracle/app/oradata/xtwllog/stdredo03.log') size 500M;
SQL> alter database add standby logfile group 9 ('/home/oracle/app/oradata/xtwllog/stdredo04.log') size 500M;
SQL> alter database add standby logfile group 10 ('/home/oracle/app/oradata/xtwllog/stdredo05.log') size 500M;
SQL> alter database add standby logfile group 11 ('/home/oracle/app/oradata/xtwllog/stdredo06.log') size 500M;
SQL> select group#,thread#,sequence#,archived,status from v$standby_log;
    GROUP#    THREAD#  SEQUENCE# ARC STATUS
---------- ---------- ---------- --- ----------
  4     0        0 YES UNASSIGNED
  5     0        0 YES UNASSIGNED
  6     0        0 YES UNASSIGNED
  7     0        0 YES UNASSIGNED
 

8、为standby数据库启动日志实时应用:

SQL> shutdown immediate;
SQL> startup;
ORACLE instance started.
Total System Global Area 1603411968 bytes
Fixed Size      2213776 bytes
Variable Size    469764208 bytes
Database Buffers  1124073472 bytes
Redo Buffers      7360512 bytes
Database mounted.
Database opened.
SQL>  select name,database_role,open_mode from v$database;
NAME   DATABASE_ROLE    OPEN_MODE
--------- ---------------- --------------------
XTWL   PHYSICAL STANDBY READ ONLY
SQL> alter database recover managed standby database using current logfile disconnect;
Database altered.
SQL> select name,database_role,open_mode from v$database;
NAME   DATABASE_ROLE    OPEN_MODE
--------- ---------------- --------------------
XTWL   PHYSICAL STANDBY READ ONLY WITH APPLY

9、修改生产环境上的dblink创建问题,因为用已知的创建方式备库的dblink会出现问题:

(1)新增primary的tnsnames.ora文件内容如下:

$ vi $ORACLE_HOME/network/admin/tnsnames.ora
XTWLLINK =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dg-primary)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = xtwl)
    )
  )
 

(2)新增standby的tnsnames.ora文件内容如下:

$ vi $ORACLE_HOME/network/admin/tnsnames.ora
XTWLLINK =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dg-standby)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = xtwl)
    )
  ) 

(3)在primary数据库上重建各用户的dblink:

$ sqlplus /nolog
SQL>conn xfjy_pay/123

SQL>drop database link VERSIONDBL;
SQL>create database link VERSIONDBL connect to xtwl_version identified by "123" using 'XTWLLINK';

SQL>conn xtwl_version/123

SQL>drop database link PAYDBL;
SQL>create database link PAYDBL connect to xfjy_pay identified by "123" using 'XTWLLINK';

查看备库的dba_db_links表是否同步修改。


SQL>select sequence#,applied from v$archived_log order by sequence#;

至此,备库配置基本完成!

五、配置rman数据库及归档备份,以及归档日志定期清理问题

篇幅较大,略

六、DG主备库创建备份导出目录:

(1)primary和standby库分别创建导出目录:

# su - oracle
$ mkdir -p /home/oracle/back

(2)primary和standby库分别查询已经创建的directory:

SQL> select * from all_directories;

OWNER          DIRECTORY_NAME        DIRECTORY_PATH
------------------------------ ------------------------------ -------------------
SYS          ORACLE_OCM_CONFIG_DIR       /home/oracle/app/oracle/product/11.2.0/dbhome_1/ccr/state
SYS          DATA_PUMP_DIR        /home/oracle/app/admin/xtwl/dpdump/
SYS          XMLDIR         /home/oracle/app/oracle/product/11.2.0/dbhome_1/rdbms/xml

(3)primary库创建directory:

SQL> create or replace directory DATA_DUMP as '/home/oracle/back';
Directory created.

SQL> select * from all_directories;
SYS          ORACLE_OCM_CONFIG_DIR       /home/oracle/app/oracle/product/11.2.0/dbhome_1/ccr/state
SYS          DATA_PUMP_DIR        /home/oracle/app/admin/xtwl/dpdump/
SYS          XMLDIR         /home/oracle/app/oracle/product/11.2.0/dbhome_1/rdbms/xml
SYS          DATA_DUMP        /home/oracle/back

(4)primary库赋予用户导出目录的读写权限:

SQL> grant read,write on directory DATA_DUMP to xtwl_version,xfjy_pay;
Grant succeeded.

(5)查询standby库同步导出目录创建的情况:

SQL> select * from all_directories;
SYS          ORACLE_OCM_CONFIG_DIR       /home/oracle/app/oracle/product/11.2.0/dbhome_1/ccr/state
SYS          DATA_PUMP_DIR        /home/oracle/app/admin/xtwl/dpdump/
SYS          XMLDIR         /home/oracle/app/oracle/product/11.2.0/dbhome_1/rdbms/xml
SYS          DATA_DUMP        /home/oracle/back

SQL> select * from dba_tab_privs where TABLE_NAME ='DATA_DUMP';

GRANTEE          OWNER         TABLE_NAME       GRANTOR       PRIVILEGE         GRA HIE
------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------------------------------------- --- ---
XFJY_PAY         SYS         DATA_DUMP        SYS       WRITE         NO  NO
XTWL_VERSION         SYS         DATA_DUMP        SYS       WRITE         NO  NO
XFJY_PAY         SYS         DATA_DUMP        SYS       READ         NO  NO
XTWL_VERSION         SYS         DATA_DUMP        SYS       READ 

至此,DG主备创建导出目录成功!

七、DG主备库开启flashback:

篇幅较大,略

八、Active dataguard的相关维护操作:

1、安装配置以及以后的维护过程中需要经常检查alert文件,以便纠错:

$ vi /home/oracle/app/diag/rdbms/xtwlpri/xtwl/trace/alert_xtwl.log

2、相关视图查看:

(1)查看进程活动状态:

SQL> select process,client_process,sequence#,status from v$managed_standby;               --主要是查看standby数据库   
PROCESS   CLIENT_P  SEQUENCE# STATUS
--------- -------- ---------- ------------
ARCH   ARCH      0 CONNECTED
ARCH   ARCH      0 CONNECTED
ARCH   ARCH     62 CLOSING
ARCH   ARCH     64 CLOSING
RFS   LGWR     65 IDLE
RFS   N/A      0 IDLE
RFS   UNKNOWN     0 IDLE
MRP0   N/A     65 WAIT_FOR_LOG

(2)查看redo应用的情况:

SQL> select dest_name,archived_thread#,archived_seq#,applied_thread#,applied_seq#,db_unique_name from v$archive_dest_status where status='VALID';
DEST_NAME                          ARCHIVED_THREAD# ARCHIVED_SEQ# APPLIED_THREAD# APPLIED_SEQ# DB_UNIQUE_NAME
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------- ------------- --------------- ------------ ------------------------------
LOG_ARCHIVE_DEST_1                             64        0     0 xtwl2
LOG_ARCHIVE_DEST_2                              0        0     0 xtwl1
STANDBY_ARCHIVE_DEST                             64        1    64 NON

(3)查看归档文件路径及创建信息:

SQL> select name,creator,sequence#,applied,completion_time from v$archived_log;
/home/oracle/arch/xtwldb_1_5_901617788.log                 ARCH     5 YES       20-JAN-16
/home/oracle/arch/xtwldb_1_6_901617788.log                 ARCH     6 YES       20-JAN-16
/home/oracle/arch/xtwldb_1_8_901617788.log                 ARCH     8 YES       20-JAN-16
/home/oracle/arch/xtwldb_1_7_901617788.log                 ARCH     7 YES       20-JAN-16

(4)查看standby中所有被应用的归档文件信息:

SQL> select first_time,first_change#,next_change#,sequence# from v$log_history;
20-JAN-16  945184       949892       1
20-JAN-16  949892       958347       2
20-JAN-16  958347       973030       3
20-JAN-16  973030       990566       4
20-JAN-16  990566       993090       5

(5)查看数据库角色,保护模式,保护级别,switchover状态:

SQL> select database_role,db_unique_name,open_mode,protection_mode,protection_level,switchover_status from v$database;
PRIMARY   xtwl1    READ WRITE
MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE  TO STANDBY
SQL> select database_role,db_unique_name,open_mode,protection_mode,protection_level,switchover_status from v$database;
PHYSICAL STANDBY xtwl2    READ ONLY WITH APPLY MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE  NOT ALLOWED

(6)查看是否启用实时应用: --在primary数据库上查看

SQL> select recovery_mode from v$archive_dest_status where dest_id=2;
RECOVERY_MODE
-----------------------
MANAGED REAL TIME APPLY

(7)查看dataguard应用情况:

SQL> select message from v$dataguard_status;
MESSAGE
--------------------------------------------------------------------------------
ARC0: Archival started
ARC1: Archival started
ARC2: Archival started
ARC2: Becoming the 'no FAL' ARCH
ARC2: Becoming the 'no SRL' ARCH
ARC1: Becoming the heartbeat ARCH
ARC3: Archival started
Error 12514 received logging on to the standby
Error 12514 for archive log file 3 to 'xtwldg'
LGWR: Failed to archive log 3 thread 1 sequence 69 (12514)
ARC0: Beginning to archive thread 1 sequence 68 (1103936-1104050)

3、Active Dataguard三种模式的切换:

SQL> select database_role,protection_mode,protection_level from v$database;
DATABASE_ROLE  PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY   MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE
//当前为最高性能模式,事务提交时只用写到primary的online redo log,primary数据库几乎不受影响,主备库有时间延时(通常最小可降到0~几秒),推荐方式!
SQL> alter database set standby database to maximize availability;
Database altered.
SQL> select database_role,protection_mode,protection_level from v$database; 
DATABASE_ROLE  PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY   MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY
//介于最高性能和最大保护模式之间,切换为最高可用性模式后,一旦standby出现故障,就切换成最高可用性模式,primary数据库不会shutdown。
SQL> alter database set standby database to maximize protection; 
Database altered.
SQL> select database_role,protection_mode,protection_level from v$database;
DATABASE_ROLE  PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY   MAXIMUM PROTECTION   MAXIMUM PROTECTION
//切换为最大保护模式,最大限度地保护数据不丢失,即至少有一个standby和primary保持实时同步,当一个事物提交时,不但要写到primary数据库的online redo log,
还要写到至少一个standby的standby redo log,这样做会造成standby出现故障或者网络出现故障时,导致日志无法同步时,primary数据库会shutdown,这在生产上一般不被接受。

4、primary和standby之间的角色转化:
(1)登录primary数据库,检查switchover状态:

$ sqlplus / as sysdba
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO STANDBY

(2)启动switchover,将primary转换为standby角色:

SQL> alter database commit to switchover to physical standby;
Database altered.

(3)将原primary数据库重启到mount状态:

SQL> shutdown immediate;
ORA-01507: database not mounted
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 1603411968 bytes
Fixed Size      2213776 bytes
Variable Size    939526256 bytes
Database Buffers   654311424 bytes
Redo Buffers      7360512 bytes
Database mounted.

(4)登录原standby数据库,检查switchover状态:

SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO PRIMARY

(5)启动switchover,将standby转换为primary角色,打开新的primary数据库:

SQL> alter database commit to switchover to primary;
Database altered.
SQL> alter database open;
Database altered.

(6)启动原primary数据库,现standby数据库的redo应用:

SQL> startup force;
SQL> alter database recover managed standby database using current logfile disconnect;
Database altered.

(7)检查新的primary,standby数据库的状态:

SQL> select name,database_role from v$database; --primary库
NAME   DATABASE_ROLE
--------- ----------------
XTWL   PRIMARY
SQL> select name,database_role from v$database; --standby库
NAME   DATABASE_ROLE
--------- ----------------
XTWL   PHYSICAL STANDBY

5、物理standby的failover(Primary数据库可能瘫痪的情况下):

重要!!!

(1)检查归档文件是否连续:

SQL> select thread#,low_sequence#,high_sequence# from v$archive_gap;

no rows selected

(2)如果有返回行,将需要的归档日志文件复制到备库的相应目录下。

(3)必须确保所有已生成的归档文件处于standby服务器,并且需要加入到数据字典,命令如下:

SQL> alter database register physical logfile '/home/oracle/arch/xtwldb_1_9_902236329.log';

(4)检查主备库的归档文件是否完整:

SQL> select distinct thread#,max(sequence#) over(partition by thread#) from v$archived_log;

   THREAD# MAX(SEQUENCE#)OVER(PARTITIONBYTHREAD#)
---------- --------------------------------------
  1          101

(5)原standby数据库切换为primary数据库:

SQL> alter database recover managed standby database finish force;
Database altered.

SQL> alter database commit to switch to primary;
Database altered.

(6)打开新的primary数据库:
如果当前数据库是mount状态,直接alter database open即可;
如果当前数据库是read-only状态,先shutdown immediate,再startup。

参考 : 《Oracle配置Dataguard》

最后修改时间:2020-09-22 09:36:16
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论