前言:

达梦数据库作为已商业化的国产数据库代表,在政府及事业单位应用还是比较广泛。最近工作中有使用到达梦数据库,这里对已学习的相关内容作个简单记录,方便以后查阅。另外,网络上有关达梦数据库的资料甚少,且不够准确和系统,也希望这篇博文能帮助有需求的人员快速了解该数据库。

达梦数据库也属于关系型数据库大类,因此有相关经验将非常有利于理解该数据库,尤其是ORACLE数据库的使用经验。


一)基本概念介绍

这里主要简单介绍以下几个简单但重要的概念:数据库、实例、用户、表空间、模式、表、角色、数据文件

数据库:数据存储的物理介质。广义上讲任何存储数据的物理介质都可叫着数据库,例如一个word文档。但实际上,我们说数据库一般是指像MySQL,ORACLE, HBASE等之类的软件系统。这些系统除了提供数据的存储外,还提供一整套相关的工具或接口对存储的数据进行管理。达梦数据库就是这样的一种系统。


数据库实例:已实例化可存储数据的仓库。达梦数据库与MySQL数据库有一个很大的差别就是:MySQL服务启动后通过create database语句创建N个数据库(数据库实例);而达梦数据库一个实例就只能挂一个数据库(即一个实例就是一个数据库),如果想建多个数据库,则需配置启动相应数量的实例。达梦的每个实例有一系列的后台进程和内存结构,这些是相互独立的。


用户:达梦数据库用户是建在实例下的,因为实例相互独立,所有达梦数据库不同的实例下可以有相同的用户名。另外,在达梦数据库中通过create user语句创建用户时,会同时创建一个同名的“模式”。也可以通过create schema语句单独创建模式(特别注意:在Oracle中,用户与schema是一一对应的,不能单独创建模式,要想创建模式得需通过创建一个同名用户来实现),并授权给某个已存在的用户,因此在达梦数据库中用户与模式是1:N的关系。(注:如果先通过create schema创建了模式,再通过create user创建同名用户,不能创建成功。)


表空间是一个用来管理数据存储的概念,表空间只是和数据文件(ORA或者DBF文件)发生关系,数据文件是物理的,一个表空间可以包含多个数据文件,而一个数据文件只能隶属一个表空间。可以将表空间理解为对应一块物理存储区,专门用来存储数据文件。实例化达梦数据库时,默认会创建MAIN、ROLL、SYSTEM、TEAM及HMAIN五个表空间。ROLL、SYSTEM、TEAM表空间系统自行维护,用户所建表(如果未指定存放表空间的话)默认放在MAIN表空间。用户也可自定义表空间,然后在创建用户时指定为默认表空间;也可以在建表时通过加"tablespace SpaceName"语句动态指定该表的存储表空间。


模式(schema):如果仅使用过MySQL,而没有ORACLE数据库使用经验,这个概念比较难理解。先摘录一段官方说明:

A schema is a collection of database objects,such as table, view, sequence, etc (used by a user.). Schema objects are the "logical" structures that directly refer to the database’s data. A user is a name defined in the database that can connect to and access objects through schema. Schemas and users help database administrators manage database security.

关于模式,需要记住一下几点:

  1.  一个用户一般对应一个schema,该用户的schema名等于用户名,并作为该用户缺省schema;

  2. 一个用户还可以使用其他的schema(Oracle数据库也可通过权限管理实现访问其他schema);

  3. 创建模式不指定用户时,该模式默认为SYSDBA拥有;

  4. 在同一模式下不能存在同名对象,但在不同模式中的对象名称可以相同;

  5. 用户可以直接访问同名模式对象,但如果要要访问其他模式对象,则必须具有对象权限;

  6. 当用户要访问其他模式对象时,必须附加模式名作后缀(schema.table);

  7. 用户是用来连接数据库对象,而模式是用来创建及管理对象的。


这个就不用说了吧,但要说明的一点是一个表只能属于一个表空间。


角色:在达梦数据库中,每个用户都有角色。它决定了该用户有什么权限,比如DBA,拥有最高权限。补充说明一点是,实例化的达梦数据库默认有3种角色:DBA, PUBLIC,RESOURCE。新建的用户只拥有PUBLIC角色,该角色几乎做不了撒,因此一般新建用户后,需要单独对他(她)进行授权。


数据文件:数据的物理载体。


这里是帮助理解的一段类比说明:

“我们可以把Database看作是一个大仓库,仓库分了很多很多的房间,Schema就是其中的房间,一个Schema代表一个房间,Table可以看作是每个Schema中的床,Table(床)被放入每个房间中,不能放置在房间之外,那岂不是晚上睡觉无家可归了,然后床上可以放置很多物品,就好比 Table上可以放置很多列和行一样,数据库中存储数据的基本单元是Table,现实中每个仓库放置物品的基本单位就是床, User就是每个Schema的主人,(所以Schema包含的是Object,而不是User),user和schema是一一对应的,每个user在没有特别指定下只能使用自己schema(房间)的东西,如果一个user想使用其他schema(房间)的东西,那就要看那个schema(房间)的user(主人)有没有给你这个权限了,或者看这个仓库的老大(DBA)有没有给你这个权限了。换句话说,如果你是某个仓库的主人,那么这个仓库的使用权和仓库中的所有东西都是你的(包括房间),你有完全的操作权,可以扔掉不用的东西从每个房间,也可以放置一些有用的东西到某一个房间,你还可以给每个User分配具体的权限,也就是他到某一个房间能做些什么,是只能看(Read-Only),还是可以像主人一样有所有的控制权(R/W),这个就要看这个User所对应的角色Role了。”—摘自网络


