admin管理员组

文章数量:1607886

一、背景

在信创“自主可控”的浪潮下,政企行业首当其冲,基于国产化信创的要求,本部门某业务后端应用也需要针对分析开源组件的风险和开源协议的商业应用限制;能用国产化替代的评估后尽可替代割接,本期针对传统数据库Mysql向达梦数据库迁移的记录。


相关资源:达梦官方文档、达梦在线服务平台、墨天轮排行榜、IDC数据报告、数据报告、洞见研报、达梦线上实验室

二、数据库现状

无论什么样的数据库都离不开数据库本身定义的作用,即它是一套承载相互有关联关系的若干数据的集合,负责组织、存储和管理数据的仓库,一般由一个数据库管理系统(DBMS)来控制。数据库按照不同维度,分类方法多种多样,按数据结构可分为关系型数据库和非关系型数据库(NoSQL数据库、NewSQL数据库等);按设计架构可分为单机数据库、集中式数据库和分布式数据库。按部署方式可分为本地部署和云部署,按应用场景/功能可分为事务性数据库(OLTP)、分析型数据库(OLAP)以及混合型关系数据库(HTAP),还可按商业模式分为开源数据库和商业数据库(闭源)。





国内数据库的发展,传统厂商多采用集中式设计架构,以达梦、人大金仓、南大通用、万里开源为代表,而新兴厂商则利用分布式进行换道超车,以PingCAP、巨杉数据库、星环等初创企业为代表,随着数据库云化部署大势所趋,云厂商则兼顾了前2者,但也主要是以分布式为主,分布式数据库是通过计算机网络将物理分散的多个数据库单元连接组成的逻辑上统一的数据库;目前分布式数据库的技术路线分为三类:分库分表+中间件方案、共享存储分布式数据库、去中心化的分布式数据库。国内数据库市场,关系型数据库市场占比90%左右,这些年非关系型正在逐年上升。国产供应商主要代表有华为、阿里、达梦、人大金仓等,这4家合计占据约30%份额,根据IDC数据,截至2022年末,在国内关系型数据库中,公有云数据库的市场中以阿里云、华为、腾讯为代表的国产数据库厂商份额已远超海外数据库厂商。


2024年2月国内数据库排行榜:


三、达梦数据库

3.1、产品介绍


当前官网最新版本为DM8,相较于目前主流产品架构:不同特性依靠不同内核去实现,DM8独特采用了双存储引擎架构,行存储引擎列存储引擎可相互配合、协同工作。同时实现了计算层和存储层的分离,同一内核既支持共享存储式集群,也支持分布式事务集群。达梦数据库采用分布式架构,可由多个节点组成,每个节点可以处理多个用户的请求,从而并发性能较好,另达梦数据库支持使用 IPv6 的地址访问,需要用 [] 指明是 ipv6 地址。达梦数据库目前已广泛应用于各种领域,包括金融、电信、政府、教育、医疗等。

产品特性:

  • 国产自研:官方声明未采用任何开源内核,完全掌握核心技术。因此知识产权风险可控。
  • 安全可靠,兼容性好:通过国家安全四级 EAL4+ 认证,支持国密算法以及第三方加密设备,号称是国内最高安全等级的数据库。它可适配各种软硬件体系,支持主流 SQL 标准和通用编程语言、接口、开发框架。在高并发、大数据量的应用中优势明显;
  • 高性能:采用基于代价计算的优化器和独立的虚拟机执行器,通过批量数据向量化执行和 MVCC 多版本并发控制等技术提升性能,实现双路 CPU 单节点 TPMC (吞吐量:transactions per minute)达到百万级。
  • 支持混合型业务处理:行列融合存储技术,支持混合负载,一套系统上同时支撑 OLAP 和 OLTP 业务场景,在此基础上,具备 HTAP 混合型业务处理能力。
  • 易用:可按照用户业务需求配置为不同集群模式,支持集中式、分布式架构;官方提供迁移评估和自动迁移工具,使数据库迁移更加便捷;支持柔性替换,降低系统迁移风险。更符合中国技术人员使用习惯,配置一站式“驾驶舱”工具集,支持数据库统一运维管理、 SQL 调试分析和监控告警。降低了使用、迁移和运维成本。

3.2、产品架构

