DM-数据守护之实时主备环境配置

术语

数据库模式

  • Normal 模式 :提供正常的数据库服务,操作没有限制。正常生成本地归档,但不发送实时归档(Realtime)、即时归档(Timely)和异步归档(Async)。

  • Primary 模式:提供正常的数据库服务,操作有极少限制。该模式下部分功能受限,包括:不支持修改表空间文件名、不支持修改 arch_ini 参数。正常生成本地归档,支持实时归档(Realtime)、即时归档(Timely)和异步归档(Async)。Primary 模式下,对临时表空间以外的所有的数据库对象的修改操作都强制生成Redo 日志

  • Standby 模式:可以执行数据库备份、查询等只读数据库操作。正常生成本地归档,正常发送异步归档Redo 日志;但实时归档(Realtime)、即时归档(Timely)均强制失效。该模式下时间触发器、事件触发器等都失效。

模式切换

必须在 Mount 状态下执行alter SQL命令

-- 将数据库切换为 Primary 模式
ALTER DATABASE PRIMARY;
-- 将数据库切换为 Standby 模式
ALTER DATABASE STANDBY;
-- 将数据库切换为 Normal 模式
ALTER DATABASE NORMAL;

数据库状态

  • Startup 状态: 刚启动时设置为 Startup 状态

  • After Redo 状态:启动过程中联机日志重做完成后,回滚活动事务前设置为 After Redo 状态。非 Standby 模式的实例在执行 alter database open 操作前,也会将系统设置为 After Redo 状态。

  • Open 状态:数据库处于正常提供服务的状态,但不能进行归档配置等操作

  • Mount 状态:数据库在 Mount 状态下,不能修改数据,不能访问表、视图等数据库对象,但可以执行修改归档配置、控制文件和修改数据库模式等操作,也可以执行一些不修改数据库内容的操作,比如查询动态视图或者一些只读的系统过程。由于 Mount 状态不生成 PWR(Page Written Record) 日志,因此数据页可以正常刷盘,也正常推进检查点。

    • PWR: REDO 日志中包含有一种特殊的记录,称为PWR。PWR 日志包含表空间ID、文件ID、数据在文件中的页号和页的当前LSN信息。每次数据页刷盘时,系统都会生成一条对应的PWR日志。
    • 系统从 Open 状态切换为 Mount 状态时,会强制回滚所有活动事务,但不会强制清理(Purge)已提交事务,不会强制断开用户连接,也不会强制 Buffer 中的脏页刷盘。
  • Suspend 状态:数据库在 Suspend 状态下,可以访问数据库对象,甚至可以修改数据,但限制 Redo 日志刷盘,一旦执行 COMMIT 等触发 Redo 日志刷盘的操作时,当前操作将被挂起。

    • Open 到 Suspend 的状态切换更加简单、高效,不会回滚任何活动事务,在状态切换完成后,所有事务可以继续执行。
  • Shutdown 状态:实例正常退出时设置为 Shutdown 状态。

数据库状态切换

不同数据库状态之间的转换规则如下图:

image-20210514213455913

  1. Open 状态与 Mount 状态可以相互切换
  2. Open 状态与 Suspend 状态可以相互切换
  3. Mount 和 Suspend 状态不能直接转换
切换SQL命令
-- 将数据库修改为 Open 状态。当系统处于 Primary/Standby 模式时,必须强制加上 FORCE 子句。
ALTER DATABASE OPEN [FORCE];

-- 将数据库修改为 Mount 状态。
ALTER DATABASE MOUNT;

--  将数据库修改为 Suspend 状态
ALTER DATABASE SUSPEND;

注意:

由于dmwatcher根据数据库模式、状态等信息作为故障处理、故障恢复的依据,建议在配置数据守护过程中,修改dm.ini参数ALTER_MODE_STATUS为0,限制用户直接通过SQL语句修改数据库状态、模式以及OGUID,避免dmwatcher做出错误的决策。

LSN(Log Sequence Number)

由DM数据库系统自动维护的 Bigint 类型数值,具有自动递增、全局唯一特性,每一个 LSN 值代表着 DM 系统内部产生的一个物理事务。物理事务(Physical Transaction,简称 ptx)是数据库内部一系列修改物理数据页操作的集合,与数据库管理系统中事务(Transaction)概念相对应,具有原子性、有序性、无法撤销等特性。

Redo 日志包(RLOG_PKG)

Redo 日志包(RLOG_PKG)是 DM 数据库批量保存物理事务产生的 Redo 日志的数据单元,以物理事务 PTX 为单位保存日志,一个日志包内可连续保存一个或多个 PTX。日志包具有自描述的特性,日志包大小不固定,采用固定包头和可变包头结合的方式,包头记录日志的控制信息,包括类型、长度、包序号、LSN 信息、产生日志的节点号、加密压缩信息、日志并行数等内容

物理事务提交时将 Redo 日志写入到日志包中,在数据库事务提交或日志包被写满时触发日志刷盘动作。日志刷盘线程负责将日志包中的 Redo 日志写入联机日志文件,如果配置了 Redo 日志归档,日志刷盘线程还将负责触发归档动作。DM 数据守护系统中,主库以RLOG_PKG为最小单位发送 Redo 日志到备库。

