达梦DM8数据库从零部署到核心操作实战指南
1. 项目概述为什么是达梦DM8最近几年国产数据库的声量越来越大无论是出于项目合规要求、技术自主可控的考量还是单纯想拓展自己的技术栈学习一款主流的国产数据库都成了很多开发者和DBA的必修课。在众多选择中达梦数据库Dameng Database凭借其深厚的积累和广泛的市场应用成为了一个绕不开的名字。而DM8作为其新一代产品在性能、功能和安全上都有了显著提升。如果你之前主要接触的是MySQL、PostgreSQL这类开源数据库或者Oracle、SQL Server这类商业数据库初次面对达梦可能会有点无从下手。它的安装方式、管理工具、甚至一些SQL语法都有其独特之处。网上资料虽然不少但往往比较零散不成体系。这篇内容我就从一个一线实践者的角度带你从零开始完成DM8数据库的创建并掌握其最核心、最常用的基本操作。我会把官方文档里那些晦涩的说明转换成我们日常开发运维中真正会用到的步骤和命令并附上我踩过坑后总结的经验。目标很简单让你看完就能动手快速搭建起一个可用的DM8环境并自信地开始使用它。2. 环境准备与安装部署在真正创建数据库实例之前我们需要先把DM8的软件安装到操作系统上。达梦支持多种平台这里我们以最常见的Linux环境CentOS 7.x / Rocky Linux 8为例进行说明。Windows下的图形化安装过程相对简单我会在注意事项里提一下关键点。2.1 系统环境检查与依赖处理达梦DM8对操作系统有一定要求盲目安装很容易失败。首先我们需要进行一系列前置检查。1. 检查系统参数达梦数据库对内核参数和用户资源限制有明确要求这是保证其稳定运行的基础。我们需要检查并调整/etc/security/limits.conf文件和内核参数。打开终端使用ulimit -a查看当前用户的资源限制。重点关注open files和max user processes。通常我们需要在/etc/security/limits.conf文件末尾添加如下配置需要root权限dmdba soft nofile 65536 dmdba hard nofile 65536 dmdba soft nproc 65536 dmdba hard nproc 65536这里的dmdba是我们将要创建的专门用来安装和运行达梦数据库的操作系统用户。修改后需要重新登录该用户生效。内核参数方面需要修改/etc/sysctl.conf确保以下参数满足最低要求fs.file-max 6815744 kernel.sem 250 32000 100 999 kernel.shmmax 137438953472 kernel.shmall 1073741824修改后执行sysctl -p使配置生效。实操心得很多安装失败都卡在这一步。特别是云服务器默认的shmmax和shmall值可能很小不足以分配达梦所需的大内存页。如果安装时遇到共享内存相关的错误回头重点检查这里。2. 创建安装用户与目录不建议使用root用户直接安装和运行数据库。我们应该创建一个专属用户和组。groupadd dinstall useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba passwd dmdba # 为dmdba用户设置密码接着创建达梦的安装目录和数据目录并授权给dmdba用户。我习惯将软件和数据分开mkdir -p /opt/dmdbms # 软件安装目录 mkdir -p /dmdata # 数据文件目录 chown -R dmdba:dinstall /opt/dmdbms /dmdata chmod -R 755 /opt/dmdbms /dmdata2.2 DM8软件安装实战达梦提供命令行和图形化两种安装方式。在生产环境或无图形界面的服务器上命令行安装是唯一选择也更显专业。1. 获取安装包与挂载镜像从达梦官网下载对应版本的ISO安装镜像如dm8_20231011_x86_rh7_64.iso。将其上传至服务器例如/tmp目录下。mount -o loop /tmp/dm8_20231011_x86_rh7_64.iso /mnt切换到我们创建的dmdba用户su - dmdba。2. 命令行静默安装进入挂载点执行安装程序。使用命令行安装需要准备一个响应文件dmrsp.xml但更简单的方式是直接使用-i参数进行交互式命令行安装。cd /mnt ./DMInstall.bin -i接下来安装程序会以文本交互的方式提问选择安装语言通常输入c选择中文。是否接受许可协议输入y。选择安装类型输入1选择典型安装。选择安装目录输入我们之前创建好的/opt/dmdbms。确认安装程序会列出摘要输入y开始安装。安装过程大约需要几分钟期间会显示进度条。安装完成后会提示以root身份执行一个脚本exit # 退出dmdba用户回到root /opt/dmdbms/script/root/root_installer.sh这个脚本会创建必要的链接和服务。执行完毕后DM8的软件就安装成功了。注意事项图形化安装在Windows或带桌面的Linux上过程更直观只需运行DMInstall.bin然后跟着GUI向导一步步操作即可主要步骤与命令行类似。但切记安装路径不要包含中文或空格这是很多奇怪问题的根源。3. 数据库实例创建与初始化软件安装好比准备好了工具箱而数据库实例才是我们真正要建造的“房子”。DM8中一个数据库实例Instance包含了一系列后台进程和内存结构用于管理一个具体的数据库Database。我们接下来要做的dminit工具初始化就是创建这个“数据库”的本体。3.1 使用dminit工具初始化数据库这是最关键的一步。我们需要使用达梦提供的dminit命令行工具来初始化一个数据库。再次切换到dmdba用户并进入安装目录的bin下su - dmdba cd /opt/dmdbms/bin执行初始化命令以下是一个包含常用参数的示例./dminit PATH/dmdata DB_NAMEDAMENG INSTANCE_NAMEDMSERVER PORT_NUM5236 PAGE_SIZE32这条命令的每一个参数都至关重要PATH/dmdata指定数据库所有数据文件、控制文件、日志文件的存放根目录。我们之前专门创建了/dmdata。DB_NAMEDAMENG数据库名默认为DAMENG你可以改为项目名如PROD_DB。INSTANCE_NAMEDMSERVER实例名后续启动服务、连接时会用到。PORT_NUM5236数据库监听端口达梦默认是5236确保防火墙已开放此端口。PAGE_SIZE32页大小单位KB。可选4, 8, 16, 32。这是初始化后无法修改的参数需要根据业务提前规划。OLTP联机交易系统通常选16或32更大的页对性能有益。命令执行成功后会在/dmdata/DAMENG目录下生成一系列文件SYSTEM.DBF系统表空间文件、ROLL.DBF回滚表空间文件、MAIN.DBF主用户表空间文件、TEMP.DBF临时表空间文件以及重做日志文件DAMENG01.log、DAMENG02.log和控制文件dm.ctl。核心细节解析PAGE_SIZE的选择为什么这么重要数据库所有的I/O操作读、写都是以“页”为单位进行的。页越大单次IOP能承载的数据就越多对于全表扫描、大字段操作如TEXT, BLOB有利。但页越大在缓冲池中能缓存的页数量就越少可能对随机读写密集型的OLTP场景产生负面影响。对于通用业务选择16K或32K是一个比较平衡且面向未来的选择。一旦选错只能通过数据导出/导入的方式重建数据库代价巨大。3.2 注册数据库服务与启动数据库文件初始化好后我们需要将其作为一个系统服务来管理方便开机自启和日常运维。1. 注册服务Linux在/opt/dmdbms/script/root目录下达梦提供了服务注册脚本。切换回root用户执行cd /opt/dmdbms/script/root ./dm_service_installer.sh -t dmserver -dm_ini /dmdata/DAMENG/dm.ini -p DMSERVER-t dmserver指定服务类型为数据库实例服务。-dm_ini指定数据库的初始化参数文件路径就是上一步在数据目录下生成的dm.ini。-p DMSERVER指定服务名后缀最终注册的服务名会是DmServiceDMSERVER。执行成功后可以使用systemctl命令来管理服务systemctl start DmServiceDMSERVER # 启动服务 systemctl stop DmServiceDMSERVER # 停止服务 systemctl status DmServiceDMSERVER # 查看状态 systemctl enable DmServiceDMSERVER # 设置开机自启2. 连接验证服务启动后我们就可以使用达梦自带的命令行工具disql进行连接验证了。切换回dmdba用户su - dmdba cd /opt/dmdbms/bin ./disql SYSDBA/SYSDBAlocalhost:5236这里SYSDBA是默认的系统管理员账号密码也是SYSDBA。localhost:5236是数据库地址和端口。如果连接成功会显示SQL提示符。执行一个简单的查询select 1;能看到返回结果就证明数据库实例创建并启动成功了。常见问题与排查如果连接失败首先检查服务状态是否active (running)。然后检查防火墙是否开放了5236端口firewall-cmd --query-port5236/tcp。还可以查看数据库日志/dmdata/DAMENG/log/dm_实例名_日期.log里面通常有详细的错误信息。4. 基本用法核心解析从连接到操作数据库跑起来了接下来就是怎么用它。这部分我们抛开复杂的理论直接看日常开发和运维中最常用的操作。4.1 连接管理不止于命令行1. 命令行工具disqldisql是达梦的交互式查询工具类似于Oracle的sqlplusMySQL的mysql client。除了基本的连接它有很多实用技巧执行SQL脚本start /home/dmdba/init.sql或/home/dmdba/init.sql。设置输出格式set linesize 1000设置行宽set pagesize 50设置每页行数让查询结果更美观。查看执行计划在SQL前加上explain例如explain select * from user;对于性能调优至关重要。连接字符串支持多种格式。./disql SYSDBA/SYSDBA192.168.1.100:5236连接远程服务器。也可以在连接时直接指定模式SYSDBA/SYSDBA192.168.1.100:5236#MAIN_SCHEMA。2. 图形化客户端DBeaver对于习惯图形界面的开发者强烈推荐使用DBeaver这款免费通用的数据库工具。连接达梦需要先配置驱动。在DBeaver中打开“数据库 - 驱动管理器”。点击“新建”创建一个新驱动。设置驱动名称如“Dameng”。在“库”标签页点击“添加文件”将达梦安装目录/opt/dmdbms/drivers/jdbc下的DmJdbcDriver18.jar对应JDBC 8添加进来。类名填写dm.jdbc.driver.DmDriver。URL模板填写jdbc:dm://{host}[:{port}]。设置默认端口为5236。 配置好后就可以像连接MySQL一样新建连接输入主机、端口、数据库名如DAMENG、用户名SYSDBA、密码进行连接了。图形化界面在表结构查看、数据编辑、ER图生成方面优势明显。4.2 用户、模式与权限体系初探达梦的权限体系与Oracle类似理解“用户”和“模式”的关系是正确操作的第一步。用户User登录数据库的账号如SYSDBA。每个用户默认拥有一个同名的模式Schema。模式Schema是数据库对象的逻辑容器包含表、视图、索引、存储过程等。用户USER_A创建的表TABLE1其完整名称是USER_A.TABLE1。如果USER_A登录后直接写SELECT * FROM TABLE1数据库会自动在其同名模式USER_A下寻找该表。1. 创建业务用户永远不要使用SYSDBA进行日常业务操作。我们应该为每个应用创建独立的用户。-- 使用SYSDBA登录后执行 CREATE USER APP_USER IDENTIFIED BY “StrongPass123” DEFAULT TABLESPACE MAIN; -- 指定默认表空间 GRANT RESOURCE, VTI TO APP_USER; -- 授予基本权限RESOURCE角色允许用户创建表、视图、过程等对象。VTI角色允许用户查询系统视图。2. 对象管理与基本SQL切换到新用户APP_USER进行连接和操作。其基本SQL与标准SQL-92兼容但也有一些达梦特有的扩展或细微差别。DDL数据定义语言-- 创建表 CREATE TABLE t_order ( order_id INT IDENTITY(1,1) PRIMARY KEY, -- 自增主键 user_name VARCHAR(50) NOT NULL, amount DECIMAL(15,2), order_time DATETIME DEFAULT CURRENT_TIMESTAMP() ); -- 创建索引 CREATE INDEX idx_order_time ON t_order(order_time);注意达梦的自增列使用IDENTITY(1,1)语法类似于SQL Server。默认值函数是CURRENT_TIMESTAMP()注意括号。DML数据操作语言-- 插入 INSERT INTO t_order (user_name, amount) VALUES (‘张三‘, 99.9); -- 查询支持分页语法类似MySQL SELECT * FROM t_order ORDER BY order_time DESC LIMIT 10 OFFSET 0; -- 更新 UPDATE t_order SET amount amount * 0.9 WHERE user_name ‘张三‘; -- 删除 DELETE FROM t_order WHERE order_time DATEADD(‘DAY‘, -30, NOW());达梦的分页语法非常友好直接使用LIMIT offset, row_count或LIMIT row_count OFFSET offset。日期函数DATEADD的参数顺序是时间单位间隔基准日期。事务控制 达梦默认是自动提交AUTOCOMMIT1。在disql中可以执行SET AUTOCOMMIT OFF;开启手动事务。使用COMMIT;提交ROLLBACK;回滚。避坑技巧达梦的字符串比较默认是区分大小写的这与MySQL的行为不同。SELECT * FROM t_user WHERE name ‘Alice‘;查不到‘alice‘。如果业务需要不区分大小写可以在建表时使用CASE_SENSITIVE参数或者查询时使用UPPER()/LOWER()函数转换。5. 日常运维与问题排查实录数据库创建好并投入开发后日常的维护和问题排查就变得尤为重要。这里分享几个高频场景和我的处理思路。5.1 状态监控与信息查询了解数据库当前在干什么是运维的基础。达梦提供了丰富的系统视图V$视图和SYS开头的字典视图。1. 查看数据库基本信息与状态-- 查看数据库版本和实例信息 SELECT * FROM V$VERSION; SELECT * FROM V$INSTANCE; -- 查看当前数据库参数类似Oracle的spfile SELECT PARA_NAME, PARA_VALUE, PARA_TYPE FROM V$PARAMETER WHERE PARA_NAME LIKE ‘%BUFFER%‘; -- 查看缓冲区相关参数 -- 查看表空间使用情况非常重要 SELECT TABLESPACE_NAME, FILE_NAME, BYTES/1024/1024 AS “SIZE_MB“, (BYTES - FREE_SPACE)/1024/1024 AS “USED_MB“, FREE_SPACE/1024/1024 AS “FREE_MB“, ROUND((BYTES - FREE_SPACE)*100/BYTES, 2) AS “USED_PERCENT“ FROM DBA_DATA_FILES df JOIN (SELECT FILE_ID, SUM(BLOCKS) * (SELECT PARA_VALUE FROM V$PARAMETER WHERE PARA_NAME‘PAGE_SIZE‘)/1024 AS FREE_SPACE FROM DBA_FREE_SPACE GROUP BY FILE_ID) fs ON df.FILE_ID fs.FILE_ID ORDER BY USED_PERCENT DESC;这个查询能清晰看到每个数据文件的使用率提前预警空间不足。2. 查看当前会话与锁信息当应用反馈“卡住”或“超时”时首先检查锁。-- 查看当前所有活动会话 SELECT SESS_ID, SQL_TEXT, STATE, LAST_RECV_TIME FROM V$SESSIONS WHERE STATE ‘ACTIVE‘; -- 查看当前锁等待情况关键 SELECT lh.BLOCK_SESS_ID AS “阻塞会话ID“, vs1.SQL_TEXT AS “阻塞会话SQL“, lh.WAIT_SESS_ID AS “被阻塞会话ID“, vs2.SQL_TEXT AS “被阻塞会话SQL“, lh.TABLE_NAME, lh.ROW_IDX FROM V$LOCK lh LEFT JOIN V$SESSIONS vs1 ON lh.BLOCK_SESS_ID vs1.SESS_ID LEFT JOIN V$SESSIONS vs2 ON lh.WAIT_SESS_ID vs2.SESS_ID WHERE lh.BLOCKED 1; -- 只查有阻塞的找到阻塞会话ID后可以进一步查看它在执行什么或者必要时用SP_CLOSE_SESSION(SESS_ID);命令需要DBA权限强制关闭该会话以解除锁。5.2 备份与恢复基础操作对于任何数据库备份都是生命线。达梦提供了多种备份方式这里介绍最常用的联机物理备份。1. 配置归档要进行联机热备必须先开启归档模式。-- 1. 修改数据库为MOUNT状态 ALTER DATABASE MOUNT; -- 2. 配置本地归档假设归档路径为/dmdata/arch ALTER DATABASE ADD ARCHIVELOG ‘DEST /dmdata/arch, TYPE local, FILE_SIZE 1024, SPACE_LIMIT 20480‘; -- 3. 开启归档模式 ALTER DATABASE ARCHIVELOG; -- 4. 打开数据库 ALTER DATABASE OPEN;执行后检查V$ARCHIVED_LOG视图确认归档已经开始工作。2. 执行联机数据库备份使用达梦的BACKUP命令可以在数据库运行时进行全量备份。-- 执行全库备份到指定目录 BACKUP DATABASE FULL BACKUPSET ‘/dmdata/backup/full_bak_20240527‘;备份集BACKUPSET是一个目录里面包含了备份的所有数据文件、控制文件和备份元数据。备份完成后强烈建议立即备份归档日志BACKUP ARCHIVELOG ALL BACKUPSET ‘/dmdata/backup/arch_bak_20240527‘;3. 模拟恢复演练知道怎么备份更要会恢复。恢复演练至关重要。-- 关闭数据库服务后在disql工具中或使用dmrman工具 -- 1. 还原数据库 RESTORE DATABASE ‘/dmdata/DAMENG/dm.ini‘ FROM BACKUPSET ‘/dmdata/backup/full_bak_20240527‘; -- 2. 恢复数据库到最新状态应用归档日志 RECOVER DATABASE ‘/dmdata/DAMENG/dm.ini‘ FROM BACKUPSET ‘/dmdata/backup/full_bak_20240527‘ WITH ARCHIVEDIR ‘/dmdata/arch‘; -- 3. 更新数据库魔数类似Oracle的resetlogs RECOVER DATABASE ‘/dmdata/DAMENG/dm.ini‘ UPDATE DB_MAGIC;恢复后数据库会回到备份时刻并应用了所有可用的归档日志从而实现数据零丢失前提是归档日志完好。实操心得备份命令一定要定期执行并验证备份集的有效性。可以写一个Shell脚本每周执行一次全备每天执行一次增量备份并加入CHECK BACKUPSET命令来检查备份集完整性。恢复演练最好每季度在测试环境做一次确保流程烂熟于心真出事时才不会手忙脚乱。6. 性能调优入门与避坑指南数据库用起来之后性能问题迟早会找上门。对于DM8以下几个点是初期最容易遇到也最有效的优化方向。6.1 内存参数优化达梦的性能很大程度上依赖于内存配置。主要调整dm.ini文件中的几个关键参数修改前需重启数据库实例。1. 缓冲池BUFFER这是最重要的内存区域用于缓存数据页。大小应为系统可用内存的50%-70%。-- 在dm.ini中修改 BUFFER 20480 -- 单位是页数页大小(PAGE_SIZE)为32K时此值为 20480*32K 640MB BUFFER_POOLS 3 -- 缓冲池个数多核CPU可设置为CPU核数/4如何计算假设系统有32G内存给数据库分配20G页大小32K。那么BUFFER (20*1024*1024) / 32 ≈ 655360。生产环境建议逐步调整观察效果。2. SQL缓存与执行计划缓存CACHE_POOL_SIZE 200 -- 缓存池大小(MB)用于缓存SQL语句和执行计划 USE_PLN_POOL 1 -- 启用执行计划缓存对于OLTP系统设置合适的CACHE_POOL_SIZE可以极大减少硬解析开销提升并发性能。6.2 索引设计与SQL优化1. 如何查看低效SQL达梦的V$SQL_STAT和V$SQL_HISTORY视图记录了SQL的执行统计信息。-- 查找平均执行时间最长的SQL SELECT SQL_TEXT, EXECUTIONS, ELAPSED_TIME/EXECUTIONS AS AVG_ELAPSED, DISK_READS/EXECUTIONS AS AVG_READS FROM V$SQL_STAT WHERE EXECUTIONS 100 ORDER BY AVG_ELAPSED DESC LIMIT 10;2. 索引使用情况分析-- 查看某个表的索引 SELECT * FROM USER_INDEXES WHERE TABLE_NAME ‘T_ORDER‘; -- 查看索引的列信息 SELECT * FROM USER_IND_COLUMNS WHERE INDEX_NAME ‘IDX_ORDER_TIME‘; -- 使用达梦提供的系统过程分析索引是否被使用 SP_INDEX_STAT_INIT(‘APP_USER‘, ‘T_ORDER‘); -- 初始化统计 -- ... 运行一段时间的业务 ... SELECT * FROM INDEX_STAT WHERE TABLE_NAME ‘T_ORDER‘;如果某个索引的LEAF_USED叶子块使用次数长期为0或很低就要考虑它是否必要了。无效的索引会降低DML增删改速度。3. 一个常见的性能陷阱隐式类型转换达梦中如果WHERE条件中字段和传入值的类型不匹配会导致索引失效进行全表扫描。-- user_id 字段是 VARCHAR 类型 -- 错误写法会导致隐式转换索引失效 SELECT * FROM t_user WHERE user_id 10086; -- 正确写法类型匹配能走索引 SELECT * FROM t_user WHERE user_id ‘10086‘;养成在SQL中明确书写与字段类型匹配的值的习惯是避免性能问题的低成本高收益手段。6.3 连接池配置与应用侧优化很多时候数据库本身压力不大但应用连接数据库的方式有问题导致性能瓶颈。1. 达梦服务端连接数配置检查dm.ini中的MAX_SESSIONS参数它决定了数据库允许的最大会话数。默认值可能偏小需要根据应用实际并发连接数调整。MAX_SESSIONS 50002. 应用侧连接池配置要点以常用的Druid连接池为例在Spring Boot的application.yml中配置达梦数据源时以下参数需要关注spring: datasource: druid: url: jdbc:dm://192.168.1.100:5236/DAMENG username: APP_USER password: StrongPass123 initial-size: 5 # 初始连接数不宜过大 min-idle: 5 # 最小空闲连接 max-active: 20 # 最大活跃连接数根据应用服务器数量和QPS估算 max-wait: 60000 # 获取连接超时时间(ms) validation-query: SELECT 1 FROM DUAL # 达梦的验证查询 test-while-idle: true time-between-eviction-runs-millis: 60000关键点max-active不是越大越好。设置过大会导致数据库服务器内存和进程资源被过多连接耗尽。一个经验值是(应用服务器数量 * 每个服务器期望的最大并发线程数) 少量冗余。例如2台应用服务器每台Tomcat的maxThreads200那么max-active可以设置在(2*200)*0.2 10 ≈ 90左右假设只有20%的线程同时需要数据库连接。数据库的安装、创建、基本使用和初步运维到这里就形成了一个完整的闭环。从系统准备到实例初始化从基础操作到备份恢复再到性能观察这些步骤覆盖了一个DM8数据库生命周期中最核心的日常活动。记住数据库管理是一个重实践的经验活多动手搭建几次测试环境多尝试不同的参数和配置遇到问题耐心查看日志你的经验值就会快速增长。

相关新闻

最新新闻

日新闻

周新闻

月新闻