#一主一备配置
本文所述一主一备配置基于主库已完成安装的场景,部署过程中可能需要重启数据库,若主库为正在使用的生产环境,请确保在可对其执行重启的时间段内进行主备部署。
# 步骤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,每个参数表示一个备库的链路属性),需在REPLICATION_ADDR参数配置生效后再进行配置。 ARCHIVE_DEST_XXX参数一旦配置立即生效,相应复制链路会被占用且不允许直接修改(直接修改将报YAS-02425错误)。如需重新配置该参数,应先将该参数置空,释放链路后再重新设置为正确的值。 |
DB_FILE_NAME_CONVERT | 主备数据文件路径不同时必须配置 | 对端到本机的数据文件转换路径,支持递归转换。 |
REDO_FILE_NAME_CONVERT | 主备日志文件路径不同时必须配置 | 对端到本机的日志文件转换路径,支持递归转换。 |
DB_BUCKET_NAME_CONVERT | 主备bucket路径不同时必须配置 | 对端到本机的LSC表的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参数重启数据库后生效,其他立即生效
ALTER SYSTEM SET LISTEN_ADDR=192.168.1.2:1688 scope=spfile;
ALTER SYSTEM SET REPLICATION_ADDR=192.168.1.2:1689 scope=spfile;
-- ARCHIVE_DEST_XXX参数在REPLICATION_ADDR参数重启生效后再进行设置
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关闭备库。
# 步骤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:部署后检查
备库初始化后,需要检查主备库的日志传输是否正常,及主备同步是否有延时,可在备库上执行如下操作检查:
查询V$INSTANCE视图,status为OPEN,表示备库正常开启。
查询V$DATABASE视图,status为NORMAL,log_mode为ARCHIVELOG,open_mode为READ_ONLY,database_role为STANDBY,表示备库已经创建成功,数据库运行正常且为归档模式,提供只读业务。
查询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;
此外,还可以通过在主库中创建表、插入数据,提交事务,然后在备库查看表数据信息,确认主备库数据同步是否正常。