达梦数据库文档

1:达梦数据库(DM8)简介

达梦数据库管理系统是武汉达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM。达梦数据库管理系统目前最新的版本是8.0版本,简称DM8。
DM8是达梦公司在总结DM系列产品研发与应用经验的基础上,坚持开放创新、简洁实用的理念,推出的新一代自研数据库。
DM8吸收借鉴当前先进新技术思想与主流数据库产品的优点,融合了分布式、弹性计算与云计算的优势,对灵活性、易用性、可靠性、高安全性等方面进行了大规模改进,多样化架构充分满足不同场景需求,支持超大规模并发事务处理和事务-分析混合型业务处理,动态分配计算资源,实现更精细化的资源利用、更低成本的投入。一个数据库,满足用户多种需求,让用户能更加专注于业务发展。

2:达梦数据在Linux上的安装

产品下载 | 达梦数据库,选择X86,CentOS7

2.1:操作系统环境准备

本次使用的系统版本是CentOS Linux release 7.6.1810 (Core)

[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)
2.2:上传所需文件到/opt/soft
[root@localhost soft]# ls
dm8_20231116_x86_rh6_64.zip
2.3:创建安装用户dmdba和组dinstall,并设置用户密码
[root@localhost ~]# groupadd dinstall
[root@localhost ~]# useradd -s /bin/bash -m -d /home/dmdba -g dinstall dmdba
[root@blocalhost ~]# passwd dmdba      //这里需要设置一个密码,可以设置为 12345678
2.4:关闭SELinux
[root@localhost soft]# vi /etc/selinux/config
SELINUX=disabled

#关闭防火墙
systemctl stop firewalld 
systemctl disable firewalld
2.5:给dmdba配置系统资源限制
[root@blocalhost ~]# vi /etc/security/limits.conf
dmdba soft nofile 65536
dmdba hard nofile 65536
dmdba soft nproc 65536
dmdba hard nproc 65536
dmdba soft stack 16384
dmdba hard stack 32768

用dmdba用户登录系统,查看ulimit参数是否生效: ulimit -a(注意:要切换到dmdba用户进行查看)
[root@localhost soft]# su dmdba 
[dmdba@localhost soft]$ ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31078
max locked memory       (kbytes, -l) 64
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) 4096
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
2.6:创建相关目录
[root@localhost ~]# su - root
[root@localhost ~]# mkdir -p /data/{dmdata,dmarch,logcommit,dmbak}
[root@localhost ~]# chown -R dmdba:dinstall /data/{dmdata,dmarch,logcommit,dmbak}
2.7:解压DM文件,并挂载
[root@localhost ~]# cd /opt/soft

[root@localhost soft]#unzip dm8_20220701_x86_rh6_64_ent.zip     
//如果这里报错没有找到unzip,需要用yum install unzip 如果是离线环境可是去现在一个二进制的包文件进行安装
[root@localhost soft]# ll
total 1691232
-rw-r--r-- 1 root root 874342400 Nov 22 14:19 dm8_20231116_x86_rh6_64.iso
-rw-r--r-- 1 root root       100 Nov 22 14:19 dm8_20231116_x86_rh6_64.iso_SHA256.txt
-rw-r--r-- 1 root root 857471599 Dec 27 16:02 dm8_20231116_x86_rh6_64.zip

挂载iso文件,这样就能像访问目录一样对iso镜像文件进行访问了

[root@localhost soft]# mkdir -p /mnt/cdrom
[root@localhost soft]# mount -o loop /opt/soft/dm8_20231116_x86_rh6_64.iso /mnt/cdrom
mount: /dev/loop0 is write-protected, mounting read-only
2.8:安装DM数据库软件
[root@localhost soft]# su - dmdba
[dmdba@localhost ~]$ cd /mnt/cdrom
[dmdba@localhost cdrom]$ ./DMInstall.bin -i