达梦数据库采用多层架构,包括:物理层、网络层、应用层和数据层。逻辑架构分为:统一接口层、应用集成数据层,物理层。其中,在应用层它采用了多级缓存机制,包括内存缓存、文件缓存和磁盘缓存。内存缓存可以提高系统的响应速度,文件缓存可以提高数据的读取速度,磁盘缓存可以提高数据的存储速度。另外它支持多线程和多节点部署,提高并发和可靠性。DM 数据库为数据库中的所有对象分配逻辑空间,并存放在数据文件中。所有的数据文件组合在一起被划分到一个或者多个表空间中,所有的数据库内部对象都存放在这些表空间中,表空间又被进一步划分为段、簇(逻辑存储单元)和页(也称块,物理存储单元)。


架构说明:

  • DM 数据库实例:从DM7 以及之后版本的数据库中,“数据库”和“实例”这两个概念之间出现了很大的差别,实例类似oracle定义,它是由一组正在运行的 DM 后台进程/线程以及一个大型的共享内存组成。实例是操作DM 数据库的一种手段/工具,是用来访问数据库的内存结构以及后台进程的集合。一个实例只能与一个数据库进行关联(装载、打开或者挂起数据库)。在大多数情况下,一个数据库也只有一个实例对其进行操作。但是在 DM 共享存储集群(DMDSC)中,多个实例可以同时装载并打开一个数据库(位于一组由多台服务器共享的物理磁盘上)。
    \
  • DM 数据库:也类同Oracle,它指磁盘上存放在 DM 数据库中的数据的集合,一般包括:数据文件、日志文件、控制文件以及临时数据文件等。DM 数据库存储在服务器的磁盘上,而 DM 实例则存储于服务器的内存中。
    \
  • DM逻辑存储结构内部如下:其中,页(数据页,也称数据块)是数据库中最小的单元(对应物理存储空间上特定数量的存储字节),它是将进一步划分得到的逻辑页(块),DM 数据库中默认每个页默认 8KB(可以自定义大小,比如:4KB、8KB、16KB 或者 32KB;另外区别于文件系统的页,那个是为了跟内存交互使用,文件系统的内存页通常是 4K),页大小一旦创建好数据库后,则在该库的整个生命周期内,页大小都不能够再改变。一个簇由多个连续的页组成。(区别OS里的簇/块是操作系统中最小的逻辑存储单位,文件系统的默认分配单元大小(簇)也是4096字节);对于上层的逻辑簇,它可以来自不同的数据文件,它由数据文件划分,每个簇的大小是 128K(16 个连续的页,由用户在创建数据库时指定);1个或多个簇又组成了逻辑的段(aegment),因此段是能跨多个数据文件的;最上层就是标间,它不直接管理段,而是与数据文件建立关系,它由1个或多个数据文件组成,表空间里存放用户、表、存储过程等,作为数据库对象的存储单元使用。综上,从下到上为:数据表里的记录(行)—>页(Page)—>簇/区( Extent)—>段---->数据文件---->表空间----->数据库。注意:记录是不能跨页存储的,记录的长度受到数据页大小的限制,DM 规定每条记录的总长度不能超过页面大小的一半,因一部分存储页的元数据;


    当创建一个表/索引的时候,DM为表/索引的数据段至少分配一个簇,也就对应分配了一组空闲页等待数据写入;当空间不足时,DM数据库会自动分配新的簇。默认DM数据库在创建表/索引时,初始分配1个簇,当初始分配的空间用完时,DM数据库会自动扩展。分配簇时,表空间会按文件从小到大的顺序在各个数据文件中查找可用簇,找到后进行分配。
    当用户删除了表中所有记录时,DM 数据库仍然会为该表保留 1-2 个簇供后续使用。若用户使用 DROP 语句来删除表/索引对象,则此表/索引对应的段以及段中包含的簇全部收回,但其占用的表空间不会自动删除,这些释放的簇会继续供存储于此表空间的其他模式对象使用。对于临时表空间,DM 数据库会自动释放在执行 SQL 过程中产生的临时段,并将属于此临时段的簇空间还给临时表空间。对于回滚表空间,DM 数据库将定期检查回滚段,并确定是否需要从回滚段中释放一个或多个簇。
    对于最上层的数据段,在同一个表空间中,因段中的簇可以来自不同文件且簇时按需分配,故数据段中的不同簇在磁盘上一般是不连续的。

    >\
  • (物理)存储结构:包括配置文件(dm.ini、dmmal.ini、dmmarch.ini、dm_svc.conf、sqllog.ini、 dmrep.ini ),控制文件(记录文件分布,dm.ctl )、数据文件(保存用户实 际数据,*.dbf)、redo、归档和跟踪日志文件、备份文件;其中,每个DM数据库实例必须至少有 2 个重做日志文件,默认两个日志文件为DAMENG01.log、DAMENG02.log,这两个文件循环使用。非归档模式下,数据库会只将重做日志写入联机日志文件中进行存储;归档模式下, 数据库会同时将重做日志写入联机日志文件和归档日志文件中分别进行存储
    \
  • DM内存结构:DM 数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等;其中,内存池包括共享内存池和其他一些运行时内存池。缓冲区包含数据缓冲区、日志缓冲区、字典缓冲区、SQL 缓冲区;排序缓冲区提供数据排序所需要的内存空间。当用户执行 SQL 语句时,常常需要进行排序,所使用的内存就是排序缓冲区提供的。可用参数 SORT_BUF_SIZE 在 DM 配置文件 dm.ini 中指定排序缓冲区大小,默认值 20M;DM8 提供了为哈希连接而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。当在进行哈希连接时,对 排序的数据量进行了计算。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用 DM8 创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上还是使用内存池来进行哈希 操作。可在 dm.ini 中使用参数 HJ_BUF_SIZE 来进行控制,该值的大小可能会 限制哈希连接的效率,一般保持默认即可;HAGR_HASH_SIZE表示处理聚集函数时创建哈希表的个数,默认值100000。
    \
  • 表空间:DM 数据库中,表空间由一个或者多个数据文件组成,所有对象在逻辑上都存放在表空间中,而物理上都存储在所属表空间的数据文件中;每一个用户都有一个默认的表空间。DM数据库表空间分为:普通表空间及混合表空间,普通表空间不能存储 HUGE 表,而混合表空间可以同时存储普通(非 HUGE)表和 HUGE 表,其中 HUGE 数据文件存储在混合表空间定义中指定的 HUGE 数据文件路径下。可以通过为普通表空间增加指定 HUGE 数据文件路径将普通表空间升级为混合表空间。在创建 DM 数据库时,会自动创建 4 个表空间:SYSTEM 表空间、ROLL 表空间、MAIN 表空间和 TEMP 表空间,其中ROLL表空间类似Oracle的UNDO表空间,MAIN表空间类似Oracle的User表空间。其中,SYSTEM 表空间存放了有关 DM 数据库的字典信息;ROLL 表空间用来存放事务运行过程中执行 DML 操作之前的值,从而为访问该表的其他用户提供表数据的读一致性视图,由 DM 数据库自动维护,用户无需干预。MAIN 表空间为混合表空间,它会在初始化库的时候,就会自动创建一个大小为 128M 的数据文件 MAIN.DBF,以及一个 HMAIN 目录作为 HUGE 数据文件路径;另创建用户时,如果没有指定默认表空间,则系统自动指定 MAIN 表空间为用户默认的表空间;。默认的用户表空间是 SYSTEM,SYSDBA 的默认表空间为 MAIN,新创建的用户如果没有指定默认表空间,则系统自动指定 MAIN 表空间为用户默认的表空间。
    \
  • Schema是一个数据库用户的命名空间,通常包括一个用户和属于该用户的数据库对象、表、视图、索引、同义词、序列、过程、函数、包、触发器等。Schema是数据库对象的逻辑容器,它包含了所有属于特定用户的数据库对象。Schema和用户是一一对应的,一个用户对应一个Schema,当我们创建一个新的数据库用户时,Oracle会自动为该用户创建一个同名的Schema。用户可以在其Schema中创建、更改和删除数据库对象;Schema的主要作用是用于组织和管理数据库对象,通过Schema可以更加有效地对数据库对象进行分组管理,提高数据库的性能和运行效率。Schema中的对象都属于同一个用户,可以避免在不同用户之间进行频繁的上下文切换,从而提高数据库的性能和运行效率。DM中,每个用户有一个默认的同名的模式,访问自己模式下的表、视图等,不需要加模式名,访问其他模式下的对象需要拥有访问权限,访问时还需加上模式名。

