达梦数据库(DM8)生产部署规范建议及故障恢复测试

本文详细介绍了达梦8数据库的生产部署规范,包括硬件配置、操作系统参数调整、安装路径规划、用户创建及实例参数设置。同时,针对数据安全,提出了全量备份+删除的策略,并通过实验模拟数据盘全损,演示了如何利用备份与恢复技术恢复数据,确保RPO=0,展示达梦数据库的数据安全保障能力。
摘要由CSDN通过智能技术生成

目录

前言

第一部分——生产部署规范建议

1.1 硬件要求

1.1.1 配置选型依据

1.1.2 数据库服务器类型参考

1.1.3 数据库物理配置基础选型说明

1.2 操作系统要求

1.2.1 安装目录划分

1.2.2 调整操作系统参数

1.3 安装路径设置

1.4 创建安装用户

1.5 实例参数设置

1.6 备份设置

1.6.1 全量+删除(建议采用)

1.6.2 全量+增量+删除

第二部分——数据盘全损与恢复实验

2.1 实验整体介绍

2.2 实验步骤

2.2.1 准备工作

2.2.2 正常运行阶段

2.2.3 数据盘故障阶段

2.2.4 恢复与验证阶段

第三部分——总结


前言

对于金融行业尤其是银行来说,数据丢失风险的是不能忍受的。作为数据存储的仓库,数据库应当把保障数据安全作为底线进行坚守。达梦8数据库作为一款行业领先的数据库产品,提供了优秀的数据安全保障能力,确保在数据库发生故障时,通过还原之前的备份集,将数据恢复到可用状态。

本文主要分为两部分,第一部分,将首先给出一份生产部署规范建议;第二部分,将以实验的方式,以生产中的典型案例为例,介绍达梦8数据库(以下简称DM8)在遭遇数据盘数据全部损坏的情况,利用备份与还原技术,恢复全部数据,论证DM8如何能够给用户以信心。

第一部分——生产部署规范建议

1.1 硬件要求

关键:数据data目录要放在块存储设备。