开始安装,语言选择中文,Key文件先不输入(没有key文件,默认使用一年后到期)
设置时区,选择:[21]: GTM+08=中国标准时间 ,这也是默认的选项。

Installer Language: 
[1]: 简体中文
[2]: English
Please select the installer's language [2]:1

是否输入Key文件路径? (Y/y:是 N/n:否) [Y/y]:n

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

下面的地址为 /home/dmdba/dmdbms

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

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

安装前小结
安装位置: /home/dmdba/dmdbms
所需空间: 1740M
可用空间: 89G
版本信息: 
有效日期: 
安装类型: 典型安装
是否确认安装? (Y/y:是 N/n:否):y
2023-12-28 04:32:54 
[INFO] 安装达梦数据库...
2023-12-28 04:32:54 
[INFO] 安装 基础 模块...
2023-12-28 04:32:57 
[INFO] 安装 服务器 模块...
2023-12-28 04:32:57 
[INFO] 安装 客户端 模块...
2023-12-28 04:32:58 
[INFO] 安装 驱动 模块...
2023-12-28 04:32:58 
[INFO] 安装 手册 模块...
2023-12-28 04:32:58 
[INFO] 安装 服务 模块...
2023-12-28 04:32:58 
[INFO] 移动日志文件。
2023-12-28 04:32:59 
[INFO] 安装达梦数据库完成。

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

安装结束

安装结束后,提示用root用户执行脚本

切换root用户
[dmdba@localhost cdrom]$ su - root
[root@localhost ~]# /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服务
2.9:创建数据库实例
su - dmdba
[dmdba@localhost bin]$ pwd
/home/dmdba/dmdbms/bin

[dmdba@localhost bin]$ ./dminit PATH=/data/dmdata EXTENT_SIZE=32 PAGE_SIZE=16 CASE_SENSITIVE=n SYSDBA_PWD=sysdba123 DB_NAME=dmtest INSTANCE_NAME=dmtest PORT_NUM=5236
initdb V8
db version: 0x7000c
file dm.key not found, use default license!
License will expire on 2024-11-09
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL

 log file path: /data/dmdata/dmtest/dmtest01.log
 log file path: /data/dmdata/dmtest/dmtest02.log

write to dir [/data/dmdata/dmtest].
create dm database success. 2023-12-28 19:21:29
2.10:注册实例服务的脚本
su - root
[root@localhost root]# pwd
/home/dmdba/dmdbms/script/root

[root@localhost root]# ./dm_service_installer.sh -t dmserver -p TEST -dm_ini /data/dmdata/dmtest/dm.ini
Created symlink from /etc/systemd/system/multi-user.target.wants/DmServiceTEST.service to /usr/lib/systemd/system/DmServiceTEST.service.
创建服务(DmServiceTEST)完成
2.11:启动数据库服务
[root@localhost root]# systemctl start DmServiceTEST