包序号

每个 RLOG_PKG 都有对应的序号属性,称之为包序号(PKG SEQNO),日志包生成时按照序号连续递增。包序号包括本地包序号(LSEQ)和全局包序号(GSEQ),本地包序号是节点内唯一、连续递增的值,用于校验联机日志连续性;全局包序号由数据守护集群的主备库共同维护,具有全局唯一、连续、递增的特性,用于校验归档日志的连续性。

Redo 日志包(KEEP_PKG)

主库的RLOG_PKG日志通过实时归档机制发送到备库后,备库将最新收到的RLOG_PKG保存在内存中,不马上启动重演,这个 RLOG_PKG 称之为 KEEP_PKG。

MAL 机制

基于 TCP 协议实现的一种内部通信机制,具有可靠、灵活、高效的特性。DM 通过 MAL 系统实现 Redo 日志传输,以及其他一些实例间的消息通讯。

MAL链路类型

  • 控制链路
  • 数据链路

OGUID

数据守护唯一标识码,配置数据守护时,需要由用户指定 OGUID 值。其中数据库的OGUID 在 MOUNT 状态下由系统函数 SP_SET_OGUID 设置,守护进程和监视器的 OGUID 值在各自的配置文件中设定。
同一守护进程组中的所有数据库、守护进程和监视器,都必须配置相同的 OGUID 值,取值范围为0~2147483647。

设置

SP_SET_OGUID(655366);

OGUID 的查询方式

SELECT OGUID FROM V$INSTANCE;

守护进程组

配置了相同 OGUID 的两个或多个守护进程,构成一个守护进程组。

组分裂

组分裂:指同一守护进程组中,不同数据库实例的数据出现不一致,并且无法通过重演 Redo 日志重新同步数据的情况

引发组分裂的主要原因
  1. 即时归档中,主库在将 Redo 日志写入本地联机 Redo 日志文件之后,发送 Redo日志到备库之前出现故障,导致主备库数据不一致,为了继续提供服务,执行备库强制接管。此时,当故障主库重启后,就会引发组分裂。
  2. 故障备库重新完成数据同步之前,主库硬件故障,并且长时间无法恢复;在用户接受丢失部分数据情况下,为了尽快恢复数据库服务,执行备库强制接管,将备库切换为主库。此时,如果故障主库重启,也会造成组分裂

检测到组分裂后,守护进程会修改控制文件为分裂状态,被分裂出去的数据库需要通过备份还原等技术手段重新恢复。

脑裂

脑裂是同一个守护进程组中同时出现两个或者多个活动主库,并且这些主库都接收用户请求,提供完整数据库服务。一旦发生脑裂,将无法保证数据一致性,对数据安全造成严重后果。

守护进程一旦检测到脑裂发生,会马上强制退出主库,等待用户干预,避免数据差异进一步扩大。

造成脑裂的主要原因
  1. 网络不稳定
  2. 错误的人工干预
建议:
  1. 设置 dm.ini 参数 ALTER_MODE_STATUS=0,限制用户进行直接通过 SQL 修改数据库模式、状态以及 OGUID。
  2. 提供稳定、可靠的网络环境。
  3. 配置自动切换数据守护时,将确认监视器部署在独立的第三方机器上,不要与某一个数据库实例部署在一起,避免由于网络问题触发自动故障切换,导致脑裂发生。
  4. 通过人工干预,将备库切换为主库之前,一定要确认主库已经发生故障,避免主库活动情况下,备库强制接管,人为造成脑裂。

实时主备

组成

实时主备系统由主库、实时备库、守护进程和监视器组成。

守护进程(dmwatcher)

守护进程(dmwatcher)是 DM 数据守护系统不可或缺的核心部件,是数据库实例和监视器之间信息流转的桥梁。数据库实例向本地守护进程发送信息,接收本地守护进程的消息和命令。

守护进程解析并执行监视器发起的各种命令(Switchover/Takeover/Open database 等),并在必要时通知数据库实例执行相应的操作。

功能

守护进程提供了数据库监控、故障检测、故障处理、故障恢复等各种功能。

守护类型

  • 本地守护:提供最基本的守护进程功能,监控本地数据库服务。如果实例使用 Mount 方式启动,守护进程会通知实例自动 Open,如果连续一段时间没有收到来自其监控数据库的消息,即认定数据库出现故障,根据配置(INST_AUTO_RESTART)确定是否使用配置的启动命令重启数据库服务。
  • 全局守护:在本地守护类型的基础上,通过和远程守护进程的交互,增加了主备库切换、主备库故障检测、备库接管、数据库故障重加入等功能
    • 实时主备、MPP 主备和读写分离集群系统中,需要将守护进程配置为全局守护类型。守护进程根据数据库服务器配置的归档类型以及 MPP_INI 参数情况,自动识别具体的集群类型

守护模式(故障切换模式)

  • 故障自动切换:主库发生故障时,确认监视器自动选择一个备库,切换为主库对外提供服务。故障自动
    切换模式,要求必须且只能配置一个(第三方)确认监视器

  • 故障手动切换:主库发生故障时,由用户根据实际情况,通过监视器命令将备库切换为主库。在用户干预之前,备库可以继续提供只读服务和临时表的操作。