DM 支持的共享存储有两种:裸设备和DMASM;其中,后者在前者的基础上,部署并使用了 DMASM 文件系统。 DMDSC 是一个共享存储的数据库集群系统。DMDSC (达梦数据共享集群)集群基于单节点数据库管理系统之上,改造了 Buffer 缓冲区、事务系统、封锁系统和日志系统等,来适应共享存储集群节点间的全局并发访问控制要求。同时,引入缓存交换技术,提升数据在节点间的传递效率。 DMDSC 集群是一个多实例、单数据库的系统。多个数据库实例可以同时访问、修改同一个数据库的数据。用户可以登录集群中的任意一个数据库实例,获得完整的数据库服务。数据文件、控制文件在集群系统中只有一份,不论有几个节点,这些节点都平等地使用这些文件。各个节点有自己独立的联机日志和归档日志。这些文件就保存在共享存储上。DMDSC 集群主要由数据库和数据库实例、共享存储、本地存储、通信网络、以及集群控制软件 DMCSS 组成。


DM 数据库产品中使用了一些第三方代码,这些代码的 LICENSE 放在 DM 数据库安装目录的
samples/third_party_license 子目录中。DM 服务器的加密使用了 OPENSSL,该软件的许可协议基于 Apache License Version 2.0;DM 服务器的 XML 支持相关模块使用了 xqilla V2.3.3xerces V3.1.4,DM 对这两个软件的代码进行了部分修改,这两个组件的许可协议基于 Apache License Version 2.0;DM 服务器提供的 DMGEO 系统包使用了 GEOS,DM 对该软件的代码进行了部分修改,该软件的许可协议基于 LGPL;DM 的 PHP 接 口 使 用 了 PHP/PDO,DM 对该软件的代码也进行了部分修改;DM 服务器的 HUGE 表压缩使用了 ZLIB,DM 服务器的一些压缩算法使用了 SNAPPY;DM 服务器的正则表达式解析使用了 REGEX;