[root@localhost root]# systemctl status DmServiceTEST   #查看状态
● DmServiceTEST.service - DM Instance Service(DmServiceTEST).
   Loaded: loaded (/usr/lib/systemd/system/DmServiceTEST.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2023-12-28 19:28:33 CST; 10s ago
  Process: 67672 ExecStart=/home/dmdba/dmdbms/bin/DmServiceTEST start (code=exited, status=0/SUCCESS)
 Main PID: 67695 (dmserver)
    Tasks: 83
   CGroup: /system.slice/DmServiceTEST.service
           └─67695 /home/dmdba/dmdbms/bin/dmserver path=/data/dmdata/dmtest/dm.ini -noconsole

Dec 28 19:28:18 localhost.localdomain systemd[1]: Starting DM Instance Service(DmServiceTEST)....
Dec 28 19:28:33 localhost.localdomain DmServiceTEST[67672]: [35B blob data]
Dec 28 19:28:33 localhost.localdomain systemd[1]: Started DM Instance Service(DmServiceTEST)..
[root@localhost root]# 

或安装bin目录下进行启动
# ./DmServiceTEST start

3:DM数据库配置

3.1:配置环境变量
达梦数据库提供了命令行客户端工具disql(类似oracle的sqlplus),用于连接数据库。
disql工具在安装目录的bin目录下,可以把bin目录添加到环境变量PATH中,dmdba用户下查看配置文件

[root@localhost root]# su - dmdba
[dmdba@localhost ~]$ vi ~/.bash_profile
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/home/dmdba/dmdbms/bin"
export DM_HOME="/home/dmdba/dmdbms"
export PATH=$PATH:$DM_HOME/bin:$DM_HOME/tool
export PATH

[dmdba@localhost ~]$ source ~/.bash_profile

这样我们在任何地方都可以使用命令登录数据库了

[dmdba@localhost ~]$ disql SYSDBA/SYSDBA123
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.518(ms)
disql V8
SQL> 

切换root用户使用软连接
[dmdba@localhost ~]$ su root
[root@localhost ~]# vi ~/.bash_profile

把下列数据插入到指定的位置即可
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/home/dmdba/dmdbms/bin"
export DM_HOME="/home/dmdba/dmdbms"
export PATH=$PATH:$DM_HOME/bin:$DM_HOME/tool
3.2:创建表空间、用户
create tablespace aaa datafile '/data/dmdata/dmtest/AAA.DBF' size 128 autoextend on next 4 maxsize 1024;

create user "dameng" identified by "dameng123" default tablespace "aaa" default index tablespace "aaa";

grant "PUBLIC","RESOURCE","VTI" to "dameng";
grant SELECT on "DMHR"."CITY" to "dameng";
alter user "dameng" limit  failed_login_attemps unlimited, password_lock_time unlimited, password_grace_time unlimited;

select * from dba_users;

CALL SP_TABLEDEF('DAMENG', 't1');  查看建表语句
3.3:达梦数据库开启归档模式
ALTER DATABASE MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE ADD ARCHIVELOG 'DEST=/data/dmarch, TYPE=LOCAL, FILE_SIZE=2048, SPACE_LIMIT=102400';
ALTER DATABASE OPEN;
3.4:配置 SQL 日志

SQL 日志内容包含系统各会话执行的 SQL 语句、参数信息、错误信息等。
SQL 跟踪日志主要用于分析错误和分析性能问题,基于跟踪日志可以对系统运行状态有一个分析,比如,可以挑出系统现在执行速度较慢的 SQL 语句,进而对其进行优化。

打开 SQL 日志会对系统的性能会有较大影响,一般用于查错和调优的时候才会打开,默认情况下系统是关闭 SQL 跟踪日志的。若需要 SQL 跟踪日志但对日志的实时性没有严格的要求,又希望系统有较高的效率,可以设置 sqllog.ini 参数 SQL_TRACE_MASK 和 MIN_EXEC_TIME 只记录关注的相关记录,减少日志总量;设置 sqllog.ini 参数 ASYNC_FLUSH 打开 SQL 日志异步刷盘功能,以提高系统性能。

创建 SQL 日志存放目录
su - dmdba
mkdir -p /data/logcommit

select * from v$parameter where name like 'SVR_LOG%';
修改实例路径下 sqllog.ini 文件如下:设置 sql 日志为异步,按照文件大小进行切换,每个 1024M,20 个文件循环写。
cd /data/dmdata/dmtest
vi sqllog.ini

BUF_TOTAL_SIZE = 10240 #SQLs Log Buffer Total Size(K)(1024~1024000)
BUF_SIZE = 1024 #SQLs Log Buffer Size(K)(50~409600)
BUF_KEEP_CNT = 6 #SQLs Log buffer keeped count(1~100)

[SLOG_ALL]
FILE_PATH = /data/logcommit  #sql 日志生成路径
PART_STOR = 0
SWITCH_MODE = 2
SWITCH_LIMIT = 1024  #每个日志文件 1024M
ASYNC_FLUSH = 1
FILE_NUM = 20  #循环收集 20 个可以根据实际情况做调整
ITEMS = 0
SQL_TRACE_MASK = 1
MIN_EXEC_TIME = 0
USER_MODE = 0
USERS =

执行调用存储过程生效配置文件,并开启 SQLLOG 日志。
SP_REFRESH_SVR_LOG_CONFIG();
sp_set_para_value(1,'SVR_LOG',1);

--检查 SVR_LOG 参数。
select * from v$parameter where name like ‘SVR_LOG’;
3.5:备份

达梦数据库中的数据存储在数据库的物理数据文件中,数据文件按照页、簇和段的方式进行管理,数据页是最小的数据存储单元。任何一个对达梦数据库的操作,其根本都是对某个数据文件页的读写操作。因此,DM 备份的本质就是从数据库文件中拷贝有效的数据页保存到备份集中,这里的有效数据页包括数据文件的描述页和被分配使用的数据页。数据库备份可按照实际需求进行手动备份或设置定时备份。手动备份详细内容可参考数据库安装目录 doc 路径下《DM8 备份与还原》手册。以下主要详细介绍定时备份相关内容。

达梦数据库提供定时备份功能。在设置定时备份前,应依据实际业务需求和数据量大小,采用不同的备份策略,达梦数据库常用备份策略包括全量备份 + 删除和全量备份 + 增量备份 + 删除。可使用命令行或图形化方式设置定时备份。

1. 全量备份 + 删除(推荐使用)
此备份策略适用于数据量小于 100G 的场景下。注意开启数据库归档,确定备份路径。
例如设置每天 23:00 全量备份、删除 10 天前的全量备份。备份路径为 /data/dmbak。

call SP_INIT_JOB_SYS(1);
call SP_CREATE_JOB('bakall_delall',1,0,'',0,0,'',0,'每天 23:00 全量备份、删除 10 天前的全量备份');
call SP_JOB_CONFIG_START('bakall_delall');
call SP_ADD_JOB_STEP('bakall_delall', 'bakall', 6, '01020000/data/dmbak', 3, 1, 0, 0, NULL, 0);

call SP_ADD_JOB_STEP('bakall_delall', 'delall', 0, 'SF_BAKSET_BACKUP_DIR_ADD("DISK","/data/dmbak");
CALL SP_DB_BAKSET_REMOVE_BATCH("DISK",SYSDATE-10);', 1, 1, 0, 0, NULL, 0);

call SP_ADD_JOB_SCHEDULE('bakall_delall', 'bakall_delall_time01', 1, 1, 1, 0, 0, '23:00:00', NULL, '2023-12-29 01:01:01', NULL, '');
call SP_JOB_CONFIG_COMMIT('bakall_delall');

2. 全量 + 增量 + 删除
配置前明确以下内容:
(1)备份策略。例如每月第一个周六 23:00 全量备份。每天(除周六) 23:00 增量备份、删除 30 天前的增量备份、删除 40 天前的全量备份。
(2)注意开启数据库归档,在 bak 目录下手动创建全备文件夹(all)和增备文件夹(add)。即全量备份路径:/data/dmbak/all,增量备份路径:/data/dmbak/add。

--设置 2 分钟后自动进行一次全量备份
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/dmbak/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()+0.0014, 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/dmbak/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/dmbak/all|/data/dmbak/add', 3, 1, 0, 0, NULL, 0);

call SP_ADD_JOB_STEP('bakadd_delbak', 'delbak', 0, 'SF_BAKSET_BACKUP_DIR_ADD("DISK","/data/dmbak/add");
CALL SP_DB_BAKSET_REMOVE_BATCH("DISK",SYSDATE-30);
SF_BAKSET_BACKUP_DIR_ADD("DISK","/data/dmbak/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');