#一主一备配置
本文所述一主一备配置基于主库已安装完成的情况,部署过程中可能需要重启数据库,若主库为正在使用的生产环境,请确保在可对其执行重启的时间段内进行主备部署。
# 步骤1:准备备库
主备部署前,需要先进行备库安装,请按安装部署所述步骤完成安装,且需注意如下事项:
- 备库与现有环境不处于同一yasom集群,依据本文档配置完成后需要对最新的主备节点进行托管,否则后续对该节点无法执行yasboot运维操作。
- 备库的各项资源参数建议与主库一致。
- 备库所安装的数据库版本必须与主库的数据库版本一致。
- 备库安装过程中所定义的DBFILES目录应尽量与主库保持一致,无法保持一致(例如主备库位于同一台服务器)的情况下,必须设置路径转换参数,详见下面描述。
- YashanDB默认安装完成后会创建一个初始数据库,需使用DROP DATABASE语句删除该数据库。
-- 登录初始数据库,该数据库安装后为open状态
$ yasql sys/sys
-- 重启至nomount状态
SQL> SHUTDOWN;
exit
$ yasboot cluster start -c yashandb -m nomount
-- 删除初始数据库
SQL> DROP DATABASE;
# 步骤2:开启主库归档
检查主库归档是否打开,如未打开,需要按如下步骤将主库调整为归档模式:
重启主库至MOUNT状态。
调整数据库的归档模式。
打开数据库。
示例
$ yasboot cluster restart -c yashandb -m mount
$ yasql sys/sys
SQL> SELECT database_name,log_mode,open_mode FROM V$DATABASE;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
# 步骤3:配置主备库参数
与主备部署相关的参数有:
- LISTEN_ADDR:本机数据库的IP与监听端口,该参数在安装时已配置。
- NODE_ID:各节点编号,该参数在创建节点时已配置,且不能重复,主要用于主备库自动选主。
- REPLICATION_ADDR:本机数据库的IP与同步复制端口,可不配置,则与LISTEN_ADDR共享一个端口。
- ARCHIVE_DEST_1:对端数据库的IP与同步复制端口(该类型的参数有32个,从ARCHIVE_DEST_1到 ARCHIVE_DEST_32,每个参数表示一个备库的链路属性,所以一个主库最多支持32个备库),必须配置。
- DB_FILE_NAME_CONVERT:对端到本机的数据文件转换路径,支持递归转换,主备数据文件路径不同时必须配置。
- REDO_FILE_NAME_CONVERT:对端到本机的日志文件转换路径,支持递归转换,主备日志文件路径不同时必须配置。
- DB_BUCKET_NAME_CONVERT:对端到本机的LSC表的bucket转换路径,支持递归转换,主备bucket路径不同时必须配置。
- HA_SSL_ENABLE(SSL_ENABLE):主备间SSL加密传输开关。当REPLICATION_ADDR和LISTEN_ADDR共享端口,主备加密传输参照SSL_ENABLE,否则参照HA_SSL_ENABLE; 主备之间的开关参数必须一致;当开启时,主备需要配置SSL_CERT_FILE/SSL_KEY_FILE/SSL_DH_PARAM_FILE参数,配置方式见数据库管理手册HA节点间SSL连接配置。
Note:
递归转换:
逐一设置文件路径转换非常繁琐且易出错,所以当主备文件路径上的某个节点开始往后一致时,只用设置这个节点路径的转换参数,系统对具有相同父目录的文件或文件夹进行递归转换。
假设主库和备库的DATA目录分别为'/home/yashan/node_1'和'/home/yashan/node_2',主库的数据文件有'/home/yashan/node_1/spc1/datafile1'和'/home/yashan/node_1/spc2/datafile2'。设置备库的转换路径为"DB_FILE_NAME_CONVERT='/home/yashan/node_1', '/home/yashan/node_2'",那么备库上创建的datafile1和datafile2将分别位于'/home/yashan/node_2/spc1/datafile1'和'/home/yashan/node_2/spc2/datafile2'。
主库配置示例(LISTEN_ADDR和REPLICATION_ADDR参数重启数据库后生效,其他立即生效,ARCHIVE_DEST_XXX参数在REPLICATION_ADDR参数重启生效后再进行设置)
ALTER SYSTEM SET LISTEN_ADDR=192.168.1.2:1688 scope=spfile;
ALTER SYSTEM SET REPLICATION_ADDR=192.168.1.2:1689 scope=spfile;
ALTER SYSTEM SET ARCHIVE_DEST_1='SERVICE=192.168.1.3:1689' scope=spfile;
-- 以下参数当主备库上路径完全一致时无须配置
-- /home/yasdb/YASDB_DATA为主库路径,/home/db1/yashandb/yasdb_data为备库路径
ALTER SYSTEM SET DB_FILE_NAME_CONVERT=
'/home/db1/yashandb/yasdb_data','/home/yasdb/YASDB_DATA' scope=both;
ALTER SYSTEM SET REDO_FILE_NAME_CONVERT=
'/home/db1/yashandb/yasdb_data','/home/yasdb/YASDB_DATA' scope=both;
ALTER SYSTEM SET DB_BUCKET_NAME_CONVERT=
'/home/db1/yashandb/yasdb_data','/home/yasdb/YASDB_DATA' scope=both;
备库配置示例(重启数据库后生效)
ALTER SYSTEM SET LISTEN_ADDR=192.168.1.3:1688 scope=spfile;
ALTER SYSTEM SET REPLICATION_ADDR=192.168.1.3:1689 scope=spfile;
ALTER SYSTEM SET ARCHIVE_DEST_1='SERVICE=192.168.1.2:1689' scope=spfile;
-- 以下参数当主备库上路径完全一致时无须配置
-- /home/yasdb/YASDB_DATA为主库路径,/home/db1/yashandb/yasdb_data为备库路径
ALTER SYSTEM SET DB_FILE_NAME_CONVERT=
'/home/yasdb/YASDB_DATA','/home/db1/yashandb/yasdb_data' scope=both;
ALTER SYSTEM SET REDO_FILE_NAME_CONVERT=
'/home/yasdb/YASDB_DATA','/home/db1/yashandb/yasdb_data' scope=both;
ALTER SYSTEM SET DB_BUCKET_NAME_CONVERT=
'/home/yasdb/YASDB_DATA','/home/db1/yashandb/yasdb_data' scope=both;
Note:
所有节点均需设置转换路径转换路径,避免主备角色发生切换后,备库异常。
如果转换路径设置不正确,可能会导致备库找错文件或者误改文件。如果备库所需要的文件路径找不到,备库回放进程将挂起并上报告警,此时用户需手动执行shutdown abort关闭备库。
ARCHIVE_DEST_1一旦配置即生效,复制链路被占用且不允许修改,部署过程中如用户发现配置错误,需重新设置该参数时,直接修改将被提示YAS-02425错误,此时应该先将该参数设置为空,释放链路后再重新设为正确的值。
# 步骤4:初始化备库
备库的初始化,即对其进行与主库的数据同步,YashanDB支持通过在线传输或备份恢复的方式进行数据同步。
# 方式1:在线传输
执行此种方式的初始化要求主库为open状态,备库为nomount状态(未建库)。
在线传输方式的工作流程为:
- 用户在主库或备库上发起BUILD DATABASE命令。
- 收到命令后,主库将控制文件、数据文件、redo日志文件和归档日志文件等通过网络传输直接发送到备库,不会生成临时备份文件,效率较高。
- 备库根据收到的文件直接在线恢复。
- 备库恢复完成之后,打开数据库。
备库发起build示例
-- 以下操作均在备库上执行:
-- 检查网络是否连通,CONNECTION为CONNECTED则主备网络连接正常,为DISCONNECTED则主备网络不相通
SELECT CONNECTION,STATUS,PEER_ADDR,TRANSPORT_LAG,APPLY_LAG
FROM V$REPLICATION_STATUS;
-- 主备网络连接正常时,在备库上执行在线同步操作
BUILD DATABASE;
-- 检查备库的实例状态是否正常,STATUS应为OPEN
SELECT STATUS FROM V$INSTANCE;
-- 检查备库的状态、打开模式和角色信息是否异常,STATUS应为NORMAL,OPEN_MODE应为READ_ONLY,DATABASE_ROLE应为STANDBY
SELECT STATUS, OPEN_MODE, DATABASE_ROLE FROM V$DATABASE;
主库发起build示例
-- 以下操作在主库上执行:
-- 检查网络是否连通,CONNECTION为CONNECTED则主备网络连接正常,为DISCONNECTED则主备网络不相通,DATABASE_MODE应为STARTED
SELECT CONNECTION,STATUS,DATABASE_MODE
FROM V$ARCHIVE_DEST_STATUS
WHERE DEST_ID = 1;
-- 查询备库的DB_UNIQUE_NAME
SELECT DB_UNIQUE_NAME FROM V$ARCHIVE_DEST WHERE DEST_ID = 1;
-- 发起build,参数为备库的DB_UNIQUE_NAME
BUILD DATABASE TO STANDBY (standby1);
-- 以下操作在备库上执行:
-- 检查备库的实例状态是否正常,STATUS应为OPEN
SELECT STATUS FROM V$INSTANCE;
Note:
BUILD不允许表空间和redo中涉及文件增删或文件大小变更的操作,需要等待任一操作完成之后才可执行下一步骤。
# 方式2:备份集恢复
本方式要求先在主库上生成一份最新的全量备份,且主库在此备份开始之后的归档不被删除,否则备库恢复后,可能会因缺少归档而故障。
执行此种方式的初始化要求主库为open状态,备库为nomount状态(已建库)。
备份集恢复方式的操作步骤如下:
- 在主库上执行全量备份。
- 将备库实例重启到NOMOUNT状态。
- 将主库的备份集拷贝到备库上。
- 在备库执行RESTORE命令。
- 将数据库转换成物理备库。
- 在备库上进行RECOVER命令。
- open数据库。
示例
-- 以下操作在主库上执行:
-- 执行全量备份,生成全量备份集fulldir
BACKUP DATABASE;
-- 以下操作在备库上执行:
-- 获取主库的全量备份集fulldir,放至备库本地,例如/tmp/backup/fulldir
-- 从备份集中恢复
RESTORE DATABASE FROM '/tmp/backup/fulldir';
-- 转换成物理备库
ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
-- recover
RECOVER DATABASE;
-- 打开数据库
ALTER DATABASE OPEN;
-- 检查备库状态、打开模式和角色信息是否异常
-- STATUS应为NORMAL,OPEN_MODE应为READ_ONLY,DATABASE_ROLE应为STANDBY
SELECT STATUS, OPEN_MODE, DATABASE_ROLE FROM V$DATABASE;
-- 检查网络是否连通
-- CONNECTION为CONNECTED则主备网络连接正常,为DISCONNECTED则主备网络不相通
SELECT CONNECTION,STATUS,PEER_ADDR,TRANSPORT_LAG,APPLY_LAG
FROM V$REPLICATION_STATUS;
# 步骤5:部署后检查
备库初始化后,需要检查主备库的日志传输是否正常,及主备同步是否有延时,可在备库上执行如下操作检查:
1.查询V$INSTANCE视图,status为OPEN,表示备库正常开启。
2.查询V$DATABASE视图,status为NORMAL,log_mode为ARCHIVELOG,open_mode为READ_ONLY,database_role为STANDBY,表示备库已经创建成功,数据库运行正常且为归档模式,提供只读业务。
3.查询V$REPLICATION_STATUS视图,如果connection为CONNECTED,status为NORMAL,peer_mode为OPEN,peer_addr为主库的IP,则主备同步正常;如果status为NEED REPAIR,主库误删归档文件,需要手动修复。如果transport_lag与apply_lag的值均为0,表示备库同步主库的日志和自身应用日志均无延时情况,同步正常;如果不为0,尝试切换一两个日志,再看是否为0,否则需要重新初始化备库。
SELECT * FROM V$INSTANCE;
SELECT database_id, database_name, status, log_mode, open_mode, database_role
FROM V$DATABASE;
SELECT connection, status, peer_mode, peer_addr, transport_lag, apply_lag
FROM V$REPLICATION_STATUS;
此外,还可以通过在主库中创建表、插入数据,提交事务,然后在备库查看表数据信息,确认主备库数据同步是否正常。