1.1.1 配置选型依据

 项目开发环境要求(例如面向于开发、测试、压测、生产、数据存储等)
 项目并发链接数情况(例如高并发、低并发、 QPS 等)
 数据量增长情况(日均增长、月度增长、季度增长、年度增长等)
 服务器规格情况(CPU 规格、内存规格、磁盘规格、网络规格等)
 数据读写比例情况(读写情况及 TPS
 机器选型基于实际各种环境配置(cpu、内存、磁盘、网络等)的混合事务型压测验证

1.1.2 数据库服务器类型参考

备注:
 标准数据是指应用所需要的数据量,比如 OA 系统有 300G 数据,标准数据为 300G
DW 表示数据守护集群(主备架构);
 监视器为主备集群的仲裁节点,如需自动切换功能需要配置此节点,如需手动切换则无需此节点;
 监视器节点一般 8C16G 即可满足需求;

1.1.3 数据库物理配置基础选型说明

 开发测试环境可采用虚拟机环境
 生产环境需选择物理机
 生产环境核心业务场景建议选择高端芯片、磁盘规格采用 SSD、网卡选择万兆网卡

1.2 操作系统要求

1.2.1 安装目录划分

    独立分区既有利于提高可靠性,也便于后期在线扩容。因而要求生产部门提供的基础环境里,要建立操作系统和数据库至少两个分区。

分区

作用

大小

备注

/

安装操作系统

>=20G

kylinV10安装后初始大小8G左右

/dm8

安装达梦数据库,存放数据库数据,单独挂载逻辑卷LV

>=40G

具体大小根据系统本身数据量决;其中达梦数据库软件占用大小1G;剩余空间存放数据文件、日志等。

   从更高的安全角度上,可以采用独立块设备,搭建主从同步,建立多路归档等技术手段。

1.2.2 调整操作系统参数

因操作系统存在差异性,有些操作系统没有该文件,可不用修改该参数。标
红色字体以操作系统实际文件为准。
(1)调整 sysctl.conf
[root@~]# vi /etc/sysctl.conf
fs.file-max = 6815744 #系统中所允许的文件句柄最大数目/linux系统中可以打开的文件的数量。
fs.aio-max-nr = 1048576 #限制并发未完成的异步请求数目,应该设置避免I/O子系统故障。
kernel.shmall = 2097152 #表示系统任意时刻可以分配的所有共享内存段的总和的最大值(以页为单位),其值应不小于shmmax/page_size.缺省值就是2097152,如果服务器上运行的所有实例的SGA总和不超过8GB(通常系统可分配的共享内存的和最大值为8GB),通常不需要修改.
kernel.shmmax = 2147483648 #一个内存段最大可以分配的内存空间,单位为字节。如果定义太小,那么会导致启动实例失败,或者SGA就会被分配到多个共享内存段。那么内存中的指针连接会给系统带来一定的开销,从而降低系统性能。这个值的设置应该大于SGA_MAX_TARGET或MEMORY_MAX_TARGET的值,最大值可以设置成大于或等于实际的物理内存。如果kernel.shmmax为100M,SGA_MAX_SIZE为500M,那么启动Oracle实例至少会分配5个共享内存段;如果设置kernel.shmmax为2G,SGA_MAX_SIZE为500M,那么启动Oracle实例只需要分配1个共享内存段。
kernel.shmmni = 4096 #系统级最大共享内存段数量,该参数的默认值是4096。这一数值已经足够,通常不需要更改。
kernel.sem = 250 32000 100 128 #第一列,表示每个信号集中的最大信号量数目。#第二列,表示系统范围内的最大信号量总数目。#第三列,表示每个信号发生时的最大系统操作数目。#第四列,表示系统范围内的最大信号集总数目。#(第一列)*(第四列)=(第二列)
net.ipv4.ip_local_port_range = 9000 65500 #专用服务器模式下与用户进程通信时分配给用户的端口区间
net.core.rmem_default = 4194304 #接收套接字缓冲区大小的默认值(以字节为单位)。
net.core.rmem_max = 4194304 #接收套接字缓冲区大小的最大值(以字节为单位)。
net.core.wmem_default = 262144 #发送套接字缓冲区大小的默认值(以字节为单位)。
net.core.wmem_max = 1048576 #发送套接字缓冲区大小的最大值(以字节为单位)。
vm.overcommit_memory = 1  #表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
vm.swappiness = 0 #表示尽量使用内存,减少使用磁盘swap交换分区,内存速度明显高于磁盘一个数量级。
vm.dirty_background_ratio = 3 #内存可以填充脏数据的百分比,这些脏数据稍后会写入磁盘,超过的话就会有后台进程pdflush/flush/kdmflush来清理。
vm.dirty_ratio = 80 #可以用脏数据填充的绝对最大系统内存量,当系统到达此点时,必须将所有脏数据提交到磁盘,同时所有新的I/O块都会被阻塞,直到脏数据被写入磁盘。这通常是长I/O卡顿的原因,但这也是保证内存中不会存在过量脏数据的保护机制。
vm.dirty_expire_centisecs = 500 #指定脏数据能存活的时间。当 pdflush/flush/kdmflush 在运行的时候,他们会检查是否有数据超过这个时限,如果有则会把它异步地写到磁盘中。
vm.dirty_writeback_centisecs = 100 #指定多长时间 pdflush/flush/kdmflush 这些进程会唤醒一次,然后检查是否有缓存需要清理。
[root@~]# sysctl -p
[root@~]# sysctl -p /etc/sysctl.conf
[root@~]# sysctl -q vm.swappiness
(2)调整 limits.conf
[root@~]# ulimit -n65536
[root@~]# vi /etc/security/limits.conf
* soft nice 0
* hard nice 0
* soft as unlimited
* hard as unlimited
* soft fsize unlimited
* hard fsize unlimited
* soft nproc 65536
* hard nproc 65536
* soft nofile 65536
* hard nofile 65536
* soft core unlimited
* hard core unlimited
* soft data unlimited
* hard data unlimited
[root@~]# vi /etc/security/limits.d/ 90-nproc.conf
* soft nproc 65536
[root@~]# vi /etc/profile
ulimit -SHn 65536
(3)  调整 login
[root@~]# vi /etc/pam.d/login
session required /lib64/security/pam_limits.so
session required pam_limits.so
(4)  关闭 selinux
[root@~]# vi /etc/sysconfig/selinux
SELINUX = disabled
参考:

 

1.3 安装路径设置

数据库软件目录:/dm8

数据目录:      /dm8/data

备份目录:        /dm8/DAMENG/backup --下一级目录full用/all  增量/add

备注:如果存储介质可靠性差,则可以将backup及多路归档到不同逻辑卷。如果备份文件较大,则可以考虑备份到NAS盘。

1.4 创建安装用户

[root@~]# groupadd dinstall -g 2001
[root@~]# useradd -g dinstall dmdba -u 1001
[root@~]# passwd dmdba
[root@~]# <输入密码>
[root@~]# <再次输入密码>
备注: dmdba 密码要符合复杂度要求

1.5 实例参数设置

通过命令行初始化实例时,可以设置参数如:

页大小(PAGE_SIZE):32
日志大小(LOG_SIZE):2048
大小写(CASE_SENSITIVE)[Y:敏感 / N:不敏感]:敏感
字符集(CHARSET)[0:GB18030 / 1:UTF-8]:GB18030
其它参数默认,如需更改其它参数,请参考《dminit 使用手册》
[dmdba@~]# /opt/dmdbms/bin/dminit PATH=/dm8/data PAGE_SIZE=32 LOG_SIZE=2048 CHARSET=0 CASE_SENSITIVE=Y 
initdb V8 
db version: 0xXXXXX 
License will expire in 1 day(s) on XXXX-XX-XX 
log file path: /dm8/data/DAMENG/DAMENG01.log 
log file path: /dm8/data/DAMENG/DAMENG02.log 
write to dir [/dm8/data/DAMENG]. 
create dm database success. XXXXX-XX-XX

1.6 备份设置

    备份时,在备份时间符合时间窗口的情况下,建议采用压缩备份,最多可以减小压缩结果文件大小为原来的1/10,压缩级别至少为1,最高可为9。具体的压缩效果,以及合理的压缩级别,需要通过在生产上进行测试以得出结论。

   建议对dm.ini等配置文件定期备份到比较安全的目录,有利于数据库快速恢复到之前的配置。

1.6.1 全量+删除(建议采用)

--说明:每天23:30生成统计信息、全量备份、删除30天前的全量备份 
--注意:开归档、备份路径:/dm8/data/DAMENG/bak 
call SP_INIT_JOB_SYS(1); 
call SP_CREATE_JOB('coun_bakall_delall',1,0,'',0,0,'',0,'每天23:30生成统计信息、 全量备份、删除30天前的全量备份'); 
call SP_JOB_CONFIG_START('coun_bakall_delall'); 
call SP_ADD_JOB_STEP('coun_bakall_delall', 'coun', 0, 'CALL SP_DB_STAT_INIT ();', 1, 2, 0, 0, NULL, 0); 
call SP_ADD_JOB_STEP('coun_bakall_delall', 'bakall', 6, '/dm8/data/DAMENG/bak', 1, 2, 0, 0, NULL, 0); 
call SP_ADD_JOB_STEP('coun_bakall_delall', 'delall', 0, 'SF_BAKSET_BACKUP_DIR_ADD("DISK','/dm8/data/DAMENG/bak'); CALL SP_DB_BAKSET_REMOVE_BATCH("DISK",SYSDATE-30);', 1, 2, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('coun_bakall_delall', 'coun_bakall_delall_time01', 1, 1, 1, 0, 0, '23:30:00', NULL, '20XX-XX-01 01:01:01', NULL, ''); 
call SP_JOB_CONFIG_COMMIT('coun_bakall_delall');

1.6.2 全量+增量+删除

--说明:每月第一个周六23:30全量备份。每天(除周六)23:30生成统计信息、增量备份、删 除30天前的增量备份、删除40天前的全量备份 
--注意:开归档、在bak目录下手动创建all、add文件夹 
--增量备份路径:/dm8/data/DAMENG/bak/add 
--全量备份路径:/dm8/data/DAMENG/bak/all 

--说明:必须执行一次全量备份 
call SP_INIT_JOB_SYS(1); 
call SP_CREATE_JOB('bakall_one',1,0,'',0,0,'',0,'执行一次全量备份'); 
call SP_JOB_CONFIG_START('bakall_one'); 
call SP_ADD_JOB_STEP('bakall_one', 'bakall_one_work', 6, '/dm8/data/DAMENG/bak/all', 1, 2, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('bakall_one', 'bakall_one_time', 1, 0, 0, 0, 0, NULL, NULL, 'XXXX-05-20 20:30:00', NULL, ''); 
call SP_JOB_CONFIG_COMMIT('bakall_one');

--说明:全量备份 call SP_CREATE_JOB('bakall',1,0,'',0,0,'',0,'每月第一个周六23:30全量备份'); call SP_JOB_CONFIG_START('bakall'); 
call SP_ADD_JOB_STEP('bakall', 'bakall_work', 6, '/dm8/data/DAMENG/bak/all', 1, 2, 0, 0, NULL, 0); 
call SP_ADD_JOB_SCHEDULE('bakall', 'bakall_time01', 1, 4, 1, 7, 0, '23:30:00', NULL, '2019-01-01 01:01:01', NULL, ''); 
call SP_JOB_CONFIG_COMMIT('bakall'); 

--说明:生成统计信息+增量备份+删除备份 
call SP_CREATE_JOB('coun_bakadd_delbak',1,0,'',0,0,'',0,'每天(除周六)23:30生成 统计信息、增量备份、删除30天前的增量备份、删除40天前的全量备份'); 
call SP_JOB_CONFIG_START('coun_bakadd_delbak'); 
call SP_ADD_JOB_STEP('coun_bakadd_delbak', 'coun', 0, 'CALL SP_DB_STAT_INIT ();', 1, 2, 0, 0, NULL, 0); 
call SP_ADD_JOB_STEP('coun_bakadd_delbak', 'bakadd', 6, '/dm8/data/DAMENG/bak/all|/dm8/data/DAMENG/bak/add', 1, 2, 0, 0, NULL, 0); 
call SP_ADD_JOB_STEP('coun_bakadd_delbak', 'delbak', 0, 'SF_BAKSET_BACKUP_DIR_ADD("DISK","/dm8/data/DAMENG/bak/add"); CALL SP_DB_BAKSET_REMOVE_BATCH("DISK",SYSDATE-30); SF_BAKSET_BACKUP_DIR_ADD("DISK","/dm8/data/DAMENG/bak/all"); CALL SP_DB_BAKSET_REMOVE_BATCH("DISK",SYSDATE-40);', 1, 2, 0, 0, NULL, 0); 
call SP_ADD_JOB_SCHEDULE('coun_bakadd_delbak', 'coun_bakadd_delbak_time01', 1, 2, 1, 63, 0, '23:30:00', NULL, 'XXXX-01-01 01:01:01', NULL, ''); call SP_JOB_CONFIG_COMMIT('coun_bakadd_delbak');

第二部分——数据盘全损与恢复实验

2.1 实验整体介绍

在生产中,为了数据的安全,常常采用数据库定期全库完全备份+每天增量备份的策略,辅以归档,使得在在数据库磁盘故障时,能够从已有备份和归档进行恢复,尽力实现RPO=0,降低数据丢失的风险。为了验证DM8的备份与还原能力,本章以单节点数据库为例进行了实验。

   实验场景步骤:

    1、进行数据库完全备份

    2、提交事务

    3、进行增量备份

    4、提交事务

    5、未完成事务

    6、模拟磁盘故障导致了数据库所有文件损坏

    7、通过数据库还原验证无提交事务丢失,RPO=0

2.2 实验步骤

2.2.1 准备工作

1、创建数据库实例DAMENG

2、DM8安装示例库DMHR。

3、设置dm.ini中ARCH_INI为1开启归档;设置dmarch.ini本地多路归档; 

2.2.2 正常运行阶段

1、数据库完全备份

SQL> BACKUP DATABASE BACKUPSET 'db_full_back_01';

注意:为简化命令,备份都保存在数据目录的默认路径下,实际生产中应当备份到其他路径。

2、进行事务

SQL> update dmhr.job set min_salary=3000 where job_id=72;

SQL> commit;

3、数据库增量备份(可选)

SQL>BACKUP DATABASE INCREMENT;

4、进行事务和未完成事务

SQL> update dmhr.job set min_salary=3500 where job_id=72;

SQL> commit;

SQL> update dmhr.job set min_salary=4000 where job_id=72;

2.2.3 数据盘故障阶段

5、模拟文件丢失

删除 /dm8/data 数据存放目录下所有文件,模拟磁盘故障导致文件丢失。

6、发现报错

比如进行数据库增量备份时发现错误:

SQL> BACKUP DATABASE INCREMENT;

BACKUP DATABASE INCREMENT;

[-8344]:specifying data file restored or tablespace backup is forbidden if the tablespace is broken.

used time: 00:00:01.045. Execute id is 0.

至此,DBA会发现故障发生,需要进行数据库修复。

2.2.4 恢复与验证阶段

7、关闭数据库

利用dmrman数据库进行数据库恢复时,需要先关闭数据库。

在DM Service Viewer中,对DmServiceDMSERVER执行stop关闭数据库。

8、重建数据库实例

卸载数据库实例,新建同配置的数据库实例。

备注:重建的主要目的是创建dm.ini,建议生产上对dm.ini进行备份,则不需重建实例,放入/dm8/data/DAMENG/下即可。

9、还原数据库

如果未做步骤3,最近一次数据库备份是完全备份,需要从完全备份的备份集进行恢复,如下:

RMAN> restore database '/dm8/data/DAMENG/dm.ini' from backupset 'db_full_back_01';

如果做了步骤3,最近一次数据库备份是增量部分,则需要从增量备份的备份集进行恢复,如下:

RMAN> restore database '/dm8/data/DAMENG/dm.ini' from backupset ' DB_DAMENG_INCREMENT_20220301_161528_000926';

其中,DB_DAMENG_INCREMENT_20220301_161528_000926是最后一次增量备份的目录,由系统自动命名。

10、恢复数据库

利用归档进行恢复:

RMAN> recover database  '/dm8/data/DAMENG/dm.ini' with archivedir '/dm8/data/DAMENG/arch';

11、更新数据库

RMAN> recover database  '/dm8/data/DAMENG/dm.ini' update db_magic;

12、启动数据库

在DM Service Viewer中,对DmServiceDMSERVER执行start开启数据库。

13、检验结果

SQL>select * from dmhr.job;

查看结果,会发现数据全部都在,且job_id=72 时对应的min_salary为3500,说明数据库已经恢复,提交事务未丢失,未提交的事务回滚。

第三部分——总结

   达梦数据库DM8展示了良好数据安全保障能力。DM8不仅可以通过主从架构、多路归档等从数据库架构上提升安全性,还可以通过RAID10、单独块设备,从硬件级别加强数据安全保障。

  优秀的数据库产品是根本,严谨的备份习惯同样重要。考虑到业务的复杂性,有时候备份数据可能被其他程序破坏,或因其他原因,导致故障发生时无备份可用,还要定期对备份进行恢复验证。只有这样,才能更好地发挥达梦数据库的优秀数据安全保障能力,坚守数据安全底线。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值