备份数据库的研究
主数据库和备份数据都要运行在归档模式下(archive log)。参见数据库备份研究一文进行设置。
主/备用数据库可建在同一台机上,推荐是在不同机上。
主节点数据库和备份节点数据库的运行机制:建立主数据库的备份文件,生成特有的备用数据库控制文件,利用主数据库的归档日志文件和备份文件实现重建主数据库在备用数据库上,备用数据库处于恢复模式时,备用数据库是没有激活,一旦主数据库down了,激活备用数据库让它成为主数据库,让系统能够运行下去。
一、备用数据库的环境建立
首先,建立备用数据库的各项目录,设定备用数据库的
ORACLE_SID与主数据库不同;
ORACLE_DATA=备用数据库的数据文件存放位置
ORACLE_ADMIN=存放备用数据库的init$ORACLE_SID.ora 和 spfile$ORACLE_SID.ora启动参数文件。
根据需要和相关实际情况修改下列参数值
export ORACLE_SID=testdb
export ORACLE_BASE=/opt/
oracle/oraInventory
export ORACLE_HOME=/opt/oracle/oraInventory
export ORACLE_DATA=/home/ldai/$ORACLE_SID
export ORACLE_ADMIN=$ORACLE_BASE/admin/$ORACLE_SID
[ 以下创建的目录为固定目录,不能更改名字 ]
mkdir $ORACLE_ADMIN
mkdir $ORACLE_ADMIN/pfile
mkdir $ORACLE_ADMIN/bdump
mkdir $ORACLE_ADMIN/cdump
mkdir $ORACLE_ADMIN/udump
mkdir $ORACLE_ADMIN/create
mkdir $ORACLE_DATA/
mkdir $ORACLE_DATA/archive
这样就建立起备用数据库的原型。
将主数据库的热备份和冷备份的数据文件放在备用数据库的数据文件目录下(ORACLE_DATA下)
二、备用数据库的参数文件建立
参数文件主要指:init$ORACLE_SID.ora 和 spfile$ORACLE_SID.ora文件,这些文件是启动备用数据库的参数文件,参数文件放在oracle目录下dbs目录中。备用数据库参数文件获得是在主数据库的参数文件基础上修改获得的。
例如:
LINUX>cp /opt/oracle/oraInventory/dbs/initoracle.ora
/opt/oracle/oraInventory/dbs/inittestdb.ora
LINUX>cp /opt/oracle/oraInventory/dbs/spfileoracle.ora
/opt/oracle/oraInventory/dbs/spfiletestdb.ora
将其中涉及到主数据库的ORACLE_SID地方全部改为备用数据库的ORACLE_SID。
还要在备用数据库两参数文件中必须要增加的参数如下:
[1] DB_FILE_NAME_CONVERT
db_file_name_convert 主数据库和备用数据库的数据文件转换目录对映(如果两数据库的目录结构不一样),如果有多个对映,逐一指明对映关系。
格式:*.db_file_name_convert=主数据库数据文件目录,备用数据库数据文件目录
例如:
一对一映射设定
*.db_file_name_convert='/opt/oracle/oraInventory/oradata/oracle','/opt/oracle/oraInventory/oradata/standby'
多对多映射设定
*.db_file_name_convert='/opt/oracle/oraInventory/oradata/oracle','/home/ldai/testdb','/opt/oracle/oraInventory/oradata/standby','/home/ldai/testdb/standby'
[2] LOG_FILE_NAME_CONVERT
指明主数据库和备用数据库的log文件转换目录对映。
格式为:*. log_file_name_convert=主数据库log目录,备用数据库目录
例如:
*.log_file_name_convert='/opt/oracle/oraInventory/oradata/oracle','/home/ldai/te
stdb'
[3] STANDBY_ARCHIVE_DEST
备用数据库的归档日志归档目录。
格式:*.standby_archive_dest=备用数据库归档日志存放目录
例如:
*.standby_archive_dest='/home/ldai/testdb/archive'
[4]LOCK_NAME_SPACE
这是当主数据库和备用数据在同一台机上时要设该参数,设为备用数据库的SID
例如:
*.lock_name_space=testdb
[5]COMPATIBLE
主数据库和备用数据库的oracle版本必须一致,这个参数指明了oracle的版本号
例如:
*.compatible='9.2.0.0.0'
[6]CONTROL_FILES
指明备用数据库存放的控制文件路径和名称
例如:
*.control_files='/home/ldai/testdb/test.ctl'
三、备用数据库的归档模式建立
在备用数据库的两个参数文件中增加以下参数,建立起备用数据库为archive log模式.
[1]LOG_ARCHIVE_START=TRUE
[2 ]LOG_ARCHIVE_DEST_1
设定第一个归档目录,最多可设9个,location代表本地机上,service指明在另一台机上。
例如:
*.log_archive_dest_1='LOCATION=/home/ldai/testdb/archive'
[3 ]LOG_ARCHIVE_DEST_STATE_1=ENABLE
激活定义的第一个归档日志目录。
[4]主数据库的归档目录设定
*.log_archive_start=TRUE
*.log_archive_dest_1='LOCATION=/opt/oracle/oraInventory/oradata/archive MANDATOR
Y REOPEN=60'
*.log_archive_dest_state_1=ENABLE
指明归档到备用数据库中的归档日志目录
*.log_archive_dest_2='SERVICE=testdb OPTIONAL REOPEN=180'
*.log_archive_dest_state_2=ENABLE
归档日志格式
*.log_archive_format='ORACLE%T%S.ARC'
主数据库一般先归档到第一个归档目录(一般都指定为本机,防止归档失败),然后才归档到第二个归档目录。如果在这期间有什么错误发生,可查看$ORACLE_HOME/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log文件。
例如:
/opt/oracle/oraInventory/admin/oracle/bdump/alert_oracle.log
[备注]主数据库和备用数据库中参数文件必须的指明相同的db_name=主数据库的ORACLE_SID
例如:
*.db_name='oracle'
四、备用数据库的控制文件建立
采用专用的sql命令创建备用数据库的控制文件
SQL> alter database create standby controlfile as ‘控制文件名和路径’
如果主/备不在同一台机上,创建后将控制文件cp到备用数据库所在的控制文件目录下。
本例中放在/home/ldai/testdb/中,与主数据库一样将控制文件同数据文件放在一个目录下。
五、数据库的LISTENER.ORA 和 TNSNAMES.ORA 文件的设定。
A、 同一台机上的LISTENER.ORA 和 TNSNAMES.ORA 的设定。
如果想通过图形化界面设定,在linux的图形界面中用run执行$ORACLE_HOME/bin/netca
然后进行图形化的设定。
这个例子中,备用数据库SID=testdb,主数据库的SID=oracle
[A]Linstener设定
设定listener时,要让监听服务stop.
Linux>lsnrctl stop
手工也可进行修改,在listener.ora 的DESCRIPTION中增加下面的监听条目,采用IPC协议。Key为k+$ORACLE_SID保证是唯一的值。因为是在同一台机上所以采用IPC协议进行本机内部通讯。
在地址监听列表中加多
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = 备用数据库的k+$ORACLE_SID))
)
有且只有让一个IPC协议条目监听(目前实验如此)
然后重新启动监听服务
linux>lsnrctl start
例子:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = ktestdb))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = studysvr)(PORT = 1521))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PL***tProc)
(ORACLE_HOME = /opt/oracle/oraInventory)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = oracle)
(ORACLE_HOME = /opt/oracle/oraInventory)
(SID_NAME = oracle)
)
)
[B]tnsnames设定
建立一个与备用数据库SID相同名称的条目,注意在一台机上service_name指的是主数据库的SID,如果设错,主数据库不能通过该服务别名访问备用数据库。管理恢复模式不能正常运作。协议是tcp协议。
例如:
TESTDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = studysvr)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = oracle)
)
)
ORACLE =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = studysvr)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = oracle)
)
)
B、 主/备不同机上的LISTENER.ORA 和 TNSNAMES.ORA 的设定。
这个例子中,备用数据库上原本已有数据库且其SID=orcl,我们建立的备用数据库其SID=sun,主数据库的SID=oracle;
主数据库机的ip地址为:192.168.0.6 主机名为:studysvr
备用数据库机的ip地址为:192.168.0.39 主机名为:sun
主数据库(Primary database)
Listerner.ora
listener.ora必须要有监听主数据库的服务条目,其SID_NAME为主数据库的ORACLE_SID。
这样监听器就开始监听指定的ORACLE_SID服务了(即oracle的实例),如果用户想要监听多个服务,只需在SID_LIST_LISTENER中的SID_LIST(监听列表)下再增加一个要监听的ORACLE_SID。例子可祥见备用数据库的监听器设定。
例如:(primary database’s listener.ora :hostname=studysvr Ipad=192.168.0.6)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.6)(PORT = 1521))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PL***tProc)
(ORACLE_HOME = /opt/oracle/oraInventory)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = oracle)
(ORACLE_HOME = /opt/oracle/oraInventory)
(SID_NAME = oracle)
)
)
Tnsnames.ora
主数据库上要设定访问备用数据库的网络服务别名,注意这时的备用数据库的SID是指备用数据库上,要启动作为备用数据库的ORACLE_SID。
例子:
#访问备用数据库的Net Service Name
SUN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = sun)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sun) //备用数据库的ORACLE_SID
)
)
#访问主数据库的Net Service Name
ORACLE =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.6)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = oracle) //主数据库上的ORACLE_SID
)
)
备用数据库(standby database)
Listener.ora
备用数据库的监听器要监听备用数据库的实例(即ORACLE_SID)。需要在备用数据库的Listener.ora上加多对备用服务器实例的监听。在SID_LIST_LISTENER的SID_LIST增加新ORACLE_SID的监听服务。监听地址列表(address_list)为备用数据库的ip地址或者主机名,该值应尽量同tnsnames.ora中的host值保持一致,减少系统出错可能。
例子:(standby database’s listener.ora)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.39)(PORT = 1521))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PL***tProc)
(ORACLE_HOME = /oracleinstall)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = sun)
(ORACLE_HOME = /oracleinstall)
(SID_NAME = sun) //开启sun实例监听(启动的备用数据库实例)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /oracleinstall)
(SID_NAME = orcl) //开启orcl实例监听(oracle安装时安装的数据库实例)
)
)
Tnsnames.ora
备用数据库上建立两个网络服务别名,一个用于访问主数据库,另一个访问备用数据库。SID_NAME对应于不同的数据库sid。
例子:
#访问主数据库的Net Service Name
ORACLE.LOCALDOMAIN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.6)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORACLE)
)
)
#访问备用数据库机上的orcl数据库的Net Service Name
ORCL.LOCALDOMAIN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
#访问备用数据库的Net Service Name
SUN.LOCALDOMAIN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.39)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sun)
)
)
六、备用数据库的口令文件的生成
便于启动备用数据库时的 sys连接用,远程管理时也有用。
Oracle用户登陆
Linux>orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=$ORACLE_SID entries=4
例如:(oracle用户执行)
linux>orapwd file=/opt/oracle/oraInventory/dbs/orapwtestdb password=testdb entries=4
七、备用数据库的启动
LINUX>export ORACLE_SID=备用数据库的SID
这个ORACLE_SID就是备用数据库的SID,必需同主数据库的Tnsnames.ora和备用数据库的Listener.ora中对应于备用数据库的SID_NAME相同。否则主数据库的归档日志不能传到备用数据库机上。
例如:
Linux>export ORACLE_SID=testdb
LINUX>sqlplus /nolog
SQL>connect sys/testdb as sysdba
SQL>startup nomount
SQL>alter database mount standby database;
这样就进入了手工恢复模式。如果想要进入管理恢复模式继续执行下面的命令
SQL>alter database recover managed standby database;
手工恢复模式
在手工恢复模式下,恢复数据库用recover standby database专用SQL命令。回车直到所有归档日志完毕。(这时的主数据库归档日志是手工干预传递到备用数据库的归档日志目录下)
管理恢复模式
系统自动将主数据库上的归档日志归档到备用数据库上的归档目录,备用数据库自动应用这些归档日志文件,使主数据库同备用数据库的数据保持一致。在启动备用数据库之前的所有归档日志需要人工干预,将它们传递到备用数据库中的归档目录,当采用ftp传递日志文件时,一定要使用度二进制模式。管理恢复模式的取消,另开一个窗口,执行:
SQL>recover managed standby database cancel;
即可取消掉管理恢复模式。
八、备用数据库的归档日志传送处理
手工恢复模式为手工干预传送归档日志(即用cp命令进行传送),注意传送完毕后,用chmod a+w给传递到备用数据库归档日志目录下的归档日志赋写权限。如不然,则手工恢复不成功。
管理恢复模式则是系统根据前面参数文件,listener.ora和tnsnames.ora设定好的参数,备用数据库自动获取归档日志文件进行自动恢复。
九、备用数据库的激活
备用数据库一旦激活成为主数据库,就不能在成为备用数据库,需要重新建立备用数据库。
激活备用数据库,首先要停止备用数据库的恢复进程。
SQL>recover managed standby database cancel;
激活备用数据库
SQL>alter database activate standby database;
SQL>shutdown;
SQL>connect sys/sys_password as sysdba; //根据需要进行修改sys_password
SQL>startup;
十、主数据库和备用数据库之间的网络调试
要使远程备用数据库实施成功,还需要测试网络环境是否正常,主数据库/备用数据库上的tnsnames.ora和listener.ora是否配置正确。
A、主数据库所在的机器和备用数据库所在的机器要互相能够ping得通,保证网络正常。
B、启动主数据库,在备用数据库上执行下面的命令,检测主数据库上的Listener和备用数据库上的tnsnames是否配置正确。
Linux>sqlplus /nolog
SQL>connect sys/primary_sys_password@primary_net_service_name as sysdba;
或
SQL>connect 主数据库上的用户/主数据库上用户口令@主数据库别名;
然后
SQL>select sysdate from dual;
如果结果正常,则证明主数据库上的Listener配置正确。备用数据库的tnsname中的主数据库服务条目配置正确。
例子:
SQL>connect sys/oracle@oracle as sysdba
或
SQL>connect system/oracle@oracle;
C、备用数据中关于本身的Tnsnames服务条目是否配置正确。
备用数据库机上:
Linux>sqlplus /nolog
SQL>connect sys/sys/备用数据库的sys_password@备用数据库的别名 as sysdba;
(注意备用数据库的sys口令同7步骤生成的口令文件是对应的)
能连上就说明配置正确。
例子:
SQL>connect sys/sun@sun as sysdba;
D、按照步骤8启动备用数据库,启动成手工恢复模式,然后将备用数据打开成只读模式,然后从主数据库访问备用数据库,检测备用数据库的listener和主数据库的tnsnames是否配置正常。
在主数据库机上:
Linux>sqlplus /nolog
SQL>connect sys/备用数据库的sys_password@备用数据库的别名 as sysdba;
(注意备用数据库的sys口令同7步骤生成的口令文件是对应的)
能连上就说明配置正确。
例子:
SQL>connect sys/sun@sun as sysdba;
E、以上涉及到的linux操作都是以oracle用户执行。
F、如果不知道主机名可用Linux>hostname获知。
G、如果机器不能解析ip地址或主机名,编辑(root用户下)/etc/hosts和/etc/resolv.conf文件;