国产数据库第一股|万字长文初探达梦 DM8

e54a9baca993fc57a7c0073df8190c1c.gif

作者 | JiekeXu

来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT)

如需转载请联系授权 | (个人微信 ID:JiekeXu_DBA)

大家好,我是 JiekeXu,江湖人称“强哥”,荣获 Oracle ACE Pro 称号,墨天轮 MVP,墨天轮年度“墨力之星”,拥有 Oracle 11g OCP/OCM 认证,MySQL 5.7/8.0 OCP 认证以及 PCA、PCTA、OBCA、OGCA、KCP 等众多国产数据库认证证书,今天和大家一起来看看 国产数据库第一股|万字长文初探达梦 DM8欢迎点击最上方蓝字“JiekeXu DBA之路”关注我的微信公众号,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!

前  言

达梦数据库一直以来都没怎么真正接触过,一来由于职业生涯没有用到过国产数据库,二来达梦数据库属于闭源的数据库,不能白嫖,就连查看官方文档都要注册账号,社区也比较高冷,没看到多少宣传及培训认证,应该是看不上我们这种小卡拉米吧,估计人家都是有着垂直关系链的客户群体,没有广告今天我以一个 Oracle  DBA 第一次接触达梦数据库的角度来学习介绍一下达梦数据库。

61bf90a8b1d03fa7c9d4a35fb90cb30b.jpeg

武汉达梦数据库股份有限公司成立于 2000 年,是中国电子信息产业集团有限公司(简称“CEC”)、中国互联网投资基金的战略参股企业,2024 年 6 月 12 日在上交所科创板挂牌上市。今天难得有些时间,初步来了解一下 DM 数据库。

0537d8ede6d0a869b1c7158ce25a9794.png

一、DM 简介

DM 数据库版本介绍

开发版:官网上下载的版本, 并发数和使用时间做了限制, 功能和企业版是一样的, 但是不能商用。

标准版:适用小型应用, 不支持集群, 对用户数和并发数有限制

企业版:适用于中大型应用, 在生产环境中应用最多的一个版本, 三权分立

安全版:在企业版的基础上做了安全特性, 增加了访问控制, 四权分立。

DM 版本对比

对比项标准版企业版安全版
最大连接数25无限制无限制
最大物理 CPU 数量2无限制无限制
最大逻辑 CPU 核数32无限制无限制
使用时间无限制无限制无限制
硬件平台支持Windows 全系列、Linux 全系列、 龙芯、飞腾、申威、泰山、 海光、兆芯、Power、安腾等Windows 全系列、Linux 全系列、 龙芯、飞腾、申威、泰山、 海光、兆芯、Power、安腾等Windows 全系列、Linux 全系列、 龙芯、飞腾、申威、泰山、 海光、兆芯、Power、安腾等
最大存储容量500G无限制无限制
单表最大行数1 亿无限制无限制
大表最大列数102420482048
列存储不支持支持支持
分区表不支持支持支持
并行查询不支持支持支持
闪回查询不支持支持支持
分析函数与 自定义聚集函数不支持支持支持
虚拟函数 VPD不支持支持支持
DBMS_SQL 包不支持支持支持
存储过程调试功能不支持支持支持
XML 支持不支持支持支持
JSON 支持不支持支持支持
空间数据库支持不支持支持支持
全文索引支持不支持支持支持
DBLINK 功能不支持支持支持
DMHS 支持不支持支持支持
数据守护集群 DATAWATCH不支持支持支持
读写分离集群 DMRWC不支持支持支持
共享存储集群 DMDSC不支持支持支持
大规模并行处理集群 DMMPP不支持支持支持
数据复制 Data Replication不支持支持支持
企业管理工具 DEM不支持支持支持
备份还原接口 SBT不支持支持支持
嵌入式 pro*c不支持支持支持
外部函数扩展不支持支持支持
外部表不支持支持支持
通讯加密不支持支持支持
存储加密不支持支持支持
加密引擎支持支持支持
三权分立不支持支持支持
四权分立不支持不支持支持
自主访问控制不支持支持支持
强制访问控制不支持不支持支持
审计和实时侵害检测不支持不支持支持
客体重用不支持支持支持
资源限制不支持支持支持

DM 数据库产品简介

达梦数据库产品简单介绍如下:

66168589ed84061550ef09b2194c1e13.png

4062c7798cd4dda86725880b6497a758.png

48a3282f8873960fa8f886c0277861fe.png

DM 体系结构简介

达梦采用单进程,多线程架构,服务器在运行时由各种内存数据结构和一系列的线程组成,体系结构和 Oracle 架构非常相似,也是由实例和数据库组成。也有表空间、数据文件、段、簇、页这些对象。

06df8f796f61ff35837498b7b503bf75.png

0f48eb4e7f14b20bf82a951eaaa15f96.png

由上图看出在 DM8 中存储的层次结构如下:

1. 数据库由一个或多个表空间组成;
2. 每个表空间由一个或多个数据文件组成;
3. 每个数据文件由一个或多个簇组成;
4. 段是簇的上级逻辑单元,一个段可以跨多个数据文件;
5. 簇由磁盘上连续的页组成,一个簇总是在一个数据文件中;
6. 页是数据库中最小的分配单元,也是数据库中使用的最小的 IO 单元。

二、开发版软件下载及安装

软件下载

注册账号登录达梦官网,选择 CPU 型号和操作系统类型下载后的文件名为 dm8_20240712_x86_rh7_64.zip ,即 2024 年 7 月 12 日发布的开发试用版本,如果购买了正版的达梦数据库,原厂会提供 Key 授权,这里仅是开发试用版本

产品下载-达梦数据 (dameng.com)

https://www.dameng.com/list_103.html

OS:CentOS 7.6 64 位

DB: dm8_20240712_x86_rh7_64.iso  

b847839a522a3eb774447743e4e5cf03.png

准备安装

将 DM8 的 zip 包上传到 Linux 系统 自定义 /backup 目录并解压

[root@JiekeXu ~]# uname -a
Linux JiekeXu 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@JiekeXu backup]# unzip dm8_20240712_x86_rh7_64.zip 
Archive:  dm8_20240712_x86_rh7_64.zip
  inflating: dm8_20240712_x86_rh7_64.README  
  inflating: dm8_20240712_x86_rh7_64.iso  

  inflating: dm8_20240712_x86_rh7_64.iso_SHA256.txt

操作系统基础信息检查