3.3、部署配置

1)安装前准备

DM 完全安装需要至少 1 GB 以上的存储空间;另,DM 安装程序在安装时将产生临时文件,临时文件需要 1GB 的存储空间,临时文件目录默认为/tmp,即系统盘需要大于1G的可用空间,如果不够的话可用环境变量指定安装的临时目录到别处;支持x86_64 架构;安装前必须创建 dmdba 用户,禁止使用 root 用户安装数据库,换句话说,为了减少对操作系统的影响,用户也不应该以 root 系统用户来安装和运行 DM。

安装的过程中,会产生两种日志:

  • 一是 install_ant.log,记录安装过程中的文件拷贝信息。日志格式为:逐条记录从安装软件中拷贝到安装目录下的文件。
    \
  • 二是 install.log,记录安装过程中的安装模块、注册服务、卸载等信息。日志格式为:时间 + 日志类型(INFO/WARN/ERROR/FATAL)+ 日志内容
getconf LONG_BIT  #获取系统位数
groupadd dinstall -g 12349  #创建安装用户组
useradd  -G  dinstall -m -d /home/dmdba -s /usr/bin/bash -u 12349 dmdba
echo "Dm12345" |passwd --stdin dmdba

Changing password for user dmdba.
passwd: all authentication tokens updated successfully.
#检查系统限制
ulimit -a
#调整如下4个参数:
#data seg size (kbytes, -d):建议用户设置为 1048576(即 1GB)以上或 unlimited,过小将导致数据库启动失败
ulimit -d
#file size(blocks, -f):建议用户设置为 unlimited(无限制),过小将导致数据库安装或初始化失败
ulimit -f
#open files(-n):建议用户设置为 65536 以上或 unlimited
ulimit -n
#virtual memory (kbytes, -v):建议用户设置为 1048576(即 1GB)以上或 unlimited(无限制),此参数过小将导致数据库启动失败
ulimit -v
#修改系统连接数限制
vi /etc/security/limits.conf #如下,其中后4条新增
dmdba  soft      nice       0
dmdba  hard      nice       0
dmdba  soft      as         unlimited
dmdba  hard      as         unlimited
dmdba  soft      fsize      unlimited
dmdba  hard      fsize      unlimited
dmdba  soft      nproc      65536
dmdba  hard      nproc      65536
dmdba  soft      nofile     65536
dmdba  hard      nofile     65536
dmdba  soft      core       unlimited
dmdba  hard      core       unlimited
dmdba  soft      data       unlimited
dmdba  hard      data       unlimited

