初识达梦数据库管理系统
一、达梦数据库最新的版本(DM8):
DM8是达梦公司在总结DM系列产品研发与应用经验的基础上,坚持开放创新、简洁实用的理念,历经五年匠心打磨,推出的新一代自研数据库。
DM8吸收借鉴当前先进新技术思想与主流数据库产品的优点,融合了分布式、弹性计算与云计算的优势,对灵活性、易用性、可靠性、高安全性等方面进行了大规模改进,多样化架构充分满足不同场景需求,支持超大规模并发事务处理和事务-分析混合型业务处理,动态分配计算资源,实现更精细化的资源利用、更低成本的投入。一个数据库,满足用户多种需求,让用户能更加专注于业务发展。
二、产品特点
1、 多维融合,满足多样需求
基于新技术发展的思考和市场的需求,坚持实用性、通用性和简洁性的理念,DM8提出了面向未来的新架构并持续演进。四种架构,共通共存,多样化配置充分满足不同场景需求。化繁为简,合而为“一”,让用户不再因规模而不断妥协。
2、关键业务解决方案—达梦数据共享集群(DM DSC)
DM8数据共享集群实现了更大规模的集群支持,用户和运维人员可以将原有的2节点DM DSC升级为更多节点,以取得更高的系统可靠性;添加了用于异地容灾的数据守护支持以提升容灾能力;增加了DSC Plus(DSCP)特性,支持远程高可用镜像部署方式。
3、达梦分布式事务处理架构—透明分布式数据库
具有分布式数据库的高可扩展、高可用、高并发处理能力,且对用户透明;同时又具备传统数据库的所有高级特性,支持传统数据库所有开发接口和业务开发框架的技术架构,用户只需将传统应用直接部署在DM8 TDD集群上,即可简单完成数据架构划时代的进化。
4、达梦分布式动态分析架构—数据库弹性计算
可以在保证包括SQL支持能力在内的所有数据库功能完备性的同时,显著提升关系数据库集群的横向扩展能力,释放用户设备算力;同时对于数据中心和云计算中心而言,更低成本、更灵活的计算扩展方式,也可促进数据中心整体能效的提升。
5、达梦混合事务分析处理技术—行列融合2.0
行列融合2.0令DM8具备了事务-分析混合型业务处理的能力,满足用户对HTAP应用场景的需求,包含变更缓存、高级日志两个关键特性,用以弥合行存储与列存储的鸿沟。简化系统架构,轻量灵活,降低应用开发和运维的难度。
三、目前国内外数据库形势:
国外:
Oracle 20C (11g 银行、电力、运营商)
SQL server 2012/2014 (政府)
DB2 (银行数据中心、烟草)
MySQL (开源、互联网、电信TelDB)
PostgreSQL (学术性、国产二次开发)
Informix sybase
国内:
人大金仓 8 (pg 电力、政府、央企)
达梦 8 (代码自主原创,电力、审计等)
神通 7(pg 审计、电力等)
南大 8(8a pg ,8t informix,8s mysql)
OB (自主原创、金融,蚂蚁金服)
高斯100 (自研)
四、数据库安装
1、安装前硬件检查
cpu:P4 1.6以上
lscpu
检查内存:256M-512M
free -hl
检查硬盘:5G
df -hl
DM 安装程序在安装时将产生临时文件,临时文件需要 1GB 的存储空间,临时文
件目录默认为/tmp
内核版本检测:2.6以上
uname -r
glibc2.3以上
rpm -q glibc
建议安装unixODBC
rpm -q unixODBC
安装rpm程序包
yum -y install unixODBC
查询操作系统商业版本
cat /etc/os-release
操作系统位数
getconf LONG_BIT
2、安装前系统配置(以linux为例)
(1)关闭防火墙
6.X
service iptables stop 停止
chkconfig iptables off 禁用开机启动
service iptables status 当前状态
7.X
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
(2)关闭Selinux
vi /etc/selinux/config
SELINUX=disabled
(3)配置网卡
查看设备
ip add
修改
(方法1)
vi /etc/sysconfig/network-scripts/ifcfg-ens33
重启生效
ifdown ens33(网卡名称) 关闭网卡–本地登录
ifup ens33 (网卡名称) 启动网卡–本地登录
service network restart 重启网络服务–远程连接方式
(方法2) 命令修改(os7)
nmcli con mod ens33 ipv4.addresses “192.168.50.135/24” gw4 “192.168.50.1” ipv4.method manual ipv4.dns “114.114.114.114 8.8.8.8” con.autoconnect yes
[root@neokylin76 ~]# nmcli connection reload
[root@neokylin76 ~]# nmcli device status
ifdown ens33 (网卡名称) 关闭网卡–本地登录
ifup ens33 (网卡名称) 启动网卡–本地登录
service network restart 重启网络服务–远程连接方式
(4)主机名称
os6
hostname 查看
vim /etc/sysconfig/network 永久修改,需要重启
hostname dm7test 当前名称,注销重入
os7
hostnamectl 查看
hostnamectl set-hostname dm7test 永久修改,注销重入
(5)配置hosts
vi /etc/hosts
(6)安装用户组与用户
创建用户组
groupadd dinstall
创建用户dmdba
useradd -g dinstall dmdba
设置密码:
passwd dmdba
(7)创建安装目录
mkdir -p /dm7/
mkdir -p /dm7/data
mkdir -p /dm7/arch
mkdir -p /dm7/back
chown -R dmdba:dinstall /dm7
chmod -R 775 /dm7
(8)检查系统参数
ulimit -a
data seg size 1048576(即 1GB)
file size unlimited
open files 65536 以上或 unlimited
virtual memory 1048576(即 1GB)
修改open-files参数
vim /etc/security/limits.conf
dmdba soft nofile 4096
dmdba hard nofile 65536
(9)修改用户配置文件
su - dmdba
vim /home/dmdba/.bash_profile
PATH=
D
M
H
O
M
E
/
b
i
n
:
DM_HOME/bin:
DMHOME/bin:PATH:
H
O
M
E
/
b
i
n
3
、
数
据
库
安
装
①
检
查
是
否
有
数
据
库
服
务
运
行
[
d
m
d
b
a
@
d
m
1
t
o
o
l
]
HOME/bin 3、数据库安装 ①检查是否有数据库服务运行 [dmdba@dm1 tool]
HOME/bin3、数据库安装①检查是否有数据库服务运行[dmdba@dm1tool] ps -ef|grep dmap
②查看是否有服务注册:
os6:[dmdba@dm1 tool]
c
h
k
c
o
n
f
i
g
−
−
l
i
s
t
∣
g
r
e
p
D
0
s
7
:
[
d
m
d
b
a
@
d
m
1
t
o
o
l
]
chkconfig --list|grep D 0s7:[dmdba@dm1 tool]
chkconfig−−list∣grepD0s7:[dmdba@dm1tool]systemctl list-dependencies|grep Dm
os7:[dmdba@dm1 tool]
s
y
s
t
e
m
c
t
l
l
i
s
t
−
u
n
i
t
−
f
i
l
e
s
∣
g
r
e
p
D
m
③
卸
载
注
意
:
如
果
有
实
例
在
运
行
,
停
止
数
据
库
实
例
,
对
数
据
库
做
备
份
。
再
去
卸
载
软
件
。
停
止
辅
助
服
务
D
m
A
P
S
e
r
v
i
c
e
o
s
6
:
s
e
r
v
i
c
e
D
m
A
P
S
e
r
v
i
c
e
s
t
o
p
o
s
7
:
s
y
s
t
e
m
c
t
l
s
t
o
p
D
m
A
P
S
e
r
v
i
c
e
停
止
实
例
R
H
E
L
6
:
/
e
t
c
/
r
c
.
d
/
i
n
i
t
.
d
/
D
m
s
e
r
v
i
c
e
+
实
例
名
s
t
o
p
如
:
[
d
m
d
b
a
@
d
m
1
]
systemctl list-unit-files|grep Dm ③卸载 注意:如果有实例在运行,停止数据库实例,对数据库做备份。再去卸载软件。 停止辅助服务 DmAPService os6:service DmAPService stop os7:systemctl stop DmAPService 停止实例 RHEL6:/etc/rc.d/init.d/Dmservice+实例名 stop 如:[dmdba@dm1 ~]
systemctllist−unit−files∣grepDm③卸载注意:如果有实例在运行,停止数据库实例,对数据库做备份。再去卸载软件。停止辅助服务DmAPServiceos6:serviceDmAPServicestopos7:systemctlstopDmAPService停止实例RHEL6:/etc/rc.d/init.d/Dmservice+实例名stop如:[dmdba@dm1 ] /etc/rc.d/init.d/DmServiceTEST stop
RHEL7:/usr/lib/systemd/system/ Dmservice+实例名.services stop
卸载程序
命令行:[dmdba@dm1 dm7]$ ./uninstall.sh -i
删除服务
root运行脚本/dm7/root_uninstaller.sh
彻底删除
rm -rf 文件、文件夹名称
④挂安装包:
mount -o loop /home/dmdba/dm7_setup_rh6_64_ent_7.6.0.197_20190917.iso /mnt
⑤安装
[dmdba@dm1 mnt]$ ./DMInstall.bin -i
⑥执行安装后脚本
[root@dm1 secur1ity]# /dm7/script/root/root_installer.sh
五、数据库管理
1、实例安装
命令:(dminit)
Oracle,mysql,sql server(文件组)
命令:create database
[dmdba@dm1 ~]$ dminit help
path 数据文件的路径
db_name 数据库的名字
instance_name 实例名字
port_num 端口号
注意:
oracle如何识别实例 oracle_sid (1521)
达梦识别实例 端口号(一个端口对应一个实例)
一个软件运行多个实例(端口)
[dmdba@dm1 ~]$ dminit path=/dm7/data db_name=DM instance_name=PROD port_num=5237
查看注册:[dmdba@dm1 ~]$ chkconfig --list|grep D
把数据库服务注册到OS:
[root@dm1 root]# ./dm_service_installer.sh -h
[root@dm1 root]# ./dm_service_installer.sh -t dmserver -p PROD -i /dm7/data/DM/dm.ini
[dmdba@dm1 root]$ netstat -ntl|grep 52
2、实例管理
一、安装目录结构
bin 达梦命令和库文件(linux .so windwos .dll)
drivers 驱动(jdbc)
license_en.txt / license_zh.txt (许可信息)
release_zh.txt / release_en.txt (版本信息)
uninstall/ uninstall.sh 卸载
bin2
include 头文件.h(达梦C语言)
samples 例子
desktop 桌面
jar jar包 (导出导入的、日志挖掘、文件快速加载)
log 日志(安装日志、工作日志)
script 脚本
web DEM(利用web维护和部署数据库的工具)B/S
doc 帮助文档
jdk java
tool 工具
二、DM管理工具
2.1 图形化方式
2.2 命令行
2.2.1启动工具
客户端的disql (安装目录的tool)
[dmdba@dm1 tool]$ cd /dm7/tool/
[dmdba@dm1 tool]$ ./disql
SQL> conn sysdba/SYSDBA
服务器的disql (安装目录的bin)
[dmdba@dm1 ~]$ cd /dm7/bin
[dmdba@dm1 bin]$ disql
用户名:sysdba
密码:
注意:1 .不指定端口时,默认使用5236端口)
2. 指定端口练级的格式如下(如5237端口)
[dmdba@dm1 bin]$ disql sysdba/SYSDBA@127.0.0.1:5237
2.2.2通过参数文件配置默认连接
[dmdba@dm1 bin]$ vim /etc/dm_svc.conf
TIME_ZONE=(480)
LANGUAGE=(cn)
TEST=(192.168.10.61:5236)
PROD=(192.168.10.61:5237)
配置完成后直接使用链接名称PROD,无需指定IP:端口
[dmdba@dm1 bin]$ disql sysdba/SYSDBA@prod
2.3常见问题
密码错误
网络不通、数据库服务未启动、达到最大的会话连接数
扩大链接数:sp_set_para_value(2,‘MAX_SESSIONS’,500);
三、 实例管理 (启动和关闭)
3.1 数据库的状态:
Oracle:nomount mount open readonly
DM: mount open suspend
注意:集群时还有如下状态:(数据守护 primary standby)
状态查询命令:
SQL> select status$ from v
i
n
s
t
a
n
c
e
;
S
Q
L
>
s
e
l
e
c
t
s
t
a
t
u
s
instance; SQL> select status
instance;SQL>selectstatus from v$database;
启动的过程:
shutdown—mount
分配共享内存,启动后台的进程或者线程,打开控制文件
mount—open
根据控制文件打开重做日志文件和数据文件
数据库状态转换:
open—mount
SQL> alter database mount;
mount—open
SQL> alter database open;
open----suspend
SQL> alter database suspend;
suspend—open
SQL> alter database open;
3.2 实例的启动与关闭
(1) 服务方式:
达梦服务查看器
(2) dmserver 命令
格式:dmserver [ini_file_path] [-noconsole] [mount]
[dmdba@dm1 ~]$ /dm7/bin/dmserver /dm7/data/DAMENG/dm.ini(dm.ini参数文件)
[dmdba@dm1 ~]$ /dm7/bin/dmserver /dm7/data/DAMENG/dm.ini mount
以mount方式启动
注意:1.此种方式为调试模式,属于前台启动,如果关闭调试窗口、在窗口内输入ctrl+C或exit视为关闭数据库实例操作。
2. 此种方式启动会检查dm.key是否过期,过期则无法启动。
(3)linux服务器方式(调用的dmserver)
RHEL6:
[dmdba@dm1 ~]$ /etc/rc.d/init.d/DmServiceTEST start
[dmdba@dm1 ~]$ /etc/rc.d/init.d/DmServiceTEST stop
或service DmService实例名 start/stop/restart
调用位置:RHEL6:/etc/rc.d/init.d/Dmservice+实例名
RHEL7:
/usr/lib/systemd/system/ Dmservice+实例名.services start/stop
或systemctl start/stop/restart DmService实例名
调用位置:RHEL7:安装目录的bin Dmservice+实例名
3、数据库备份与还原
一、备份目的:
- 天灾
- 误操作
- 硬件故障
- 软件故障
二、备份的介质: - 磁盘
- 磁带
- 光盘
三、备份方法:
3.1. 物理备份 (数据文件)
a) 冷备份(数据库关闭)
b) 热备份(数据库打开)
c) 完全备份和增量备份(不支持差异增量)
3.2. 逻辑备份(SQL)
四、冷备份:(可能会丢数据)
4.1数据库关闭
[dmdba@dm1 DAMENG]$ /etc/rc.d/init.d/DmServiceTEST status
[dmdba@dm1 DAMENG]$ /etc/rc.d/init.d/DmServiceTEST stop
4.2damp服务要开启
[dmdba@dm1 DAMENG]$ /etc/rc.d/init.d/DmAPService status
注意:提示管道文件已存在?
删除安装目录bin下的DM_PIPE_DMAP_LSNR_*,再启动dmap
4.3执行备份
[dmdba@dm1 bin]$ cd /dm7/bin
[dmdba@dm1 bin]$ ./dmrman
RMAN> backup database ‘/dm7/data/DAMENG/dm.ini’ backupset ‘/dm7/backup/20200429’
[dmdba@dm1 20200429]$ ls
20200429.bak(备份文件) 20200429.meta(备份的元数据)
4.4还原备份
假设数据库崩溃,利用冷备份还原?
1)restore database
RMAN> restore database ‘/dm7/data/DAMENG/dm.ini’ from backupset ‘/dm7/backup/20200429’
此时打开数据库会报错
[dmdba@dm1 ~]$ /etc/rc.d/init.d/DmServiceTEST start
Starting DmServiceTEST: [ FAILED ]
version info: enterprise
Use normal os_malloc instead of HugeTLB
Use normal os_malloc instead of HugeTLB
DM Database Server x64 V7.6.0.197-Build(2019.09.12-112648)ENT startup…
License will expire on 2020-09-10
instance TEST is restored,should be recovered.
2)recover database
RMAN> recover database ‘/dm7/data/DAMENG/dm.ini’ from backupset ‘/dm7/backup/20200429’
5、热备份:数据库必须是归档模式
5.1 检查数据库归档模式
SQL> select arch_mode from v
d
a
t
a
b
a
s
e
;
N
非
归
档
模
式
5.2
打
开
归
档
:
1
)
.
数
据
库
到
配
置
模
式
S
Q
L
>
a
l
t
e
r
d
a
t
a
b
a
s
e
m
o
u
n
t
;
2
)
.
配
置
归
档
文
件
S
Q
L
>
a
l
t
e
r
d
a
t
a
b
a
s
e
a
d
d
a
r
c
h
i
v
e
l
o
g
′
t
y
p
e
=
l
o
c
a
l
,
d
e
s
t
=
/
d
m
7
/
a
r
c
h
,
f
i
l
e
s
i
z
e
=
64
,
s
p
a
c
e
l
i
m
i
t
=
0
′
;
3
)
.
打
开
归
档
S
Q
L
>
a
l
t
e
r
d
a
t
a
b
a
s
e
a
r
c
h
i
v
e
l
o
g
;
4
)
.
打
开
数
据
库
S
Q
L
>
a
l
t
e
r
d
a
t
a
b
a
s
e
o
p
e
n
;
数
据
库
打
开
[
d
m
d
b
a
@
d
m
1
D
A
M
E
N
G
]
database; N 非归档模式 5.2打开归档: 1). 数据库到配置模式 SQL> alter database mount; 2). 配置归档文件 SQL> alter database add archivelog 'type=local,dest=/dm7/arch,file_size=64,space_limit=0'; 3). 打开归档 SQL> alter database archivelog; 4). 打开数据库 SQL> alter database open; 数据库打开 [dmdba@dm1 DAMENG]
database;N非归档模式5.2打开归档:1).数据库到配置模式SQL>alterdatabasemount;2).配置归档文件SQL>alterdatabaseaddarchivelog′type=local,dest=/dm7/arch,filesize=64,spacelimit=0′;3).打开归档SQL>alterdatabasearchivelog;4).打开数据库SQL>alterdatabaseopen;数据库打开[dmdba@dm1DAMENG] /etc/rc.d/init.d/DmServiceTEST status
dmap服务启动
[dmdba@dm1 DAMENG]$ /etc/rc.d/init.d/DmAPService status
5.3 备份:(库,表空间,表,归档)
库
SQL> backup database backupset ‘/dm7/backup/db_bak’;
表空间
SQL> backup tablespace dmhr backupset ‘/dm7/backup/dmhr_bak’;
表
SQL> backup table dmhr.employee backupset ‘/dm7/backup/emp_bak’;
归档日志
SQL> backup archivelog backupset ‘/dm7/backup/arch_bak’;
注意:(system损坏,要重新初始化数据库,在利用整个备份还原,(dmrman))
roll表空间损坏用(dmrman)还原
5.4 还原
假设DMHR表空间损害?
SQL> alter tablespace dmhr offline;
SQL> restore tablespace dmhr from backupset ‘/dm7/backup/db_bak/’;
SQL> alter tablespace dmhr online;
6、逻辑备份(dexp dimp) 数据库,表,用户,模式
备份参数查询:
[dmdba@dm1 db_bak]$ dexp help
备份表:
[dmdba@dm1 db_bak]$ dexp sysdba/SYSDBA file=/dm7/backup/emp.dmp tables=dmhr.emp
还原表:
[dmdba@dm1 db_bak]$ dimp sysdba/SYSDBA file=/dm7/backup/emp.dmp tables=dmhr.emp
总结:物理备份备份的数据文件,不备份配置文件,redolog,控制文件。
4、DMSQL语言
一、DMSQL简介
SQL 结构化查询语言
分类:DML DDL DCL TCL
二、DML 命令
(select insert update delete)
2.1 select
- 简单查询
select () from ();
第一个括号可以接(*,列命名,||,alias,distinct,表达式) - 过滤排序
过滤 select () from () where ();
where后边可以接(比较运算,逻辑运算,NULL/NOT NULL,in,between…and,模糊查询like)
排序:select () from () where () order by (asc / desc); - 分组查询
聚合函数 sum avg max min count
select 聚合函数(),column_name from () group by (column_name) having (); - 多表查询
99标准:
内连接:
自然连接
using子句
on子句
语法:select () from () join () on ();
找出每个用工所在的部门?
SQL> select e.employee_name,d.department_name from employee e join department d on e.department_id=d.department_id;(问题,有员工没有部门)
自连接(分表)
hash join
SQL> select e.employee_name,d.department_name from employee e hash join department d on e.department_id=d.department_id;
第 1 行, 第 110 列[hash]附近出现错误[-2007]:
语法分析出错.
SQL> select e.employee_name,d.department_name from employee e inner hash join department d on e.department_id=d.department_id;
外连接:
左外连接
SQL> select e.employee_name,d.department_name from employee e left join department d on e.department_id=d.department_id;(解决员工没有部门)
右外连接(right join)
全外连接 (full join) - 子查询
分类:单行 多行
机制:子查询的结果是主查询的条件,子查询先于主查询运行
单行:返回结果唯一
select () from () where ()=(sql语句);
找出和马学铭在同一个部门的人?(同名,可以使用in)
SQL> select department_id,employee_name from employee where department_id= (select department_id from employee where employee_name=‘马学铭’);
SQL> select department_id,employee_name from employee where department_id =(select department_id from employee where employee_name=‘马学铭’);
[-4097]:单行子查询返回多行
解决办法:
SQL> select department_id,employee_name from employee where department_id in (select department_id from employee where employee_name=‘马学铭’);
SQL> select department_id,employee_name from employee where department_id = any (select department_id from employee where employee_name=‘马学铭’);
多行子查询:返回结果为多个 any all in exists
any(min) <any(max)
all(max) <all(min)
找出比1004部门所有人工资都高的?
SQL> select employee_name,department_id,salary from employee where salary >all (select salary from employee where department_id=1004);
in:先运行子查询,子查询运行完,在运行主查询。
exists:先运行子查询,如果存在满足查询条件的,就去运行主查询,主查询没有满足条件的,再运行子查询,直到没有满足条件的。
其他命令在表管理中进行介绍