[root@JiekeXu ~]# cat /proc/cpuinfo | grep processor | wc -l
2
[root@JiekeXu ~]# grep MemTotal /proc/meminfo
MemTotal:       10054664 kB
[root@JiekeXu ~]# grep SwapTotal /proc/meminfo
SwapTotal:       2097148 kB
[root@JiekeXu ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           9819        1174        1474          25        7170        8434
Swap:          2047           0        2047
[root@JiekeXu ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   97G   78G   20G  80% /
devtmpfs                 4.8G     0  4.8G   0% /dev
tmpfs                    4.8G     0  4.8G   0% /dev/shm
tmpfs                    4.8G   21M  4.8G   1% /run
tmpfs                    4.8G     0  4.8G   0% /sys/fs/cgroup
/dev/sda1               1014M  180M  835M  18% /boot
tmpfs                    982M   12K  982M   1% /run/user/42
tmpfs                    982M     0  982M   0% /run/user/0

查看 glibc、gcc 版本,安装 DM8 数据库,glibc 版本不能低于 2.3,Linux 内核不能低于 2.6。

[root@JiekeXu ~]# rpm -qa | grep glibc
glibc-2.17-260.el7.x86_64
compat-glibc-2.12-4.el7.centos.x86_64
glibc-common-2.17-260.el7.x86_64
glibc-devel-2.17-260.el7.x86_64
glibc-utils-2.17-260.el7.x86_64
glibc-headers-2.17-260.el7.x86_64
compat-glibc-headers-2.12-4.el7.centos.x86_64
[root@JiekeXu ~]# ldd --version
ldd (GNU libc) 2.17
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
[root@JiekeXu ~]# rpm -qa | grep gcc
compat-gcc-44-4.4.7-8.el7.x86_64
gcc-c++-4.8.5-36.el7.x86_64
compat-gcc-44-c++-4.4.7-8.el7.x86_64
libgcc-4.8.5-36.el7.x86_64
gcc-gfortran-4.8.5-36.el7.x86_64
gcc-4.8.5-36.el7.x86_64
[root@JiekeXu ~]# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

OS 配置

修改 limits.conf 配置文件,增加如下内容:

cat>>/etc/security/limits.conf <<EOF
##################################
############For DM Setting########
dmdba  soft    stack     unlimited
dmdba  hard    stack     unlimited
dmdba  soft    nproc     unlimited
dmdba  hard    nproc     unlimited
dmdba  soft    nofile    1048576
dmdba  hard    nofile    1048576
dmdba  soft    memlock   unlimited
dmdba  hard    memlock   unlimited
EOF

/etc/sysctl.conf 内核参数修改,这里复用了 Oracle 的安装机器配置,我这里不做修改。

cat>>/etc/sysctl.conf <<EOF
############For DM Setting########
fs.aio-max-nr = 1048576  #异步IO请求数目 推荐值是:1048576 其实它等于 1024*1024 也就是 1024K 个
fs.file-max = 6815744  #打开的文件句柄的最大数量,防止文件描述符耗尽的问题
fs.nr_open = 20480000  # 系统范围内可打开的最大文件数
kernel.core_pattern = core.%e.%p.%t  # Core dump 文件名模式
kernel.shmall = 2097152 #共享内存总量 页为单位,内存除以4K所得
kernel.shmmax = 4294967295  
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128  #SEMMSL: 每个信号集的最大信号数量 SEMMNS:用于控制整个 Linux 系统中信号的最大数 SEMOPM:内核参数用于控制每个 semop 系统调用可以执行的信号操作的数量 SEMMNI :内核参数用于控制整个 Linux 系统中信号集的最大数量
net.ipv4.ip_local_port_range = 9000 65500  #用于向外连接的端口范围  
net.core.rmem_default = 262144 #套接字接收缓冲区大小的缺省值
net.core.rmem_max = 4194304  #套接字接收缓冲区大小的最大值
net.core.wmem_default = 262144 #套接字发送缓冲区大小的缺省值
net.core.wmem_max = 1048576  #套接字发送缓冲区大小的最大值
fs.file-max = 6815744
kernel.watchdog_thresh=30
vm.min_free_kbytes = $(free -k | awk 'NR==2 {printf "%d\n", int($2 / 200)}')  # 预留给 OS 的最小空闲内存
vm.swappiness = 1
vm.overcommit_memory = 0  # 表示系统的内存分配策略可以选值为 0,1,2。0:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
vm.max_map_count=2000000
EOF

主要核心参数手工计算如下:

MEM=$(expr $(grep MemTotal /proc/meminfo|awk '{print $2}') \* 1024)
SHMALL=$(expr $MEM / $(getconf PAGE_SIZE))
SHMMAX=$(expr $MEM \* 3 / 5)  # 这里配置为3/5 RAM大小
echo $MEM
echo $SHMALL
echo $SHMMAX

min_free_kbytes = sqrt(lowmem_kbytes * 16) = 4 * sqrt(lowmem_kbytes)(注:lowmem_kbytes即可认为是系统内存大小) ##这里是测试开发环境,暂时不设置
vm.nr_hugepages =(共享内存大小 M)/Hugepagesize M ##这里是测试开发环境,暂时不设置大页

关闭 selinux 调整 login

cp /etc/selinux/config /etc/selinux/config_`date +"%Y%m%d_%H%M%S"`&& sed -i 's/SELINUX\=enforcing/SELINUX\=disabled/g' /etc/selinux/config
cat /etc/selinux/config
#不重启
setenforce 0
getenforce

cat >> /etc/pam.d/login <<EOF 
session    required     /lib/security/pam_limits.so
session    required     pam_limits.so
EOF

关闭 numa 和禁用透明大页

### 检查:
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag

### 修改
sed -i 's/quiet/quiet transparent_hugepage=never numa=off/' /etc/default/grub
grep quiet  /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg

### 重启后检查是否生效:
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /proc/cmdline

关闭防火墙

#关闭防火墙
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld

安装规划

软件的安装路径 /dm8

数据库实例的创建路径 /dm8/data

归档日志文件存储路径 /dm8/arch(归档开启可选项)

为了减少对操作系统的影响,用户不应该以 root 系统用户来安装和运行 DM。用户可以在安装之前为 DM 创建一个专用的系统用户,例如 dmdba。

mkdir -p /dm8/data
mkdir -p /dm8/arch

## 1.创建安装用户组 dinstall
groupadd -g 12349 dinstall

## 2.创建安装用户 dmdba
useradd -u 12345 -g dinstall -m -d /home/dmdba -s /bin/bash dmdba

## 3.初始化用户密码
passwd dmdba

chown -R dmdba:dinstall /dm8

挂载镜像

挂载 DM 镜像安装软件

[root@JiekeXu /]# ll /backup/dm8_20240712_x86_rh7_64.iso
-rw-r--r-- 1 root root 1103818752 Jul 26 17:36 /backup/dm8_20240712_x86_rh7_64.iso
[root@JiekeXu /]# mkdir /mnt/dm
[root@JiekeXu /]# mount /backup/dm8_20240712_x86_rh7_64.iso /mnt/dm
mount: /dev/loop0 is write-protected, mounting read-only
[root@JiekeXu /]# df -h | grep dm
/dev/loop0               1.1G  1.1G     0 100% /mnt/dm
/dev/loop0               1.1G  1.1G     0 100% /mnt/dm
[root@JiekeXu /]# cd /mnt/dm
[root@JiekeXu dm]# ll
total 1077886
-r-xr-xr-x 1 root root    2853242 Jun 17 14:26 DM8 Install.pdf
-r-xr-xr-x 1 root root 1100901663 Jul 12 13:28 DMInstall.bin

安装 DM 数据库软件

DM 数据库支持三种安装方式:

  • 图形化安装,开启图形界面安装

  • 命令行安装,执行 DMInstall.bin -i 命令行方式安装 DM 数据库  

  • 静默方式安装,需要配置 xml 文件,./DMInstall.bin -q 配置文件全路径  

本次由于是第一次安装,便使用图形化安装。我们登录到 VMWare 虚拟机界面,以 dmdba 用户登录打开图形化。进入到 /mnt/dm 目录,执行 ./DMInstall.bin ,如下如果图形化界面没有问题则会让我们选择语言。

92a74a8b326dce44007badd55d945db7.png

然后点击确定进入安装程序下一步

b75e80936204a482ddf21ff9e1bee968.png

点击下一步,这里点“接收”选择授权协议。然后点击下一步。

fe615627b426101b001e623c5ab5984d.png

然后下一步直接点击下一步,因为开发版本没有 key 文件直接跳过,默认使用一年(官网发布时间),故我们这个可以使用到明年 7 月。 

0cad1a7f334b1429daf0f746de633588.png

选择安装方式

DM 安装程序提供四种安装方式:“典型安装”、“服务器安装”、“客户端安装”和“自定义安装”,用户可根据实际情况灵活地选择。如下图所示:

典型安装包括:服务器、客户端、驱动、用户手册、数据库服务。

服务器安装包括:服务器、驱动、用户手册、数据库服务。

客户端安装包括:客户端、驱动、用户手册。

自定义安装包括:根据用户需要勾选组件,可以是服务器、客户端、驱动、用户手册、数据库服务中的任意组合

故这里我选择“典型安装”,然后下一步。

ed89c70f0dd42781ecf96f2048b17154.png

然后选择安装目录

DM 默认安装目录为$HOME/dmdbms(即 /home/dmdba 目录,如果安装用户为 root 系统用户,则默认安装目录为/opt/dmdbms,但不建议使用 root 系统用户来安装  DM),用户可以通过点击“浏览”按钮自定义安装目录。如果用户所指定的目录已经存在,则弹出警告消息框提示用户该路径已经存在。若确定在指定路径下安装请点击“确定”,则该路径下已经存在的 DM 某些组件,将会被覆盖;否则点击“取消”,重新选择安装目录。

1d4dcbb448a5fcf252e9ff37276380e5.png

说明:安装路径里允许字符的范围是小写字母(a-z)、大写字母(A-Z)、数字(0-9)、下划线(_)、空格( )和中文。

安装前小结

显示用户即将进行的安装的有关信息,例如产品名称、版本信息、安装类型、安装目录、可用空间、可用内存等信息,检查无误后点击“安装”按钮,开始拷贝安装的软件。如下图所示:

556fafc2638f7bc76b999b6d536d0231.png

使用 root 用户执行 root_installer.sh 脚本完成安装

/home/dmdba/dmdbms/script/root/root_installer.sh

deb1574ab12ba2aeb75e3b0b1a2cd9a9.png

[root@JiekeXu dm]# cd /home/dmdba/dmdbms/script/root/
[root@JiekeXu root]# ll
total 44
-rwxr-xr-x 1 dmdba dinstall 25861 Aug  9 16:32 dm_service_installer.sh
-rwxr-xr-x 1 dmdba dinstall  9290 Aug  9 16:32 dm_service_uninstaller.sh
-rwxr-xr-x 1 dmdba dinstall   490 Aug  9 16:32 root_installer.sh
[root@JiekeXu root]# /home/dmdba/dmdbms/script/root/root_installer.sh
移动 /home/dmdba/dmdbms/bin/dm_svc.conf 到/etc目录
创建DmAPService服务
Created symlink from /etc/systemd/system/multi-user.target.wants/DmAPService.service to /usr/lib/systemd/system/DmAPService.service.
创建服务(DmAPService)完成
启动DmAPService服务

0a72da99c5ea3aafdcdb221f8b6446a5.png

初始化数据库

如用户在选择安装组件时选中服务器组件,DM 安装过程结束时,将会提示是否初始化数据库,如下图所示。若用户未安装服务器组件,安装完成后,点击“完成”将直接退出,点击“取消”将完成安装,关闭对话框。

1769b089d6052bf794b9a76ccfc0adbf.png

附1 命令行安装软件
[dmdba@jiekexu ~]$ cd /data/dm8/
[dmdba@jiekexu dm8]$ ll
total 0
drwxr-xr-x 2 dmdba dinstall 6 Aug 13 11:11 arch
drwxr-xr-x 2 dmdba dinstall 6 Aug 13 11:11 data
[dmdba@jiekexu dm8]$ mkdir dmdbms       --创建软件安装目录 /data/dm8/dmdbms
[dmdba@jiekexu dm8]$ ll
total 0
drwxr-xr-x 2 dmdba dinstall 6 Aug 13 11:11 arch
drwxr-xr-x 2 dmdba dinstall 6 Aug 13 11:11 data
drwxr-xr-x 2 dmdba dinstall 6 Aug 13 11:20 dmdbms
[dmdba@jiekexu dm8]$ cd /mnt/dm
[dmdba@jiekexu dm]$ ll
total 1077886
-r-xr-xr-x 1 root root    2853242 Jun 17 14:26 DM8 Install.pdf
-r-xr-xr-x 1 root root 1100901663 Jul 12 13:28 DMInstall.bin
[dmdba@jiekexu dm]$ ./DMInstall.bin  -i     -- 使用 -i 选项命令行安装
Installer Language: 
[1]: 简体中文
[2]: English
Please select the installer's language [2]:2     --使用 2 英文安装
Extract install files......... 
Hardware architecture verification passedï¼
Welcome to DM DBMS Installer

Whether to input the path of Key File? (Y/y:Yes N/n:No) [Y/y]:N  --输入 N,开发版本不用选择,如果企业版这里也可以不选 key,待安装完成后将 dm.key 文件放入安装目录 bin 下重启数据库即可。

Whether to Set The TimeZone? (Y/y:Yes N/n:No) [Y/y]:y   -- 输入 Y 设置 timezone
TimeZone:
[ 1]: (GTM-12:00) West Date Line
[ 2]: (GTM-11:00) Samoa
[ 3]: (GTM-10:00) Hawaii
[ 4]: (GTM-09:00) Alaska
[ 5]: (GTM-08:00) Pacific(America and Canada)
[ 6]: (GTM-07:00) Arizona
[ 7]: (GTM-06:00) Central(America and Canada)
[ 8]: (GTM-05:00) East(America and Canada)
[ 9]: (GTM-04:00) Atlantic(America and Canada)
[10]: (GTM-03:00) Brasilia
[11]: (GTM-02:00) Middle Atlantic
[12]: (GTM-01:00) Azores
[13]: (GTM) Greenwich Mean Time
[14]: (GTM+01:00) Sarajevo
[15]: (GTM+02:00) Cairo
[16]: (GTM+03:00) Moscow
[17]: (GTM+04:00) AbuDhabi
[18]: (GTM+05:00) Islamabad
[19]: (GTM+06:00) Dakar
[20]: (GTM+07:00) BangKok,Hanoi
[21]: (GTM+08:00) China
[22]: (GTM+09:00) Seoul
[23]: (GTM+10:00) Guam
[24]: (GTM+11:00) Solomon
[25]: (GTM+12:00) Fiji
[26]: (GTM+13:00) Nukualofa
[27]: (GTM+14:00) Kiribati
Please Select the TimeZone [21]:21   --选择 21 中国时区

Installation Type:
1 Typical
2 Server
3 Client
4 Custom
Please Input the number of the Installation Type [1 Typical]:1  --选择 1 标准安装
Require Space: 2284M

Please Input the install path [/home/dmdba/dmdbms]:/data/dm8/dmdbms  --选择前面创建好的软件安装目录
Available Space:207G
Please Confirm the install path(/data/dm8/dmdbms)? (Y/y:Yes N/n:No) [Y/y]:Y   -- 确认安装路径

Pre-Installation Summary
Installation Location: /data/dm8/dmdbms
Require Space: 2284M
Available Space: 207G
Version Information: 
Expire Date: 
Installation Type: Typical
Confirm to Install? (Y/y:Yes N/n:No):Y     -- 确认开始安装
2024-08-13 11:27:55 
[INFO] Installing BASE Module...
2024-08-13 11:27:55 
[INFO] Installing DM DBMS...
2024-08-13 11:28:05 
[INFO] Installing SERVER Module...
2024-08-13 11:28:06 
[INFO] Installing CLIENT Module...
2024-08-13 11:28:13 
[INFO] Installing DRIVERS Module...
2024-08-13 11:28:16 
[INFO] Installing MANUAL Module...
2024-08-13 11:28:16 
[INFO] Installing SERVICE Module...
2024-08-13 11:28:17 
[INFO] Move log file to log directory.
2024-08-13 11:28:18 
[INFO] Installed DM DBMS completely.

Please execute the commands by root:
/data/dm8/dmdbms/script/root/root_installer.sh

End

[dmdba@jiekexu dm]$ exit
logout

-- 使用 root 用户执行 root_installer.sh 脚本
[root@jiekexu dm]# /data/dm8/dmdbms/script/root/root_installer.sh
Move /data/dm8/dmdbms/bin/dm_svc.conf to /etc
Create the DmAPService service
Created symlink from /etc/systemd/system/multi-user.target.wants/DmAPService.service to /usr/lib/systemd/system/DmAPService.service.
Finished to create the service (DmAPService)
Start the DmAPService service
附2 自动化脚本安装

有位达梦原厂大佬之前写了一键安装脚本,非常方便,对于职场老手很友好,这里也介绍下,但对于第一次安装学习的小伙伴来说我是不建议一上来就开始使用脚本安装,这样不太利于个人学习,建议使用图形化一步步来安装学习。这里脚本也是简单介绍一下即可。

--DMShellInstall 脚本下载地址
https://gitee.com/hnyuanzj/DMShellInstall

脚本下载解压之后有个 DMShellInstall ,然后挂载操作系统 ISO 镜像,用于脚本自动配置软件源。

脚本使用说明可直接 ./DMShellInstall -h ,可安装达梦单机、数据守护集群(DataWatch)、DSC 集群(DMDSC)。

[root@jiekexu dm]# unzip dm8_20240712_x86_rh7_64.zip 
[root@jiekexu dm ~]# cd /soft/
[root@jiekexu soft]# chmod u+x DMShellInstall

## 根据实际环境调整以下参数值,执行一键安装即可
./DMShellInstall -hn dm8 `# 主机名`\
-dp Dameng@123 `# dmdba用户密码`\
-d /data/dm8/dmdbms `# 软件安装目录`\
-dd /data/dm8/data `# 数据库文件目录`\
-ad /data/dm8/arch `# 数据库归档目录`\
-bd /data/dm8/dm_backup `# 数据库备份目录`\
-dn DAMENG `# 数据库名称`\
-in DMSERVER `#实例名称`\
-es 32 `# 数据文件簇大小`\
-ps 32 `# 数据页大小`\
-cs Y `# 字符串大小写敏感`\
-c 1 `# 数据库字符集`\
-sl 102400 `# 归档空间大小`\
-pn 5236 `# 监听端口号`\
-sp SYSDBA `# 数据库SYSDBA用户密码`\
-bm 2 `# 数据库备份模式 1全备 2增量`\
-opd Y `# 优化数据库参数`\
-mp 80 `# 优化数据库物理内存占比`\
-di dm8_20240712_x86_rh7_64.iso `# 达梦ISO镜像名称`

初始化 DM 实例

若用户选中创建数据库选项,点击“初始化”将弹出数据库配置工具。如下图所示:

c9d9a6f31f5becd8c62825418aa5874d.png

当然,也可以使用 dminit 命令行创建数据库实例,位于 DM 安装目录 bin 下 。

[dmdba@JiekeXu bin]$ ll dminit 
-r-xr-xr-x 1 dmdba dinstall 132744 Jul 12 13:23 dminit
[dmdba@JiekeXu bin]$ pwd
/home/dmdba/dmdbms/bin
[dmdba@JiekeXu bin]$ ./dminit help
initdb V8
db version: 0x7000c
file dm.key not found, use default license!
License will expire on 2025-07-03
version: 03134284194-20240703-234060-20108 Pack1
格式: ./dminit     KEYWORD=value

例程: ./dminit     PATH=/public/dmdb/dmData PAGE_SIZE=16

关键字                     说明(默认值)
--------------------------------------------------------------------------------
INI_FILE                   初始化文件dm.ini存放的路径
PATH                       初始数据库存放的路径
CTL_PATH                   控制文件路径
LOG_PATH                   日志文件路径
EXTENT_SIZE                数据文件使用的簇大小(16),可选值:16, 32, 64,单位:页
PAGE_SIZE                  数据页大小(8),可选值:4, 8, 16, 32,单位:K
LOG_SIZE                   日志文件大小(2048),单位为:M,范围为:256M ~ 8G
CASE_SENSITIVE             大小敏感(Y),可选值:Y/N,1/0
CHARSET/UNICODE_FLAG       字符集(0),可选值:0[GB18030],1[UTF-8],2[EUC-KR]
SEC_PRIV_MODE              权限管理模式(0),可选值:0[TRADITION],1[BMJ],2[EVAL],3[ZB]
SYSDBA_PWD                 设置SYSDBA密码(SYSDBA)
SYSAUDITOR_PWD             设置SYSAUDITOR密码(SYSAUDITOR)
DB_NAME                    数据库名(DAMENG)
INSTANCE_NAME              实例名(DMSERVER)
PORT_NUM                   监听端口号(5236)
BUFFER                     系统缓存大小(8000),单位M
TIME_ZONE                  设置时区(+08:00)
PAGE_CHECK                 页检查模式(3),可选值:0/1/2/3
PAGE_HASH_NAME             设置页检查HASH算法
EXTERNAL_CIPHER_NAME       设置默认加密算法
EXTERNAL_HASH_NAME         设置默认HASH算法
EXTERNAL_CRYPTO_NAME       设置根密钥加密引擎
RLOG_ENCRYPT_NAME          设置日志文件加密算法,若未设置,则不加密
RLOG_POSTFIX_NAME          设置日志文件后缀名,长度不超过10。默认为log,例如DAMENG01.log
USBKEY_PIN                 设置USBKEY PIN
PAGE_ENC_SLICE_SIZE        设置页加密分片大小,可选值:0、512、4096,单位:Byte
ENCRYPT_NAME               设置全库加密算法
BLANK_PAD_MODE             设置空格填充模式(0),可选值:0/1
SYSTEM_MIRROR_PATH         SYSTEM数据文件镜像路径
MAIN_MIRROR_PATH           MAIN数据文件镜像
ROLL_MIRROR_PATH           回滚文件镜像路径
MAL_FLAG                   初始化时设置dm.ini中的MAL_INI(0)
ARCH_FLAG                  初始化时设置dm.ini中的ARCH_INI(0)
MPP_FLAG                   Mpp系统内的库初始化时设置dm.ini中的mpp_ini(0)
CONTROL                    初始化配置文件(配置文件格式见系统管理员手册)
AUTO_OVERWRITE             是否覆盖所有同名文件(0) 0:不覆盖 1:部分覆盖 2:完全覆盖
USE_NEW_HASH               是否使用改进的字符类型HASH算法(1)
ELOG_PATH                  指定初始化过程中生成的日志文件所在路径
AP_PORT_NUM                分布式环境下协同工作的监听端口
HUGE_WITH_DELTA            是否仅支持创建事务型HUGE表(1) 1:是 0:否
RLOG_GEN_FOR_HUGE          是否生成HUGE表REDO日志(1) 1:是 0:否
PSEG_MGR_FLAG              是否仅使用管理段记录事务信息(0) 1:是 0:否
CHAR_FIX_STORAGE           CHAR是否按定长存储(N),可选值:Y/N,1/0
SQL_LOG_FORBID             是否禁止打开SQL日志(N),可选值:Y/N,1/0
DPC_MODE                   指定DPC集群中的实例角色(0) 0:无 1:MP 2:BP 3:SP,取值1/2/3时也可以用MP/BP/SP代替
USE_DB_NAME                路径是否拼接DB_NAME(1) 1:是 0:否
MAIN_DBF_PATH              MAIN数据文件存放路径
SYSTEM_DBF_PATH            SYSTEM数据文件存放路径
ROLL_DBF_PATH              ROLL数据文件存放路径
TEMP_DBF_PATH              TEMP数据文件存放路径
ENC_TYPE                   数据库内部加解密使用的加密接口类型(1), 可选值: 1: 优先使用EVP类型 0: 不启用EVP类型
HELP                       打印帮助信息

## 示例
/data/dm8/dmdbms/bin/dminit path=/data/dm8/data db_name=DMTEST instance_NAME=DMTEST_JIEKEXU sysdba_pwd=JiekeXu_DM8 port_num=15236 PAGE_SIZE=8  charset=1 case_sensitive=1 

initdb V8
db version: 0x7000c
file dm.key not found, use default license!
License will expire on 2025-07-03
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL

 log file path: /data/dm8/data/DMTEST/DMTEST01.log
 log file path: /data/dm8/data/DMTEST/DMTEST02.log

write to dir [/data/dm8/data/DMTEST].
create dm database success. 2024-08-13 14:30:41

----charset 字符集选项。取值:0 代表 GB18030,1 代表 UTF-8,2 代表韩文字符集 EUC-KR。默认为 0。可选参数。
----case_sensitive 标识符大小写敏感。当大小写敏感时,小写的标识符应当用 "" 括起,否则被系统自动转换为大写;当大小写不敏感时,系统不会转换标识符的大小写,在标识符比较时也不能区分大小写。取值:Y、y、1 表示敏感;N、n、0 表示不敏感。默认值为 Y 。可选参数。

上面初始化后还需要通过如下命令启动数据库服务
--注册成服务的方式再启动,-p 后面跟实例名
/data/dm8/dmdbms/script/root/dm_service_installer.sh -t dmserver -dm_ini /data/dm8/data/DMTEST/dm.ini -p DMTEST_JIEKEXU

/data/dm8/dmdbms/bin/DmServiceDMTEST_JIEKEXU start

--当然也可以直接放后台启动
nohup /data/dm8/dmdbms/bin/dmserver path=/data/dm8/data/DMTEST/dm.ini &

--初始化示例 2
/home/dmdba/dmdbms/bin/dminit path=/data/ extent_size=16 page_size=32 charset=0 case_sensitive=1 log_size=2048 DB_NAME=DMTEST LOG_PATH= /data/DMTEST/DMTEST01.log LOG_PATH=/data/DMTEST/DMTEST02.log LOG_PATH=/data/DMTEST/DMTEST03.log LOG_PATH=/data/DMTEST/DMTEST04.log LOG_PATH=/data/DMTEST/DMTEST05.log

注意:dminit 方式创建数据库不会自动注册数据库服务(DM 数据库配置助手方式默认自动注册数据库服务),所以不能以服务方式启动数据库,如果要以服务方式启动,则需要注册数据库服务。   

e70aacea1187b1560a6d014660af2083.png

选择数据存放目录,这里选择 /dm8/data 作为数据目录。

2a483ca88c7d6cb76df162fc386265ad.png

默认数据库名为 DAMENG,实例名为 DMSERVER,端口号为 5236,这里我将数据库名修改为“JiekeXu”,实例名修改为“DM_JiekeXu”,端口号修改为 15236,然后下一步。

442599afea8a14f9a8d9bd389ecad4a1.png

数据库文件设置

315cfa80053d8e814a9ba24fbb2832f6.png

初始化参数设置

我这里由于是测试库,参数直接默认即可。

簇大小、页大小、字符集、大小写敏感、 VARCHAR 类型以字符为单位等一旦指定, 数据库创建完成将无法更改。页是达梦数据库的最小存储单元, 簇是由连续的页组成,簇是达梦数据库的最小分配单元。达梦中 varchar 类型长度默认不能大于页大小的一半。

b4f2670adcf33a4d1400e463833953b3.png

设置统一口令

不得少于 9 位,更不能多于 48 位。我这里将其设置为 JiekeXu_DM8,SYSDBA 用户密码指定后不要忘记。 

7930ba530b3abc0d381e5aed2da36ad7.png

创建示例库

这里勾选 BOOKSH 和 DMHR 两个示例库的创建,然后下一步。

55ac88f53f54a8017ca5d98d09a08afb.png

概要信息

点击 完成,开始创建。

数据库名 : JiekeXu
实例名 : DM_JiekeXu
数据库目录 : /dm8/data
端口 : 15236
路径拼接数据库名 : 是

控制文件 : 
/dm8/data/JiekeXu/dm.ctl

数据文件 : 
/dm8/data/JiekeXu/SYSTEM.DBF
/dm8/data/JiekeXu/ROLL.DBF
/dm8/data/JiekeXu/TEMP.DBF
/dm8/data/JiekeXu/MAIN.DBF

日志文件 : 
/dm8/data/JiekeXu/JiekeXu01.log
/dm8/data/JiekeXu/JiekeXu02.log
/dm8/data/JiekeXu/JiekeXu03.log

ELOG : 
/dm8/data/JiekeXu/

簇大小 : 16页
页大小 : 8K
日志文件大小 : 256M
时区设置 : +08:00
页面检查 : 默认
字符集 : GB18030
USBKEY-PIN : 
页分片大小 : 4096
标识符大小写敏感 : 是
空格填充模式 : 否
改进的字符串HASH算法 : 是
启用日志文件加密 : 否
启用全库加密 : 否

启用加密 : 否

修改 SYSDBA的口令
修改 SYSAUDITOR的口令

创建示例库BOOKSHOP
创建示例库DMHR

66ae69c9c2b97bd371cce9b39005d473.png

执行脚本

f86a9782dcae96cb4a4ddaedfcf83573.png

mv /home/dmdba/dmdbms/bin/DmServiceDM_JiekeXu.service /usr/lib/systemd/system/DmServiceDM_JiekeXu.service
systemctl enable DmServiceDM_JiekeXu.service
systemctl start DmServiceDM_JiekeXu.service

[root@JiekeXu ~]# mv /home/dmdba/dmdbms/bin/DmServiceDM_JiekeXu.service /usr/lib/systemd/system/DmServiceDM_JiekeXu.service
[root@JiekeXu ~]# systemctl enable DmServiceDM_JiekeXu.service
Created symlink from /etc/systemd/system/multi-user.target.wants/DmServiceDM_JiekeXu.service to /usr/lib/systemd/system/DmServiceDM_JiekeXu.service.
[root@JiekeXu ~]# systemctl start DmServiceDM_JiekeXu.service

4760052284ff8c41b4a68b83f8894497.png

664f130169c825262e23f6837fcc7a17.png

重启实例,使其参数生效

70a41234be66a7fb8ad8734ba2972f6d.png

systemctl restart DmServiceDM_JiekeXu.service

点击完成,退出图形化,完成整个实例初始化步骤。

a6bc5c57011099d11ffa58e06f06bfb1.png

配置环境变量登录实例

环境变量 MALLOC_ARENA_MAX 用来控制进程可以创建的 thread arena 数量上限(默认为 cpu core*8). 其中修改 DM_HOME 为 DM_SOFT_HOME,LD_LIBRARY_PATH 已存在不用修改。

vim /home/dmdba/.bash_profile
export LD_LIBRARY_PATH='LD_LIBRARY_PATH:/home/dmdba/dmdbms/bin'
export DM_SOFT_HOME='/home/dmdba/dmdbms'
export DM_DATA_HOME='/dm8/data/'
export NLS_DATE_FORMAT="yyyy-mm-dd hh24:mi:ss"
export PATH=$DM_SOFT_HOME/bin:$PATH:.
export PS1=`hostname`:'$PWD'"$"
export MALLOC_ARENA_MAX=4

登录数据库实例

[dmdba@JiekeXu bin]$ systemctl status DmServiceDM_JiekeXu.service
● DmServiceDM_JiekeXu.service - DM Instance Service
   Loaded: loaded (/usr/lib/systemd/system/DmServiceDM_JiekeXu.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2024-08-09 17:14:13 CST; 56min ago
  Process: 31987 ExecStop=/home/dmdba/dmdbms/bin/DmServiceDM_JiekeXu stop (code=exited, status=0/SUCCESS)
  Process: 32066 ExecStart=/home/dmdba/dmdbms/bin/DmServiceDM_JiekeXu start (code=exited, status=0/SUCCESS)
 Main PID: 32087 (dmserver)
    Tasks: 92
   CGroup: /system.slice/DmServiceDM_JiekeXu.service
           └─32087 /home/dmdba/dmdbms/bin/dmserver path=/dm8/data/JiekeXu/dm.ini -noconsole
[dmdba@JiekeXu bin]$ ll disql
-r-xr-xr-x 1 dmdba dinstall 8432 Jul 12 13:23 disql
[dmdba@JiekeXu bin]$ pwd
/home/dmdba/dmdbms/bin
[dmdba@JiekeXu bin]$ /home/dmdba/dmdbms/bin/disql sysdba/JiekeXu_DM8:15236

服务器[LOCALHOST:15236]:处于普通打开状态
登录使用时间 : 2.886(ms)
disql V8
SQL>  select name from V$database;        

行号     NAME   
---------- -------
1          JiekeXu

已用时间: 0.615(毫秒). 执行号:2301.
SQL> select instance_name from v$instance;

行号     INSTANCE_NAME
---------- -------------
1          DM_JIEKEXU

已用时间: 0.559(毫秒). 执行号:2302.

21e89c16837ddccc6fdf36161b6c9f5d.png

三、基础管理

数据库安装目录

下图展示为 DM8 数据库目录。

9eb8a9137f1092c379d98964dba42c71.png

/home/dmdba/dmdbms/bin 目录存放 DM 数据库的可执行文件,例如 disql 命令、dminit 命令、dmrman 工具等。

/home/dmdba/dmdbms/desktop/icons  存放 DM 数据库各个工具的桌面图标。

/home/dmdba/dmdbms/doc 存放 DM 数据库用户手册。

/home/dmdba/dmdbms/drivers 存放连接 DM 数据库的驱动文件。

/home/dmdba/dmdbms/log 存放 DM 数据库日志,包括工具的日志、数据库日志、服务日志等。

/home/dmdba/dmdbms/samples 存放 DM 数据库各类配置文件的示例文件。

/home/dmdba/dmdbms/script/root 存放注册、注销 DM 数据库服务的工具,例如 dm_service_installer.sh 等。

/home/dmdba/dmdbms/tool 存放 DM 数据库的各个工具,例如 manager 管理工具、dbca 数据库配置助手等。

/home/dmdba/dmdbms/uninstall 目录存放卸载 DM 数据库的脚本。

/home/dmdba/dmdbms/web 目录存放 DM 数据库 dem 工具的 web 环境。

数据库实例目录

f89655aff54a91478da321b79f5f36b6.png

/dm8/data 为数据库实例目录,该目录存放各个实例的文件。

以实例 JiekeXu 为例,该目录下存放 JiekeXu 实例的配置文件 *.ini、控制文件 dm.ctl、数据文件 *.DBF、redo 日志文件 JiekeXu0*.log 等。

73de5ed1ec688e47796430454f9e7eee.png

创建表空间和用户

  • 创建表空间

--创建表空间 TEST,初始大小 128 MB,自动扩容每次扩充 100 MB,扩充上限 10240 MB
create tablespace "TEST" datafile 'TEST.DBF' size 128 autoextend on next 100 maxsize 10240 CACHE = NORMAL;

--命令行修改表空间,打开自动扩展,每次自动扩展 200M ,扩展上限 20240M,参考示例如下:
alter tablespace "TEST" datafile 'TEST.DBF' autoextend on next 200 maxsize 20240;

SQL> select b.tablespace_name, b.file_name, b.bytes/1024/1024 size_m
2     from dba_data_files b
3    union all 
4   select 'RLOG', a.path, a.rlog_size/1024/1024
5     from v$rlogfile a;

行号     TABLESPACE_NAME FILE_NAME                       SIZE_M              
---------- --------------- ------------------------------- --------------------
1          BOOKSHOP        /dm8/data/JiekeXu/BOOKSHOP.DBF  150
2          SYSTEM          /dm8/data/JiekeXu/SYSTEM.DBF    74
3          TEMP            /dm8/data/JiekeXu/TEMP.DBF      1024
4          ROLL            /dm8/data/JiekeXu/ROLL.DBF      128
5          TEST            /dm8/data/JiekeXu/TEST.DBF      128
6          MAIN            /dm8/data/JiekeXu/MAIN.DBF      128
7          DMHR            /dm8/data/JiekeXu/DMHR.DBF      128
8          RLOG            /dm8/data/JiekeXu/JiekeXu01.log 256
9          RLOG            /dm8/data/JiekeXu/JiekeXu02.log 256
10         RLOG            /dm8/data/JiekeXu/JiekeXu03.log 256

10 rows got
  • 创建用户并指定表空间

create user "TEST" identified by "JiekeXu_DM8"
default tablespace "TEST"
default index tablespace "TEST";
--授予 “PUBLIC” 和 “SOI” 权限
grant "PUBLIC","SOI" to "TEST";
grant "RESOURCE","VTI" to "TEST";

select USERNAME,ACCOUNT_STATUS,CREATED,LOCK_DATE,PROFILE,PASSWORD_VERSIONS,DEFAULT_TABLESPACE from dba_users where account_status='OPEN' order by CREATED asc;

-- 创建只读用户
create user "TEST_READONLY" identified by "JiekeXu_DM8" read only
default tablespace "TEST";

-- 取消用户限制
ALTER USER "TEST" LIMIT FAILED_LOGIN_ATTEMPS UNLIMITED, PASSWORD_LOCK_TIME UNLIMITED, PASSWORD_GRACE_TIME UNLIMITED;

-- 删除用户
DROP USER "TEST" CASCADE;

-- 删除表空间
DROP TABLESPACE "TEST";
  • 创建表并插入数据

CREATE TABLE test.city
(
 city_id CHAR(3) NOT NULL,
 city_name VARCHAR(40) NULL,
 region_id INT NULL
);

INSERT INTO test.city(city_id,city_name,region_id) VALUES('BJ','北京',1);
INSERT INTO test.city(city_id,city_name,region_id) VALUES('SJZ','石家庄',1);
INSERT INTO test.city(city_id,city_name,region_id) VALUES('SH','上海',2);
INSERT INTO test.city(city_id,city_name,region_id) VALUES('NJ','南京',2);
INSERT INTO test.city(city_id,city_name,region_id) VALUES('GZ','广州',3);
INSERT INTO test.city(city_id,city_name,region_id) VALUES('HK','海口',3);
INSERT INTO test.city(city_id,city_name,region_id) VALUES('WH','武汉',4);
INSERT INTO test.city(city_id,city_name,region_id) VALUES('CS','长沙',4);
INSERT INTO test.city(city_id,city_name,region_id) VALUES('SY','沈阳',5);
INSERT INTO test.city(city_id,city_name,region_id) VALUES('XA','西安',6);
INSERT INTO test.city(city_id,city_name,region_id) VALUES('CD','成都',7);
commit;

DM 管理工具

开启图形界面,进入数据库安装路径 /tool 目录下,运行 ./manager 即可启动 DM 管理工具。

[dmdba@JiekeXu icons]$ cd /home/dmdba/dmdbms/tool/
[dmdba@JiekeXu tool]$ ./manager

ec273f92c849122acf98190fcb97957f.png

7699d7f94bf590b98dc0a9bd7de0c98d.png

636921f741a3dcffcccd06dc2d6796dc.png

b9cddf28008729e359f3417ba0e358d4.png

DM 实例启停

DM 数据库启动顺序:读取配置参数文件 dm.ini,找到控制文件 dm.ctl,启动后台进程和线  程,启动数据库实例,启动到 mount 状态,根据控制文件中的数据文件路径和联机日志文件  路径,找到并打开数据文件和联机日志,启动到 OPEN 状态。DM:shutdown ->mount->open  

Oracle启动顺序:shutdown -> nomount->mount->open  

7e25bb62ef01ec2189f6f2f9204e100d.png

Shutdown:关闭状态  

Mount:配置状态,此时可以修改数据库归档配置、主备等模式,不能进行数据文件的读写。 此时数据库不能对外正常提供服务。可以读取内存中或者控制文件中的表(V$开头的动态视图 )。 

Open:打开状态,此时数据库提供正常的服务。可以读写数据文件。正常访问表,读取数据。Suspend:只读状态,只能读,不能写(DML 操作一旦 commit,数据库即会被挂起)。MOUNT 和 OPEN 可以相互转换(与 Oracle 不同)。SUSPEND 和 OPEN 也可以相互转换。 但 MOUNT 和 SUSPEND 之间不能相互转换。 

  • 手动注册成服务的方式启动与停止

# /data/dm8/dmdbms/script/root/dm_service_installer.sh -t dmserver -dm_ini /data/dm8/data/DMTEST/dm.ini -p DMTEST_JIEKEXU

./bin/DmService实例名 start/stop

$ /data/dm8/dmdbms/bin/DmServiceDMTEST_JIEKEXU start
$ /data/dm8/dmdbms/bin/DmServiceDMTEST_JIEKEXU stop
$ /data/dm8/dmdbms/bin/DmServiceDMTEST_JIEKEXU restart
$ /data/dm8/dmdbms/bin/DmServiceDMTEST_JIEKEXU status

## disql 登入直接关闭实例
SQL> shutdown immediate;
  • 前台方式启动

前台方式启动数据库后如果启动界面会话关闭数据库也相应会关闭所以一般情况下建议采用服务的方式启动数据库。

/data/dm8/dmdbms/bin/dmserver path=/data/dm8/data/DMTEST/dm.ini

--当然也可以直接放后台启动
nohup /data/dm8/dmdbms/bin/dmserver path=/data/dm8/data/DMTEST/dm.ini &

该启动方式为前台启动,界面输出“SYSTEM IS READY”后表示前台启动成功,若想关闭数据库,输入 exit 退出即可。

  • 图形化启动

--图形化安装时会自动注册成服务,可以使用服务的方式启动
systemctl start DmServiceDM_JiekeXu.service
systemctl stop DmServiceDM_JiekeXu.service
systemctl restart DmServiceDM_JiekeXu.service

另外,进入 DM 安装目录下的 tool 目录,使用如下命令打开 DM 服务查看器,如下所示:

cd /home/dmdba/dmdbms/tool/
 ./dmservice.sh

可以通过【DM 服务查看器】查看到对应的 DM 服务,可选择【启动】或【停止】对应的服务,如下图所示:

e9379f443501966e8af97401368d5a3c.png

实例参数优化调整

实例参数优化可通过手动方式和自动方式进行调整。为增强参数优化的适用性,降低参数修改的过程风险,建议使用达梦数据库提供的 AutoParaAdj.sql 脚本进行实例参数优化。脚本执行成功后,须重启数据库使参数修改生效。

## -- AutoParaAdj3.8_dm8.sql  https://eco.dameng.com/document/dm/zh-cn/ops/installation-install.html#2.1%20%E5%AE%9E%E4%BE%8B%E5%8F%82%E6%95%B0%E4%BC%98%E5%8C%96%E8%B0%83%E6%95%B4
/*
 **************************************************************************
 * *
 * Auto parameter adjustment 3.8 for dm8*
 * [November 22, 2023 ]
 * Take effect after restart dmserver
 * *
 **************************************************************************
*/
declare
exec_mode int:= 1;       --0表示直接执行脚本修改参数,1表示不直接修改参数,打印设置参数的语句,设置为1后,必须调整v_mem_mb和v_cpus
is_dsc int := 0;         --是否是dsc集群,如果是dsc集群请设置为1,将自动调整dsc相关参数
mem_per int:= 100;       --默认所有的内存归达梦数据库使用,如实际不能100%可用,可以调整此参数; MAX_OS_MEMORY强制100不与此参数挂钩
v_mem_mb int:= 16000;    --exec_mode为1时请自行根据机器实际内存调整此参数,单位为M
v_cpus int:= 8;          --exec_mode为1时请自行根据机器实际CPU核数调整此参数
oltp_mode int:=0;        --并发量较高的OLTP类型系统此参数设置为1,并发量不高的一般业务系统和OLAP类的系统此参数设置为0,影响SORT_FLAG和UNDO_RETENTION 
pk_cluster_mode int:=1;  --是否使用聚集主键:性能要求高且大字段较少的业务场景强烈建议设置为1,大字段多的场景设置为0


tname varchar(100);
MEMORY_POOL int;
MEMORY_N_POOLS int;
MEMORY_TARGET int;
BUFFER INT;
MAX_BUFFER INT;
RECYCLE int;
CACHE_POOL_SIZE int;
BUFFER_POOLS int;
RECYCLE_POOLS int;
SORT_BUF_SIZE int;
SORT_BUF_GLOBAL_SIZE INT;
DICT_BUF_SIZE  INT;
HJ_BUF_SIZE INT;
HAGR_BUF_SIZE INT;
HJ_BUF_GLOBAL_SIZE INT;
HAGR_BUF_GLOBAL_SIZE INT;
SORT_FLAG INT;
SORT_BLK_SIZE INT;
RLOG_POOL_SIZE INT;
TASK_THREADS INT;
IO_THR_GROUPS INT;
FAST_POOL_PAGES INT :=3000;
FAST_ROLL_PAGES INT :=1000;
UNDO_RETENTION INT :=90;
CNT INT;


begin
    CNT :=0;
    if exec_mode=0 then 
    SELECT TOP 1 N_CPU,TOTAL_PHY_SIZE/1024/1024 INTO v_cpus,v_mem_mb FROM V$SYSTEMINFO;
  end if;
  
  v_mem_mb := v_mem_mb * (mem_per/100.0);
  
  v_mem_mb=round(v_mem_mb,-3);


  IF v_mem_mb <= 2000  THEN
    goto return_2000;
  END IF;
  
  IF v_mem_mb > 512000 THEN  
     v_mem_mb :=v_mem_mb*0.8;
  END IF;
  
  MEMORY_TARGET=round(cast(v_mem_mb * 0.12 as int),-3);
  
  TASK_THREADS :=4;
  IO_THR_GROUPS :=8;


  IF v_cpus > 64 THEN 
     v_cpus := 64; 
     TASK_THREADS :=16;
     IO_THR_GROUPS :=32;
  END IF;
  
  IF v_cpus <= 64 THEN 
     IO_THR_GROUPS :=16;
     TASK_THREADS :=8;
  END IF;
  
  IF v_cpus <= 8  THEN   
    TASK_THREADS :=4;
    IO_THR_GROUPS :=8;
  END IF;
  
  
  BUFFER := round(cast(v_mem_mb * 0.4 as int),-3);
  RECYCLE :=cast(v_mem_mb * 0.04 as int);
  
  IF v_mem_mb < 70000 THEN
  
       with t as
        (
                select rownum rn from dual connect by level <= 100
        ) ,
        t1 as
        (
                select * from t where rn > 1 minus
                select
                        ta.rn * tb.rn
                from
                        t ta,
                        t tb
                where
                        ta.rn <= tb.rn
                    and ta.rn  > 1
                    and tb.rn  > 1
        )
      select top 1 rn into BUFFER_POOLS from t1 where rn > v_mem_mb/800 order by 1;     
        
    ELSE
       BUFFER_POOLS := 101;
    END IF;
    
  --修改内存池
  IF v_mem_mb >= 16000  THEN 
     IF v_mem_mb= 16000 THEN
        MEMORY_POOL := 1500;
        SORT_BUF_GLOBAL_SIZE := 1000;
      MEMORY_N_POOLS := 3;
      CACHE_POOL_SIZE := 512;
     ELSE
        MEMORY_POOL := 2000;
        SORT_BUF_GLOBAL_SIZE := 2000;
      MEMORY_N_POOLS := 11;
      CACHE_POOL_SIZE := 1024;
     END IF;
     
     FAST_POOL_PAGES :=9999;
     SORT_FLAG = 0;
     SORT_BLK_SIZE=1;
     SORT_BUF_SIZE := 10;
     RLOG_POOL_SIZE := 1024;
     
     HJ_BUF_GLOBAL_SIZE := LEAST(cast(v_mem_mb * 0.0625 as int),10000);
     HAGR_BUF_GLOBAL_SIZE := LEAST(cast(v_mem_mb * 0.0625 as int),10000);
     HJ_BUF_SIZE  :=250;
       HAGR_BUF_SIZE :=250;
     
     IF v_mem_mb >= 64000 THEN
        FAST_POOL_PAGES :=99999;
        FAST_ROLL_PAGES :=9999;
        BUFFER :=BUFFER-3000;
        CACHE_POOL_SIZE := 2048;
        RLOG_POOL_SIZE := 2048;
        SORT_FLAG = 1;
        SORT_BLK_SIZE=1;
        SORT_BUF_SIZE=50; 
        SORT_BUF_GLOBAL_SIZE= cast(v_mem_mb * 0.02 as int); 
        
        HJ_BUF_GLOBAL_SIZE := cast(v_mem_mb * 0.15625 as int);
        HAGR_BUF_GLOBAL_SIZE := cast(v_mem_mb * 0.04 as int);
        HJ_BUF_SIZE  :=512;
          HAGR_BUF_SIZE :=512;
          MEMORY_N_POOLS := 59;
     END IF;
     
     DICT_BUF_SIZE := 50;
       HJ_BUF_GLOBAL_SIZE :=round(HJ_BUF_GLOBAL_SIZE,-3);
       HAGR_BUF_GLOBAL_SIZE :=round(HAGR_BUF_GLOBAL_SIZE,-3);
       SORT_BUF_GLOBAL_SIZE :=round(SORT_BUF_GLOBAL_SIZE,-3);
       RECYCLE :=round(RECYCLE,-3);
  ELSE
     MEMORY_POOL :=GREAT(cast(v_mem_mb * 0.0625 as int),100);
     MEMORY_POOL :=round(MEMORY_POOL,-2);
     MEMORY_N_POOLS := 2;
     CACHE_POOL_SIZE := 200;
     RLOG_POOL_SIZE  := 256;
     SORT_BUF_SIZE := 10;
     SORT_BUF_GLOBAL_SIZE := 500;
     DICT_BUF_SIZE := 50;
     SORT_FLAG = 0;
     SORT_BLK_SIZE=1;
     
     HJ_BUF_GLOBAL_SIZE := GREAT(cast(v_mem_mb * 0.0625 as int),500);
     HAGR_BUF_GLOBAL_SIZE := GREAT(cast(v_mem_mb * 0.0625 as int),500);
       HJ_BUF_SIZE := GREAT(cast(v_mem_mb * 0.00625 as int),50);
       HAGR_BUF_SIZE :=GREAT(cast(v_mem_mb * 0.00625 as int),50);
  END IF;  
  
    --设置根据RECYCLE情况RECYCLE_POOLS参数
    with t as
        (
                select rownum rn from dual connect by level <= 100
        ) ,
        t1 as
        (
                select * from t where rn > 1 minus
                select
                        ta.rn * tb.rn
                from
                        t ta,
                        t tb
                where
                        ta.rn <= tb.rn
                    and ta.rn  > 1
                    and tb.rn  > 1
        )
      select top 1 rn into RECYCLE_POOLS from t1 where rn <= great(RECYCLE*1024/3000/(page()/1024),2) order by 1 desc;
  
  tname :='BAK_DMINI_' || to_char(sysdate,'yymmdd');
  
  execute IMMEDIATE 'select count(*) from USER_ALL_TABLES where table_name= ?' into CNT using tname;
    if exists(select 1 from V$INSTANCE where MODE$ in ('NORMAL','PRIMARY')) then  
      IF CNT=0 THEN 
      execute IMMEDIATE 'CREATE TABLE BAK_DMINI_' || to_char(sysdate,'yymmdd') || ' as select *,sysdate uptime from v$dm_ini';
    ELSE 
      execute IMMEDIATE  'INSERT INTO  BAK_DMINI_' || to_char(sysdate,'yymmdd') || ' select *,sysdate uptime from v$dm_ini';
    END IF;
  end if;
  
  --如果oltp_mode设置为0,采用旧的排序模式,undo_relation采用默认值
  if oltp_mode=1 then
     SORT_FLAG = 0;
     SORT_BUF_SIZE := 2;
  end if;
  
  --如果oltp_mode设置为0,undo_relation适当放大,采用新的排序方法
  if oltp_mode=0 then
     UNDO_RETENTION = 900;
  end if;
  
  MAX_BUFFER := BUFFER;
  
  IF exec_mode=0 THEN
    --修改cpu相关参数
    SP_SET_PARA_VALUE(2,'WORKER_THREADS',v_cpus);
    SP_SET_PARA_VALUE(2,'IO_THR_GROUPS',IO_THR_GROUPS);
    --将此参数改为0
    SP_SET_PARA_VALUE(2,'GEN_SQL_MEM_RECLAIM',0);
    
    --修改内存池相关参数
    SP_SET_PARA_VALUE(2,'MAX_OS_MEMORY',       100);
    SP_SET_PARA_VALUE(2,'MEMORY_POOL',         MEMORY_POOL);
    SP_SET_PARA_VALUE(2,'MEMORY_N_POOLS',      MEMORY_N_POOLS);
    SP_SET_PARA_VALUE(2,'MEMORY_TARGET',       MEMORY_TARGET);
        --修改内存检测参数为1    
    SP_SET_PARA_VALUE(2,'MEMORY_MAGIC_CHECK',       1);
      
    --修改缓冲区相关参数
    SP_SET_PARA_VALUE(2,'BUFFER',              BUFFER);
    
    --新版本已去掉MAX_BUFFER参数,如果存在就修改
    IF EXISTS (SELECT * FROM V$DM_INI WHERE PARA_NAME='MAX_BUFFER') THEN
        SP_SET_PARA_VALUE(2,'MAX_BUFFER',          MAX_BUFFER);
    END IF;    
    SP_SET_PARA_VALUE(2,'BUFFER_POOLS',        BUFFER_POOLS);
    SP_SET_PARA_VALUE(2,'RECYCLE',             RECYCLE);
      
    SP_SET_PARA_VALUE(2,'RECYCLE_POOLS',       RECYCLE_POOLS);
    
    --修改fast_pool相关参数,如果是dsc环境,适当放小,以免影响启动速度
        IF is_dsc= 1 THEN
           SP_SET_PARA_VALUE(2,'FAST_POOL_PAGES',    10000);  
       SP_SET_PARA_VALUE(2,'FAST_ROLL_PAGES',     3000);
       SP_SET_PARA_VALUE(2,'TASK_THREADS',     16);     
        ELSE
       SP_SET_PARA_VALUE(2,'FAST_POOL_PAGES',    FAST_POOL_PAGES);  
       SP_SET_PARA_VALUE(2,'FAST_ROLL_PAGES',    FAST_ROLL_PAGES);
       SP_SET_PARA_VALUE(2,'TASK_THREADS',TASK_THREADS);
       --如果不是dsc环境,开启热页动态加载,关闭预读
       SP_SET_PARA_VALUE(2,'ENABLE_FREQROOTS',1);
       SP_SET_PARA_VALUE(2,'MULTI_PAGE_GET_NUM',1);
           SP_SET_PARA_VALUE(2,'PRELOAD_SCAN_NUM',0);
           SP_SET_PARA_VALUE(2,'PRELOAD_EXTENT_NUM',0);
        END IF;
    
    --修改HASH相关参数
    SP_SET_PARA_VALUE(1,'HJ_BUF_GLOBAL_SIZE',  HJ_BUF_GLOBAL_SIZE);
    SP_SET_PARA_VALUE(1,'HJ_BUF_SIZE',         HJ_BUF_SIZE );
    SP_SET_PARA_VALUE(1,'HAGR_BUF_GLOBAL_SIZE',HAGR_BUF_GLOBAL_SIZE);
    SP_SET_PARA_VALUE(1,'HAGR_BUF_SIZE',       HAGR_BUF_SIZE  );
    
    --修改排序相关参数
    SP_SET_PARA_VALUE(2,'SORT_FLAG',SORT_FLAG);
    SP_SET_PARA_VALUE(2,'SORT_BLK_SIZE',SORT_BLK_SIZE);
    SP_SET_PARA_VALUE(2,'SORT_BUF_SIZE',       SORT_BUF_SIZE);
    SP_SET_PARA_VALUE(2,'SORT_BUF_GLOBAL_SIZE',       SORT_BUF_GLOBAL_SIZE);
    
    --修改其他内存参数
    SP_SET_PARA_VALUE(2,'RLOG_POOL_SIZE',      RLOG_POOL_SIZE);
    SP_SET_PARA_VALUE(2,'CACHE_POOL_SIZE',     CACHE_POOL_SIZE);  
    SP_SET_PARA_VALUE(2,'DICT_BUF_SIZE',       DICT_BUF_SIZE); 
    SP_SET_PARA_VALUE(2,'VM_POOL_TARGET',       16384); 
    SP_SET_PARA_VALUE(2,'SESS_POOL_TARGET',       16384); 


    --修改实例相关参数
    SP_SET_PARA_VALUE(2,'USE_PLN_POOL',        1); 
    SP_SET_PARA_VALUE(2,'ENABLE_MONITOR',      1); 
    SP_SET_PARA_VALUE(2,'SVR_LOG',             0); 
    SP_SET_PARA_VALUE(2,'TEMP_SIZE',           1024);
    SP_SET_PARA_VALUE(2,'TEMP_SPACE_LIMIT',    102400); 
    SP_SET_PARA_VALUE(2,'MAX_SESSIONS',        1500); 
    SP_SET_PARA_VALUE(2,'MAX_SESSION_STATEMENT', 20000); 
    
    --性能要求高且大字段较少的业务场景建议设置为1,大字段多的场景设置为0
    if pk_cluster_mode = 1 then
      SP_SET_PARA_VALUE(2,'PK_WITH_CLUSTER',1); 
    else
      SP_SET_PARA_VALUE(2,'PK_WITH_CLUSTER',0);
    end if;
    
    SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',0); 
    
    --修改优化器相关参数
    SP_SET_PARA_VALUE(2,'OLAP_FLAG',2); 
    SP_SET_PARA_VALUE(2,'VIEW_PULLUP_FLAG',1);  
    SP_SET_PARA_VALUE(2,'OPTIMIZER_MODE',1); 
    SP_SET_PARA_VALUE(2,'ADAPTIVE_NPLN_FLAG',0); 
    
    --开启并行PURGE
    SP_SET_PARA_VALUE(2,'PARALLEL_PURGE_FLAG',1);
    --开启手动并行
    SP_SET_PARA_VALUE(2,'PARALLEL_POLICY',2);
    
    SP_SET_PARA_DOUBLE_VALUE(2,'UNDO_RETENTION',UNDO_RETENTION);
    
    --UNDO_RETENTION如果放大,可以适当调大UNDO_EXTENT_NUM。负载高的时候,减少文件系统的申请/释放操作。
    SP_SET_PARA_VALUE(2,'UNDO_EXTENT_NUM',16);
    
    --开启SQL 注入HINT功能
    SP_SET_PARA_VALUE(2,'ENABLE_INJECT_HINT',1);
    
    SP_SET_PARA_VALUE(2,'FAST_LOGIN',1);
    SP_SET_PARA_VALUE(2,'BTR_SPLIT_MODE',1);
    
    --关闭参数监控
    SP_SET_PARA_VALUE(2,'ENABLE_MONITOR_BP',0);
    
    --SLCT_OPT_FLAG参数设置为0
    IF EXISTS (SELECT * FROM V$DM_INI WHERE PARA_NAME='SLCT_OPT_FLAG') THEN
        SP_SET_PARA_VALUE(1,'SLCT_OPT_FLAG',0);
      END IF;    
    
    IF is_dsc= 1 THEN
      
     SP_SET_PARA_VALUE(2,'ENABLE_FREQROOTS',0);  
     --DSC关闭数据页预加载参数
         SP_SET_PARA_VALUE(2,'MULTI_PAGE_GET_NUM',1);
         SP_SET_PARA_VALUE(2,'PRELOAD_SCAN_NUM',0);
         SP_SET_PARA_VALUE(2,'PRELOAD_EXTENT_NUM',0);
      
      SP_SET_PARA_VALUE(2,'DSC_N_POOLS',MEMORY_N_POOLS); 
      
      IF EXISTS (SELECT * FROM V$DM_INI WHERE PARA_NAME='DSC_GBS_REVOKE_OPT') THEN
        SP_SET_PARA_VALUE(2,'DSC_GBS_REVOKE_OPT',0);
      END IF;
      
      SP_SET_PARA_VALUE(2,'DSC_HALT_SYNC',0);
      SP_SET_PARA_VALUE(2,'DSC_N_CTLS',50000);
          SP_SET_PARA_VALUE(2,'DSC_ENABLE_MONITOR',0);
          SP_SET_PARA_VALUE(2,'TRX_DICT_LOCK_NUM',5);
      SP_SET_PARA_VALUE(2,'DIRECT_IO',1);
    END IF;
    
  ELSE
    --修改cpu相关参数
    PRINT 'SP_SET_PARA_VALUE(2,''WORKER_THREADS'','||v_cpus||');';
    PRINT 'SP_SET_PARA_VALUE(2,''IO_THR_GROUPS'','||IO_THR_GROUPS||');';
    PRINT 'SP_SET_PARA_VALUE(2,''GEN_SQL_MEM_RECLAIM'',0);';


    --修改内存池相关参数
    PRINT 'SP_SET_PARA_VALUE(2,''MAX_OS_MEMORY'',       '||100||');';
    PRINT 'SP_SET_PARA_VALUE(2,''MEMORY_POOL'',         '||MEMORY_POOL||');';
    PRINT 'SP_SET_PARA_VALUE(2,''MEMORY_N_POOLS'',      '||MEMORY_N_POOLS||');';
    PRINT 'SP_SET_PARA_VALUE(2,''MEMORY_TARGET'',       '||MEMORY_TARGET||');';  
    
    --修改缓冲区相关参数
    PRINT 'SP_SET_PARA_VALUE(2,''BUFFER'',              '||BUFFER||');';
    
    --新版本已去掉MAX_BUFFER参数,如果存在就修改
    IF EXISTS (SELECT * FROM V$DM_INI WHERE PARA_NAME='MAX_BUFFER') THEN
       PRINT 'SP_SET_PARA_VALUE(2,''MAX_BUFFER'',          '||MAX_BUFFER||');';
      END IF;  
    PRINT 'SP_SET_PARA_VALUE(2,''BUFFER_POOLS'',        '||BUFFER_POOLS||');';
    PRINT 'SP_SET_PARA_VALUE(2,''RECYCLE'',             '||RECYCLE||');';
    PRINT 'SP_SET_PARA_VALUE(2,''RECYCLE_POOLS'',       '||RECYCLE_POOLS||');';
    
    --修改fast_pool相关参数,如果是dsc环境,适当放小,以免影响启动速度
        IF is_dsc= 1 THEN
           PRINT 'SP_SET_PARA_VALUE(2,''FAST_POOL_PAGES'',  10000);';  
       PRINT 'SP_SET_PARA_VALUE(2,''FAST_ROLL_PAGES'',   3000);';   
       PRINT 'SP_SET_PARA_VALUE(2,''TASK_THREADS'',     16);';  
        ELSE
       PRINT 'SP_SET_PARA_VALUE(2,''FAST_POOL_PAGES'',     '||FAST_POOL_PAGES||');';  
       PRINT 'SP_SET_PARA_VALUE(2,''FAST_ROLL_PAGES'',     '||FAST_ROLL_PAGES||');'; 
       --如果不是dsc环境,开启热页动态加载,关闭预读
       PRINT 'SP_SET_PARA_VALUE(2,''ENABLE_FREQROOTS'',1);';   
       PRINT 'SP_SET_PARA_VALUE(2,''MULTI_PAGE_GET_NUM'',1);';
           PRINT 'SP_SET_PARA_VALUE(2,''PRELOAD_SCAN_NUM'',0);';
           PRINT 'SP_SET_PARA_VALUE(2,''PRELOAD_EXTENT_NUM'',0);';  
           PRINT 'SP_SET_PARA_VALUE(2,''TASK_THREADS'','||TASK_THREADS||');';                                            
        END IF;
    
    --修改内存检测参数为1    
    PRINT 'SP_SET_PARA_VALUE(2,''MEMORY_MAGIC_CHECK'',       1);';
    
    --修改HASH相关参数
    PRINT 'SP_SET_PARA_VALUE(1,''HJ_BUF_GLOBAL_SIZE'',  '||HJ_BUF_GLOBAL_SIZE||');';
    PRINT 'SP_SET_PARA_VALUE(1,''HJ_BUF_SIZE'',        '||HJ_BUF_SIZE||');';
    PRINT 'SP_SET_PARA_VALUE(1,''HAGR_BUF_GLOBAL_SIZE'','||HAGR_BUF_GLOBAL_SIZE||');';
    PRINT 'SP_SET_PARA_VALUE(1,''HAGR_BUF_SIZE'',     '||HAGR_BUF_SIZE||');';
    
    --修改排序相关参数
    PRINT 'SP_SET_PARA_VALUE(2,''SORT_FLAG'','||SORT_FLAG||');';
    PRINT 'SP_SET_PARA_VALUE(2,''SORT_BLK_SIZE'','||SORT_BLK_SIZE||');';
    PRINT 'SP_SET_PARA_VALUE(2,''SORT_BUF_SIZE'',       '||SORT_BUF_SIZE||');';
    PRINT 'SP_SET_PARA_VALUE(2,''SORT_BUF_GLOBAL_SIZE'',       '||SORT_BUF_GLOBAL_SIZE||');';
    
    --修改其他内存参数
    PRINT 'SP_SET_PARA_VALUE(2,''RLOG_POOL_SIZE'',      '||RLOG_POOL_SIZE||');';
    PRINT 'SP_SET_PARA_VALUE(2,''CACHE_POOL_SIZE'',     '||CACHE_POOL_SIZE||');';  
    PRINT 'SP_SET_PARA_VALUE(2,''DICT_BUF_SIZE'',       '||DICT_BUF_SIZE||');'; 
    PRINT 'SP_SET_PARA_VALUE(2,''VM_POOL_TARGET'',       16384);';
    PRINT 'SP_SET_PARA_VALUE(2,''SESS_POOL_TARGET'',       16384);';


    --修改实例相关参数
    PRINT 'SP_SET_PARA_VALUE(2,''USE_PLN_POOL'',        1);';
    PRINT 'SP_SET_PARA_VALUE(2,''ENABLE_MONITOR'',      1);'; 
    PRINT 'SP_SET_PARA_VALUE(2,''SVR_LOG'',             0);'; 
    PRINT 'SP_SET_PARA_VALUE(2,''TEMP_SIZE'',           1024);';
    PRINT 'SP_SET_PARA_VALUE(2,''TEMP_SPACE_LIMIT'',    102400);';
    PRINT 'SP_SET_PARA_VALUE(2,''MAX_SESSIONS'',        1500);';
    PRINT 'SP_SET_PARA_VALUE(2,''MAX_SESSION_STATEMENT'', 20000);';
    
    --性能要求高且大字段较少的业务场景建议设置为1,大字段多的场景设置为0
    if pk_cluster_mode = 1 then
       PRINT 'SP_SET_PARA_VALUE(2,''PK_WITH_CLUSTER'',    1);';
    else
       PRINT 'SP_SET_PARA_VALUE(2,''PK_WITH_CLUSTER'',    0);';
    end if;
    
    PRINT 'SP_SET_PARA_VALUE(2,''ENABLE_ENCRYPT'',0);';
    
    --修改优化器相关参数
    PRINT 'SP_SET_PARA_VALUE(2,''OLAP_FLAG'',2);';
    PRINT 'SP_SET_PARA_VALUE(2,''VIEW_PULLUP_FLAG'',1);';
    PRINT 'SP_SET_PARA_VALUE(2,''OPTIMIZER_MODE'',1);';
    PRINT 'SP_SET_PARA_VALUE(2,''ADAPTIVE_NPLN_FLAG'',0);';
    
    --开启并行PURGE
    PRINT 'SP_SET_PARA_VALUE(2,''PARALLEL_PURGE_FLAG'',1);';
    --开启手动并行
    PRINT 'SP_SET_PARA_VALUE(2,''PARALLEL_POLICY'',2);';
    
    PRINT 'SP_SET_PARA_DOUBLE_VALUE(2,''UNDO_RETENTION'','||UNDO_RETENTION||');';
    
    --UNDO_RETENTION如果放大,可以适当调大UNDO_EXTENT_NUM。负载高的时候,减少文件系统的申请/释放操作。
    PRINT 'SP_SET_PARA_VALUE(2,''UNDO_EXTENT_NUM'',16);';
    
    --开启INJECT HINT功能
    PRINT 'SP_SET_PARA_VALUE(2,''ENABLE_INJECT_HINT'',1);';


    PRINT 'SP_SET_PARA_VALUE(2,''BTR_SPLIT_MODE'',1);';
        PRINT 'SP_SET_PARA_VALUE(2,''FAST_LOGIN'',1);';
        
        --关闭参数监控
        PRINT 'SP_SET_PARA_VALUE(2,''ENABLE_MONITOR_BP'',0);';
        
        --SLCT_OPT_FLAG参数设置为0
    IF EXISTS (SELECT * FROM V$DM_INI WHERE PARA_NAME='SLCT_OPT_FLAG') THEN
        PRINT 'SP_SET_PARA_VALUE(1,''SLCT_OPT_FLAG'',0);';
      END IF;
          
     IF is_dsc= 1 THEN      
      
       PRINT 'SP_SET_PARA_VALUE(2,''ENABLE_FREQROOTS'',0);';
      --DSC关闭数据页预加载参数
         PRINT 'SP_SET_PARA_VALUE(2,''MULTI_PAGE_GET_NUM'',1);';
         PRINT 'SP_SET_PARA_VALUE(2,''PRELOAD_SCAN_NUM'',0);';
         PRINT 'SP_SET_PARA_VALUE(2,''PRELOAD_EXTENT_NUM'',0);';
    
      PRINT 'SP_SET_PARA_VALUE(2,''DSC_N_POOLS'',' ||MEMORY_N_POOLS ||');'; 
      IF EXISTS (SELECT * FROM V$DM_INI WHERE PARA_NAME='DSC_GBS_REVOKE_OPT') THEN
        PRINT 'SP_SET_PARA_VALUE(2,''DSC_GBS_REVOKE_OPT'',0);';
      END IF;
      PRINT 'SP_SET_PARA_VALUE(2,''DSC_HALT_SYNC'',0);';
      PRINT 'SP_SET_PARA_VALUE(2,''DSC_N_CTLS'',50000);';
          PRINT 'SP_SET_PARA_VALUE(2,''DSC_ENABLE_MONITOR'',0);';
          PRINT 'SP_SET_PARA_VALUE(2,''TRX_DICT_LOCK_NUM'',5);';
      PRINT 'SP_SET_PARA_VALUE(2,''DIRECT_IO'',1);';
     END IF;
    
  END IF;
  
  select MEMORY_TARGET+BUFFER+RECYCLE+HJ_BUF_GLOBAL_SIZE+HAGR_BUF_GLOBAL_SIZE+CACHE_POOL_SIZE
  +DICT_BUF_SIZE+SORT_BUF_GLOBAL_SIZE+RLOG_POOL_SIZE;
  exception
      when others then
         raise_application_error (-20001,substr( ' 执行失败, '||SQLCODE||' '||SQLERRM||' '||dbms_utility.format_error_backtrace  , 1, 400));
  
  <<return_2000>> null;
end;
/

开启归档模式

开启数据库归档可通过两种方式实现。方式一:通过 SQL 命令方式开启归档;方式二:通过修改数据库配置文件方式开启归档。

ARCH_FILE_SIZE 默认 128,推荐 2048 ,本地单个归档文件最大值(单位:M)。

ARCH_SPACE_LIMIT 默认 0,推荐 102400 ,归档大小上限,0 表示无限制(按数据量的 1/5 保留,例如 500G 数据,保留 100G 归档)。

ALTER DATABASE MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE ADD ARCHIVELOG 'DEST=/data/dm8/arch, TYPE=LOCAL, FILE_SIZE=2048, SPACE_LIMIT=102400';
ALTER DATABASE OPEN;

## 另一种方式
##修改数据库实例的 /data/dm8/data/DMTEST/dm.ini文件中 ARCH_INI 参数值
vi /data/dm8/data/DMTEST/dm.ini
##将 ARCH_INI 值改为 1,保存后退出
ARCH_INI = 1 #开启归档功能

##新增文件 dmarch.ini
vi  /data/dm8/data/DMTEST/dmarch.ini
##新增如下内容
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /data/dm8/arch
ARCH_FILE_SIZE = 2048
ARCH_SPACE_LIMIT = 102400

##最后重启数据库完成归档配置

20a904c90a68e5cb3e1213a4d827e1b8.png

配置备份任务

我们可以直接在 SQL 命令行发起备份,在 disql 工具或图形化管理工具 SQL 编辑区中使用 BACKUP 语句可以备份整个数据库,执行以下命令:

SQL> BACKUP DATABASE FULL BACKUPSET '/data/dm8/dm_backup/db_full_bak_01';

##执行备份压缩,压缩级别设置为 5。
SQL> BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_3_06' COMPRESSED LEVEL 5;
##压缩选项有不同的压缩级别可以选择,取值范围为 0~9。应根据存储空间、数据文件大小等确定合适地压缩级别

##创建并行备份,指定并行数为8
SQL> BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_3_07' PARALLEL 8;

## 表备份
SQL> BACKUP TABLE TAB_01 BACKUPSET 'tab_bak_01';
##备份集“tab_bak_01”会生成到默认的备份路径下

## 备份归档
SQL>BACKUP ARCHIVE LOG ALL BACKUPSET 'arch_bak_01';

命令行配置全备任务

例如设置每天 22:30 全量备份、删除 30 天前的全量备份。备份路径为 /data/dm8/dm_backup。

call SP_INIT_JOB_SYS(1);
call SP_CREATE_JOB('bakall_delall',1,0,'',0,0,'',0,'每天 22:30 全量备份、删除 30 天前的全量备份');
call SP_JOB_CONFIG_START('bakall_delall');
call SP_ADD_JOB_STEP('bakall_delall', 'bakall', 6, '01020000/data/dm8/dm_backup', 3, 1, 0, 0, NULL, 0);
call SP_ADD_JOB_STEP('bakall_delall', 'delall', 0, 'SF_BAKSET_BACKUP_DIR_ADD(''DIS'',''/data/dm8/dm_backup'');
CALL SP_DB_BAKSET_REMOVE_BATCH(''DISK'',SYSDATE-30);', 1, 1, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('bakall_delall', 'bakall_delall_time01', 1, 1, 1, 0, 0, '22:30:00', NULL, '2019-01-01 01:01:01', NULL, '');
call SP_JOB_CONFIG_COMMIT('bakall_delall');

命令行配置全备+增备任务

此备份策略适用于数据量大于 100G 并且小于 3T 的场景下。注意开启数据库归档,确定备份路径。

例如:设置每月第一个周六 23:00 全量备份。每天(除周六) 23:00 增量备份、删除 30 天前的增量备份、删除 40 天前的全量备份。全量备份路径为 /data/dm8/dm_backup/all,增量备份路径为 /data/dm8/dm_backup/add。

--设置 60 分钟后自动进行一次全量备份
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', 6, '01020000/data/dm8/dm_backup/all', 1, 1, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('bakall_one', 'bakall_one_time01', 1, 0, 0, 0, 0, NULL, NULL, SYSDATE()+1/24, NULL, '');
call SP_JOB_CONFIG_COMMIT('bakall_one');

--设置全量备份
call SP_CREATE_JOB('bakall',1,0,'',0,0,'',0,'每月第一个周六23:00全量备份');
call SP_JOB_CONFIG_START('bakall');
call SP_ADD_JOB_STEP('bakall', 'bakall', 6, '01020000/data/dm8/dm_backup/all', 1, 1, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('bakall', 'bakall_time01', 1, 4, 1, 7, 0, '23:00:00', NULL, '2019-01-01 01:01:01', NULL, '');
call SP_JOB_CONFIG_COMMIT('bakall');

--设置增量备份 + 删除备份
call SP_CREATE_JOB('bakadd_delbak',1,0,'',0,0,'',0,'每天(除周六)23:00增量备份、删除30天前的增量备份、删除40天前的全量备份');
call SP_JOB_CONFIG_START('bakadd_delbak');
call SP_ADD_JOB_STEP('bakadd_delbak', 'bakadd', 6, '11020000/data/dm8/dm_backup/all|/data/dm8/dm_backup/add', 3, 1, 0, 0, NULL, 0);
call SP_ADD_JOB_STEP('bakadd_delbak', 'delbak', 0, 'SF_BAKSET_BACKUP_DIR_ADD(''DISK'',''/opt/dmdbms/data/DAMENG/bak/add'');
CALL SP_DB_BAKSET_REMOVE_BATCH(''DISK'',SYSDATE-30);
SF_BAKSET_BACKUP_DIR_ADD(''DISK'',''/data/dm8/dm_backup/all'');
CALL SP_DB_BAKSET_REMOVE_BATCH(''DISK'',SYSDATE-40);', 1, 1, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('bakadd_delbak', 'bakadd_delbak_time01', 1, 2, 1, 63, 0, '23:00:00', NULL, '2019-01-01 01:01:01', NULL, '');
call SP_JOB_CONFIG_COMMIT('bakadd_delbak');

=========未完待续系列============

最后这里在新开一个国产数据库技术交流群,有感兴趣的朋友可扫码入群,坑位有限先到先得。本群定位:交流学习国产数据库相关技术,拒绝吹水

989edb3f4c92722894eb61540668bbe1.png

全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

❤️ 欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!

2320c83542776e3fc4bef35c64a4fa14.gif

分享几个数据库备份脚本

一文搞懂 Oracle 统计信息
 
 

我的 Oracle ACE 心路历程

MOP 系列|MOP 三种主流数据库索引简介

Oracle 主流版本不同架构下的静默安装指南
 
 

关机重启导致 ASM 磁盘丢失数据库无法启动

Oracle SQL 性能分析(SPA)原理与实战演练
 
 

Oracle 11g 升级到 19c 需要关注的几个问题

Windows 10 环境下 MySQL 8.0.33 安装指南

SQL 大全(四)|数据库迁移升级时常用 SQL 语句

OGG|使用 OGG19c 迁移 Oracle11g 到 19C(第二版)

Oracle 大数据量导出工具——sqluldr2 的安装与使用

从国产数据库调研报告中你都能了解哪些信息及我的总结建议

使用数据泵利用 rowid 分片导出导入 lob 大表及最佳实践

在归档模式下直接 rm dbf 数据文件并重启数据库还有救吗?

欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!

——————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
ITPUB:https://blog.itpub.net/69968215
腾讯云:https://cloud.tencent.com/developer/user/5645107
——————————————————————————

f06a0c704e061c7911d3ec0769fc16f0.png

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值