搭建读写分离一主一实一备集群
1.1 读写分离集群的特性及原理
读写分离集群其实是主备集群的升级版本,在双机热备的基础上把用户写和度的会话事务分别放在主库和备库上执行。写事务会被分发到主库上执行,读事务则分发到备库上执行。由接口负责读写事务的分发。读写分离集群是基于即时归档实现的高性能数据库集群,不但提供数据保护、容灾等数据守护基本功能,还具有读写操作自动分离、负载均衡等特性。读写分离集群最多可以配置8 个即时备库,提供数据同步、备库故障自动处理、故障恢复自动数据同步等功能,也支持自动故障切换和手动故障切换两种守护模式。
在一个高并发的事务型系统中,当写事务占的比例相对读事务相对较小时,可以借助DM8 的主备系统备机可读的特点,将读事务转移到备机执行,减少单节点的并发压力,通过增加备机节点资源,提高系统的并发能力,增强系统性能。理论上说,在允许的范围内,备机配置的越多,更能分担主机的压力,系统整体并发效率越高。读写分离系统适用于读写比例较大的应用系统,读写比例越大对系统性能提升越明显。对于一般简单应用业务来讲,若需要使用读写分离系统提升系统性能,读写比例最少要大于1:1。
根据读写分离的事务特性,在业务允许条件下最好将具有读又有写的事务拆分成纯度和纯写的事务。读操作尽量放在写操作之前,利用备机的可读特点来分摊系统压力。 写操作后尽量不要有读操作,避免压力集中在主机,影响性能。因为纯读操作的事务全部在备机执行。纯写操作的事务全部在主机执行。有读有写的事务放在主机上执行。
1.2 环境配置
1.2.1 环境参数设置
准备四台机器主1、备2、备3、监视器,主1、备2 和 备3用来部署主备库,监视器用来部署确认监视器。其中主1、备2、备3配置两块网卡,一块接入内部网络交换模块,一块接入到外部交换机,DW_M接入内部网络。 四台机器事先都安装了DM,安装路径为'/dm1',执行程序保存在'/dm1/bin'目录中,数据存放路径为'/dm1/data'。
表7.3 配置环境说明
机器名 IP地址 初始状态 操作系统 备注
主1 192.168.38.131 192.168.38.136 192.168.38.131外部服务IP; 192.168.38.136内部通信IP
备2 192.168.38.132 192.168.38.137 192.168.1.132外部服务IP; 192.168.38.137内部通信IP
备3 192.168.38.134 192.168.38.138 备库 192.168.38.134外部服务IP; 192.168.38.138内部通信IP
DW_M 192.168.38.133 确认监视器
GRP1_RWW_01 32141 33141 192.168.0.141 61141 52141
GRP1_RWW_02 32142 33142 192.168.0.142 61142 52142
GRP1_RWW_03 32143 33143 192.168.0.143 61143 52143
数据准备
DW_P机器上初始化库至目录/dm1/data: /dminit path=/dm1/data
1.配置dm.ini,打开ARCH_INI参数
ARCH_INI = 1 #打开归档配置
2.配置dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm/data/DAMENG/arch
ARCH_FILE_SIZE = 128
#本地归档文件存放路径
#单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0
#单位Mb,0表示无限制,范围1024~2147483647M
1.2.2 配置主库ZHU
配置dm.ini:
在DW_P机器上配置主库的实例名为ZHU,dm.ini参数修改如下:
#实例名,建议使用“组名_守护环境_序号”的命名方式,总长度不能超过16
INSTANCE_NAME = ZHU
PORT_NUM = 32131 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库OFFLINE表空间
MAL_INI = 1 #打开MAL系统
ARCH_INI = 1 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近64次的日志发送信息
配置dmmal.ini
配置MAL系统,各主备库的dmmal.ini配置必须完全一致,MAL_HOST使用内部网络IP,MAL_PORT与dm.ini中PORT_NUM使用不同的端口值,MAL_DW_PORT是各实
例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:
MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定MAL链路断开的时间
[MAL_INST1]
MAL_INST_NAME = ZHU #实例名,和dm.ini中的INSTANCE_NAME一致
MAL_HOST = 192.168.38.136 #MAL系统监听TCP连接的IP地址
MAL_PORT = 61131 #MAL系统监听TCP连接的端口
MAL_INST_HOST = 192.168.38.131 #实例的对外服务IP地址
MAL_INST_PORT = 32131 #实例的对外服务端口,和dm.ini中的PORT_NUM一致
MAL_DW_PORT = 52131 #实例对应的守护进程监听TCP连接的端口
MAL_INST_DW_PORT = 33131 #实例监听守护进程TCP连接的端口
[MAL_INST2]
MAL_INST_NAME = BEI1
MAL_HOST = 192.168.38.137
MAL_PORT = 61132
MAL_INST_HOST = 192.168.38.132
MAL_INST_PORT = 32132
MAL_DW_PORT = 52132
MAL_INST_DW_PORT = 33132
[MAL_INST3]
MAL_INST_NAME = BEI2
MAL_HOST = 192.168.38.138
MAL_PORT = 61135
MAL_INST_HOST = 192.168.38.135
MAL_INST_PORT = 32135
MAL_DW_PORT = 52135
MAL_INST_DW_PORT = 33135
配置dmarch.ini
修改dmarch.ini,配置本地归档和即时归档。
除了本地归档外,其他归档配置项中的ARCH_DEST表示实例是Primary模式时,需
要同步归档数据的目标实例名。
当前实例ZHU是主库,需要向即时备库BEI1/ BEI2同步数据,因此即时归档的ARCH_DEST分别配置为BEI1和BEI2。
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = BEI1 #即时归档目标实例名
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = BEI2 #即时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm1/data/DAMENG/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位Mb,0表示无限制,范围1024~2147483647M
配置dmwatcher.ini :
修改dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453332 #守护系统唯一OGUID值
INST_INI = /dm1/data/ZHU /dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
以mount方式启动主库./dmserver /主库的dm.ini路径
修改oguid参数:
ZHU设置为primary模式:
异步的修改:
配置dmtimer.ini
配置dmtimer.ini,用于定时触发实例发送归档日志到异步备库。
下面示例中定时器配置为每天00:00:00触发主库发送归档日志到异步备库,可以根据实际情况再做调整。
[RT_TIMER] #和dmarch.ini中的ARCH_TIMER_NAME一致
TYPE = 2
FREQ_MONTH_WEEK_INTERVAL = 1
FREQ_SUB_INTERVAL = 0
FREQ_MINUTE_INTERVAL = 0
START_TIME = 00:00:00
END_TIME = 00:00:00
DURING_START_DATE = 2016-02-11 17:36:09
DURING_END_DATE = 9999-12-31 23:59:59
NO_END_DATE_FLAG = 1
DESCRIBE = RT TIMER
IS_VALID = 1
1.2.3 配置备库BEI1
配置dm.ini 在DW_S1机器上配置备库的实例名为GRP1_RWW_02,dm.ini参数修改如下: #实例名,建议使用“组名_守护环境_序号”的命名方式,总长度不能超过16
INSTANCE_NAME = GRP1_RWW_02
PORT_NUM = 32142 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间 ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID ENABLE_OFFLINE_TS = 2 #不允许备库OFFLINE表空间
MAL_INI = 1 #打开MAL系统
ARCH_INI = 1 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近64次的日志重演信息
配置dmmal.ini
配置MAL系统,各主备库的dmmal.ini配置必须完全一致,MAL_PORT与dm.ini中PORT_NUM使用不同的端口值,MAL_DW_PORT是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下(和前面的dmmal.ini一样,可以直接复制文件):
MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定MAL链路断开的时间
[MAL_INST1]
MAL_INST_NAME = ZHU #实例名,和dm.ini中的INSTANCE_NAME一致
MAL_HOST = 192.168.38.136 #MAL系统监听TCP连接的IP地址
MAL_PORT = 61131 #MAL系统监听TCP连接的端口
MAL_INST_HOST = 192.168.38.131 #实例的对外服务IP地址
MAL_INST_PORT = 32131 #实例的对外服务端口,和dm.ini中的PORT_NUM一致
MAL_DW_PORT = 52131 #实例对应的守护进程监听TCP连接的端口
MAL_INST_DW_PORT = 33131 #实例监听守护进程TCP连接的端口
[MAL_INST2]
MAL_INST_NAME = BEI1
MAL_HOST = 192.168.38.137
MAL_PORT = 61132
MAL_INST_HOST = 192.168.38.132
MAL_INST_PORT = 32132
MAL_DW_PORT = 52132
MAL_INST_DW_PORT = 33132
[MAL_INST3]
MAL_INST_NAME = BEI2
MAL_HOST = 192.168.38.138
MAL_PORT = 61135
MAL_INST_HOST = 192.168.38.135
MAL_INST_PORT = 32135
MAL_DW_PORT = 52135
MAL_INST_DW_PORT = 33135
配置dmarch.ini
修改dmarch.ini,配置本地归档和即时归档。
除了本地归档外,其他归档配置项中的ARCH_DEST表示实例是Primary模式时,需要同步归档数据的目标实例名。
当前实例GRP1_RWW_02是备库,守护系统配置完成后,可能在各种故障处理中,GRP1_RWW_02切换为新的主库,正常情况下,GRP1_RWW_01会切换为新的备库,需要向GRP1_RWW_01和GRP1_RWW_03同步数据,因此即时归档的ARCH_DEST分别配置为GRP1_RWW_01和GRP1_RWW_03。(即时归档这里归向别的库,自然是配置成别的库)
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = BEI1 #即时归档目标实例名
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = BEI2 #即时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm1/data/DAMENG/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位Mb,0表示无限制,范围1024~2147483647M
配置dmwatcher.ini
修改dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453332 #守护系统唯一OGUID值
INST_INI = /opt/dm1/data/DAMENG/dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
启动备库 以Mount方式启动备库。 ./dmserver /dm/data/DAMENG/dm.ini mount
设置 OGUID 启动命令行工具DIsql,登录备库设置OGUID值。 SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SQL>sp_set_oguid(453332);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
修改数据库模式 启动命令行工具DIsql,登录备库修改数据库为Standby模式。 如果当前数据库不是Normal模式,需要先修改dm.ini中ALTER_MODE_STATUS值 为1,允许修改数据库模式,修改Standby模式成功后再改回为0。如果是Normal模式, 请忽略下面的第1步和第3步。
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>alter database standby;
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
备库的异步修改
dm.ini中的TIMER_INI改为1
dmmal.ini中添加新的字段
[MAL_INST3]
MAL_INST_NAME = yzh_yi_1 #实例名,和dm.ini中的INSTANCE_NAME
一致
MAL_HOST = 192.168.38.138 #MAL系统监听TCP连接的IP地址
MAL_PORT = 61143 #MAL系统监听TCP连接的端口
MAL_INST_HOST = 192.168.38.135 #实例的对外服务IP地址
MAL_INST_PORT = 32143 #实例的对外服务端口,和dm.ini中的PORT_NUM一致
MAL_DW_PORT = 52143 #实例对应的守护进程监听TCP连接的端口
MAL_INST_DW_PORT = 33143 #实例监听守护进程TCP连接的端口
配置dmtimer.ini
配置dmtimer.ini,用于定时触发实例发送归档日志到异步备库。
下面示例中定时器配置为每天00:00:00触发主库发送归档日志到异步备库,可以根据
实际情况再做调整。
[RT_TIMER] #和dmarch.ini中的ARCH_TIMER_NAME一致
TYPE = 2
FREQ_MONTH_WEEK_INTERVAL = 1
FREQ_SUB_INTERVAL = 0
FREQ_MINUTE_INTERVAL = 0
START_TIME = 00:00:00
END_TIME = 00:00:00
DURING_START_DATE = 2016-02-11 17:36:09
DURING_END_DATE = 9999-12-31 23:59:59
NO_END_DATE_FLAG = 1
DESCRIBE = RT TIMER
IS_VALID = 1
1.2.4 配置异步备库
异步库的数据准备:
将主库的数据库备份过来,然后进行还原操作
restore database '/opt/dmdbms/data/yhz_yi_1/DAMENG/dm.ini' from backupset '/home/dmdba/Desktop/DB_yzh_zhu_1_FULL_20240527_013419_157693'
配置 dm.ini :
在DW_S2机器上配置备库的实例名为GRP1_RWW_03,dm.ini参数修改如下:
#实例名,建议使用“组名_守护环境_序号”的命名方式,总长度不能超过16
INSTANCE_NAME = BEI2
PORT_NUM = 32143 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60
#接收守护进程消息超时时间
ALTER_MODE_STATUS = 0
#不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2
#不允许备库OFFLINE表空间
MAL_INI = 1
#打开MAL系统
ARCH_INI = 1
#打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近64次的日志重演信息
TIMER_INI = 1 #打开定时器,定时同步归档到异步备库。目的是使GRP1_LOCAL_01 能够定时发送归档信息到GRP1_LOCAL_02。
配置MAL系统:
各主备库的dmmal.ini配置必须完全一致,MAL_HOST使用内部网 络IP,MAL_PORT与dm.ini中PORT_NUM使用不同的端口值,MAL_DW_PORT是各实 例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:
MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定MAL链路断开的时间
[MAL_INST1]
MAL_INST_NAME = ZHU #实例名,和dm.ini中的INSTANCE_NAME一致
MAL_HOST = 192.168.38.136 #MAL系统监听TCP连接的IP地址
MAL_PORT = 61131 #MAL系统监听TCP连接的端口
MAL_INST_HOST = 192.168.38.131 #实例的对外服务IP地址
MAL_INST_PORT = 32131 #实例的对外服务端口,和dm.ini中的PORT_NUM一致
MAL_DW_PORT = 52131 #实例对应的守护进程监听TCP连接的端口
MAL_INST_DW_PORT = 33131 #实例监听守护进程TCP连接的端口
[MAL_INST2]
MAL_INST_NAME = BEI1
MAL_HOST = 192.168.38.137
MAL_PORT = 61132
MAL_INST_HOST = 192.168.38.132
MAL_INST_PORT = 32132
MAL_DW_PORT = 52132
MAL_INST_DW_PORT = 33132
[MAL_INST3]
MAL_INST_NAME = BEI2
MAL_HOST = 192.168.38.138
MAL_PORT = 61135
MAL_INST_HOST = 192.168.38.135
MAL_INST_PORT = 32135
MAL_DW_PORT = 52135
MAL_INST_DW_PORT = 33135
配置dmarch.ini
修改dmarch.ini,配置本地归档和即时归档。
除了本地归档外,其他归档配置项中的ARCH_DEST表示实例是Primary模式时,需
要同步归档数据的目标实例名。
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = BEI1 #即时归档目标实例名
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = ZHU #即时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm1/data/DAMENG/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位Mb,0表示无限制,范围1024~2147483647M
配置 dmtimer.ini
配置dmtimer.ini,用于定时触发实例发送归档日志到异步备库。
下面示例中定时器配置为每天00:00:00触发GRP1_LOCAL_01 发送归档日志到异步
备库GRP1_LOCAL_02,可以根据实际情况再做调整。
[RT_TIMER] #和dmarch.ini中的ARCH_TIMER_NAME一致
TYPE = 2
FREQ_MONTH_WEEK_INTERVAL = 1
FREQ_SUB_INTERVAL = 0
FREQ_MINUTE_INTERVAL = 0
START_TIME = 00:00:00
END_TIME = 00:00:00
DURING_START_DATE = 2016-02-11 17:36:09
DURING_END_DATE = 9999-12-31 23:59:59
NO_END_DATE_FLAG = 1
DESCRIBE = RT TIMER
IS_VALID = 1
配置dmwatcher.ini
修改dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453332 #守护系统唯一OGUID值
INST_INI = /dm/data/DAMENG/dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
启动备库 以Mount方式启动备库 ./dmserver /dm/data/DAMENG/dm.ini mount
设置 OGUID 启动命令行工具DIsql,登录备库设置OGUID值。 SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SQL>sp_set_oguid(453332); SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
修改数据库模式 启动命令行工具DIsql,登录备库修改数据库为Standby模式 如果当前数据库不是Normal模式,需要先修改dm.ini中ALTER_MODE_STATUS值 为1,允许修改数据库模式,修改Standby模式成功后再改回为0。如果是Normal模式, 请忽略下面的第1步和第3步。 SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SQL>alter database standby; //第1步 //第2步 SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0); //第3步
1.2.5 配置监视器
为每个实例配置一个dmmonitor.ini。众多dmmonitor.ini中,除MON_ID参数不同
以外,其他参数应完全一致。
以其中一个实例的dmmonitor.ini为例进行介绍。各实例的MON_ID与
MON_LOG_PATH = /home/dmdba/Desktop
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 0
MON_DW_CONFIRM = 1
MON_INST_NUM = 3 #实例总个数
MON_HB_INTERVAL = 60 #通信心跳校验间隔
MON_BRO_INTERVAL = 100 #raft协议中实例通信心跳间隔
MON_VOTE_INTERVAL = 100 #raft协议中基础投票间隔
MON_ID = 1 #当前监视器在监视器系统中的ID
MON_MID = 45614 #当前监视器系统的唯一标识
[GRP1]
MON_INST_OGUID = 453332
MON_DW_IP = 192.168.38.136:52131
MON_DW_IP = 192.168.38.137:52132
MON_DW_IP = 192.168.38.138:52135
[MON1]
MON_HOST = 192.168.38.133 #系统监听TCP连接的IP地址
MON_PORT = 8339 #系统监听TCP连接的端口号
MON_INST_ID = 1 #监视器实例在监视器系统中的ID
[MON2]
MON_HOST = 192.168.38.133
#系统监听TCP连接的IP地址
MON_PORT = 8340
#系统监听TCP连接的端口号
MON_INST_ID = 2
#监视器实例在监视器系统中的ID
[MON3]
MON_HOST = 192.168.38.133
#系统监听TCP连接的IP地址
MON_PORT = 8341
#系统监听TCP连接的端口号
MON_INST_ID = 3
#监视器实例在监视器系统中的ID
启动各个守护(注:dmwatcher的启动是在bin目录下./dmwatcher /dmwatcher的路径)和监视器,在监视器中查看
1.3 监视器查看
在监视器中用show命令查看
switchover进行转化:
注:这里面需要注意的是这样的集群逻辑上需要保证只操作一个库,所以备库上的库需要备份还原过去,以保证主备库中的永久魔数相同,否则当数据库都以mount方式启动后无法自行转化为open状态,这里就是数据库不一致导致的。
文章
阅读量
获赞