#vim /etc/security/limits.d/90-nproc.conf
* soft  nproc  1024
root  soft  nproc  unlimited
* nproc  16384
#验证
su - dmdba
$ ulimit -a

real-time non-blocking time  (microseconds, -R) unlimited
core file size              (blocks, -c) unlimited
data seg size               (kbytes, -d) unlimited
scheduling priority                 (-e) 20
file size                   (blocks, -f) unlimited
pending signals                     (-i) 128296
max locked memory           (kbytes, -l) 65536
max memory size             (kbytes, -m) unlimited
open files                          (-n) 65536
pipe size                (512 bytes, -p) 8
POSIX message queues         (bytes, -q) 819200
real-time priority                  (-r) 0
stack size                  (kbytes, -s) 8192
cpu time                   (seconds, -t) unlimited
max user processes                  (-u) 65536
virtual memory              (kbytes, -v) unlimited
file locks                          (-x) unlimited

#或者修改系统参数
vi /etc/sysctl.conf    #添加如下内容:
fs.file-max = 6815744
fs.aio-max-nr = 1048576
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 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.swappiness = 0
vm.dirty_background_ratio = 3
vm.dirty_ratio = 80
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
kernel.core_pattern=/coredump/%e.core.%p
#生效验证
sysctl -p 
#安装临时目录
DM_INSTALL_TMPDIR=/mount_point/tmp
export DM_INSTALL_TMPDIR
#设置java环境
DM_JAVA_HOME=/mount_point/jdk_home_dir   #指定特定的 JAVA 的目录,设置后安装程序将使用此 JAVA 环境进行安装,且安装完成之后,客户端程序也将使用此 JAVA 环境
export DM_JAVA_HOME
#创建实例保存目录、归档保存目录、备份保存目录,默认配置 DM 数据库安装在 /home/dmdba 文件夹下
##实例/数据库的保存目录
mkdir /opt/dmdata/data 
##归档保存目录
mkdir -p /opt/dmdata/arch
##备份保存目录
mkdir -p /opt/dmdata/dmbak
#授权
chown -R dmdba:dinstall /opt/dmdata/data
chown -R dmdba:dinstall /opt/dmdata/arch
chown -R dmdba:dinstall /opt/dmdata/dmbak
chmod -R 755 /opt/dmdata/data
chmod -R 755 /opt/dmdata/arch
chmod -R 755 /opt/dmdata/dmbak

2)数据库安装

#软件下载,推荐下载docker版本
https://eco.dameng/download/
wget https://download.dameng/eco/dm8/dm8_20230808_rev197096_x86_rh6_64_single.tar #或
docker pull registry-shanghai.aliyuncs/techerwang/dbhub:jem_dm8
#进入/opt目录,导入docker镜像包,从包名看有点老
docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar
#验证导入的镜像
docker images
#启动容器,将本地/opt/dmdbms/data下的
docker run -d -p 30236:5236 --restart=always --name dm8_db1 --privileged=true -e PAGE_SIZE=16 -e LD_LIBRARY_PATH=/opt/dmdbms/bin -e  EXTENT_SIZE=32 -e BLANK_PAD_MODE=1 -e LOG_SIZE=1024 -e UNICODE_FLAG=1 -e LENGTH_IN_CHAR=1 -e INSTANCE_NAME=dm8_db1 -v /data/dm8_db1:/opt/dmdbms/data dm8_single:dm8_20230808_rev197096_x86_rh6_64
#验证
docker ps
docker logs -f  dm8_db1
#管理
docker stop  dm8_db1
docker start  dm8_db1
docker restart  dm8_db1
#登陆,如果使用 docker 容器里面的 disql,进入容器后,先执行 source /etc/profile 防止中文乱码;.新版本 Docker 镜像中数据库默认用户名/密码为 SYSDBA/SYSDBA001
disql SYSDBA/SYSDBA001
SQL> desc v$database;
SQL> select
NAME,
CREATE_TIME,
ARCH_MODE,
TOTAL_SIZE,
OPEN_COUNT,
STARTUP_COUNT from v$database;
SQL>

本文标签: 过程数据库