二)安装及配置

达梦数据库的安装在此不做说明,网上教程一堆,而且相对也比较简单。

下载地址: http://www.dameng.com/down.aspx?TypeId=11&FId=t14:11:14 

文档下载地址: http://www.dameng.com/down.aspx?TypeId=12&FId=t14:12:14 


安装后实例化数据库,以Windows为例:

开始-》所有程序-》达梦数据库,实例化需要用到以下红框内客户端,双击它:

DM(达梦)数据库简介_DM

出现如下所示界面,我们可以看到这货中文名叫达梦数据库配置助手,通过这个图形化的界面来创建一个数据库,按照默认“创建数据库实例”,点击“开始”:

DM(达梦)数据库简介_达梦_02

指定数据库模板,默认“一般用途”,点击“下一步” :

DM(达梦)数据库简介_DM_03

数据库目录,以后放数据的地方,这里自行选择目录,点击“下一步”:

DM(达梦)数据库简介_国产数据库_04

数据库标识,第一次创建时,默认的库名,实例名,端口号如下图所示,继续点击“下一步” :

DM(达梦)数据库简介_DM_05

数据库文件,按默认的来,点击“下一步”:

DM(达梦)数据库简介_国产数据库_06

初始化参数,依旧默认(这里注意字符集,如果有需求可更改为需要的字符集),点击“下一步” :

DM(达梦)数据库简介_达梦_07

口令管理,为了方便,我选择第二个“所有用户(这里指系统默认可登录用户:SYSDBA, SYSAUDITOR)使用同意口令”,然后输入口令,点击“下一步” :

DM(达梦)数据库简介_达梦_08

创建实例库,对于初学者,建议都勾选上,这样实例化的数据库的同时会创建BOOKSHOP和DMHR两个模式及相应用户,便于学习。点击“下一步” :

DM(达梦)数据库简介_达梦_09

创建摘要,点击“完成”:

DM(达梦)数据库简介_DM_10

DM(达梦)数据库简介_达梦_11 

至此,实例化数据库完成!

安装参考网址:https://blog.csdn.net/xiaokedou_hust/article/details/69214029 


三)基本使用

  1. 查表空间

    select * from V$TABLESPACE;

  2. 查询模式

    SELECT owner FROM dba_segments group by OWNER;

  3. 查询表

    select * from dba_tables where tablespace_name='TEMP';         //根据表空间查询表

    SELECT * FROM SYSOBJECTS WHERE schid = (SELECT object_id from all_objects where object_name = 'CTISYS'  and object_type = 'SCH') and (SUBTYPE$ = 'UTAB'  or SUBTYPE$ = 'STAB');    //object_name指模式名, UTAB用户表,STAB系统表

  4. 表空间脱机及上线

    alter tablespace "DMHR" offline;

    alter tablespace "DMHR" online;        //同一表空间可以存在同名对象

  5. 模式切换

    SELECT SYS_CONTEXT ('userenv', 'current_schema') FROM DUAL;        //查询当前模式

    SET SCHEMA "SYSDBA";        //设置当前登录用户的默认模式

  6. 数据大小

     SELECT SUM(bytes) from dba_data_files;        //数据库占用空间

     SELECT TABLE_USED_SPACE('DMHR', 'REGION') * 1024;        //表大小

  7. 归档模式

     select arch_mode from v$database;        //归档是否打开

    select * from V$DM_ARCH_INI;        //归档信息

  8. 系统数据查询

    select * from dba_tables;        //系统所有表查询

    select * from user_tables;        //登录用户所有表查询

    select * from user_tablespaces;        //表空间查询

    select * from dba_users;        //系统所有用户查询


四)高级特性

  1. 表空间详解及管理,参考以下博文:

    https://blog.csdn.net/lucky_fly/article/details/81566616 

  2. 达梦数据库group by子句用法,参考以下博文:

    https://blog.csdn.net/basenet855x/article/details/6694150 

  3. 视图创建使用,参考以下博文:

    https://www.cnblogs.com/oraclestudy/articles/5779200.html 

  4. 达梦临时表创建及使用,参考以下博文:

    https://www.cnblogs.com/zmlctt/p/3782083.html 

  5. 达梦外部表创建及使用

    所谓外部表,其实质上与一般的表一样有相应的表字段结构,区别在于外部表的数据存储在外部系统中,因此你在数据库系统的表空间找不到外部表的存储信息。另外,外部表只可读,不可做其他操作。创建外部表的语句如下,以windows为例:

    create external table ext_table(num1 int, num2 int, num3 int) from datafile 'E:\data.txt' parms(fields delimited by '|', records delimited by 0x0d0a);

    注:使用外部表时需要注意,外部文件字段数据必须大于等于外部表字段的定义数,小于时查询会提示数据错误。