Redo\Undo\ArchivedRedoLog
Oracle的日志(Log)是记载数据库修改信息的数据结构,日志文件是日志记录的汇集。
日志完整记录了数据库所有活动,其中不仅包含有数据的历史记录:新建(Insert)、更新(Update)和删除(Delete),也包含有事务的历史记录:开始(Begin)、提交(Commit)和回滚(Rollback)。
日志有两种类型,重做(Redo)和撤销(Undo)。
撤销日志对应于即时的数据库修改。所有的数据修改操作直接作用在原表上,日志则记录了修改的过程,当要撤销某个操作时,通过把日志中的历史记录写回到原表,就可以撤销该操作,把数据库回退之前的状态。
重做日志则通过推迟数据库的修改,来实现相同的功能。通过把事务的所有实际操作推迟到事务提交后才进行,在事务提交后根据日志记录中对数据库数据的修改信息对数据文件进行写入,从而实现事务的原子性。如果事务在未提交之前发生了故障,则当前事务所做的修改只写到了日志文件中而没有被写到数据文件中,这时数据库恢复子系统会直接忽略日志中的信息,不去修改数据文件。12另一方面,如果在事务提交后发生了故障,可能事务已经执行完成,但是只写了日志文件而没有写数据文件,这时恢复子系统从日志中可以判断那些动作需要重做,然后利用日志中记录的对应信息进行数据文件的重写。
Oracle日志文件组成Oracle的日志系统是基于重做日志的,分为两类:联机日志(OnlineRedoLog)和归档日志(ArchivedRedoLog)。联机日志是每个Oracle数据库必须有的日志,它支持着数据库的正常运作。一旦相关联的数据库发生了变更,那些记录就会被写入联机日志。其中既有变更前的旧数据又有变更后的新数据。联机日志由两个以上的文件组成,它们循环地记录着数据库当前的变更,当一个日志文件写满后,日志管理进程会使用另一个日志文件,直到所有的日志文件都写了一遍后,再重新写第一个文件,开始新的一轮循环。通过配置Oracle数据库,可以使联机日志文件在写满后以归档的形式保存起来,这就是归档日志。在归档日志中通过日志序列号LSN(LogSequenceNumber)来唯一确定每一个联机日志。归档日志记录的是变更记录的历史,联机日志记录的是当前最近的变更记录。通过合理使用这两类的日志文件,可以把Oracle数据库恢复到任何一个历史状态。
Oracle日志系统运行机制Oracle在运行时会把数据文件以块(Block)为单位加载到缓存,所有的操作都发生在缓存中,当操作完毕后再以块的形式写到文件中。Oracle重做日志记录了所有的发生在缓存中的变化,其中包括有数据、索引和回滚段的变更。而且不论这个变更提交与否,都会写重做日志。一个日志实体包含一组变更向量,它们记录了对数据库的原子操作。Oracle的后台进程LGWR(LogWriterProcess)管理着日志的保存。
它每隔三秒或是在遇到事务递交的时候,把在缓存中生成的日志。
#通过v$log视图查询在线日志的总体信息
SQL> SELECT * FROM v$log;
#通过v$logfile视图查询在线日志文件信息:
SQL> SELECT * FROM v$logfile ORDER BY group#;
Alert log files--系统报警日志,Trace files--跟踪日志(用户和进程) ,这里不做介绍。
ip&OS | Hostname | 角色 | sid | DB_UNIQUE_NAME | tns |
---|---|---|---|---|---|
192.168.0.57--centos7 | oracle57 | 主 | orcl | orcl_p | orcl_p |
192.168.0.58--centos7 | oracle58 | 备 | orcl | orcl_s | orcl_s |
主库安装数据库、安装监听、创建数据库实例。 备库安装数据库软件,创建监听,不安装数据库实例。本安装过程只为验证功能,部分参数未进行计算配置。
192.168.0.57静默安装(搭建数据库软件,建立lsnrctl监听,采用dbca搭建实例)
###配置主机名
[root@oracle57 ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.57 oracle57
192.168.0.58 oracle58
[root@oracle57 ~]# hostname
oracle57
###安装依赖包
[root@oracle57 ~]# yum -y install rlwrap binutils compat-libcap1 compat-libstdc++-33 compat-libstdc++-33*i686 compat-libstdc++-33 gcc gcc-c++ glibc glibc*.i686 glibc-devel glibc-devel*.i686 ksh libaio libaio*.i686 libaio-devel libgcc libgcc*.i686 libstdc++ libstdc++*.i686 libstdc++-devel libXi libXi*.i686 libXtst sysstat unixODBC unixODBC*.i686 unixODBC-devel unixODBC-devel*.i686
###添加用户,用于安装与运行数据库
[root@oracle57 ~]# groupadd -g 54321 oinstall
[root@oracle57 ~]# groupadd -g 54322 dba
[root@oracle57 ~]# groupadd -g 54323 oper
[root@oracle57 ~]# useradd -u 54321 -g oinstall -G dba,oper oracle
###修改内核参数,不修改安装验证会失败,kernel.shm*需要计算
[root@oracle57 ~]# vim /etc/sysctl.conf
fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
kernel.panic_on_oops = 1
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
[root@oracle57 ~]# sysctl -p
###配置limit
[root@oracle57 ~]# cat >> /etc/security/limits.conf << EOF
> oracle soft nofile 1024
> oracle hard nofile 65536
> oracle soft nproc 16384
> oracle hard nproc 16384
> oracle soft stack 10240
> oracle hard stack 32768
> oracle hard memlock 134217728
> oracle soft memlock 134217728
> EOF
###创建oracle安装目录
[root@oracle57 ~]# mkdir -p /u01/app/oracle/oradata
[root@oracle57 ~]# chmod -R 775 /u01
[root@oracle57 ~]# chown -R oracle:oinstall /u01
###配置环境变量
[root@oracle57 ~]# vim /etc/profile
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_HOSTNAME=oracle57 #主机名
export ORACLE_UNQNAME=orcl_p
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.2.0.1/db_1
export ORACLE_SID=orcl
export PATH=/usr/sbin:$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
[root@oracle57 ~]# source /etc/profile
### 解压
mv /root/linuxx64_12201_database.zip /u01/
unzip linuxx64_12201_database.zip
chown -R oracle:oinstall /u01/
###配置安装应答文件
[root@oracle57 u01]# cat /u01/database/response/db_install.rsp | egrep -v '^#|^$'
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v12.2.0
oracle.install.option=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/oracle/oraInventory
ORACLE_HOME=/u01/app/oracle/product/12.2.0.1/db_1
ORACLE_BASE=/u01/app/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSOPER_GROUP=oper
oracle.install.db.OSBACKUPDBA_GROUP=dba
oracle.install.db.OSDGDBA_GROUP=dba
oracle.install.db.OSKMDBA_GROUP=dba
oracle.install.db.OSRACDBA_GROUP=dba
oracle.install.db.rac.configurationType=
oracle.install.db.CLUSTER_NODES=
oracle.install.db.isRACOneInstall=
oracle.install.db.racOneServiceName=
oracle.install.db.rac.serverpoolName=
oracle.install.db.rac.serverpoolCardinality=
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE
oracle.install.db.config.starterdb.globalDBName=orcl
oracle.install.db.config.starterdb.SID=orcl
oracle.install.db.ConfigureAsContainerDB=
oracle.install.db.config.PDBName=
oracle.install.db.config.starterdb.characterSet=AL32UTF8
oracle.install.db.config.starterdb.memoryOption=
oracle.install.db.config.starterdb.memoryLimit=
oracle.install.db.config.starterdb.installExampleSchemas=
oracle.install.db.config.starterdb.password.ALL=Orcl43210Soft
oracle.install.db.config.starterdb.password.SYS=
oracle.install.db.config.starterdb.password.SYSTEM=
oracle.install.db.config.starterdb.password.DBSNMP=
oracle.install.db.config.starterdb.password.PDBADMIN=
oracle.install.db.config.starterdb.managementOption=
oracle.install.db.config.starterdb.omsHost=
oracle.install.db.config.starterdb.omsPort=
oracle.install.db.config.starterdb.emAdminUser=
oracle.install.db.config.starterdb.emAdminPassword=
oracle.install.db.config.starterdb.enableRecovery=
oracle.install.db.config.starterdb.storageType=
oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=
oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=
oracle.install.db.config.asm.diskGroup=
oracle.install.db.config.asm.ASMSNMPPassword=
MYORACLESUPPORT_USERNAME=
MYORACLESUPPORT_PASSWORD=
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false
DECLINE_SECURITY_UPDATES=true
PROXY_HOST=
PROXY_PORT=
PROXY_USER=
PROXY_PWD=
COLLECTOR_SUPPORTHUB_URL=
###开始安装(可以再开一个窗口tail -f 日志输出文件)
[root@oracle57 u01]# su - oracle
[oracle@oracle57 ~]$ cd /u01/database/
[oracle@oracle57 database]$ ./runInstaller -force -silent -responseFile /u01/database/response/db_install.rsp
As a root user, execute the following script(s):
1. /u01/app/oracle/oraInventory/orainstRoot.sh
2. /u01/app/oracle/product/12.2.0.1/db_1/root.sh
Successfully Setup Software.
###在root用户下运行上面提示的2个脚本
[root@oracle57 u01]# /u01/app/oracle/oraInventory/orainstRoot.sh
Changing permissions of /u01/app/oracle/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.
Changing groupname of /u01/app/oracle/oraInventory to oinstall.
The execution of the script is complete.
[root@oracle57 u01]# /u01/app/oracle/product/12.2.0.1/db_1/root.sh
Check /u01/app/oracle/product/12.2.0.1/db_1/install/root_oracle57_2021-12-24_15-56-51-129488354.log for the output of root script
###配置网络监听
[root@oracle57 u01]# su - oracle
[oracle@oracle57 ~]$ netca -silent -responsefile /u01/database/response/netca.rsp
[oracle@oracle57 ~]$ lsnrctl start
[oracle@oracle57 ~]$ lsnrctl status
### 创建数据库应答文件,我调整了memory_target与db_recovery_file_dest_size
[oracle@oracle57 ~]$ vim /u01/database/response/dbca.rsp
responseFileVersion=/oracle/assistants/rspfmt_dbca_response_schema_v12.2.0
gdbName=orcl
sid=orcl
databaseConfigType=SI
RACOneNodeServiceName=
policyManaged=false
createServerPool=false
serverPoolName=
cardinality=
force=false
pqPoolName=
pqCardinality=
createAsContainerDatabase=true
numberOfPDBs=1
pdbName=orclpdb
useLocalUndoForPDBs=true
pdbAdminPassword=Orcl43210Soft
nodelist=
templateName=/u01/app/oracle/product/12.2.0.1/db_1/assistants/dbca/templates/General_Purpose.dbc
sysPassword=Orcl43210Soft
systemPassword=Orcl43210Soft
oracleHomeUserPassword=
emConfiguration=
emExpressPort=5500
runCVUChecks=false
dbsnmpPassword=
omsHost=
omsPort=0
emUser=
emPassword=
dvConfiguration=false
dvUserName=
dvUserPassword=
dvAccountManagerName=
dvAccountManagerPassword=
olsConfiguration=false
datafileJarLocation={ORACLE_HOME}/assistants/dbca/templates/
datafileDestination={ORACLE_BASE}/oradata/{DB_UNIQUE_NAME}/
recoveryAreaDestination={ORACLE_BASE}/fast_recovery_area/{DB_UNIQUE_NAME}
storageType=FS
diskGroupName=
asmsnmpPassword=
recoveryGroupName=
characterSet=AL32UTF8
nationalCharacterSet=AL16UTF16
registerWithDirService=false
dirServiceUserName=
dirServicePassword=
walletPassword=
listeners=LISTENER
variablesFile=
variables=DB_UNIQUE_NAME=orcl_p,ORACLE_BASE=/u01/app/oracle,PDB_NAME=,DB_NAME=orcl,ORACLE_HOME=/u01/app/oracle/product/12.2.0.1/db_1,SID=orcl
initParams=undo_tablespace=UNDOTBS1,memory_target=10240MB,processes=300,db_recovery_file_dest_size=10240MB,nls_language=AMERICAN,dispatchers=(PROTOCOL=TCP) (SERVICE=oralXDB),db_recovery_file_dest={ORACLE_BASE}/fast_recovery_area/{DB_UNIQUE_NAME},db_block_size=8192BYTES,diagnostic_dest={ORACLE_BASE},audit_file_dest={ORACLE_BASE}/admin/{DB_UNIQUE_NAME}/adump,nls_territory=AMERICA,local_listener=LISTENER_oral,compatible=12.2.0,control_files=("{ORACLE_BASE}/oradata/{DB_UNIQUE_NAME}/control01.ctl", "{ORACLE_BASE}/fast_recovery_area/{DB_UNIQUE_NAME}/control02.ctl"),db_name=orcl,audit_trail=db,remote_login_passwordfile=EXCLUSIVE,open_cursors=300
sampleSchema=false
memoryPercentage=40
databaseType=MULTIPURPOSE
automaticMemoryManagement=false
totalMemory=0
###安装
[oracle@oracle57 ~]$ dbca -silent -createDatabase -responseFile /u01/database/response/dbca.rsp
192.168.0.58静默安装(搭建数据库软件,建立lsnrctl监听,不需要用dbca搭建实例)
###安装依赖包
[root@oracle58 ~]# yum -y install rlwrap binutils compat-libcap1 compat-libstdc++-33 compat-libstdc++-33*i686 compat-libstdc++-33 gcc gcc-c++ glibc glibc*.i686 glibc-devel glibc-devel*.i686 ksh libaio libaio*.i686 libaio-devel libgcc libgcc*.i686 libstdc++ libstdc++*.i686 libstdc++-devel libXi libXi*.i686 libXtst sysstat unixODBC unixODBC*.i686 unixODBC-devel unixODBC-devel*.i686
###添加用户,用于安装与运行数据库
groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper
useradd -u 54321 -g oinstall -G dba,oper oracle
###修改内核参数,不修改安装验证会失败
[root@oracle58 ~]# vim /etc/sysctl.conf
fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
kernel.panic_on_oops = 1
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
[root@oracle58 ~]# sysctl -p
###配置limit
[root@oracle58 ~]# cat >> /etc/security/limits.conf << EOF
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft stack 10240
oracle hard stack 32768
oracle hard memlock 134217728
oracle soft memlock 134217728
EOF
###创建oracle安装目录
[root@oracle58 ~]# mkdir -p /u01/app/oracle/oradata
[root@oracle58 ~]# chmod -R 775 /u01
[root@oracle58 ~]# chown -R oracle:oinstall /u01
###配置环境变量
[root@oracle58 ~]# vim /etc/profile
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_HOSTNAME=oracle58 #主机名
export ORACLE_UNQNAME=orcl_s
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.2.0.1/db_1
export ORACLE_SID=orcl
export PATH=/usr/sbin:$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
[root@oracle58 ~]# source /etc/profile
### 解压
[root@oracle58 u01]# mv /root/linuxx64_12201_database.zip /u01/
[root@oracle58 u01]# unzip linuxx64_12201_database.zip
[root@oracle58 u01]# chown -R oracle:oinstall /u01/
###配置安装应答文件
[root@oracle58 u01]# cat database/response/db_install.rsp
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v12.2.0
oracle.install.option=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/oracle/oraInventory
ORACLE_HOME=/u01/app/oracle/product/12.2.0.1/db_1
ORACLE_BASE=/u01/app/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSOPER_GROUP=oper
oracle.install.db.OSBACKUPDBA_GROUP=dba
oracle.install.db.OSDGDBA_GROUP=dba
oracle.install.db.OSKMDBA_GROUP=dba
oracle.install.db.OSRACDBA_GROUP=dba
oracle.install.db.rac.configurationType=
oracle.install.db.CLUSTER_NODES=
oracle.install.db.isRACOneInstall=
oracle.install.db.racOneServiceName=
oracle.install.db.rac.serverpoolName=
oracle.install.db.rac.serverpoolCardinality=
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE
oracle.install.db.config.starterdb.globalDBName=orcl
oracle.install.db.config.starterdb.SID=orcl
oracle.install.db.ConfigureAsContainerDB=
oracle.install.db.config.PDBName=
oracle.install.db.config.starterdb.characterSet=AL32UTF8
oracle.install.db.config.starterdb.memoryOption=
oracle.install.db.config.starterdb.memoryLimit=
oracle.install.db.config.starterdb.installExampleSchemas=
oracle.install.db.config.starterdb.password.ALL=Orcl43210Soft
oracle.install.db.config.starterdb.password.SYS=
oracle.install.db.config.starterdb.password.SYSTEM=
oracle.install.db.config.starterdb.password.DBSNMP=
oracle.install.db.config.starterdb.password.PDBADMIN=
oracle.install.db.config.starterdb.managementOption=
oracle.install.db.config.starterdb.omsHost=
oracle.install.db.config.starterdb.omsPort=
oracle.install.db.config.starterdb.emAdminUser=
oracle.install.db.config.starterdb.emAdminPassword=
oracle.install.db.config.starterdb.enableRecovery=
oracle.install.db.config.starterdb.storageType=
oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=
oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=
oracle.install.db.config.asm.diskGroup=
oracle.install.db.config.asm.ASMSNMPPassword=
MYORACLESUPPORT_USERNAME=
MYORACLESUPPORT_PASSWORD=
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false
DECLINE_SECURITY_UPDATES=true
PROXY_HOST=
PROXY_PORT=
PROXY_USER=
PROXY_PWD=
COLLECTOR_SUPPORTHUB_URL=
###开始安装(可以再开一个窗口tail -f 日志输出文件)
[root@oracle58 u01]# su - oracle
[oracle@oracle58 ~]$ cd /u01/database/
[oracle@oracle58 database]$ ./runInstaller -force -silent -responseFile /u01/database/response/db_install.rsp
As a root user, execute the following script(s):
1. /u01/app/oracle/oraInventory/orainstRoot.sh
2. /u01/app/oracle/product/12.2.0.1/db_1/root.sh
Successfully Setup Software.
###在root用户下运行上面提示的2个脚本
[root@oracle58 u01]# /u01/app/oracle/oraInventory/orainstRoot.sh
Changing permissions of /u01/app/oracle/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.
Changing groupname of /u01/app/oracle/oraInventory to oinstall.
The execution of the script is complete.
[root@oracle58 u01]# /u01/app/oracle/product/12.2.0.1/db_1/root.sh
Check /u01/app/oracle/product/12.2.0.1/db_1/install/root_oracle57_2021-12-24_15-56-51-129488354.log for the output of root script
###配置网络监听
[root@oracle58 u01]# su - oracle
[oracle@oracle58 ~]$ netca -silent -responsefile /u01/database/response/netca.rsp
[oracle@oracle58 ~]$ lsnrctl status
数据库设置为归档模式,归档目录/u01/archivelog/ 主库启动FORCE LOGGING
SQL> alter database force logging;
Database altered.
SQL> select force_logging from v$database;
FORCE_LOGGING
---------------------------------------
YES
主库启动归档模式
SQL> alter system set log_archive_dest_1='location=/u01/arch';
system altered.
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog
SQL> alter database open;
SQL> archive log list;
在主库添加 standby redo logfile,比redolog多一组,并且要和redolog大小一致
alter database add standby logfile group 4 '/u01/app/oracle/oradata/orcl/stdredo4.log' size 200m;
alter database add standby logfile group 5 '/u01/app/oracle/oradata/orcl/stdredo5.log' size 200m;
alter database add standby logfile group 6 '/u01/app/oracle/oradata/orcl/stdredo6.log' size 200m;
alter database add standby logfile group 7 '/u01/app/oracle/oradata/orcl/stdredo7.log' size 200m;
SQL> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/redo03.log
/u01/app/oracle/oradata/orcl/redo02.log
/u01/app/oracle/oradata/orcl/redo01.log
/u01/app/oracle/oradata/orcl/stdredo4.log
/u01/app/oracle/oradata/orcl/stdredo5.log
/u01/app/oracle/oradata/orcl/stdredo6.log
/u01/app/oracle/oradata/orcl/stdredo7.log
分别在主备库配置监听并启动,注意HOST = <主机名或者ip>
[oracle@oracle57 admin]$ pwd
/u01/app/oracle/product/12.2.0.1/db_1/network/admin
[oracle@oracle57 admin]$ vim listener.ora
# listener.ora Network Configuration File: /data/app/oracle/product/12.2.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(SID_NAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/12.2.0.1/db_1)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle57 )(PORT = 1521))
)
)
ADR_BASE_LISTENER = /u01/app/oracle
重启监听
lsnrctl stop
lsnrctl start
分别在主备库配置tnsnames.ora
[oracle@oracle58 admin]$ pwd
/u01/app/oracle/product/12.2.0.1/db_1/network/admin
[oracle@oracle58 admin]$ vim listener.ora
# tnsnames.ora Network Configuration File: /data/app/oracle/product/12.2.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
orcl_p =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle57)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
orcl_s =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle58)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
测试监听,tns等配置。可以进去查看数据库状态,如果有异常表示配置有问题
shell
[oracle@oracle57 admin]$ sqlplus sys/Orcl43210Soft@orcl_s as sysdba
[oracle@oracle57 admin]$ sqlplus sys/Orcl43210Soft@orcl_p as sysdba
在主库创建pfile 文件并修改pfile 内容
SQL> create pfile from spfile;
SQL> exit
[oracle@oracle57 dbs]$ pwd
/u01/app/oracle/product/12.2.0.1/db_1/dbs
[oracle@oracle57 dbs]$ vim initorcl.ora
####添加修改以下内容
*.db_unique_name='orcl_p'
*.log_archive_config='dg_config=(orcl_p,orcl_s)'
*.log_archive_dest_1='location=/u01/arch valid_for=(all_logfiles,all_roles) db_unique_name=orcl_p'
#*.log_archive_dest_2= 'service=oracle_s LGWR ASYNC valid_for=(online_logfiles, primary_role) db_unique_name=oracle_s' --异步传输,仅作参考,不需要设置
*.log_archive_dest_2= 'service=orcl_s LGWR affirm SYNC valid_for=(online_logfiles, primary_role) db_unique_name=orcl_s'
*.log_archive_dest_state_1=enable
*.log_archive_dest_state_2=enable
*.fal_server='orcl_s'
*.fal_client='orcl_p'
*.standby_file_management='auto'
*.log_file_name_convert=('/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl')
*.db_file_name_convert=('/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl')
用spfile启动数据库
SQL> shutdown immediate
SQL> create spfile from pfile;
SQL> startup
将主库的口令文件copy到备库
[oracle@oracle57 dbs]$ pwd
/u01/app/oracle/product/12.2.0.1/db_1/dbs
[oracle@oracle57 dbs]$ scp orapworcl initorcl.ora oracle58:/u01/app/oracle/product/12.2.0.1/db_1/dbs
将主库的pfile拷贝到备库并修改
[root@oracle58 u01]# cd app/oracle/product/12.2.0.1/db_1/dbs
[root@oracle58 dbs]# ls
init.ora initorcl.ora orapworcl
###添加修改以下内容
[root@oracle58 dbs]# vim initorcl.ora
*.db_unique_name='orcl_s'
*.log_archive_config='dg_config=(orcl_p,orcl_s)'
*.log_archive_dest_1='location=/u01/arch valid_for=(all_logfiles,all_roles) db_unique_name=orcl_s'
*.log_archive_dest_2= 'service=orcl_p LGWR affirm SYNC valid_for=(online_logfiles, primary_role) db_unique_name=orcl_p'
#*.log_archive_dest_2= 'service=oracle_p LGWR ASYNC valid_for=(online_logfiles, primary_role) db_unique_name=oracle_p' --异步传输
*.log_archive_dest_state_1=enable
*.log_archive_dest_state_2=enable
*.fal_server='orcl_p'
*.fal_client='orcl_s'
*.standby_file_management='auto'
*.log_file_name_convert=('/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl')
*.db_file_name_convert=('/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl')
创建相关目录
mkdir -p /u01/arch
mkdir -p /u01/app/oracle/fast_recovery_area/orcl
mkdir -p /u01/app/oracle/oradata/orcl
mkdir -p /u01/app/oracle/admin/orcl/adump
用spfile 将备库启动到nomount 状态
SQL> shutdown immediate
SQL> create spfile from pfile;
SQL> startup nomount
在主库执行,开始进行Active duplicate
[oracle@oracle57 ~]$ rman target sys/Orcl43210Soft@orcl_p auxiliary sys/Orcl43210Soft@orcl_s nocatalog
RMAN> duplicate target database for standby from active database nofilenamecheck;
####同步后备库出于mounted状态,打开
SQL> alter database open;
查看主库状态
RMAN> select log_mode,open_mode ,database_role from v$database;
LOG_MODE OPEN_MODE DATABASE_ROLE
------------ -------------------- ----------------
ARCHIVELOG READ WRITE PRIMARY
查看备库状态,备库是只读只能查询
SQL> select log_mode,open_mode ,database_role from v$database;
LOG_MODE OPEN_MODE DATABASE_ROLE
------------ -------------------- ----------------
ARCHIVELOG READ ONLY PHYSICAL STANDBY
备库执行,启用real-time apply
SQL> alter database recover managed standby database using current logfile disconnect from session;
查看保护模式
SQL> select protection_mode,protection_level from v$database;
PROTECTION_MODE PROTECTION_LEVEL
-------------------- --------------------
MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE
查看归档日志应用状态
SQL> Select sequence#,name,applied from v$archived_log;
#...省略输出
dataguard --swithover 和failover的说明:
SWITCHOVER
Switchover是有计划的将primary切换为standby,standby切换为primary.在主库结束生产后,备库应用完所有主库archivelog或者redo log后进行切换,不丢失数据。
常用场景:
(1) 有计划的灾备切换演练,如测试灾备站点的可用性,客户端连接等,确保主库发生重大意外时,可以切换至备库正常运转。
(2) 主库长时间的维护升级,如OS升级,DB滚动升级,更换存储,更换OS硬件设备等。
(3) 切换有风险,一般不做切换。
FAILOVER
Failover通常在主库突发故障,短时间无法解决,考虑到备库的可用性,数据丢失的容忍度,迫切需要向外提供数据库服务时进行Failover.
Failover前,如果数据库没有操作在最大保护模式,可能发生数据丢失。
Failover前,需要将准备Failover的备库置于最大性能模式。
Failover前,尽量应用所有的主库重做数据,减少数据丢失。
Failover后,原主库将从DG配置中删除,如果原主库启用了Flashback,则在修复故障后,故障的数据库可恢复为新的standby数据库。
Oracle11.2之前,可以拷贝primary的online redo log到standby做recover,从Oracle11.2开始,Oracle提供了flush redo到standby的功能,当primary不能OPEN时,启动到mount状态,standby redo apply处于激活状态,执行以下语句flush redo到standby,以此来减少数据丢失:
SQL> alter system flush redo to target_db_name;
具体切换过程
①switchover-----无损转换
1、检查primary数据库是否支持切换成standby
SQL>Select switchover_status from v$database;
如果支持则status状态为 To standby 或session active(当前有用户连接)
2、启动switchover
SQL>alter database commit to switchover to standby/physical standby with session shutdown;
3、SQL>shutdown immediate
SQL>startup mount
4、检查standby库是否支持切换
SQL>Select switchover_status from v$database;
如果支持则status状态为 To primary或session active(当前有用户连接)或switchover pending (standby库没有启用redo应用)
如果为switchover pending状态则需要执行启用redo日志应用:
SQL>alter database recover managed standby database disconnect from session;
5、转换角色到primary
SQL>alter database commit to switchover to primary with session shutdown;
SQL>alter database open;
②failover-----会丢失数据
执行failover后原primary库将不再是dataguard中的一部分,所以在执行failover之前,尽可能将原primary库中的redo文件(含联机重做日志文件和归档日志文件)都复制到standby库
1、如果待转换的standby库处于maximum protection模式,需要切换到maximum performence模式
SQL>alter database set standby database to maximum performence;
2、检查归档日志是否连续
查询待转换standby库(原primary)的v$archive_gap,确认归档文件是否连续
SQL>select thread#,low_sequence#,high_sequence# from v$archive_gap;
如果有返回记录,则按照列出的记录号复制对应的归档日志到待转换的standby服务器
文件复制过去后在待转换的standby服务器上执行:
SQL>alter database register physical logfile ‘filespec1’;
3、检查归档文件是否完整
分别在两台服务器上执行:
SQL>select distinct thread#,max(sequence#) over(partition by thread#) a from v$archive_log;
4、启动failover
SQL>alter database recover managed standby database finish force;
5、切换物理standby为primary
SQL>alter database commit to switchover to primary;
6、启动新的primary
如果当前库为mount则直接open,如果为read only,则要先shutdown再open。
参考引用:https://www.cnblogs.com/lysheng/p/14094693.html