守护进程的状态转换

守护进程主要工作在 Startup 和 Open 状态,几乎任何状态都可以转到这两种状态,并且这两种状态之间也可以相互转换。

image-20210514224132737

守护进程命令

命令 说明
help 显示帮助信息
exit 退出守护进程
status 显示守护进程运行状态信息
show 显示所有守护进程组中的本地库信息
show group group_name 显示指定守护进程组中的本地库信息
show version 显示守护进程自身版本信息
show monitor config 显示监视器配置 ini 文件的信息
show link 显示守护进程上的 tcp 连接信息

监视器(dmmonitor)

监视器(dmmonitor)接收守护进程的消息,并向守护进程发送命令;数据库实例与监视器之间没有直接的消息交互。一个数据守护集群,只能配置一个确认监视器

监视器(dmmonitor)是基于监视器接口(详见 9.2 监视器接口)实现的一个命令行工具。

通过监视器,可以监控数据守护系统的运行情况,获取主备库状态、守护进程状态以及主备库数据同步情况等信息。同时,监视器(dmmonitor)还提供了一系列命令来管理数据守护系统。

对于实时主备和读写分离集群,监视器只允许配置一个守护进程组

监视器的基本作用

  • 监控数据守护:接收守护进程发送的消息,显示主、备数据库状态变化,以及故障切换过程中,数据库模式、状态变化的完整过程
  • 管理数据守护:在监视器上输入命令,启动、停止守护进程的监控功能,执行主备库切换、备库故障接管等操作
  • 确认状态信息:用于故障自动切换的数据守护系统中,主、备库进行故障处理之前,需要通过监视器进行信息确认,确保对应的备库或者主库是真的产生异常了,避免主备库之间网络故障引发脑裂
  • 发起故障自动接管命令:用于故障自动切换的数据守护系统中,主库发生故障时,挑选符合接管条件的备库并通知备库执行接管操作

监视器类型

监视器支持两种运行模式:

  • 监控模式:一个数据守护系统中,最多允许同时启动 10 个监视器,所有监视器都可以接收守护进程消息,获取守护系统状态。所有监视器都可以发起 Switchover 等命令,但守护进程一次只能接收一个监视器的命令,在一个监视器命令执行完成之前,守护进程收到其他监视器发起的请求,会直接报错返回
  • 确认模式:确认监视器接收守护进程消息,获取数据守护系统状态,也可以执行各种监控命令。它除了具备监控模式监视器所有功能之外,确认监视器还具有状态确认和自动接管两个功能。
    • 一个数据守护系统中,只能配置 1 个确认监视器
    • 故障自动切换模式的数据守护系统,必须部署一个确认监视器,否则在出现数据库故障时,会导致数据库服务中断。
配置监视器类型

监视器运行模式由配置文件(dmmonitor.ini)的 MON_DW_CONFIRM 参数来确定。

  • MON_DW_CONFIRM 参数的默认值是 0,表示监视器运行在监控模式
  • MON_DW_CONFIRM 参数值为 1 时,表示监视器运行在确认模式

自动接管

故障自动切换模式下,确认监视器检测到主库故障后,根据收到的主备库 LSN、归档状态、MAL 链路状态等信息,确定一个接管备库,并将其切换为主库。

触发自动接管的场景

确认监视器启动自动接管流程的主要场景有三种,任何一种都会导致备库自动接管。

  1. 主库数据库实例异常终止,主库守护进程正常。
  2. 主库硬件故障、或者数据库实例和守护进程同时故障
  3. 主库网络故障,主备库之间、主库与监视器之间连接异常

image-20210514230016591

监视器命令

监视器 LOG 日志

监视器 LOG 日志记录监视器自己的信息和守护进程的本地信息,在 LOG 日志中分别以[monitor] 和 [ 守 护 进 程 本 地 的 实 例 名 ] 开 头 。

命名格式

监 视 器 LOG 日 志 的 命 名 格 式 为“dmmonitor_年月日时分秒.log”,例“dmmonitor_20160418230523.log”。

日志路径

LOG日志的路径通过 dmmonitor.ini 文件中 MON_LOG_PATH 来设置,如果没有设置则和dmmonitor.ini 在同一个目录下

数据准备

配置数据守护 V4.0 之前,必须先通过备份还原方式同步各数据库的数据,确保各数据的数据保持完全一致。主库可以是新初始化的数据库,也可以是正在生产、使用中的数据库。

不能使用分别初始化库或者直接拷贝数据文件的方法,原因如下:

  1. 每个库都有一个永久魔数(permenant_magic),一经生成,永远不会改变,主库传送日志时会判断这个值是否一样,确保是来自同一个数据守护环境中的库,否则传送不了日志。
  2. 由于 dminit 初始化数据库时,会生成随机密钥用于加密,每次生成的密钥都不相同,备库无法解析采用主库密钥加密的数据。
  3. 每个库都有一个数据库魔数(DB_MAGIC),每经过一次还原、恢复操作,DB_MAGIC就会产生变化,需要通过这种方式来区分同一个数据守护环境中各个不同的库

