数据库实例管理
数据库和实例:
在 DM7 之前版本的 DM 数据库中,“数据库”和“实例”这两个术语经常可以互相替换,意义也很相近。在新版本 DM7 数据库中,“数据库”和“实例”这两个概念之间有着很大的差别,甚至可以说它们是两个完全不同的实体。
当同时出现 DM 数据库和实例时,DM 数据库指的是磁盘上存放在 DM 据库中的数据的集合,一般包括:数据文件、日志文件、控制文件以及临时数据文件等。
实例一般是由一组正在运行的 DM 后台进程/线程以及一个大型的共享内存组成。简单来说,实例就是操作 DM 数据库的一种手段,是用来访问数据库的内存结构以及后台进程的集合。
大多数情况下,一个数据库也只有一个实例对其进行操作。但是在 DM 共享存储集群(DMRAC)中,多个实例可以同时装载并打开一个数据库(位于一组由多台服务器共享的物理磁盘上)。此时,我们可以同时从多台不同的计算机访问这个数据库。
数据库状态和模式
DM 数据库包含以下几种状态:
- 配置状态(MOUNT):不允许访问数据库对象,只能进行控制文件维护、归档配置、数据库模式修改等操作;
- 打开状态(OPEN):不能进行控制文件维护、归档配置等操作,可以访问数据库对象,对外提供正常的数据库服务;
- 挂起状态(SUSPEND):与 OPEN 状态的唯一区别就是,限制磁盘写入功能;一旦修改了数据页,触发 REDO 日志、数据页刷盘,当前用户将被挂起。
OPEN 状态与 MOUNT 和 SUSPEND 能相互转换,但是 MOUNT 和 SUSPEND 之间不能相互转换。
DM 数据库包含以下几种模式:
- 普通模式(NORMAL):用户可以正常访问数据库,操作没有限制;
- 主库模式(PRIMARY):用户可以正常访问数据库,所有对数据库对象的修改强制生成 REDO 日志,在归档有效时,发送 REDO 日志到备库;
- 备库模式(STANDBY):接收主库发送过来的 REDO 日志并重做。数据对用户只读。
三种模式只能在 MOUNT 状态下设置,模式之间可以相互转换。对于新初始化的库,首次启动不允许使用 mount 方式,需要先正常启动并正常退出,然后才允许 mount 方式启动。一般情况下,数据库为 NORMAL 模式,如果不指定 MOUNT 状态启动,则自动启动到 OPEN状态。
在需要对数据库配置时(如配置数据守护、数据复制),服务器需要指定 MOUNT 状态启动。当数据库模式为非 NORMAL 模式(PRIMARY、STANDBY 模式),无论是否指定启动状态,服务器启动时自动启动到 MOUNT 状态。
-- 查看数据库中实例状态
SELECT status$ FROM V$INSTANCE;
启动实例
Linux 服务方式:
安装 DM 数据库后,在/etc/rc.d/init.d 中有名称为 DmService 开头的文件,文件全名为 DmService+实例名(例:如果实例名为 DMSERVER,则相对应的服务文件为DmServiceDMSERVER )。
以实例名为 DMSERVER 为例,在终端输入./DmServiceDMSERVER start 或者 service DmServiceDMSERVER start 即可启动 DM 数据库。
命令行方式:在终端进入 DM 安装目录下的 bin 目录,执行./dmserver 启动 DM 数据库,参数选项同 Windows。
当前session有效。关闭会话,连接就断了。
判断DM数据库是不是启动的
- 端口:
netstat -ntl|grep 523*
ps -ef|grep DMSERVER
DM数据库工具的使用
disql工具的使用
- https://mp.weixin.qq.com/s/UKvdr8wHat_MP12KZCyDfQ
- https://mp.weixin.qq.com/s/Nvx_oSPTidIeNqed7l1KTg
- https://mp.weixin.qq.com/s/QGGOH1APIo2VpEhgn5YGkA
disql sysdba/SYSDBA@localhost:5239
数据库管理工具
控制台工具
COMPATIBLE_MODE 是否兼容其他数据库模式。
0:不兼容,
1:兼容SQL92标准,
2:兼容ORACLE,
3:兼容MS SQL SERVER,
4:兼容MYSQL
达梦数据库手册的使用,手册在 ./doc 目录下
DM7 的体系结构
DM7 逻辑存储结构
在 DM7 中存储的层次结构如下:
- 数据库由一个或多个表空间组成;
- 每个表空间由一个或多个数据文件组成;
- 每个数据文件由一个或多个簇组成;
- 段是簇的上级逻辑单元,一个段可以跨多个数据文件;
- 簇由磁盘上连续的页组成,一个簇总是在一个数据文件中;
- 页是数据库中最小的分配单元,也是数据库中使用的最小的 IO 单元。
在 DM 数据库中,表空间 由一个或者多个数据文件组成。DM 数据库中的所有对象在逻辑上都存放在表空间中,而物理上都存储在所属表空间的数据文件中。
在创建 DM 数据库时,会自动创建 5 个表空间:SYSTEM 表空间、ROLL 表空间、MAIN表空间、TEMP 表空间和 HMAIN 表空间。
数据库表中的每一行是一条 记录 。
记录是存储在数据页中的,记录并不是 DM 数据库的存储单位,页才是。
由于记录不能跨页存储,这样记录的长度就受到数据页大小的限制。DM 规定每条记录的总长度不能超过页面大小的一半。
数据页(也称数据块)是 DM 数据库中最小的数据存储单元。页的大小对应物理存储空间上特定数量的存储字节,在 DM 数据库中,页大小可以为 4KB、8KB、16KB 或者 32KB,用户在创建数据库时可以指定,默认大小为 KB,一旦创建好了数据库,则在该库的整个生命周期内,页大小都不能够改变。
簇是数据页的上级逻辑单元 ,由同一个数据文件中 16 个或 32 个连续的数据页组成。
段是簇的上级逻辑分区单元,它由一组簇组成。
在同一个表空间中,段可以包含来自不同文件的簇,即一个段可以跨越不同的文件 。
而一个簇以及该簇所包含的数据页则只能来自一个文件,是连续的 16或者 32 个数据页。由于簇的数量是按需分配的 ,数据段中的不同簇在磁盘上不一定连续。
DM7 物理存储结构
配置文件:用来设置功能选项的一些文本文件的集合,配置文件以 ini 为扩展名,具有固定的格式
控制文件:每个 DM 数据库都有一个名为 dm.ctl 的控制文件。
控制文件是一个二进制文件,它记录了数据库必要的初始信息。
# 查看控制文件内容
dmctlcvt help
数据文件 以 dbf 为扩展名,它是数据库中最重要的文件类型,一个 DM 数据文件对应磁盘上的一个物理文件,数据文件是真实数据存储的地方,每个数据库至少有一个与之相关的数据文件。在实际应用中,通常有多个数据文件。
重做日志文件:又叫 REDO 日志,指在 DM 数据库中添加、删除、修改对象,或者改变数据,DM 都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。
重做日志文件以 log 为扩展名。每个 DM 数据库实例必须至少有 2 个重做日志文件,默认两个日志文件为 DAMENG01.log、DAMENG02.log,这两个文件循环使用。
# 查看日志信息 v$rlogfile;
select path from v$rlogfile
# 增加一个日志文件
alter database add logfile '/dm7/data/DAMENG/DAMENG04.log' size 128;
# 修改日志文件的大小
alter database resize logfile '/dm7/data/DAMENG/DAMENG04.log' to 256;
归档日志文件:日志文件分为联机日志文件和归档日志文件。DM 数据库可以在归档模式和非归档模式下
运行。只有当数据库处于归档模式下,才将联机日志文件中的内容保存到硬盘中,形成归档日志文件。
归档参数文件: dmarch.ini
逻辑日志文件:如果在 DM 数据库上配置了复制功能,复制源就会产生逻辑日志文件。
逻辑日志文件是一个流式的文件,它有自己的格式,且不在第一章所述的页,簇和段的管理之下。
逻辑日志文件内部存储按照复制记录的格式,一条记录紧接着一条记录,存储着复制源端的各种逻辑操作。用于发送给复制目的端。
备份文件:以 bak 为扩展名,当系统正常运行时,备份文件不会起任何作用,它也不是数据库必须有的联机文件类型之一。
跟踪日志文件:在dm.ini中配置SVR_LOG和SVR_LOG_SWITCH_COUNT参数后就会打开跟踪日志。
跟踪日志文件是一个纯文本文件,以“dm_commit_日期_时间”命名,默认生成在 DM安装目录的 log 子目录下面,管理员可通过 ini 参数 SVR_LOG_FILE_PATH 设置其生成路径。
跟踪日志内容包含系统各会话执行的 SQL 语句、参数信息、错误信息等。
跟踪日志主要用于分析错误和分析性能问题,基于跟踪日志可以对系统运行状态有一个分析,
比如,可以挑出系统现在执行速度较慢的 SQL 语句,进而对其进行优化。
事件日志文件:DM 数据库系统在运行过程中,会在 log 子目录下产生一个“dm_实例名_日期”命名的事件日志文件。
事件日志文件对 DM 数据库运行时的关键事件进行记录,如系统启动、关闭、内存申请失败、IO 错误等一些致命错误。事件日志文件主要用于系统出现严重错误时进行查看并定位问题。
DM 内存结构
共享内存池是 DM Server 在启动时从操作系统申请的一大片内存。在 DM Server 的运行期间,经常会申请与释放小片内存,而向操作系统申请和释放内存时需要发出系统调用,此时可能会引起线程切换,降低系统运行效率。采用共享内存池则可一次向操作系统申请一片较大内存,即为内存池,当系统在运行过程中需要申请内存时,可在共享内存池内进行申请,当用完该内存时,再释放掉,即归还给共享内存池。
DM 系统管理员可以通过 DM Server 的配置文件(dm.ini)来对共享内存池的大小进行设置,共享池的参数为 MEMORY_POOL,该配置默认为 200M。
SQL> select distinct name,is_shared from v$mem_pool order by 2;
SQL> select para_name,para_value from v$dm_ini where para_name like '%MEMORY%';
数据缓冲区是 DM Server 在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。这是 DM Server 至关重要的内存区域之一,将其设定得太小,会导致缓冲页命中率低,磁盘 IO 繁;将其设定得太大,又会导致操作系统内存本身不够用。
参考值:
- OLTP:buffer 大小占整个物理内存的40%-60%
- OLAP:buffer 大小为整个物理内存的60%-80%
相关的视图:
- V$buffer_lru_first:显示所有缓冲区LRU链首页信息。
- V$buffer_lru_last:显示所有缓冲区LRU链末页信息。
- V$buffer_upd_first:显示所有缓冲区update链首页信息。
- V$buffer_upd_last:显示所有缓冲区update链末页信息。
DM Server 中有四种类型的数据缓冲区,分别是 NORMAL、KEEP、FAST 和 RECYCLE。
其中,用户可以在创建表空间或修改表空间时,指定表空间属于 NORMAL 或 KEEP 缓冲区。
RECYCLE 缓冲区供临时表空间使用,FAST 缓冲区根据用户指定的 FAST_POOL_PAGES 大小由系统自动进行管理,用户不能指定使用 RECYCLE 和 FAST 缓冲区的表或表空间。
ORACLE: RECYCLE和keep存的表。DM:recycle和keep 存的是表空间。
修改参数值:
-- Oracle:
alter system set ....
--DM:
SP_SET_PARA_VALUE(scope,para_name,para_value);
-- 通过视图v$parameter来查看类型
select name,type from v$parameter where name='BUFFER';
DM的参数类型:
- Sys/session:动态参数,同时修改内存和配置文件
- Read only:在数据库运行状态时,不能修改。
- IN FILE:静态参数,修改配置文件,重启服务生效。
- Scope:
SQL> Select para_name,para_value from v$dm_ini where para_name='BUFFER';
SQL> sp_set_para_value(2,'BUFFER',1500);
-- 重启生效
- BUFFER_POOLS: 缓冲池个数
- Max_buffer:缓冲区最大值
select para_name,para_value from v$dm_ini where para_name like '%BUFFRE%';
- 是否读取多页:MULTI_PAGE_NUM,默认是单页。
- 在数据库加密或是启用ssd缓冲区,则不支持多页读取。
字典缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。
每次对数据库的操作都会涉及到数据字典信息,访问数据字典信息的效率直接影响到相应的操作效率,如进行查询语句,就需要相应的表信息、列信息等,这些字典信息如果都在缓冲区里,则直接从缓冲区中获取即可,否则需要 I/O 才能读取到这些信息。
该缓冲区配置参数为 DICT_BUF_SIZE,默认的配置大小为 5M。
select para_name,para_value from v$dm_ini where para_name='DICT_BUF_SIZE';
- V$DICT_CACHE_ITEM:字典缓冲区中字典对象的信息。
- V$DICT_CAHCE:字典缓冲区的信息.
SQL 缓冲区提供在执行 SQL 语句过程中所需要的内存,包括计划、SQL 语句和结果集缓存。
很多应用当中都存在反复执行相同 SQL 语句的情况,此时可以使用缓冲区保存这些语句和它们的执行计划,这就是计划重用。
这样带来的好处是加快了 SQL 语句执行效率,但同时给内存也增加了压力。
- A 语法分析
- B 语义分析(读字典表)
- D 查找数据块是否在内存(在内存,产生逻辑读,不在内存,产生物理读)
- E 是否有可用的执行计划 ,如有的话,按执行计划来,如果没有,就生成执行计划,运行sql ,将结果集发回客户端)sql缓冲区里存放的都是最近使用的执行计划和最近查询的结果集。
DM Server 在配置文件 dm.ini 提供了参数来支持是否需要计划重用,参数为USE_PLN_POOL,当指定为非 0 时,则启动计划重用;为 0 时禁止计划重用。DM 同时还提供了参数 CACHE_POOL_SIZE(单位为 MB),来改变 SQL 缓冲区大小,系统管理员可以设置该值以满足应用需求,默认值为 10M。
# Cache_pool_size:sql缓冲区的大小
SQL> select para_name,para_value from v$dm_ini where para_name='CACHE_POOL_SIZE';
# RS_CAN_CACHE:控制结果集缓存
SQL> select para_name,para_value from v$dm_ini where para_name='RS_CAN_CACHE';
- 0:禁止重用结果集
- 1:强制模式:默认缓存所有的结果集
- 2:手动模式:默认不缓存结果集。
仅当参数RS_CAN_CACHE=1 且USE_PLN_POOL非0的时候,才会缓存结果集。
相关的视图:
- V$sql_plan:缓冲区中的执行计划信息。
- V$sql_history:sql执行历史信息
- $sql_text:sql执行信息。
- V$cachesql:缓冲区中SQL语句的信息。
重做日志缓冲区:用于存放重做日志的内存缓冲区,为了避免直接对磁盘的io进行读写,对数据库的性能产生影响。
Rlog_buf_size:日志缓冲区的大小 单位:page 大小设置为2的幂。
Rlog_pool_size:最大日志缓冲区的大小 :单位M
SQL> select para_name,para_value from v$dm_ini where para_name='RLOG_BUF_SIZE';
SQL> select para_name,para_value from v$dm_ini where para_name='RLOG_POOL_SIZE';
排序缓冲区提供数据排序所需要的内存空间。当用户执行 SQL 语句时,常常需要进行排序,所使用的内存就是排序缓冲区提供的。在每次排序过程中,都首先申请内存,排序结束后再释放内存。
SQL> select para_name,para_value from v$dm_ini where para_name='SORT_BUF_SIZE';
DM7 提供了为哈希连接而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。
之所以说是虚拟缓冲,是因为系统没有真正创建特定属于哈希缓冲区的内存,
而是在进行哈希连接时,对排序的数据量进行了计算。
如果计算出的数据量大小超过了哈希缓冲区的大小,则使用 DM7创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上使用的还是 VPOOL 内存池来进行哈希操作。
SQL> select para_name,para_value from v$dm_ini where para_name='HJ_BUF_SIZE';
为提高系统执行效率,DM Server 将 SSD 文件作为内存缓存与普通磁盘之间的缓冲层,称为“SSD 缓存”。
DM Server 在的 dm.ini 中提供参数 SSD_BUF_SIZE 和 SSD_FILE_PATH 来配置 SSD 缓冲,SSD_BUF_SIZE 指定缓冲区的大小,单位是 M,DM Server 根据该参数创建相应大小的文件作为缓冲区使用;SSD_FILE_PATH 指定该文件所在的文件夹路径,管理员需要保证设置的路径是位于固态磁盘上。
SQL> select para_name,para_value from v$dm_ini where para_name like '%SSD%';
DM 线程管理
DM 服务器使用“对称服务器构架”的单进程、多线程结构。这种对称服务器构架在有效地利用了系统资源的同时又提供了较高的可伸缩性能,这里所指的线程即为操作系统的线程。服务器在运行时由各种内存数据结构和一系列的线程组成,线程分为多种类型,不同类型的线程完成不同的任务。线程通过一定的同步机制对数据结构进行并发访问和处理,以完成客户提交的各种任务。DM 数据库服务器是共享的服务器,允许多个用户连接到同一个服务器上,服务器进程称为共享服务器进程。
DM 进程中主要包括监听线程、IO 线程、工作线程、调度线程、日志线程等。
相关视图:
- V$LATCHES:在等待线程信息
- V$threads:当前系统中所有活的线程的信息。
- V$wthrd_history:记录自数据库启动以来,所有活动过的线程的相关历史信息。
- V$process:查看当前数据进程信息。
SQL> select * from v$process;
SQL> select distinct name,count(1),thread_desc from v$threads group by name,thread_desc order by 2 desc;