注意

  • 对于新初始化的库,首次启动不允许使用 Mount 方式,需要先正常启动并正常退出,然后才允许 Mount 方式启动
  • 如果需要使用 Huge 表,在初始化库时需要将建库参数 HUGE_WITH_DELTA 和RLOG_GEN_FOR_HUGE 都配置为 1
  • 准备数据时,如果主库是新初始化的库,先正常启动并正常退出,然后再使用备份还原方式准备备库数据

方式

如果是初始搭建环境,可以通过对主库脱机备份、对备库脱机还原的方式来准备数据,如果主库已经处于运行状态,则可以对主库进行联机备份、对备库脱机还原的方式来准备数据。==两种方式都需要配置本地归档

  • 脱机备份、脱机还原方式
  • 联机备份、脱机还原方式

流程

脱机备份、脱机还原方式
  1. 正常关闭数据库

  2. 进行脱机备份

    $MD_HOME/bin/dmrman CTLSTMT="BACKUP DATABASE '/dm/data/DAMENG/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/dm/data/BACKUP_FILE_01'"
    
  3. 拷贝备份文件到备库所在机器

  4. 执行脱机数据库还原与恢复

    $MD_HOME/bin/dmrman CTLSTMT="RESTORE DATABASE '/dm/data/DAMENG/dm.ini' FROM BACKUPSET '/dm/data/BACKUP_FILE_01'"
    $MD_HOME/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm/data/DAMENG/dm.ini' FROM BACKUPSET '/dm/data/BACKUP_FILE_01'"
    $MD_HOME/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm/data/DAMENG/dm.ini' UPDATE DB_MAGIC"
    
联机备份、脱机还原方式
  1. 对主库进行联机备份操作

    BACKUP DATABASE BACKUPSET '/dm/data/BACKUP_FILE_01';
    
  2. 拷贝备份文件到备库所在机器

  3. 执行脱机数据库还原与恢复

    $MD_HOME/bin/dmrman CTLSTMT="RESTORE DATABASE '/dm/data/DAMENG/dm.ini' FROM BACKUPSET '/dm/data/BACKUP_FILE_01'"
    
    $MD_HOME/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm/data/DAMENG/dm.ini' FROM BACKUPSET
    '/dm/data/BACKUP_FILE_01'"
    
    $MD_HOME/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm/data/DAMENG/dm.ini' UPDATE DB_MAGIC"
    

前期准备

环境规划

用途 IP地址 实例名称 操作系统
主库 192.168.10.180(外部服务)
192.168.0.71(内部通信)
ITZS01 kylin10
备库 192.168.10.181(外部服务)
192.168.0.72(内部通信)
ITZS02 kylin10
第三方确认监视器(可选) 192.168.0.70(内部通信) kylin10

主备库的实例名建议采用 组名_守护环境集群类型_序号 的方式命名,方便按组区分不同实例,注意总长度不能超过 16。如:守护进程组的组名为“GRP1”,配置为实时主备,主库命名为“GRP1_RT_01”,备库命名为“GRP1_RT_02”

端口规划

数据库名称 实例名称 监听端口(PORT_NUM) DW_PORT MAL_HOST MAL_PORT MAL_DW_PORT
ITZS ITZS01 5237 5238 192.168.0.71 5239 5240
ITZS ITZS02 5237 5238 192.168.0.72 5239 5240

创建用户

# 1. 创建安装用户组
groupadd -g 54321 dinstall
# 2. 创建安装用户
useradd -u 54321 -g dinstall -m -d /home/dmdba -c "DM RDBMS Sever" -s /bin/bash dmdba

系统资源配置

# 修改用户更改ulimit的资源限制
# cp /etc/security/limits.conf /etc/security/limits.conf_$(date +%Y%m%d)
cat > /etc/security/limits.d/99-dmdba.conf <<EOF
# modify for dmrdbms
# data seg size
# dmdba              soft    data   1048576
# dmdba              hard    data   1048576
# file size
dmdba              soft    fsize  unlimited
dmdba              hard    fsize  unlimited
# open files
dmdba              soft    nofile   65536
dmdba              hard    nofile   65536
# virtual memory
dmdba              soft    as   unlimited
dmdba              hard    as   unlimited
EOF
  • data seg size: 建议用户设置为 1048576(即 1GB)以上或 unlimited(无限制),此参数过小将导致数据库启动失败。
  • file size : 建议用户设置为 unlimited(无限制),此参数过小将导致数据库安装或初始化失败。
  • open files: 建议用户设置为 65536 以上或 unlimited(无限制)
  • virtual memory:建议用户设置为 1048576(即 1GB)以上或 unlimited(无限制),此参数过小将导致数据库启动失败

数据库启动失败情况

当前配置

image-20210514155659791

错误信息

image-20210514155848811

处理

修改data seg size : unlimited 后重启启动服务即可。

创建软件目录

mkdir -p /dm/app/dmdbms
mkdir -p /dm/dmdata
mkdir -p /dm/dmarch
mkdir -p /dm/dmbackup
chown -R dmdba:dinstall /dm
chmod -R 775 /dm

准备dm软件包

mount -o loop /dm/soft/dm8_20210421_x86_rh6_64_ent_8.1.1.190_pack4.iso /mnt
cp /mnt/DMInstall.bin /dm/soft/
chown dmdba:dinstall /dm/soft/DMInstall.bin

注意事项

数据守护系统中各实例使用的 DM 服务器版本应一致,同时还应注意各实例所在主机的操作系统位数、大小端模式、时区及时间设置都应一致,以及使用同一个用户启动 DM 服务器和守护进程 dmwatcher

软件部署

命令行交互方式

[dmdba@node1 soft]$ ./DMInstall.bin -i
请选择安装语言(C/c:中文 E/e:英文) [C/c]:
解压安装程序......... 
欢迎使用达梦数据库安装程序

是否输入Key文件路径? (Y/y:是 N/n:否) [Y/y]:y
请输入Key文件的路径地址 [dm.key]:/dm/soft/dm77041229.key
/tmp/DMInstall/install/install_zh_UTF.sh:行235: 警告:命令替换:忽略输入中的 null 字节

有效日期: 2021-06-25
服务器颁布类型: 企业版
发布类型: 试用版
用户名称: 达梦公司产品试用
授权用户数: 无限制
并发连接数: 无限制

是否设置时区? (Y/y:是 N/n:否) [Y/y]:y
设置时区:
[ 1]: GTM-12=日界线西
[ 2]: GTM-11=萨摩亚群岛
[ 3]: GTM-10=夏威夷
[ 4]: GTM-09=阿拉斯加
[ 5]: GTM-08=太平洋时间(美国和加拿大)
[ 6]: GTM-07=亚利桑那
[ 7]: GTM-06=中部时间(美国和加拿大)
[ 8]: GTM-05=东部部时间(美国和加拿大)
[ 9]: GTM-04=大西洋时间(美国和加拿大)
[10]: GTM-03=巴西利亚
[11]: GTM-02=中大西洋
[12]: GTM-01=亚速尔群岛
[13]: GTM=格林威治标准时间
[14]: GTM+01=萨拉热窝
[15]: GTM+02=开罗
[16]: GTM+03=莫斯科
[17]: GTM+04=阿布扎比
[18]: GTM+05=伊斯兰堡
[19]: GTM+06=达卡
[20]: GTM+07=曼谷,河内
[21]: GTM+08=中国标准时间
[22]: GTM+09=汉城
[23]: GTM+10=关岛
[24]: GTM+11=所罗门群岛
[25]: GTM+12=斐济
[26]: GTM+13=努库阿勒法
[27]: GTM+14=基里巴斯
请选择设置时区 [21]:

安装类型:
1 典型安装
2 服务器
3 客户端
4 自定义
请选择安装类型的数字序号 [1 典型安装]:
所需空间: 1139M

请选择安装目录 [/home/dmdba/dmdbms]:/dm/app/dmdbms
可用空间: 196G
是否确认安装路径(/dm/app/dmdbms)? (Y/y:是 N/n:否)  [Y/y]:y

安装前小结
安装位置: /dm/app/dmdbms
所需空间: 1139M
可用空间: 196G
版本信息: 企业版
有效日期: 2021-06-25
安装类型: 典型安装
是否确认安装? (Y/y:是 N/n:否):y
2021-05-14 13:55:13 
[INFO] 安装达梦数据库...
2021-05-14 13:55:13 
[INFO] 安装 基础 模块...
2021-05-14 13:55:15 
[INFO] 安装 服务器 模块...
2021-05-14 13:55:16 
[INFO] 安装 客户端 模块...
2021-05-14 13:55:16 
[INFO] 安装 驱动 模块...
2021-05-14 13:55:16 
[INFO] 安装 手册 模块...
2021-05-14 13:55:16 
[INFO] 安装 服务 模块...
2021-05-14 13:55:17 
[INFO] 移动日志文件。
2021-05-14 13:55:17 
[INFO] 安装达梦数据库完成。

请以root系统用户执行命令:
/dm/app/dmdbms/script/root/root_installer.sh

安装结束

[dmdba@node1 soft]$ 

数据初始化配置

创建主库

初始化

/dm/app/dmdbms/bin/dminit PATH=/dm/dmdata DB_NAME=ITZS INSTANCE_NAME=ITZS01 PORT_NUM=5237

[dmdba@node1 bin]$ /dm/app/dmdbms/bin/dminit PATH=/dm/dmdata DB_NAME=ITZS INSTANCE_NAME=ITZS01 PORT_NUM=5237
initdb V8
db version: 0x7000c
License will expire on 2021-06-25
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL

log file path: /dm/dmdata/ITZS/ITZS01.log

log file path: /dm/dmdata/ITZS/ITZS02.log

write to dir [/dm/dmdata/ITZS].
create dm database success. 2021-05-14 10:30:57
[dmdba@node1 bin]$

启动主库

使用dmserver 启动数据库,在DM 数据库第一次必须正常启动,完成初始化的动作

/dm/app/dmdbms/bin/dmserver /dm/dmdata/ITZS/dm.ini

启动归档模式

disql SYSDBA/SYSDBA@localhost:5237

alter database mount;
alter database add archivelog 'DEST=/dm/dmarch,TYPE=local,FILE_SIZE=128,space_limit=10240';
alter database archivelog;
alter database open;
select arch_mode from v$database;

注册服务

语法
[root@node1 root]# ./dm_service_installer.sh -h
Usage: dm_service_installer.sh -t service_type [-p service_name_postfix] [-dm_ini dm_ini_file]
        [-watcher_ini watcher_ini_file ] [-monitor_ini monitor_ini_file] [-cssm_ini cssm_ini_file]
        [-dfs_ini dfs_ini_file] [-dcr_ini dcr_ini_file]
        [-dss_ini dss_ini_file] [-drs_ini drs_ini_file] [-dras_ini dras_ini_file] [-dcs_ini dcs_ini_file] [-server server_info]
        [-dmap_ini dmap_ini_file] [-m open|mount] [-y dependent_service] [-auto true|false]
  or dm_service_installer.sh [-s service_file_path]
  or dm_service_installer.sh -h

配置
# 注册服务
/dm/app/dmdbms/script/root/dm_service_installer.sh -t dmserver -dm_ini /dm/dmdata/ITZS/dm.ini -p ITZS
# 启动服务
systemctl start DmServiceITZS

备份主库数据

# 离线备份
systemctl stop DmServiceITZS

/dm/app/dmdbms/bin/dmrman CTLSTMT="backup database '/dm/dmdata/ITZS/dm.ini' full backupset '/dm/dmbackup/dbbak01';"

备库配置

初始化

/dm/app/dmdbms/bin/dminit PATH=/dm/dmdata DB_NAME=ITZS INSTANCE_NAME=ITZS02 PORT_NUM=5237

恢复数据到备库

# 传输备份数据到standby主机
scp -r /dm/dmbackup dmdba@node2:/dm/

# 还原数据
/dm/app/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dm/dmdata/ITZS/dm.ini' FROM BACKUPSET '/dm/dmbackup/dbbak01'"
## 新库未生成日志,可跳过
/dm/app/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm/dmdata/ITZS/dm.ini' FROM BACKUPSET '/dm/dmbackup/dbbak01'"

/dm/app/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm/dmdata/ITZS/dm.ini' UPDATE DB_MAGIC" 

主备参数配置

配置 dm.ini文件

修改主备库参数,注意2个库的instance_name参数不同

INSTANCE_NAME = ITZS01 # 数据库实例名称
PORT_NUM = 5237  #数据库实例监听端口
ALTER_MODE_STATUS = 0  #不允许手工方式修改实例模式/状态
ENABLE_OFFLINE_TS = 2  #不允许备库 OFFLINE 表空间
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
MAL_INI = 1  #打开 MAL 系统
ARCH_INI = 1  #打开归档配置

配置 dmmal.ini文件

各节点配置配置一样, MAL_HOST 使用内部网络 IP,MAL_PORT 与 dm.ini 中 PORT_NUM 使用不同的端口值,MAL_DW_PORT 是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口

cat > /dm/dmdata/ITZS/dmmal.ini<<-'EOF'
MAL_CHECK_INTERVAL = 5             #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5         #判定 MAL 链路断开的时间

[MAL_INST1]
MAL_INST_NAME = ITZS01               #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.0.71              #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 5238                      #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.10.180        #实例的对外服务 IP 地址
MAL_INST_PORT = 5237                 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_INST_DW_PORT = 5240              #实例监听守护进程TCP连接的端口
MAL_DW_PORT = 5239                   #实例本地的守护进程监听 TCP 连接的端口

[MAL_INST2]
MAL_INST_NAME = ITZS02
MAL_HOST = 192.168.0.72
MAL_PORT = 5238
MAL_INST_HOST = 192.168.10.181
MAL_INST_PORT = 5237
MAL_INST_DW_PORT = 5240
MAL_DW_PORT = 5239
EOF

配置 dmarch.ini 文件

2节点环境中,ARCH_DEST分别写对端的实例名称

[ARCHIVE_REALTIME] 
ARCH_TYPE = REALTIME  #实时归档类型
ARCH_DEST = ITZS02    #实时归档目标实例名

[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL         #本地归档类型
ARCH_DEST = =/dm/dmarch   #本地归档文件存放路径
ARCH_FILE_SIZE = 128      #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 10240  #单位 Mb,0 表示无限制,范围 1024~4294967294M

配置 dmwatcher.ini 文件

守护进程使用MANUAL,手工切换模式,使用全局守护类型

cat > dmwatcher.ini<<-'EOF'
[GRP1]
DW_TYPE = GLOBAL                         #全局守护类型
DW_MODE = MANUAL                         #自动切换模式
DW_ERROR_TIME = 10                         #远程守护进程故障认定时间
INST_RECOVER_TIME = 60                     #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10                        #本地实例故障认定时间
INST_OGUID = 655366                         #守护系统唯一 OGUID 值
INST_INI = /dm/dmdata/ITZS/dm.ini           #dm.ini 配置文件路径
INST_AUTO_RESTART = 1                       #打开实例的自动启动功能
INST_STARTUP_CMD = /dm/app/dmdbms/bin/dmserver       #命令行方式启动
RLOG_SEND_THRESHOLD = 0                   #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0                   #指定备库重演日志的时间阀值,默认关闭
EOF

在DM DW4.0 之后,已经不再需要生成dmwatcher.ctl 控制文件,dmctlcvt 工具也不再支持dmwaterch.ctl 文件的生成

以mount模式启动主备库

/dm/app/dmdbms/bin/dmserver /dm/dmdata/ITZS/dm.ini mount

一定要以 mount 方式启动数据库实例,否则系统启动时会重构回滚表空间,生成 Redo 日志;并且,启动后应用可能连接到数据库实例进行操作,破坏主备库的数据一致性。数据守护配置结束后,守护进程会自动 Open 数据库

设置 OGUID

主备库分别执行

-- # disql SYSDBA/SYSDBA@localhost:5237
SELECT OGUID FROM V$INSTANCE;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(655366);
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

注意:

系统通过 OGUID 值确定一个守护进程组,由用户保证 OGUID 值的唯一性,并确保数据守护系统中,数据库、守护进程和监视器配置相同的 OGUID 值

修改数据库模式

主库修改为: primary

alter database primary;

备库修改为: standby

alter database standby;

注意:

如果当前数据库不是 normal 模式,需要先修改 dm.ini 中 ALTER_MODE_STATUS 值 为 1,允许修改数据库模式,修改 Standby 模式成功后再改回为 0。

SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
alter database standby;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

注册并启动守护进程

在主备库进行注册

/dm/app/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -watcher_ini /dm/dmdata/ITZS/dmwatcher.ini -p ITZS

主备库启动服务

systemctl start DmWatcherServiceITZS

守护进程启动后,进入 Startup 状态,此时实例都处于 Mount 状态。守护进程开始广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将本地实例 Open,并切换为 Open 状态。

配置监视器

监视器:基于监视器接口实现的命令行工具,用于监控、管理数据守护系统。

配置参数文件 dmmonitor.ini

在监控节点的/dm/dmdata/ITZS/目录下创建并修改 dmmonitor.ini 配置确认监视器,其中 MON_DW_IP 中的 IP 和 PORT 和dmmal.ini 中的 MAL_HOST 和 MAL_DW_PORT 配置项保持一致。

cat > /dm/dmdata/ITZS/dmmonitor.ini <<-'EOF'
MON_DW_CONFIRM = 0 #确认监视器模式
MON_LOG_PATH = /dm/app/dmdbms/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32M
MON_LOG_SPACE_LIMIT = 1024 #不限定日志文件总占用空间

[GRP1]
MON_INST_OGUID = 655366  #组 GRP1 的唯一 OGUID 值
#以下配置为监视器到组 GRP1 的守护进程的连接信息,以―IP:PORT‖的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 192.168.0.71:5239
MON_DW_IP = 192.168.0.72:5239
EOF

启动监视器

/dm/app/dmdbms/bin/dmmonitor /dm/dmdata/ITZS/dmmonitor.ini

image-20210514145305836

守护进程启动后,进入 Startup 状态,此时实例都处于 Mount 状态。守护进程开始广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将本地实例 Open,并切换为 Open 状态。

登陆数据库

/dm/app/dmdbms/bin/disql SYSDBA/SYSDBA:5237

需要用 $DM_HOME/bin/disql 路径

image-20210514145850532

主备测试验证

数据同步验证

主库

disql SYSDBA/SYSDBA@localhost:5237
create table tt as select * from sysobjects;

备库

disql SYSDBA/SYSDBA@localhost:5237
select count(1) from tt;

主备切换 (switchover)

进入在监控器中进行switchover操作

# su  - dmdba 并执行下面的命令进入监视器命令行界面
/dm/app/dmdbms/bin/dmmonitor /dm/dmdata/ITZS/dmmonitor.ini

show   -- 输入show 命令查看当前状态

choose switchover grp1  -- # 执行 switchover切换操作

备库接管 (Takeover)

主库发生故障后,可以通过监视器的 Takeover 命令,将备库切换为主库,继续对外提供服务。

强制接管

通过 Takeover Force 命令强制将备库切换为主库

日常管理

启动与关闭

因为Global 守护类型的守护进程,会自动将数据库实例切换到 Open 状态,并将守护进程状态也切换为 Open。因此在关闭DW系统时,必须按照一定的顺序来关闭守护进程和实例。

可以在监视器中执行 Stop Instance 命令关闭数据守护系统,命令执行成功后,数据库实例正常关闭。但守护进程并没有真正退出,而是将状态切换为Shutdown 状态。

如果使用手动方式关闭数据守护系统,请严格按照以下顺序:

  1. 如果启动了确认监视器,先关闭确认监视器(防止自动接管)
  2. 关闭主库守护进程(防止重启实例)
  3. 关闭备库守护进程(防止重启实例)

在关闭守护进程时会自动关闭对应的DM实例

关闭DW(数据守护)-手工方式

# 先后关闭主库和备库守护进程服务
systemctl stop DmWatcherServiceITZS

启动DW(数据守护)-手工方式

启动守护进程时会自动启动DM 实例

启动备库守护进程
# 备库守护进程服务
systemctl start DmWatcherServiceITZS
启动主库守护进程
systemctl start DmWatcherServiceITZS
启动监视器
/dm/app/dmdbms/bin/dmmonitor /dm/dmdata/ITZS/dmmonitor.ini

DW相关系统视图

名称 用途 说明
V$UTSK_INFO 仅用于查看当前SQL命令执行情况 CMD 字段值不为空时,记录了有效的命令信息。
CODE 字段记录命令执行结果:执行中(CODE=100);执行成功(code=0);执行失败(code<0)
V$UTSK_SYS2 显示当前的全局信息
V$RECOVER_STATUS 在主库上查询,用于查询主库向备库发送日志的进度,如果已恢复完成,查询结果为空
V$KEEP_RLOG_PKG 在备库上查询,用于查询备库上的 KEEP_RLOG_PKG 信息
V$RAPPLY_SYS 在备库上查询,用于查询备库重做日志时的一些系统信息
V$RAPPLY_LOG_TASK 在备库上查询,用于查询备库当前重做任务的日志信息
V$ARCH_FILE 查询本地以及远程归档的日志信息
V$ARCH_STATUS 查询归档状态信息(主库上查询)
V$MAL_LINK_STATUS 查询本地实例到远程实例的 MAL 链路连接状态
V$DM_ARCH_INI 归档参数信息
V$DM_MAL_INI MAL 参数信息
V$DM_TIMER_INI 定时器参数信息
V$DMWATCHER 查询当前登录实例所对应的守护进程信息
V$MAL_SYS MAL 系统信息视图
V$MAL_SITE_INFO MAL站点信息视图
V$ARCH_SEND_INFO 用于在主库上查询各备库的日志发送统计信息
V$RAPPLY_STAT 用于在备库上查询备库重演日志的统计信息
V$RAPPLY_LSN_INFO 查询备库的重演信息
V$RLOG_PKG 显示日志包信息。通过该视图可以查询日志系统中当前日志包的使用情况,如包的长度、最大LSN、最小LSN等。通过该视图还可以查询当前实例日志系统中等待刷盘的链表上的日志包信息
V$RLOG_PKG_STAT 显示当前实例日志系统中日志包使用的统计信息

业务应用数据配置

服务名称配置

配置 DM 数据守护,一般要求配置连接服务名,以实现故障自动重连。

连接服务名可以在 DM 提供的 JDBC、DPI 等接口中使用,连接数据库时指定连接服务名,接口会随机选择一个 IP 进行连接,如果连接不成功或者服务器状态不正确,则顺序获取下一个 IP 进行连接,直至连接成功或者遍历了所有 IP。

连接服务名配置

dm_svc.conf 文件路径
  • Windows 平台下位于%SystemRoot%\system32 目录
  • Linux 平台下位于/etc 目录
连接服务名格式
SERVERNAME=(IP[:PORT],IP[:PORT],......)
dm_svc.conf 文件中常用配置项目说明
  • SERVERNAME:连接服务名,用户通过连接服务名访问数据库

  • IP:数据库所在的 IP 地址,如果是 IPv6 地址,为了区分端口,需要用[]封闭 IP 地址

  • PORT:数据库使用的 TCP 连接端口,可选配置,不配置则使用连接上指定的端口

  • LOGIN_MODE:指定优先登录的服务器模式

    • 0:优先连接 Primary 模式的库,Normal 模式次之,最后选择 Stantby 模式;默认值为 0。
    • 1:只连接主库
    • 2:只连接备库
    • 3:优先连接 Standby 模式的库,Primary 模式次之,最后选择 Normal 模式
    • 4:优先连接 Normal 模式的库,Primary模式次之,最后选择 Standby 模式。
  • SWITCH_TIME:检测到数据库实例故障时,接口在服务器之间切换的次数;超过设置次数没有连接到有效数据库时,断开连接并报错。有效值范围 1~9223372036854775807,默认值为 3。

  • SWITCH_INTERVAL:表 示 在 服 务 器 之 间 切 换 的 时 间 间 隔 , 单 位 为 毫 秒 , 有 效 值 范 围1~9223372036854775807,默认值为 200

  • RW_SEPARATE:指定是否启用读写分离。0 表示不启用读写分离;1 表示启用读写分离,默认值为 0

  • RW_PERCENT:启用读写分离时,读写分离的分发比例,有效值范围 0~100,默认值为 25。

示例

配置一个名为 dw_svc 的连接服务名,使用 dw_svc 连接数据守护中的数据库,即可实现故障自动重连

dw_svc=(192.168.10.180:5237,192.168.10.181:5237)
LOGIN_MODE =(1)
SWITCH_TIME=(3)
SWITCH_INTERVAL=(1000)

创建表空间

create tablespace ITZSXT datafile '/dm/dmdata/ITZS/ITZSXT001.DBF' size 32764 autoextend off;
alter tablespace ITZSXT add datafile '/dm/dmdata/ITZS/ITZSXT002.DBF' size 32764 autoextend off;

创建用户

create user DAMENG identified by "DAMENG#1234" default tablespace ITZSXT;

grant resource, public to DAMENG;

附录

dmmdf 工具

dmmdf 工具可以对DM相关的文件的属性进行修改。 dmmdf 工具支持的修改的文件类型有:dbf、rlog、original bak、bakset meta、bakset bkp、bakset,根据文件的不同,可修改的属性也有所不同,最主要的就是修改db_magic(DM数据库魔数)

posted @ 2021-05-15 00:11  KuBee  阅读(1491)  评论(0编辑  收藏  举报